private void UpdateUserRaidJoinOrUpdateAttendance(User user, string raidID) { var raidCollection = DB.GetCollection <RaidParticipation>(); lock (RaidParticipation.Lock) { var raid = raidCollection.Find(x => x.PublicID == raidID).First(); var userSettings = UserSettings.GetOrCreateUserSettings(user, DB.GetCollection <UserSettings>()); raid.Rejected.RemoveAll(x => x.ID == user.ID); raid.Done.RemoveAll(x => x.ID == user.ID); raid.Maybe.RemoveAll(x => x.ID == user.ID); UserParticipation participation = null; // If the user's team changed, make sure their data is saved but their participation record // is removed from the 'wrong' faction. raid.Participants.ToList().ForEach(kvp => { participation = kvp.Value.Where(x => x.User.ID == user.ID).FirstOrDefault() ?? participation; kvp.Value.RemoveAll(x => x.User.ID == user.ID); }); // If there was no participation record, create an unlined record now. if (null == participation) { participation = new UserParticipation { User = user }; } // If the participation record was not in the correct list yet, add it and re-sort the list. if (!raid.Participants[userSettings.Team].Contains(participation)) { raid.Participants[userSettings.Team].Add(participation); raid.Participants[userSettings.Team].Sort((x, y) => string.Compare(x.User.DisplayName(), y.User.DisplayName())); } raidCollection.Update(raid); } }
public CommunicationUser(string userId, string email, string name, string userType, UserParticipation participation) { UserId = userId; Email = email; Name = name; UserType = userType; Participation = participation; }
public async Task <IActionResult> Join([FromQuery] string id, [FromQuery] string when, [FromQuery] int extra) { if (!_botHost.IsRunning) { return(JsonError(System.Net.HttpStatusCode.BadRequest, "Not started", "Not started")); } if (LoggedInUser == null || LoggedInUser.TelegramUserID == 0) { return(JsonError(System.Net.HttpStatusCode.BadRequest, "Registreer eerst bij de bot", "Registreer eerst bij de bot")); } var db = _botHost.Kernel.Get <Botje.DB.IDatabase>(); var logger = _botHost.Kernel.Get <Botje.Core.ILoggerFactory>().Create(typeof(RaidsController)); var raidParticipationCollection = db.GetCollection <RaidParticipation>(); var raid = raidParticipationCollection.Find(x => x.PublicID == id).SingleOrDefault(); if (null == raid) { return(JsonError(System.Net.HttpStatusCode.BadRequest, "Invalid ID", "Invalid ID")); } Team team = Team.Unknown; int level = -1; Botje.Messaging.Models.User user = GetTgUserForLoggedInUser(db, ref team, ref level); RemoveAnyAndAllCurrentParticipations(raid, user); var participation = new UserParticipation { User = user }; participation.Extra = extra; if (DateTime.TryParse(when ?? "", out DateTime whenAsDateTime)) { participation.UtcWhen = whenAsDateTime.ToUniversalTime(); } if (!raid.Participants[team].Contains(participation)) { raid.Participants[team].Add(participation); raid.Participants[team].Sort((x, y) => string.Compare(x.User.DisplayName(), y.User.DisplayName())); } raid.LastModificationTime = DateTime.UtcNow; raidParticipationCollection.Update(raid); logger.Info($"Got subscription for raid {raid.Raid.Raid} ({id}) at {raid.Raid.Gym} for {user.UsernameOrName()} (level: {level}, team: {team}) @ {when}, with {extra} extra players"); var result = raid.Adapt <McRaidDetails>(); return(new JsonResult(await Task.FromResult(result), JsonSettings)); }
/// <summary> /// Takes care that the user's participation type gets updated for the given raid. /// </summary> /// <param name="user"></param> /// <param name="raidID"></param> /// <param name="userParticipationType"></param> private void UpdateUserRaidParticipationType(User user, string raidID, UserParticipationType userParticipationType) { DbSet <RaidParticipation> raidParticipationCollection = this.DB.GetCollection <RaidParticipation>(); lock (RaidParticipation.Lock) { RaidParticipation raidParticipation = raidParticipationCollection.Find(rp => rp.PublicID == raidID).First(); UserSettings userSettings = UserSettings.GetOrCreateUserSettings(user, DB.GetCollection <UserSettings>()); UserParticipation userParticipation = raidParticipation.Participants[userSettings.Team].FirstOrDefault(rp => rp.User.ID == user.ID); if (userParticipation != null) { userParticipation.Type = userParticipationType; raidParticipationCollection.Update(raidParticipation); } } }