public override void Logon(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.authentication.LogonRequest request, Action<bnet.protocol.authentication.LogonResponse> done) { Logger.Trace("LogonRequest(); Email={0}", request.Email); // we should be also checking here version, program, locale and similar stuff /raist. AuthManager.StartAuthentication(this.Client, request); var authenticationThread = new Thread(() => { this.Client.AuthenticationCompleteSignal.WaitOne(); // wait the signal; if(this.Client.AuthenticationErrorCode != MooNetClient.AuthenticationErrorCodes.None) { Logger.Info("Authentication failed for {0} because of invalid credentals.", request.Email); done(bnet.protocol.authentication.LogonResponse.DefaultInstance); return; } Logger.Info("User {0} authenticated successfuly.", request.Email); var builder = bnet.protocol.authentication.LogonResponse. CreateBuilder() .SetAccount(Client.Account.BnetAccountID) .SetGameAccount(Client.Account.BnetGameAccountID); done(builder.Build()); PlayerManager.PlayerConnected(this.Client); }) { IsBackground = true, CurrentCulture = CultureInfo.InvariantCulture }; ; authenticationThread.Start(); }
public override void SubscribeToFollowers(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.followers.SubscribeToFollowersRequest request, System.Action<bnet.protocol.followers.SubscribeToFollowersResponse> done) { Logger.Trace("Subscribe() {0}", this.Client); var builder = bnet.protocol.followers.SubscribeToFollowersResponse.CreateBuilder(); done(builder.Build()); }
public override void SubscribeToUserManager(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.user_manager.SubscribeToUserManagerRequest request, System.Action<bnet.protocol.user_manager.SubscribeToUserManagerResponse> done) { Logger.Trace("Subscribe() {0}", this.Client); // temp hack: send him all online players on server where he should be normally get list of player he met in his last few games /raist. var builder = bnet.protocol.user_manager.SubscribeToUserManagerResponse.CreateBuilder(); uint i = 0; foreach (var client in PlayerManager.OnlinePlayers) { if (client == this.Client) continue; // Don't add the requester to the list if (client.Account.CurrentGameAccount.CurrentToon == null) continue; Logger.Debug("RecentPlayer => " + client.Account.CurrentGameAccount.CurrentToon); var recentPlayer = bnet.protocol.user_manager.RecentPlayer.CreateBuilder() .SetEntity(client.Account.BnetEntityId) .SetProgramId("D3") .AddAttributes(bnet.protocol.attribute.Attribute.CreateBuilder() .SetName("GameAccountEntityId") .SetValue(bnet.protocol.attribute.Variant.CreateBuilder() .SetMessageValue(client.Account.CurrentGameAccount.D3GameAccountId.ToByteString()) .Build()) .Build()) .SetId(i++) .Build(); builder.AddRecentPlayers(recentPlayer); } done(builder.Build()); }
public override void Unsubscribe(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.presence.UnsubscribeRequest request, System.Action<bnet.protocol.NoData> done) { Logger.Trace("Unsubscribe()"); //Logger.Debug("request:\n{0}", request.ToString()); var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }
public void ParseCommand(bnet.protocol.notification.Notification request, MooNetClient client) { if (request.Type != "WHISPER") return; if (request.AttributeCount <= 0 || !request.AttributeList[0].HasValue) return; CommandManager.TryParse(request.AttributeList[0].Value.StringValue, client, CommandManager.RespondOver.Whisper); }
public override void SendInvitation(IRpcController controller, bnet.protocol.invitation.SendInvitationRequest request, Action<bnet.protocol.NoData> done) { // somehow protobuf lib doesnt handle this extension, so we're using a workaround to get that channelinfo. var extensionBytes = request.UnknownFields.FieldDictionary[103].LengthDelimitedList[0].ToByteArray(); var friendRequest = bnet.protocol.friends.SendInvitationRequest.ParseFrom(extensionBytes); if (friendRequest.TargetEmail.ToLower() == this.Client.Account.Email.ToLower()) return; // don't allow him to invite himself - and we should actually return an error! // also he shouldn't be allowed to invite his current friends - put that check too!. /raist var inviteee = AccountManager.GetAccountByEmail(friendRequest.TargetEmail); if (inviteee == null) return; // we need send an error response here /raist. Logger.Trace("{0} sent {1} friend invitation.", this.Client.Account, inviteee); var invitation = bnet.protocol.invitation.Invitation.CreateBuilder() .SetId(FriendManager.InvitationIdCounter++) // we may actually need to store invitation ids in database with the actual invitation there. /raist. .SetInviterIdentity(this.Client.GetIdentity(true, false, false)) .SetInviterName(this.Client.Account.Email) // we shoulde be instead using account owner's name here. .SetInviteeIdentity(bnet.protocol.Identity.CreateBuilder().SetAccountId(inviteee.BnetAccountID)) .SetInviteeName(inviteee.Email) // again we should be instead using invitee's name. .SetInvitationMessage(request.InvitationMessage) .SetCreationTime(DateTime.Now.ToUnixTime()) .SetExpirationTime(86400); // Response is bnet.protocol.NoData as of 7728. /raist. //var response = bnet.protocol.invitation.SendInvitationResponse.CreateBuilder() // .SetInvitation(invitation.Clone()); var response = bnet.protocol.NoData.CreateBuilder(); done(response.Build()); // notify the invitee on invitation. FriendManager.HandleInvitation(this.Client, invitation.Build()); }
public override void SendNotification(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.notification.Notification request, Action<bnet.protocol.NoData> done) { switch (request.GetNotificationType()) { case NotificationTypeHelper.NotificationType.Whisper: // NOTE: Real implementation doesn't even handle the situation where neither client knows about the other. // Client requires prior knowledge of sender and target (and even then it cannot whisper by using the /whisper command). Logger.Trace(string.Format("NotificationRequest.Whisper by {0} to {1}", this.Client.CurrentToon, ToonManager.GetToonByLowID(request.TargetId.Low))); var targetAccount = ToonManager.GetOwnerAccountByToonLowId(request.TargetId.Low); if (targetAccount.LoggedInClient == null) return; if (targetAccount == this.Client.Account) // check if whisper targets the account itself. CommandManager.TryParse(request.AttributeList[0].Value.StringValue, this.Client); // try parsing it as a command and respond it if so. else { var notification = bnet.protocol.notification.Notification.CreateBuilder(request) .SetSenderId(this.Client.CurrentToon.BnetEntityID) .Build(); targetAccount.LoggedInClient.MakeRPC(() => bnet.protocol.notification.NotificationListener.CreateStub(targetAccount.LoggedInClient).OnNotificationReceived(controller, notification, callback => { })); } break; default: Logger.Warn("Unhandled notification type: {0}", request.Type); break; } var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }
public override void Unsubscribe(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.presence.UnsubscribeRequest request, System.Action<bnet.protocol.NoData> done) { switch (request.EntityId.GetHighIdType()) { case EntityIdHelper.HighIdType.AccountId: var account = AccountManager.GetAccountByPersistentID(request.EntityId.Low); // The client will probably make sure it doesn't unsubscribe to a null ID, but just to make sure.. if (account != null) { account.RemoveSubscriber(this.Client); Logger.Trace("Unsubscribe() {0} {1}", this.Client, account); } break; case EntityIdHelper.HighIdType.GameAccountId: var gameaccount = GameAccountManager.GetAccountByPersistentID(request.EntityId.Low); if (gameaccount != null) { gameaccount.RemoveSubscriber(this.Client); Logger.Trace("Unsubscribe() {0} {1}", this.Client, gameaccount); } break; default: Logger.Warn("Recieved an unhandled Presence.Unsubscribe request with type {0} (0x{1})", request.EntityId.GetHighIdType(), request.EntityId.High.ToString("X16")); break; } var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }
public override void SendInvitation(IRpcController controller, bnet.protocol.invitation.SendInvitationRequest request, Action<SendInvitationResponse> done) { Logger.Trace("SendInvitation() Stub"); //TODO: Set these to the corect values. const ulong accountHandle = 0x0000000000000000; const ulong gameAccountHandle = 0x0000000000000000; var invitation = bnet.protocol.invitation.Invitation.CreateBuilder() .SetCreationTime(DateTime.Now.ToUnixTime()) .SetExpirationTime(request.ExpirationTime) .SetId(0) .SetInvitationMessage(request.InvitationMessage) .SetInviteeIdentity(bnet.protocol.Identity.CreateBuilder() .SetAccountId(bnet.protocol.EntityId.CreateBuilder().SetHigh(accountHandle).SetLow(0x1).Build()) //TODO: Change SetLow to an actual index in the database. .SetGameAccountId(bnet.protocol.EntityId.CreateBuilder().SetHigh(gameAccountHandle).SetLow(0x1).Build()) //TODO: Change SetLow to an actual index in the database. .Build()) .SetInviteeName("FriendName") //TODO: Set this to the name retrieved from the database. .SetInviterIdentity(bnet.protocol.Identity.CreateBuilder() .SetAccountId(bnet.protocol.EntityId.CreateBuilder().SetHigh(accountHandle).SetLow(0x0).Build()) //TODO: Change SetLow to an actual index in the database. .SetGameAccountId(bnet.protocol.EntityId.CreateBuilder().SetHigh(gameAccountHandle).SetLow(0x0).Build()) //TODO: Change SetLow to an actual index in the database. .Build()) .SetInviterName("YourName") //TODO: Set this to the name retrieved from the database. .Build(); var builder = bnet.protocol.invitation.SendInvitationResponse.CreateBuilder().SetInvitation(invitation); done(builder.Build()); }
public void Revoke(MooNetClient client, bnet.protocol.channel_invitation.RevokeInvitationRequest request) { if (!this._onGoingInvitations.ContainsKey(request.InvitationId)) return; var invitation = this._onGoingInvitations[request.InvitationId]; //notify inviter about revoke var updateChannelNotification = bnet.protocol.channel.UpdateChannelStateNotification.CreateBuilder() .SetAgentId(bnet.protocol.EntityId.CreateBuilder().SetHigh(0).SetLow(0)) // caps have this set to high: 0 low: 0 /dustin .SetStateChange(bnet.protocol.channel.ChannelState.CreateBuilder() .AddInvitation(invitation) .SetReason((uint)InvitationRemoveReason.Revoked)); this._onGoingInvitations.Remove(request.InvitationId); client.MakeTargetedRPC(client.CurrentChannel, () => bnet.protocol.channel.ChannelSubscriber.CreateStub(client).NotifyUpdateChannelState(null, updateChannelNotification.Build(), callback => { })); //notify invitee about revoke var invitationRemoved = bnet.protocol.channel_invitation.InvitationRemovedNotification.CreateBuilder() .SetInvitation(invitation) .SetReason((uint)InvitationRemoveReason.Revoked); var invitee = ToonManager.GetToonByLowID(invitation.InviteeIdentity.ToonId.Low); invitee.Owner.LoggedInClient.MakeTargetedRPC(this, () => bnet.protocol.channel_invitation.ChannelInvitationNotify.CreateStub(invitee.Owner.LoggedInClient).NotifyReceivedInvitationRemoved(null, invitationRemoved.Build(), callback => { })); }
public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.presence.SubscribeRequest request, System.Action<bnet.protocol.NoData> done) { switch (request.EntityId.GetHighIdType()) { case EntityIdHelper.HighIdType.AccountId: var account = AccountManager.GetAccountByPersistentID(request.EntityId.Low); if (account != null) { Logger.Trace("Subscribe() {0} {1}", this.Client, account); account.AddSubscriber(this.Client, request.ObjectId); } break; case EntityIdHelper.HighIdType.GameAccountId: var gameaccount = GameAccountManager.GetAccountByPersistentID(request.EntityId.Low); if (gameaccount != null) { Logger.Trace("Subscribe() {0} {1}", this.Client, gameaccount); gameaccount.AddSubscriber(this.Client, request.ObjectId); } break; default: Logger.Warn("Recieved an unhandled Presence.Subscribe request with type {0} (0x{1})", request.EntityId.GetHighIdType(), request.EntityId.High.ToString("X16")); break; } var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }
public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.presence.SubscribeRequest request, System.Action<bnet.protocol.NoData> done) { switch (request.EntityId.GetHighIdType()) { case EntityIdHelper.HighIdType.AccountId: var account = AccountManager.GetAccountByPersistentID(request.EntityId.Low); if (account != null) { Logger.Trace("Subscribe() {0} {1}", this.Client, account); account.AddSubscriber(this.Client, request.ObjectId); } break; case EntityIdHelper.HighIdType.ToonId: var toon = ToonManager.GetToonByLowID(request.EntityId.Low); if (toon != null) { Logger.Trace("Subscribe() {0} {1}", this.Client, toon); toon.AddSubscriber(this.Client, request.ObjectId); // The client will send us a Subscribe with ToonId of 0 the first time it tries to create a toon with a name that already exists. Let's handle that here. } break; default: Logger.Warn("Recieved an unhandled Presence.Subscribe request with type {0}", request.EntityId.GetHighIdType()); break; } var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }
public override void SendNotification(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.notification.Notification request, Action<bnet.protocol.NoData> done) { switch (request.GetNotificationType()) { case NotificationTypeHelper.NotificationType.Whisper: // NOTE: Real implementation doesn't even handle the situation where neither client knows about the other. // Client requires prior knowledge of sender and target (and even then it cannot whisper by using the /whisper command). Logger.Trace(string.Format("NotificationRequest.Whisper by {0} to {1}", this.Client.CurrentToon, ToonManager.GetToonByLowID(request.TargetId.Low))); var account = ToonManager.GetOwnerAccountByToonLowId(request.TargetId.Low); if (account.LoggedInClient == null) return; if (account is CommandHandlerAccount) // hackish way to enable server commands for players that are not in party. CommandHandlerAccount.Instance.ParseCommand(request, this.Client); else { var notification = bnet.protocol.notification.Notification.CreateBuilder(request) .SetSenderId(this.Client.CurrentToon.BnetEntityID) .Build(); account.LoggedInClient.MakeRPC(() => bnet.protocol.notification.NotificationListener.CreateStub(account.LoggedInClient). OnNotificationReceived(controller, notification, callback => { })); } break; default: Logger.Warn("Unhandled notification type: {0}", request.Type); break; } var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }
public override void SendNotification(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.notification.Notification request, Action<bnet.protocol.NoData> done) { Logger.Trace("SendNotification()"); //Logger.Debug("notification:\n{0}", request.ToString()); switch (request.GetNotificationType()) { case NotificationTypeHelper.NotificationType.Whisper: // NOTE: Real implementation doesn't even handle the situation where neither client knows about the other. // Client requires prior knowledge of sender and target (and even then it cannot whisper by using the /whisper command). Logger.Trace(string.Format("NotificationRequest by {0} to {1}", this.Client.CurrentToon, ToonManager.GetToonByLowID(request.TargetId.Low))); var account = ToonManager.GetOwnerAccountByToonLowId(request.TargetId.Low); if (account.LoggedInClient == null) return; var notification = bnet.protocol.notification.Notification.CreateBuilder(request) .SetSenderId(this.Client.CurrentToon.BnetEntityID) .Build(); var method = bnet.protocol.notification.NotificationListener.Descriptor.FindMethodByName("OnNotificationReceived"); account.LoggedInClient.CallMethod(method, notification); break; default: Logger.Warn("Unhandled notification type: {0}", request.Type); break; } var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }
public override void Unsubscribe(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.presence.UnsubscribeRequest request, System.Action<bnet.protocol.NoData> done) { Logger.Trace("Unsubscribe()"); Logger.Debug("request:\n{0}", request.ToString()); switch (request.EntityId.GetHighIdType()) { case EntityIdHelper.HighIdType.AccountId: var account = AccountManager.GetAccountByEntityID(request.EntityId); // The client will probably make sure it doesn't unsubscribe to a null ID, but just to make sure.. if (account != null) account.RemoveSubscriber((MooNetClient)this.Client); break; case EntityIdHelper.HighIdType.ToonId: var toon = ToonManager.GetToonByLowID(request.EntityId.Low); if (toon != null) toon.RemoveSubscriber((MooNetClient)this.Client); break; default: Logger.Warn("Recieved an unhandled Presence.Unsubscribe request with type {0}", request.EntityId.GetHighIdType()); break; } var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }
public void Revoke(MooNetClient client, bnet.protocol.channel_invitation.RevokeInvitationRequest request) { if (!this._onGoingInvitations.ContainsKey(request.InvitationId)) return; this._onGoingInvitations.Remove(request.InvitationId); //TODO: We should be also notifying invitee somehow /raist }
private static void InitAuthentication(MooNetClient client, bnet.protocol.authentication.LogonRequest request) { var account = AccountManager.GetAccountByEmail(request.Email); // check if account exists. if (account == null) // we should be returning an error to client /raist. { client.AuthenticationErrorCode = AuthenticationErrorCodes.NoGameAccount; client.AuthenticationCompleteSignal.Set(); return; } var srp6a = new SRP6a(account); // create srp6 handler to process the authentication. OngoingAuthentications.Add(client, srp6a); // request client to load password.dll for authentication. var moduleLoadRequest = bnet.protocol.authentication.ModuleLoadRequest.CreateBuilder() .SetModuleHandle(bnet.protocol.ContentHandle.CreateBuilder() .SetRegion(0x00005553) // us .SetUsage(0x61757468) // auth - password.dll .SetHash(ByteString.CopyFrom(ModuleHash))) .SetMessage(ByteString.CopyFrom(srp6a.LogonChallenge)) .Build(); client.MakeRPCWithListenerId(request.ListenerId, () => bnet.protocol.authentication.AuthenticationClient.CreateStub(client).ModuleLoad(null, moduleLoadRequest, ModuleLoadResponse)); }
public override void SubscribeToFriends(IRpcController controller, bnet.protocol.friends.SubscribeToFriendsRequest request, Action<bnet.protocol.friends.SubscribeToFriendsResponse> done) { Logger.Trace("Subscribe() {0}", this.Client); FriendManager.Instance.AddSubscriber(this.Client, request.ObjectId); var builder = bnet.protocol.friends.SubscribeToFriendsResponse.CreateBuilder() .SetMaxFriends(127) .SetMaxReceivedInvitations(127) .SetMaxSentInvitations(127) .AddRole(bnet.protocol.Role.CreateBuilder().SetId(1).SetName("battle_tag_friend").Build()) .AddRole(bnet.protocol.Role.CreateBuilder().SetId(2).SetName("real_id_friend").Build()); foreach (var friend in FriendManager.Friends[this.Client.Account.BnetEntityId.Low]) // send friends list. { builder.AddFriends(friend); } var invitations = new List<bnet.protocol.invitation.Invitation>(); foreach (var invitation in FriendManager.OnGoingInvitations.Values) { if (invitation.InviteeIdentity.AccountId == this.Client.Account.BnetEntityId) { invitations.Add(invitation); } } if (invitations.Count > 0) builder.AddRangeReceivedInvitations(invitations); done(builder.Build()); }
public override void Bind(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.connection.BindRequest request, Action<bnet.protocol.connection.BindResponse> done) { Logger.Trace("Bind(): {0}", this.Client); var requestedServiceIDs = new List<uint>(); foreach (var serviceHash in request.ImportedServiceHashList) { var serviceID = Service.GetByHash(serviceHash); requestedServiceIDs.Add(serviceID); Logger.Trace("[export] Hash: 0x{0} Id: 0x{1} Service: {2} ", serviceHash.ToString("X8"),serviceID.ToString("X2"), Service.GetByID(serviceID) != null ? Service.GetByID(serviceID).GetType().Name : "N/A"); } // read services supplied by client.. foreach (var service in request.ExportedServiceList.Where(service => !Client.Services.ContainsValue(service.Id))) { if (Client.Services.ContainsKey(service.Hash)) continue; Client.Services.Add(service.Hash, service.Id); Logger.Trace(string.Format("[import] Hash: 0x{0} Id: 0x{1}", service.Hash.ToString("X8"), service.Id.ToString("X2"))); } var builder = bnet.protocol.connection.BindResponse.CreateBuilder(); foreach (var serviceId in requestedServiceIDs) builder.AddImportedServiceId(serviceId); done(builder.Build()); }
public override void ListFactories(IRpcController controller, bnet.protocol.game_master.ListFactoriesRequest request, Action<bnet.protocol.game_master.ListFactoriesResponse> done) { Logger.Trace("ListFactories() {0}", this.Client); var description = bnet.protocol.game_master.GameFactoryDescription.CreateBuilder().SetId(14249086168335147635); var attributes = new bnet.protocol.attribute.Attribute[4] { bnet.protocol.attribute.Attribute.CreateBuilder().SetName("min_players").SetValue(bnet.protocol.attribute.Variant.CreateBuilder().SetIntValue(2)).Build(), bnet.protocol.attribute.Attribute.CreateBuilder().SetName("max_players").SetValue(bnet.protocol.attribute.Variant.CreateBuilder().SetIntValue(4)).Build(), bnet.protocol.attribute.Attribute.CreateBuilder().SetName("num_teams").SetValue(bnet.protocol.attribute.Variant.CreateBuilder().SetIntValue(1)).Build(), bnet.protocol.attribute.Attribute.CreateBuilder().SetName("version").SetValue(bnet.protocol.attribute.Variant.CreateBuilder().SetStringValue("0.3.1")).Build() //This should be a static string so all versions are the same -Egris }; description.AddRangeAttribute(attributes); description.AddStatsBucket(bnet.protocol.game_master.GameStatsBucket.CreateBuilder() .SetBucketMin(0) .SetBucketMax(4267296) .SetWaitMilliseconds(1354) .SetGamesPerHour(0) .SetActiveGames(69) .SetActivePlayers(75) .SetFormingGames(5) .SetWaitingPlayers(0).Build()); var builder = bnet.protocol.game_master.ListFactoriesResponse.CreateBuilder().AddDescription(description).SetTotalResults(1); done(builder.Build()); }
public override void FindChannel(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel.FindChannelRequest request, System.Action<bnet.protocol.channel.FindChannelResponse> done) { Logger.Trace("FindChannel(): Filter={0}", request.Filter); var builder = bnet.protocol.channel.FindChannelResponse.CreateBuilder(); done(builder.Build()); }
public override void AcceptInvitation(IRpcController controller, bnet.protocol.invitation.GenericRequest request, Action<bnet.protocol.NoData> done) { var response = bnet.protocol.NoData.CreateBuilder(); done(response.Build()); FriendManager.HandleAccept(this.Client, request); }
private static void InitAuthentication(MooNetClient client, bnet.protocol.authentication.LogonRequest request) { client.LoginEmail = request.Email; var account = AccountManager.GetAccountByEmail(request.Email.ToLower()); // check if account exists. if (account == null) // we should be returning an error to client /raist. { client.AuthenticationErrorCode = AuthenticationErrorCodes.NoGameAccount; client.AuthenticationComplete(); return; } var thumbprintData = "f9513183031b3836103ac3a3bb606c0e06fd3b94ae4a6b6e405844085b794e901b0ebb1db650b85bac4b489a38a1ca9dcef2bbd13445d0cd85accfc62d84bc3a8d960b1a7a65cd8d3f72a172f41dca98459015ffbd25d766b02824a42dacb7c4cd64f4b3b9e316de23ec1dbb0153b73a4fa58ffb39c3f484b4b478a660dc8979e16e52f978a0ca2fc4184fa0f69844d73ef99f47e3ccb02cf6a636b4ae9513404eee7e0ad536dcef50cd1699e38195e6afdd3655a3a3529b4e52b33ac5d04f5fa2b15536a2c782c89c0acf133e14eac15af035abf5e44e9e1124a3397dac8f90a4ccb1717540698869fc1ba9037e099d68698ecf17ffdd36f07013176be24269fda1e5d221708181d95474fc1d74bb901062a9f6a3e24aef79e9d583d9126796d63c153a0f75f02da27ecc0971f39a46ec29087c3ae474e08fdf8f65d1445b293399bc495ff651b7d2d7a36216ba5e4400ea7bbc884dc4cf3ed27f14501b8bb7fc0f86b5089880e6889bcd851153e299a337d6c945f710559595e351995341cbef44abac379cf0f845b362d294eec390d50f1a50089d250eae1b1205cea1aff514de076516f467cd077a1fbb759b415dc6c0ea1617f31f7d764a0d60d5b67aa82b4202b2a9455eb9ca3683955ec45aaf56aba42a2f3ae9be5f3eed093a6601816d00e0569bfcb91fb7843945336c99757812d373d510d25744f9480b6cc87e8a".ToByteArray(); var srp6a = new SRP6a(account); // create srp6 handler to process the authentication. OngoingAuthentications.Add(client, srp6a); // request client to load thumbprint.dll for authentication. var moduleLoadRequest = bnet.protocol.authentication.ModuleLoadRequest.CreateBuilder() .SetModuleHandle(bnet.protocol.ContentHandle.CreateBuilder() .SetRegion(0x00005858) // XX .SetUsage(0x61757468) // auth - thumbprint.dll .SetHash(ByteString.CopyFrom(VersionInfo.MooNet.ThumbprintHashMap[client.Platform]))) .SetMessage(ByteString.CopyFrom(thumbprintData)) .Build(); client.ThumbprintReq = true; client.MakeRPC(() => bnet.protocol.authentication.AuthenticationClient.CreateStub(client).ModuleLoad(null, moduleLoadRequest, callback => { })); }
public static GameFactory CreateGame(MooNetClient owner, bnet.protocol.game_master.FindGameRequest request, ulong requestId) { var gameFactory = new GameFactory(owner, request, requestId); GameCreators.Add(gameFactory.DynamicId, gameFactory); ChannelManager.AddGameChannel(gameFactory); return gameFactory; }
public GameFactory(MooNetClient owner, bnet.protocol.game_master.FindGameRequest request, ulong requestId) : base(owner, true) { this.Started = false; this.Owner = owner; //Game is really the owner Channel.Owner should maybe be EntityId instead of MooNetClient -Egris this.RequestId = requestId; this.FactoryID = request.FactoryId; this.BnetEntityId = bnet.protocol.EntityId.CreateBuilder().SetHigh((ulong)EntityIdHelper.HighIdType.GameId).SetLow(this.DynamicId).Build(); this.GameHandle = bnet.protocol.game_master.GameHandle.CreateBuilder().SetFactoryId(this.FactoryID).SetGameId(this.BnetEntityId).Build(); foreach (bnet.protocol.attribute.Attribute attribute in request.Properties.CreationAttributesList) { if (attribute.Name != "GameCreateParams") Logger.Warn("FindGame(): Unknown CreationAttribute: {0}", attribute.Name); else this.GameCreateParams = D3.OnlineService.GameCreateParams.ParseFrom(attribute.Value.MessageValue); } foreach (bnet.protocol.attribute.Attribute attribute in request.Properties.Filter.AttributeList) { if (attribute.Name != "version") Logger.Warn("FindGame(): Unknown Attribute: {0}", attribute.Name); else this.Version = attribute.Value.StringValue; } }
public override void JoinChannel(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel.JoinChannelRequest request, System.Action<bnet.protocol.channel.JoinChannelResponse> done) { Logger.Trace("JoinChannel()"); var builder = bnet.protocol.channel.JoinChannelResponse.CreateBuilder().SetObjectId(67122); // should be fixed with the actual joined channel object id. done(builder.Build()); }
public override void Execute(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.storage.ExecuteRequest request, System.Action<bnet.protocol.storage.ExecuteResponse> done) { Logger.Trace("Execute() {0}", this.Client); bnet.protocol.storage.ExecuteResponse response = null; switch (request.QueryName) { case "GetGameAccountSettings": response = GameAccountSettings(request); break; case "LoadAccountDigest": response = LoadAccountDigest(Client, request); break; case "GetHeroDigests": response = GetHeroDigest(Client, request); break; case "GetToonSettings": response = GetToonSettings(request); break; default: Logger.Warn("Unhandled query: {0}", request.QueryName); response = bnet.protocol.storage.ExecuteResponse.CreateBuilder().Build(); break; } done(response); }
public Member(bnet.protocol.Identity identity, Privilege privs, params Role[] roles) { this.Identity = identity; this.Privileges = privs; this.Roles = new List<Role>(); AddRoles(roles); }
public static void HandleInvitation(MooNetClient client, bnet.protocol.invitation.Invitation invitation) { var invitee = AccountManager.GetAccountByPersistentID(invitation.InviteeIdentity.AccountId.Low); //var invitee = Instance.Subscribers.FirstOrDefault(subscriber => subscriber.Account.BnetEntityId.Low == invitation.InviteeIdentity.AccountId.Low); if (invitee == null) return; // if we can't find invite just return - though we should actually check for it until expiration time and store this in database. //Check for duplicate invites foreach (var oldInvite in OnGoingInvitations.Values) { if ((oldInvite.InviteeIdentity.AccountId == invitation.InviteeIdentity.AccountId) && (oldInvite.InviterIdentity.AccountId == invitation.InviterIdentity.AccountId)) return; } OnGoingInvitations.Add(invitation.Id, invitation); // track ongoing invitations so we can tranport it forth and back. if (invitee.IsOnline) { var inviter = AccountManager.GetAccountByPersistentID(invitation.InviterIdentity.AccountId.Low); var notification = bnet.protocol.friends.InvitationNotification.CreateBuilder().SetInvitation(invitation).SetGameAccountId(inviter.CurrentGameAccount.BnetEntityId); invitee.CurrentGameAccount.LoggedInClient.MakeTargetedRPC(FriendManager.Instance, () => bnet.protocol.friends.FriendsNotify.CreateStub(invitee.CurrentGameAccount.LoggedInClient).NotifyReceivedInvitationAdded(null, notification.Build(), callback => { })); } }
public override void SendReport(IRpcController controller, bnet.protocol.report.SendReportRequest request, Action<bnet.protocol.NoData> done) { Logger.Trace("SendReport()"); var report = request.Report; //TODO: Store reports against accounts foreach (var attribute in report.AttributeList) { switch (attribute.Name) { case "target_toon_id": //uint GameAccount.Low var reportee = GameAccountManager.GetAccountByPersistentID(attribute.Value.UintValue); Logger.Trace("{0} reported {1} for \"{2}\".", this.Client.Account.CurrentGameAccount.CurrentToon, reportee, report.ReportType); break; //case "target_account_id": //uint Account.Low //case "target_toon_name": //string //case "target_toon_program": //fourcc //case "target_toon_region": //string //case "note": //string - not currently used in client } } var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }