#include "stdafx.h" #define MAX_FRIEND_COUNT 24 // From the client void CUser::FriendProcess(Packet & pkt) { uint8 opcode = pkt.read(); 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(); 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); }