Skip to content

Instantly share code, notes, and snippets.

@Subv
Created June 21, 2014 22:30
Show Gist options
  • Save Subv/667e6ebcf2efe99a5bd6 to your computer and use it in GitHub Desktop.
Save Subv/667e6ebcf2efe99a5bd6 to your computer and use it in GitHub Desktop.
Very preliminar implementation of RealID's FriendInvite opcodes
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