Beispiel #1
0
        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());
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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 => { }));
        }
Beispiel #4
0
        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());
        }
Beispiel #5
0
        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());
        }
Beispiel #6
0
        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());
        }
Beispiel #7
0
        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());
        }
Beispiel #8
0
        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());
        }
Beispiel #9
0
        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());
        }
Beispiel #10
0
        public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, SubscribeRequest request, Action <SubscribeResponse> done)
        {
            Debug.WriteLine("Subscribe request");
            var response = SubscribeResponse.CreateBuilder();

            done(response.Build());
        }
Beispiel #11
0
        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());
        }
Beispiel #12
0
        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());
        }
Beispiel #13
0
 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();
 }
Beispiel #14
0
        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());
        }
Beispiel #15
0
        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());
        }
Beispiel #16
0
        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.
            }
        }
Beispiel #17
0
        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());
        }
Beispiel #18
0
        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());
        }
Beispiel #19
0
        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());
        }
Beispiel #20
0
        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());
        }
Beispiel #21
0
        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());
        }
Beispiel #22
0
 // 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);
 }
Beispiel #23
0
        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());
        }
Beispiel #24
0
        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);
        }
Beispiel #25
0
        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);
        }
Beispiel #26
0
        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());
        }
Beispiel #27
0
        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());
        }
Beispiel #28
0
        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));
        }
Beispiel #29
0
        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);
        }
Beispiel #30
0
        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);
        }