Created
June 21, 2014 22:30
-
-
Save Subv/667e6ebcf2efe99a5bd6 to your computer and use it in GitHub Desktop.
Very preliminar implementation of RealID's FriendInvite opcodes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/server/authserver/Server/BattlenetPackets.cpp b/src/server/authserver/Server/BattlenetPackets.cpp | |
index 6a8e090..fece14f 100644 | |
--- a/src/server/authserver/Server/BattlenetPackets.cpp | |
+++ b/src/server/authserver/Server/BattlenetPackets.cpp | |
@@ -447,3 +447,87 @@ std::string Battlenet::RealmJoinResult::ToString() const | |
return stream.str().c_str(); | |
} | |
+ | |
+void Battlenet::FriendInviteRequest::Read() | |
+{ | |
+ Unk1 = _stream.Read<uint32>(32); | |
+ Type = _stream.Read<uint8>(3); | |
+ | |
+ switch (Type) | |
+ { | |
+ case 1: | |
+ { | |
+ _stream.Read<uint8>(8); | |
+ _stream.Read<uint32>(32); | |
+ uint32 unk = _stream.Read<uint32>(32); | |
+ if (unk - 2 < 0x62) | |
+ _stream.Read<uint8>(7); | |
+ break; | |
+ } | |
+ case 2: | |
+ { | |
+ Email = _stream.ReadString(9, 3); | |
+ break; | |
+ } | |
+ default: | |
+ break; | |
+ } | |
+ | |
+ Unk2 = _stream.Read<uint8>(1); | |
+ HasMessage = _stream.Read<uint8>(1); | |
+ | |
+ if (HasMessage) | |
+ Message = _stream.ReadString(9); | |
+ | |
+ _stream.ReadString(0, 4); // if HasMessage is true, this will _always_ contain the string "Misc", otherwise we get some seemingly random stuff | |
+} | |
+ | |
+std::string Battlenet::FriendInviteRequest::ToString() const | |
+{ | |
+ std::ostringstream stream; | |
+ stream << "Battlenet::FriendInviteRequest Unk1 " << Unk1 << " Type " << Type << " Email " << Email << " Unk2 " << Unk2 << " HasMessage " << HasMessage << " Total Size: " << _stream.GetSize(); | |
+ return stream.str().c_str(); | |
+} | |
+ | |
+std::string Battlenet::FriendInviteResult::ToString() const | |
+{ | |
+ return ""; | |
+} | |
+ | |
+void Battlenet::FriendInviteResult::Write() | |
+{ | |
+ _stream.Write(0, 32); // Not used by the client | |
+ | |
+ bool inviteNotAdded = false; | |
+ bool initializeInviteList = false; | |
+ | |
+ _stream.Write(inviteNotAdded, 1); | |
+ | |
+ if (inviteNotAdded) | |
+ _stream.Write(initializeInviteList, 1); // InitializeInviteList | |
+ | |
+ if (inviteNotAdded || initializeInviteList) | |
+ { | |
+ int32 value = -1; | |
+ _stream.Write(value, 32); // Unk | |
+ if (value <= -1) | |
+ { | |
+ _stream.Write(true, 1); | |
+ | |
+ _stream.WriteString("TestName ", 8); // First name | |
+ _stream.WriteString("TestLastName", 8); // Last name - not set for WoW | |
+ | |
+ int32 unk4 = -2; | |
+ int32 unk5 = -1; | |
+ _stream.Write(unk4, 64); | |
+ _stream.Write(unk5, 32); | |
+ | |
+ _stream.Write(true, 1); // More unks | |
+ _stream.WriteString("TestData1", 9); | |
+ | |
+ _stream.Write(true, 1); // More unks | |
+ int32 unk6 = -1; | |
+ _stream.Write(unk6, 32); | |
+ } | |
+ } | |
+} | |
diff --git a/src/server/authserver/Server/BattlenetPackets.h b/src/server/authserver/Server/BattlenetPackets.h | |
index 1505f21..66cad76 100644 | |
--- a/src/server/authserver/Server/BattlenetPackets.h | |
+++ b/src/server/authserver/Server/BattlenetPackets.h | |
@@ -34,7 +34,8 @@ namespace Battlenet | |
{ | |
AUTHENTICATION = 0, | |
CREEP = 1, | |
- WOW = 2 | |
+ WOW = 2, | |
+ FRIEND = 3 | |
}; | |
enum AuthOpcode | |
@@ -70,6 +71,13 @@ namespace Battlenet | |
SMSG_JOIN_RESULT = 0x8 | |
}; | |
+ enum FriendOpcodes | |
+ { | |
+ CMSG_FRIEND_INVITE = 0x16, | |
+ | |
+ SMSG_FRIEND_INVITE_RESULT = 0x1, | |
+ }; | |
+ | |
struct PacketHeader | |
{ | |
PacketHeader(uint32 opcode, uint32 channel) : Opcode(opcode), Channel(channel) { } | |
@@ -356,6 +364,36 @@ namespace Battlenet | |
uint32 ServerSeed; | |
std::vector<ACE_INET_Addr> IPv4; | |
}; | |
+ | |
+ class FriendInviteRequest final : public ClientPacket | |
+ { | |
+ public: | |
+ FriendInviteRequest(PacketHeader const& header, BitStream& stream) : ClientPacket(header, stream) | |
+ { | |
+ ASSERT(header == PacketHeader(CMSG_FRIEND_INVITE, FRIEND) && "Invalid packet header for FriendInviteRequest"); | |
+ } | |
+ | |
+ void Read() override; | |
+ std::string ToString() const override; | |
+ | |
+ uint32 Unk1; | |
+ uint8 Type; | |
+ std::string Email; | |
+ uint8 Unk2; | |
+ uint8 HasMessage; | |
+ std::string Message; | |
+ }; | |
+ | |
+ class FriendInviteResult final : public ServerPacket | |
+ { | |
+ public: | |
+ FriendInviteResult() : ServerPacket(PacketHeader(SMSG_FRIEND_INVITE_RESULT, FRIEND)) | |
+ { | |
+ } | |
+ | |
+ void Write() override; | |
+ std::string ToString() const override; | |
+ }; | |
} | |
#endif // __BATTLENETPACKETS_H__ | |
diff --git a/src/server/authserver/Server/BattlenetSocket.cpp b/src/server/authserver/Server/BattlenetSocket.cpp | |
index dad52f6..43e5370 100644 | |
--- a/src/server/authserver/Server/BattlenetSocket.cpp | |
+++ b/src/server/authserver/Server/BattlenetSocket.cpp | |
@@ -43,6 +43,8 @@ std::map<Battlenet::PacketHeader, Battlenet::Socket::PacketHandler> InitHandlers | |
handlers[Battlenet::PacketHeader(Battlenet::CMSG_REALM_UPDATE_SUBSCRIBE, Battlenet::WOW)] = &Battlenet::Socket::HandleRealmUpdateSubscribe; | |
handlers[Battlenet::PacketHeader(Battlenet::CMSG_JOIN_REQUEST, Battlenet::WOW)] = &Battlenet::Socket::HandleRealmJoinRequest; | |
+ handlers[Battlenet::PacketHeader(Battlenet::CMSG_FRIEND_INVITE, Battlenet::FRIEND)] = &Battlenet::Socket::HandleFriendInvite; | |
+ | |
return handlers; | |
} | |
@@ -540,6 +542,16 @@ bool Battlenet::Socket::HandleRealmJoinRequest(PacketHeader& header, BitStream& | |
return true; | |
} | |
+bool Battlenet::Socket::HandleFriendInvite(PacketHeader& header, BitStream& packet) | |
+{ | |
+ FriendInviteRequest invite(header, packet); | |
+ invite.Read(); | |
+ | |
+ FriendInviteResult result; | |
+ Send(result); | |
+ return true; | |
+} | |
+ | |
void Battlenet::Socket::OnRead() | |
{ | |
size_t length = _socket.recv_len(); | |
diff --git a/src/server/authserver/Server/BattlenetSocket.h b/src/server/authserver/Server/BattlenetSocket.h | |
index ee399e2..73e578d 100644 | |
--- a/src/server/authserver/Server/BattlenetSocket.h | |
+++ b/src/server/authserver/Server/BattlenetSocket.h | |
@@ -66,6 +66,9 @@ namespace Battlenet | |
bool HandleRealmUpdateSubscribe(PacketHeader& header, BitStream& packet); | |
bool HandleRealmJoinRequest(PacketHeader& header, BitStream& packet); | |
+ // Friend | |
+ bool HandleFriendInvite(PacketHeader& header, BitStream& packet); | |
+ | |
void OnRead() override; | |
void OnAccept() override; | |
void OnClose() override; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment