コード例 #1
0
        public async Task <SessionToken> BeginSessionAsync(AuthToken token, string clientVersion, string accessKey, bool isLocal)
        {
            var db   = dbProvider.Get();
            var game = await db.GameClient.FirstOrDefaultAsync(x => x.ClientVersion == clientVersion);

            var user = await db.User.FirstOrDefaultAsync(x => x.Id == token.UserId);

            if (game == null)
            {
                return(null);
            }

            if (game.AccessKey != accessKey)
            {
                return(null);
            }

            var userId        = token.UserId;
            var activeSession = await db.GameSession
                                .FirstOrDefaultAsync(
                x => x.UserId == userId && x.Status == (int)SessionStatus.Active);

            if (activeSession != null)
            {
                await EndSessionAsync(db, activeSession);
            }

            var newGameSession = new GameSession
            {
                Id      = Guid.NewGuid(),
                UserId  = userId,
                Status  = (int)SessionStatus.Active,
                Started = DateTime.UtcNow,
                Local   = isLocal
            };

            await db.GameSession.AddAsync(newGameSession);

            if (user.IsAdmin.GetValueOrDefault() || user.IsModerator.GetValueOrDefault())
            {
                var permissionEvent = new DataModels.GameEvent
                {
                    Id            = Guid.NewGuid(),
                    GameSession   = newGameSession,
                    GameSessionId = newGameSession.Id,
                    Type          = (int)GameEventType.PermissionChange,
                    Revision      = 1,
                    Data          = JSON.Stringify(new Permissions
                    {
                        IsAdministrator = user.IsAdmin ?? false,
                        IsModerator     = user.IsModerator ?? false
                    })
                };
                await db.GameEvent.AddAsync(permissionEvent);
            }

            await db.SaveChangesAsync();

            return(GenerateSessionToken(token, newGameSession));
        }
コード例 #2
0
ファイル: ModelMapper.cs プロジェクト: GreatisNate/RavenNest
 public static Models.GameEvent Map(DataModels.GameEvent data)
 {
     return(DataMapper.Map <Models.GameEvent, DataModels.GameEvent>(data));
 }
コード例 #3
0
        public async Task <bool> EndSessionAndRaidAsync(
            SessionToken token, string userIdOrUsername, bool isWarRaid)
        {
            var db = dbProvider.Get();

            var currentSession = await db.GameSession.Include(x => x.User).FirstOrDefaultAsync(x => x.Id == token.SessionId);

            if (currentSession == null)
            {
                return(false);
            }

            var user = await db.User.FirstOrDefaultAsync(x =>
                                                         x.UserId == userIdOrUsername || x.UserName.ToLower().Equals(userIdOrUsername));

            if (user == null)
            {
                //await EndSessionAsync(token);
                return(false);
            }

            var targetSession = await db.GameSession.FirstOrDefaultAsync(x =>
                                                                         x.UserId == user.Id && x.Status == (int)SessionStatus.Active);

            if (targetSession == null)
            {
                //await EndSessionAsync(token);
                return(false);
            }

            var revision  = 1;
            var lastEvent = await db.GameEvent.LastOrDefaultAsync(x => x.GameSessionId == targetSession.Id);

            if (lastEvent != null)
            {
                revision = lastEvent.Revision + 1;
            }

            var characters = await db.Character
                             .Include(x => x.User)
                             .Where(x => x.UserIdLock == currentSession.UserId && x.LastUsed != null && x.LastUsed >= currentSession.Started)
                             .OrderByDescending(x => x.LastUsed)
                             .ToListAsync();

            var ge = new DataModels.GameEvent
            {
                Id            = Guid.NewGuid(),
                GameSessionId = targetSession.Id,
                GameSession   = targetSession,
                Revision      = revision,
                Type          = isWarRaid
                    ? (int)GameEventType.WarRaid
                    : (int)GameEventType.Raid,
                Data = JsonConvert.SerializeObject(new
                {
                    RaiderUserName = currentSession.User.UserName,
                    RaiderUserId   = currentSession.User.UserId,
                    Players        = characters.Select(x => x.User.UserId).ToArray()
                })
            };

            await db.GameEvent.AddAsync(ge);

            await EndSessionAsync(token);

            await db.SaveChangesAsync();

            return(true);
        }