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); }
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"); } }
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; }