Пример #1
0
        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;
 }
Пример #3
0
        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);
                }
            }
        }