Ejemplo n.º 1
0
        public async Task <SessionToken> BeginSessionAsync(
            AuthToken token,
            string clientVersion,
            string accessKey,
            bool isLocal,
            float syncTime)
        {
            var game = gameData.Client;
            var user = gameData.GetUser(token.UserId);

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

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

            var userId        = token.UserId;
            var activeSession = gameData.GetUserSession(userId);

            // x => x.UserId == userId && x.Status == (int)SessionStatus.Active

            if (activeSession != null)
            {
                EndSession(activeSession);
            }

            var newGameSession = gameData.CreateSession(userId);

            gameData.Add(newGameSession);

            var sessionState = gameData.GetSessionState(newGameSession.Id);

            sessionState.SyncTime = syncTime;

            var isAdmin     = user.IsAdmin.GetValueOrDefault();
            var isModerator = user.IsModerator.GetValueOrDefault();
            var subInfo     = await twitchClient.GetSubscriberAsync(user.UserId);

            var subscriptionTier   = 0;
            var expMultiplierLimit = 0;

            if (subInfo != null && int.TryParse(subInfo.Tier, out subscriptionTier))
            {
                subscriptionTier  /= 1000;
                expMultiplierLimit = subscriptionTier == 1 ? 10 : (subscriptionTier - 1) * 25;
            }
            if (isModerator)
            {
                subscriptionTier   = 3;
                expMultiplierLimit = 50;
            }
            if (isAdmin)
            {
                subscriptionTier   = 3;
                expMultiplierLimit = 5000;
            }
            if (isAdmin || isModerator || subInfo != null)
            {
                var permissionEvent = gameData.CreateSessionEvent(
                    GameEventType.PermissionChange,
                    newGameSession,
                    new Permissions
                {
                    IsAdministrator    = user.IsAdmin ?? false,
                    IsModerator        = user.IsModerator ?? false,
                    SubscriberTier     = subscriptionTier,
                    ExpMultiplierLimit = expMultiplierLimit,
                });

                gameData.Add(permissionEvent);
            }

            var village          = gameData.GetOrCreateVillageBySession(newGameSession);
            var villageHouses    = gameData.GetOrCreateVillageHouses(village);
            var villageInfoEvent = gameData.CreateSessionEvent(
                GameEventType.VillageInfo,
                newGameSession,
                new VillageInfo
            {
                Name       = village.Name,
                Level      = village.Level,
                Experience = village.Experience,
                Houses     = villageHouses.Select(x =>
                                                  new VillageHouseInfo
                {
                    Owner = x.UserId != null
                               ? gameData.GetUser(x.UserId.Value).UserId
                               : null,
                    Slot = x.Slot,
                    Type = x.Type
                }
                                                  ).ToList()
            }
                );

            gameData.Add(villageInfoEvent);

            return(GenerateSessionToken(token, newGameSession));
        }
Ejemplo n.º 2
0
        public async Task <SessionToken> BeginSessionAsync(
            AuthToken token,
            string clientVersion,
            string accessKey,
            bool isLocal,
            float syncTime)
        {
            var game = gameData.Client;
            var user = gameData.GetUser(token.UserId);

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

            if (game.AccessKey != accessKey)
            {
                //logger.LogError("Unable to start session for user: "******", client version: {clientVersion}, accessKey: {accessKey}");
                return(null);
            }

            if (clientVersion.ToLower() != game.ClientVersion.ToLower())
            {
                var expectedVersionStr = game.ClientVersion.Replace("a", "");
                var clientVersionStr   = clientVersion.Replace("a", "");
                if (!Version.TryParse(clientVersionStr, out var version) || !Version.TryParse(expectedVersionStr, out var expectedVersion) || version < expectedVersion)
                {
                    //logger.LogError("Unable to start session for user: "******", client version: {clientVersion}, accessKey: {accessKey}");
                    return(null); // new SessionToken();
                }
            }

            var userId = token.UserId;

            gameData.ClearAllCharacterSessionStates(userId);

            var activeSession = gameData.GetSessionByUserId(userId);
            // x => x.UserId == userId && x.Status == (int)SessionStatus.Active
            var oldSessionExpired = false;
            var oldSession        = activeSession;

            if (activeSession != null)
            {
                oldSessionExpired = DateTime.UtcNow - activeSession.Updated.GetValueOrDefault() >= TimeSpan.FromMinutes(30);
                if (oldSessionExpired)
                {
                    activeSession.Status  = (int)SessionStatus.Inactive;
                    activeSession.Stopped = DateTime.UtcNow;
                    activeSession         = null;
                }
            }

            var newGameSession = activeSession ?? gameData.CreateSession(userId);

            if (activeSession == null)
            {
                gameData.Add(newGameSession);
            }

            if (oldSession != null && !oldSessionExpired)
            {
                logger.LogError("BeginSessionAsync was called while an existing session is active. User: "******". Previous players will not be cleared.");
            }
            else
            {
                var activeChars = gameData.GetSessionCharacters(newGameSession);
                if (activeChars != null)
                {
                    foreach (var c in activeChars)
                    {
                        c.UserIdLock = null;
                    }
                }
                //#if DEBUG
                //                logger.LogDebug(user.UserName + " game session started. " + activeChars.Count + " characters cleared.");
                //#endif
            }

            newGameSession.Revision = 0;

            var sessionState = gameData.GetSessionState(newGameSession.Id);

            sessionState.SyncTime      = syncTime;
            sessionState.ClientVersion = clientVersion;

            SendPermissionData(newGameSession, user);
            SendVillageInfo(newGameSession);

            return(GenerateSessionToken(token, user, newGameSession, clientVersion));
        }