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((BNetClient)this.Client); } break; case EntityIdHelper.HighIdType.ToonId: var toon = ToonManager.GetToonByLowID(request.EntityId.Low); if (toon != null) { toon.RemoveSubscriber((BNetClient)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 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 override void SuggestInvitation(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel_invitation.SuggestInvitationRequest request, Action <bnet.protocol.NoData> done) { var suggester = GameAccountManager.GetAccountByPersistentID(request.TargetId.Low); //wants invite var suggestee = GameAccountManager.GetAccountByPersistentID(request.ApprovalId.Low); //approves invite if (suggestee == null) { return; } Logger.Debug("{0} suggested {1} to invite him.", suggester, suggestee); var respone = bnet.protocol.NoData.CreateBuilder(); done(respone.Build()); // Even though it makes no sense, the suggester is used for all fields in the caps and is what works with the client. /dustinconrad var suggestion = bnet.protocol.invitation.Suggestion.CreateBuilder() .SetChannelId(request.ChannelId) .SetSuggesterId(suggester.BnetEntityId) .SetSuggesterName(suggester.Owner.BattleTag) .SetSuggesteeId(suggester.BnetEntityId) .SetSuggesteeName(suggester.Owner.BattleTag) .Build(); var notification = bnet.protocol.channel_invitation.SuggestionAddedNotification.CreateBuilder().SetSuggestion(suggestion); suggestee.LoggedInClient.MakeTargetedRPC(this._invitationManager, () => bnet.protocol.channel_invitation.ChannelInvitationNotify.CreateStub(suggestee.LoggedInClient).NotifyReceivedSuggestionAdded(null, notification.Build(), callback => { })); }
public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.presence.SubscribeRequest request, System.Action <bnet.protocol.NoData> done) { Logger.Trace("Subscribe() {0}: {1}", request.EntityId.GetHighIdType(), request.EntityId.Low); switch (request.EntityId.GetHighIdType()) { case EntityIdHelper.HighIdType.AccountId: this.Client.Account.AddSubscriber((BNetClient)this.Client, request.ObjectId); break; case EntityIdHelper.HighIdType.ToonId: var toon = ToonManager.GetToonByLowID(request.EntityId.Low); // 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. if (toon != null) { toon.AddSubscriber((BNetClient)this.Client, request.ObjectId); } break; default: Logger.Warn("Recieved an unhandled Presence.Subscribe request with type {0}", request.EntityId.GetHighIdType()); break; } var builder = NoData.CreateBuilder(); done(builder.Build()); }
public override void Bind(Google.ProtocolBuffers.IRpcController controller, BindRequest request, Action <BindResponse> done) { var requestedServiceIDs = new List <uint>(); foreach (var serviceHash in request.ImportedServiceHashList) { var serviceID = Service.GetByHash(serviceHash); Logger.Trace("Bind() [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"); requestedServiceIDs.Add(serviceID); } // 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("Bind() [import] Hash: 0x{0} ID: 0x{1}", service.Hash.ToString("X8"), service.Id.ToString("X2"))); } var builder = BindResponse.CreateBuilder(); foreach (var serviceId in requestedServiceIDs) { builder.AddImportedServiceId(serviceId); } 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.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 SubscribeToFriends(Google.ProtocolBuffers.IRpcController controller, SubscribeToFriendsRequest request, Action <SubscribeToFriendsResponse> done) { var response = SubscribeToFriendsResponse.CreateBuilder(); response.SetMaxFriends(127).SetMaxReceivedInvitations(127).SetMaxSentInvitations(127); done(response.Build()); }
public override void OpenColumn(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.storage.OpenColumnRequest request, System.Action <bnet.protocol.storage.OpenColumnResponse> done) { Logger.Trace("OpenColumn() {0}", this.Client); var builder = bnet.protocol.storage.OpenColumnResponse.CreateBuilder(); done(builder.Build()); }
public override void SubscribeToFollowers(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.followers.SubscribeToFollowersRequest request, System.Action <bnet.protocol.followers.SubscribeToFollowersResponse> done) { Logger.Trace("SubscribeToFollowers()"); var builder = bnet.protocol.followers.SubscribeToFollowersResponse.CreateBuilder(); done(builder.Build()); }
public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, SubscribeRequest request, Action <SubscribeResponse> done) { Debug.WriteLine("Subscribe request"); var response = SubscribeResponse.CreateBuilder(); done(response.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.Options.AttributeFilter); var builder = bnet.protocol.channel.FindChannelResponse.CreateBuilder(); done(builder.Build()); }
public override void SendInvitation(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.invitation.SendInvitationRequest request, System.Action <bnet.protocol.invitation.SendInvitationResponse> done) { var invitee = ToonManager.GetToonByLowID(request.TargetId.Low); Logger.Warn(String.Format("{0} invited {1} to his channel.", Client.CurrentToon.Name, invitee.Name)); // somehow protobuf lib doesnt handle this extension, so we're using a workaround to get that channelinfo. var extensionBytes = request.UnknownFields.FieldDictionary[105].LengthDelimitedList[0].ToByteArray(); var channelInvitationInfo = bnet.protocol.channel_invitation.SendInvitationRequest.ParseFrom(extensionBytes); var channelInvitation = bnet.protocol.channel_invitation.Invitation.CreateBuilder() .SetChannelDescription(bnet.protocol.channel.ChannelDescription.CreateBuilder().SetChannelId(channelInvitationInfo.ChannelId).Build()) .SetReserved(channelInvitationInfo.Reserved) .SetServiceType(channelInvitationInfo.ServiceType) .SetRejoin(false).Build(); var invitation = bnet.protocol.invitation.Invitation.CreateBuilder(); // also need to add creation_time, expiration_time. invitation.SetId(1) // TODO: fix the id .SetInviterIdentity(bnet.protocol.Identity.CreateBuilder().SetToonId(Client.CurrentToon.BnetEntityID).Build()) .SetInviterName(Client.CurrentToon.Name) .SetInviteeIdentity(bnet.protocol.Identity.CreateBuilder().SetToonId(request.TargetId).Build()) .SetInviteeName(invitee.Name) .SetInvitationMessage(request.InvitationMessage) .SetCreationTime(DateTime.Now.ToUnixTime()) .SetExpirationTime(DateTime.Now.ToUnixTime() + request.ExpirationTime) .SetExtension(bnet.protocol.channel_invitation.Invitation.ChannelInvitation, channelInvitation); var builder = bnet.protocol.invitation.SendInvitationResponse.CreateBuilder() .SetInvitation(invitation); done(builder.Build()); }
public override void RequestDisconnect(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.connection.DisconnectRequest request, Action <bnet.protocol.NO_RESPONSE> done) { Logger.Trace("RequestDisconnect()"); this.Client.Account.CurrentGameAccount.SaveToDB(); this.Client.Account.SaveToDB(); this.Client.Account.CurrentGameAccount.LoggedInClient.Connection.Disconnect(); }
public override void Update(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.presence.UpdateRequest request, System.Action <bnet.protocol.NoData> done) { //Logger.Warn("request:\n{0}", request.ToString()); // This "UpdateRequest" is not, as it may seem, a request to update the client on the state of an object, // but instead the *client* requesting to change fields on an object that it has subscribed to. // Check docs/rpc/presence.txt in branch wip-docs (or master) switch (request.EntityId.GetHighIdType()) { case EntityIdHelper.HighIdType.AccountId: var account = AccountManager.GetAccountByPersistentID(request.EntityId.Low); Logger.Trace("Update() {0} {1} - {2} Operations", this.Client, account, request.FieldOperationCount); Logger.Warn("No AccountManager updater."); break; case EntityIdHelper.HighIdType.GameAccountId: var gameaccount = GameAccountManager.GetAccountByPersistentID(request.EntityId.Low); var trace = string.Format("Update() {0} {1} - {2} Operations", this.Client, gameaccount, request.FieldOperationCount); foreach (var fieldOp in request.FieldOperationList) { trace += string.Format("\t{0}, {1}, {2}", (FieldKeyHelper.Program)fieldOp.Field.Key.Program, (FieldKeyHelper.OriginatingClass)fieldOp.Field.Key.Group, fieldOp.Field.Key.Field); gameaccount.Update(fieldOp); } Logger.Trace(trace); break; default: Logger.Warn("Recieved an unhandled Presence.Update 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 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 SendMessage(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel.SendMessageRequest request, System.Action <bnet.protocol.NoData> done) { var channel = ChannelManager.GetChannelByDynamicId(this.LastCallHeader.ObjectId); Logger.Trace("{0} sent a message to channel {1}.", this.Client.Account.CurrentGameAccount.CurrentToon, channel); var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); if (!request.HasMessage) { return; // only continue if the request actually contains a message. } if (request.Message.AttributeCount == 0 || !request.Message.AttributeList.First().HasValue) { return; // check if it has attributes. } var parsedAsCommand = CommandManager.TryParse(request.Message.AttributeList[0].Value.StringValue, this.Client); // try parsing the message as a command if (!parsedAsCommand) { channel.SendMessage(this.Client, request.Message); // if it's not parsed as an command - let channel itself to broadcast message to it's members. } }
public override void Update(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.presence.UpdateRequest request, System.Action <bnet.protocol.NoData> done) { Logger.Trace("Update() {0}: {1}", request.EntityId.GetHighIdType(), request.EntityId.Low); //Logger.Warn("request:\n{0}", request.ToString()); // This "UpdateRequest" is not, as it may seem, a request to update the client on the state of an object, // but instead the *client* requesting to change fields on an object that it has subscribed to. // Check docs/rpc/presence.txt in branch wip-docs (or master) switch (request.EntityId.GetHighIdType()) { case EntityIdHelper.HighIdType.AccountId: var account = AccountManager.GetAccountByEntityID(request.EntityId); break; case EntityIdHelper.HighIdType.ToonId: var toon = ToonManager.GetToonByLowID(request.EntityId.Low); break; default: Logger.Warn("Recieved an unhandled Presence.Update request with type {0}", request.EntityId.GetHighIdType()); break; } var builder = NoData.CreateBuilder(); done(builder.Build()); }
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 Unsubscribe(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel_invitation.UnsubscribeRequest request, Action <bnet.protocol.NoData> done) { Logger.Trace("Unsubscribe() {0}", this.Client); this._invitationManager.RemoveSubscriber(Client); var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }
public override void SelectGameAccount(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.EntityId request, Action <bnet.protocol.NoData> done) { this.Client.Account.CurrentGameAccount = GameAccountManager.GetAccountByPersistentID(request.Low); this.Client.Account.CurrentGameAccount.LoggedInClient = this.Client; Logger.Trace("SelectGameAccount(): {0}", this.Client.Account.CurrentGameAccount); done(bnet.protocol.NoData.CreateBuilder().Build()); }
public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel_invitation.SubscribeRequest request, Action <bnet.protocol.channel_invitation.SubscribeResponse> done) { Logger.Trace("Subscribe() {0}", this.Client); this._invitationManager.AddSubscriber(this.Client, request.ObjectId); var builder = bnet.protocol.channel_invitation.SubscribeResponse.CreateBuilder(); done(builder.Build()); }
// BEGIN INSERTED CODE public virtual void CallMethod( Google.ProtocolBuffers.Descriptors.MethodDescriptor method, Google.ProtocolBuffers.IRpcController controller, Google.ProtocolBuffers.IMessage request, Google.ProtocolBuffers.IMessage responsePrototype, Action <Google.ProtocolBuffers.IMessage> done) { RcfProtoChannelImpl.CallMethod(this, method, controller, request, responsePrototype, done); }
public override void SendMessage(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel.SendMessageRequest request, System.Action <bnet.protocol.NoData> done) { Logger.Trace("SendMessage()"); //Logger.Warn("request:\n{0}", request.ToString()); var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); }
public override void AcceptInvitation(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel_invitation.AcceptInvitationRequest request, Action <bnet.protocol.channel_invitation.AcceptInvitationResponse> done) { Logger.Trace("{0} accepted invitation.", this.Client.CurrentToon); var channel = this._invitationManager.HandleAccept(this.Client, request); var response = bnet.protocol.channel_invitation.AcceptInvitationResponse.CreateBuilder().SetObjectId(channel.DynamicId).Build(); done(response); }
public override void SelectToon(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.toon.external.SelectToonRequest request, Action <bnet.protocol.toon.external.SelectToonResponse> done) { var builder = bnet.protocol.toon.external.SelectToonResponse.CreateBuilder(); var toon = ToonManager.GetToonByLowID(request.Toon.Low); this.Client.CurrentToon = toon; done(builder.Build()); Logger.Trace("SelectToon() {0}", toon); }
public override void Connect(Google.ProtocolBuffers.IRpcController controller, ConnectRequest request, Action <ConnectResponse> done) { Logger.Trace("Connect()"); var builder = ConnectResponse.CreateBuilder() .SetServerId(ProcessId.CreateBuilder().SetLabel(0xAAAA).SetEpoch(DateTime.Now.ToUnixTime())) .SetClientId(ProcessId.CreateBuilder().SetLabel(0xBBBB).SetEpoch(DateTime.Now.ToUnixTime())); done(builder.Build()); }
public override void ToonList(Google.ProtocolBuffers.IRpcController controller, ToonListRequest request, Action <ToonListResponse> done) { var response = ToonListResponse.CreateBuilder(); response.AddToons(new EntityId.Builder { High = 0x300016200004433, Low = 2 }); done(response.Build()); }
public override void RemoveMember(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel.RemoveMemberRequest request, System.Action <bnet.protocol.NoData> done) { Logger.Trace("RemoveMember()"); // TODO: we should be actually checking for which member has to be removed. /raist. var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); this.Client.CurrentChannel.RemoveMember(this.Client, Channel.GetRemoveReasonForRequest((Channel.RemoveRequestReason)request.Reason)); }
public override void RevokeInvitation(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel_invitation.RevokeInvitationRequest request, Action <bnet.protocol.NoData> done) { Logger.Trace("{0} revoked invitation.", this.Client.Account.CurrentGameAccount.CurrentToon); var builder = bnet.protocol.NoData.CreateBuilder(); done(builder.Build()); this._invitationManager.Revoke(this.Client, request); }
public override void DeclineInvitation(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.invitation.GenericRequest request, Action <bnet.protocol.NoData> done) { Logger.Trace("{0} declined invitation.", this.Client.Account.CurrentGameAccount.CurrentToon); var respone = bnet.protocol.NoData.CreateBuilder(); done(respone.Build()); this._invitationManager.HandleDecline(this.Client, request); }