示例#1
0
        public async Task Connect(IShardSessionObserver observer, string shardName)
        {
            if (sessionObservers.Count != 0)
            {
                GetLogger().Warn($"session {this.GetPrimaryKey()} has {sessionObservers.Count} observers at the start of {nameof(Connect)}; expected 0");
            }

            ShardName = shardName;
            sessionObservers.Subscribe(observer);
            GetLogger().Info($"session {this.GetPrimaryKey()} connected");

            var random = GrainFactory.GetGrain <IRandomService>(0);

            do
            {
                seed = await random.GetRandomInt();
            } while (seed == 0);

            var randomNumber = await random.GetRandomBigInteger(32);

            var authChallenge = new AuthChallengeRequest()
            {
                Seed         = seed,
                RandomNumber = randomNumber,
            };

            await Send(authChallenge);
        }
示例#2
0
 protected override Task OnInitialize()
 {
     if (self == null)
     {
         self = GrainFactory.CreateObjectReference <IShardSessionObserver>(this).Result;
         return(ShardSession.Connect(self, shardName));
     }
     else
     {
         throw new InvalidOperationException("cannot initialize more than once");
     }
 }
示例#3
0
        public async Task Disconnect(IShardSessionObserver observer)
        {
            sessionObservers.Unsubscribe(observer);
            seed = 0;
            GetLogger().Info($"session {this.GetPrimaryKey()} disconnected");

            if (ActiveCharacter != null)
            {
                await ActiveCharacter.Logout();

                ActiveCharacter = null;
            }

            AuthenticatedIdentity = null;
            ShardName             = null;
        }