PageRenderTime 45ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/src/Mooege/Core/MooNet/Services/ChannelInvitationService.cs

https://github.com/angerwin/d3sharp
C# | 160 lines | 103 code | 33 blank | 24 comment | 2 complexity | ca5c54aa6e055df98028c01aefaca7b4 MD5 | raw file
  1. /*
  2. * Copyright (C) 2011 mooege project
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  17. */
  18. using System;
  19. using Mooege.Common.Extensions;
  20. using Mooege.Common.Logging;
  21. using Mooege.Core.MooNet.Channels;
  22. using Mooege.Core.MooNet.Toons;
  23. using Mooege.Net.MooNet;
  24. namespace Mooege.Core.MooNet.Services
  25. {
  26. [Service(serviceID: 0x3, serviceName: "bnet.protocol.channel_invitation.ChannelInvitationService")]
  27. public class ChannelInvitationService: bnet.protocol.channel_invitation.ChannelInvitationService, IServerService
  28. {
  29. private static readonly Logger Logger = LogManager.CreateLogger();
  30. public MooNetClient Client { get; set; }
  31. public bnet.protocol.Header LastCallHeader { get; set; }
  32. private readonly ChannelInvitationManager _invitationManager = new ChannelInvitationManager();
  33. public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel_invitation.SubscribeRequest request, Action<bnet.protocol.channel_invitation.SubscribeResponse> done)
  34. {
  35. Logger.Trace("Subscribe() {0}",this.Client);
  36. this._invitationManager.AddSubscriber(this.Client, request.ObjectId);
  37. var builder = bnet.protocol.channel_invitation.SubscribeResponse.CreateBuilder();
  38. done(builder.Build());
  39. }
  40. public override void AcceptInvitation(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel_invitation.AcceptInvitationRequest request, Action<bnet.protocol.channel_invitation.AcceptInvitationResponse> done)
  41. {
  42. Logger.Trace("{0} accepted invitation.", this.Client.CurrentToon);
  43. var channel = this._invitationManager.HandleAccept(this.Client, request);
  44. var response = bnet.protocol.channel_invitation.AcceptInvitationResponse.CreateBuilder().SetObjectId(channel.DynamicId).Build();
  45. done(response);
  46. }
  47. public override void DeclineInvitation(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.invitation.GenericRequest request, Action<bnet.protocol.NoData> done)
  48. {
  49. Logger.Trace("{0} declined invitation.", this.Client.CurrentToon);
  50. var respone = bnet.protocol.NoData.CreateBuilder();
  51. done(respone.Build());
  52. this._invitationManager.HandleDecline(this.Client, request);
  53. }
  54. public override void RevokeInvitation(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel_invitation.RevokeInvitationRequest request, Action<bnet.protocol.NoData> done)
  55. {
  56. Logger.Trace("{0} revoked invitation.", this.Client.CurrentToon);
  57. var builder = bnet.protocol.NoData.CreateBuilder();
  58. done(builder.Build());
  59. this._invitationManager.Revoke(this.Client, request);
  60. }
  61. public override void SendInvitation(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.invitation.SendInvitationRequest request, Action<bnet.protocol.invitation.SendInvitationResponse> done)
  62. {
  63. var invitee = ToonManager.GetToonByLowID(request.TargetId.Low);
  64. if (this.Client.CurrentChannel.HasToon(invitee)) return; // don't allow a second invitation if invitee is already a member of client's current channel.
  65. Logger.Debug("{0} invited {1} to his channel.", Client.CurrentToon, invitee);
  66. // somehow protobuf lib doesnt handle this extension, so we're using a workaround to get that channelinfo.
  67. var extensionBytes = request.UnknownFields.FieldDictionary[105].LengthDelimitedList[0].ToByteArray();
  68. var channelInvitationInfo = bnet.protocol.channel_invitation.SendInvitationRequest.ParseFrom(extensionBytes);
  69. var channelInvitation = bnet.protocol.channel_invitation.Invitation.CreateBuilder()
  70. .SetChannelDescription(bnet.protocol.channel.ChannelDescription.CreateBuilder().SetChannelId(channelInvitationInfo.ChannelId).Build())
  71. .SetReserved(channelInvitationInfo.Reserved)
  72. .SetServiceType(channelInvitationInfo.ServiceType)
  73. .SetRejoin(false).Build();
  74. var invitation = bnet.protocol.invitation.Invitation.CreateBuilder();
  75. invitation.SetId(ChannelInvitationManager.InvitationIdCounter++)
  76. .SetInviterIdentity(bnet.protocol.Identity.CreateBuilder().SetToonId(Client.CurrentToon.BnetEntityID).Build())
  77. .SetInviterName(Client.CurrentToon.Name)
  78. .SetInviteeIdentity(bnet.protocol.Identity.CreateBuilder().SetToonId(request.TargetId).Build())
  79. .SetInviteeName(invitee.Name)
  80. .SetInvitationMessage(request.InvitationMessage)
  81. .SetCreationTime(DateTime.Now.ToExtendedEpoch())
  82. .SetExpirationTime(DateTime.Now.ToUnixTime() + request.ExpirationTime)
  83. .SetExtension(bnet.protocol.channel_invitation.Invitation.ChannelInvitation, channelInvitation);
  84. // oh blizz, cmon. your buggy client even doesn't care this message at all but waits the UpdateChannelStateNotification with embedded invitation proto to show "invitation sent message".
  85. // ADVICE TO POTENTIAL BLIZZ-WORKER READING THIS;
  86. // change rpc SendInvitation(.bnet.protocol.invitation.SendInvitationRequest) returns (.bnet.protocol.invitation.SendInvitationResponse); to rpc SendInvitation(.bnet.protocol.invitation.SendInvitationRequest) returns (.bnet.protocol.NoData);
  87. var builder = bnet.protocol.invitation.SendInvitationResponse.CreateBuilder()
  88. .SetInvitation(invitation.Clone()); // clone it because we need that invitation as un-builded below.
  89. done(builder.Build());
  90. // send bnet.protocol.channel.UpdateChannelStateNotification to inviter - update him on invitation is sent.
  91. var notification = bnet.protocol.channel.UpdateChannelStateNotification.CreateBuilder()
  92. .SetAgentId(Client.CurrentToon.BnetEntityID)
  93. .SetStateChange(bnet.protocol.channel.ChannelState.CreateBuilder().AddInvitation(invitation.Clone()));
  94. this.Client.MakeTargetedRPC(this.Client.CurrentChannel, () =>
  95. bnet.protocol.channel.ChannelSubscriber.CreateStub(Client).NotifyUpdateChannelState(controller,notification.Build(),callback => { }));
  96. // notify the invitee on invitation.
  97. this._invitationManager.HandleInvitation(this.Client, invitation.Build());
  98. }
  99. public override void SuggestInvitation(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel_invitation.SuggestInvitationRequest request, Action<bnet.protocol.NoData> done)
  100. {
  101. var suggester = ToonManager.GetToonByLowID(request.TargetId.Low); //wants invite
  102. var suggestee = ToonManager.GetToonByLowID(request.ApprovalId.Low); //approves invite
  103. if(suggestee==null) return;
  104. Logger.Debug("{0} suggested {1} to invite him.", suggester, suggestee);
  105. var respone = bnet.protocol.NoData.CreateBuilder();
  106. done(respone.Build());
  107. // Even though it makes no sense, the suggester is used for all fields in the caps and is what works with the client. /dustinconrad
  108. var suggestion = bnet.protocol.invitation.Suggestion.CreateBuilder()
  109. .SetChannelId(request.ChannelId)
  110. .SetSuggesterId(suggester.BnetEntityID)
  111. .SetSuggesterName(suggester.Name)
  112. .SetSuggesteeId(suggester.BnetEntityID)
  113. .SetSuggesteeName(suggester.Name)
  114. .Build();
  115. var notification = bnet.protocol.channel_invitation.SuggestionAddedNotification.CreateBuilder().SetSuggestion(suggestion);
  116. suggestee.Owner.LoggedInClient.MakeTargetedRPC(this._invitationManager, () =>
  117. bnet.protocol.channel_invitation.ChannelInvitationNotify.CreateStub(suggestee.Owner.LoggedInClient).NotifyReceivedSuggestionAdded(null, notification.Build(), callback => { }));
  118. }
  119. public override void Unsubscribe(Google.ProtocolBuffers.IRpcController controller, bnet.protocol.channel_invitation.UnsubscribeRequest request, Action<bnet.protocol.NoData> done)
  120. {
  121. Logger.Trace("Unsubscribe() {0}", this.Client);
  122. this._invitationManager.RemoveSubscriber(Client);
  123. var builder = bnet.protocol.NoData.CreateBuilder();
  124. done(builder.Build());
  125. }
  126. }
  127. }