예제 #1
0
        private void CheckUsers()
        {
            var now   = Utils.Now();
            var users = _dbService.Collection <User>()
                        .Where(u => u.NotifyTime > 0 && u.NotifyTime < now)
                        .ToList();

            foreach (var user in users)
            {
                if (user.NotifyPathId <= 0)
                {
                    continue;
                }
                var path    = _pathService.PathFromId(user, user.NotifyPathId);
                var message = $"Время совершить шаг по пути: \"{path.Name}\"";

                // notify user
                _socialService.Notify(new [] { user.Id }, message);

                // clear notify time
                user.NotifyTime   = 0;
                user.NotifyPathId = 0;
                _dbService.Update(user);
            }
        }
예제 #2
0
        public Duel JoinDuel(string userId, string duelId, string image, string photoId)
        {
            // load user
            var user = _dbService.ById <User>(userId, false);
            // load duel
            var duel = _dbService.ById <Duel>(duelId);

            // check if duel doesnt exist or already has an opponent
            if (duel == null)
            {
                throw new InvalidOperationException("Дуэль удалена");
            }
            if (duel.Opponent != null)
            {
                throw new InvalidOperationException("Дуэль уже принята");
            }

            // check image
            if (photoId.Length > 300)
            {
                throw new ArgumentException("PhotoId is too long");
            }
            if (!_socialService.CheckImageUrl(image))
            {
                throw new ArgumentException("Image url is invalid");
            }
            // check if own
            if (duel.Creator.User.Id == userId)
            {
                throw new InvalidOperationException("This is your own duel");
            }

            // get current duel
            var currentDuel = _dbService.Collection <Duel>().FirstOrDefault(Duel.IsCurrentDuelOf(userId));

            if (currentDuel != null)
            {
                throw new InvalidOperationException("У вас уже есть текущая дуэль");
            }

            // create new duel object
            duel.Opponent = new Duellist
            {
                Image   = image,
                PhotoId = photoId,
                Time    = Utils.Now(),
                User    = user.ToMeta(),
                Voters  = new List <UserMeta>()
            };
            duel.Status     = DuelStatus.Started;
            duel.TimeStart  = Utils.Now();
            duel.TimeFinish = Utils.Now() + 24 * 3600000L;

            // notify creator
            _socialService.Notify(
                new[] { duel.Creator.User.Id },
                $"{user.Name} принял ваш вызов. К барьеру, господа! Зайдите, чтобы опубликовать голосование."
                );

            // write to db
            _dbService.Update(duel);

            // return
            return(duel);
        }