knightonline/server/GameServer/FriendHandler.cpp

120 lines
2.6 KiB
C++

#include "stdafx.h"
#define MAX_FRIEND_COUNT 24
// From the client
void CUser::FriendProcess(Packet & pkt)
{
uint8 opcode = pkt.read<uint8>();
switch (opcode)
{
case FRIEND_REQUEST:
FriendRequest();
break;
case FRIEND_REPORT:
FriendReport(pkt);
break;
case FRIEND_ADD:
case FRIEND_REMOVE:
FriendModify(pkt, opcode);
break;
}
}
// Request friend list.
void CUser::FriendRequest()
{
Packet result(WIZ_FRIEND_PROCESS, uint8(FRIEND_REQUEST));
g_pMain->AddDatabaseRequest(result, this);
}
// Add or remove a friend from your list.
void CUser::FriendModify(Packet & pkt, uint8 opcode)
{
std::string strUserID;
CUser *pUser;
CBot *pBot;
pkt >> strUserID;
if (strUserID.empty() || strUserID.size() > MAX_ID_SIZE
|| (opcode == FRIEND_ADD && ((pUser = g_pMain->GetUserPtr(strUserID, TYPE_CHARACTER)) == nullptr && (pBot = g_pMain->GetBotPtr(strUserID, TYPE_CHARACTER)) == nullptr)))
return;
Packet result(WIZ_FRIEND_PROCESS, opcode);
if (opcode == FRIEND_ADD && pUser != nullptr)
result << pUser->GetSocketID();
else if(pUser == nullptr && opcode == FRIEND_ADD)
result << pBot->GetID();
result.SByte();
result << strUserID;
g_pMain->AddDatabaseRequest(result, this);
}
// Refresh the status of your friends.
void CUser::FriendReport(Packet & pkt)
{
Packet result(WIZ_FRIEND_PROCESS, uint8(FRIEND_REPORT));
uint16 usercount = pkt.read<uint16>();
if (usercount > MAX_FRIEND_COUNT)
return;
result << usercount;
for (int i = 0; i < usercount; i++)
{
std::string strUserID;
int16 sid;
pkt >> strUserID;
if (strUserID.empty() || strUserID.size() > MAX_ID_SIZE)
return; // malformed packet, just ignore it.
uint8 status = GetFriendStatus(strUserID, sid);
result << strUserID << sid << status;
}
Send(&result);
}
// Retrieves the status (and socket ID) of a character.
uint8 CUser::GetFriendStatus(std::string & charName, int16 & sid)
{
CUser *pUser;
CBot *pBot;
if (charName.empty()
|| ((pUser = g_pMain->GetUserPtr(charName, TYPE_CHARACTER)) == nullptr && (pBot = g_pMain->GetBotPtr(charName, TYPE_CHARACTER)) == nullptr))
{
sid = -1;
return 0; // user not found
}
sid = pUser != nullptr ? pUser->GetSocketID() : pBot->GetID();
if(pUser != nullptr)
{
if (pUser->isInParty()) // user in party
return 3;
}
return 1; // user not in party
}
void CUser::RecvFriendModify(Packet & pkt, uint8 opcode)
{
Packet result(WIZ_FRIEND_PROCESS);
std::string strUserID;
int16 sid = -1;
uint8 bResult = 0;
if (opcode == FRIEND_ADD)
pkt >> sid;
pkt >> bResult;
pkt.SByte();
pkt >> strUserID;
uint8 status = GetFriendStatus(strUserID, sid);
result << opcode << bResult << strUserID << sid << status;
Send(&result);
}