public Task <EigeneAbstimmungenModel> GetAbstimmung(Guid userId) { var dct = new Dictionary <string, EigeneAbstimmungModel>(); foreach (var aktion in AktionenModel.GetAktionen().Aktionen) { dct.Add(aktion.Name, new EigeneAbstimmungModel(aktion.Name, 0, false)); } var abstimmungen = this._Abstimmung.State.AktionProUser.Where((kv) => !string.IsNullOrEmpty(kv.Value)); foreach (var abstimmung in abstimmungen) { if (dct.TryGetValue(abstimmung.Value, out var eigeneAbstimmung)) { eigeneAbstimmung.Anzahl++; if (abstimmung.Key == userId) { eigeneAbstimmung.Eigene = true; } } } var result = new EigeneAbstimmungenModel(); result.EigeneAbstimmungen.AddRange( dct.Values.OrderBy(eigeneAbstimmung => eigeneAbstimmung.Aktion) ); return(Task.FromResult <EigeneAbstimmungenModel>(result)); }
public async Task GewinnVerteilung() { var aktionProUser = this._Abstimmung.State.AktionProUser; var aktionenDerUser = aktionProUser.Where(kv => !string.IsNullOrEmpty(kv.Value)).ToList(); var aktionen = AktionenModel.GetAktionen(); var count = aktionenDerUser.Count; if (count > 0) { var grpByAktion = aktionenDerUser.GroupBy(i => i.Value); var maxCount = grpByAktion.Max(grp => grp.Count()); var gewinnerAktionen = grpByAktion.Where(grp => (grp.Count() == maxCount)) .Select(grp => grp.Key) .ToDictionary(aktion => aktion, aktion => aktionen.FindAktion(aktion)); var verliehrerAktion = new AktionModel(string.Empty, 0, 0f, 0f, 0f, false); var nichtTeilnehmerAktion = new AktionModel(string.Empty, 0, 0f, 0f, 0f, false); var gewinnerAktion = new AktionModel(string.Empty, 0, 0f, 0f, 0f, false); var gesammtAktion = new AktionModel(string.Empty, 0, 0f, 0f, 0f, false); foreach (var aktuelleGewinnerAktion in gewinnerAktionen.Where(kv => (kv.Value is object) && (kv.Value.ForAll))) { nichtTeilnehmerAktion.AddGesammtTeilnehmer(aktuelleGewinnerAktion.Value !); verliehrerAktion.AddGesammtTeilnehmer(aktuelleGewinnerAktion.Value !); gewinnerAktion.AddGesammtTeilnehmer(aktuelleGewinnerAktion.Value !); } foreach (var aktuelleGewinnerAktion in gewinnerAktionen.Where(kv => (kv.Value is object) && (!kv.Value.ForAll))) { nichtTeilnehmerAktion.AddNichtTeilnehmer(aktuelleGewinnerAktion.Value !); verliehrerAktion.AddVerliehrer(aktuelleGewinnerAktion.Value !); gewinnerAktion.AddGewinner(aktuelleGewinnerAktion.Value !); } foreach (var kv in aktionProUser.ToList()) { var userId = kv.Key; IUserGrain userGrain = this.GrainFactory.GetGrain <IUserGrain>(userId); if (string.IsNullOrEmpty(kv.Value)) { await userGrain.GewinnVerteilung(nichtTeilnehmerAktion); } else if (gewinnerAktionen.TryGetValue(kv.Value, out var aktion)) { await userGrain.GewinnVerteilung(gewinnerAktion); } else { await userGrain.GewinnVerteilung(verliehrerAktion); } aktionProUser[userId] = string.Empty; } await this._Abstimmung.WriteStateAsync(); } }
public async Task KaufAktion(Guid userId, string aktion) { var aktionModel = AktionenModel.GetAktionen().Aktionen .FirstOrDefault(m => string.Equals(m.Name, aktion, StringComparison.Ordinal)); if (aktionModel is object) { var userModel = this._User.State; if (aktionModel.Level <= userModel.Money) { userModel.Money -= aktionModel.Level; if (aktionModel.ForAll) { userModel.Baumhaus.Add(aktionModel.Baumhaus, true); userModel.Berg.Add(aktionModel.Berg, true); userModel.Zelt.Add(aktionModel.Zelt, true); await this._User.WriteStateAsync(); var abstimmungGrain = this.GrainFactory.GetGrain <IAbstimmungGrain>(0); var allUserIds = await abstimmungGrain.GetUserIds(); foreach (var id in allUserIds) { if (id == userId) { continue; } else { var userGrain = this.GrainFactory.GetGrain <IUserGrain>(id); await userGrain.GewinnVerteilung(aktionModel); } } } else { userModel.Baumhaus.Add(aktionModel.Baumhaus, false); userModel.Berg.Add(aktionModel.Berg, false); userModel.Zelt.Add(aktionModel.Zelt, false); await this._User.WriteStateAsync(); } } } }