📄 comunicationserver.cpp.svn-base
字号:
#include "StdAfx.h"
#pragma pack(push, 1)
typedef struct
{
uint16 opcode;
uint32 size;
}packet;
#pragma pack(pop)
VENICE_INLINE static void swap32(uint32* p) { *p = ((*p >> 24 & 0xff)) | ((*p >> 8) & 0xff00) | ((*p << 8) & 0xff0000) | (*p << 24); }
void CommServerSocket::HandleMappingReply(WorldPacket & recvData)
{
/* this packet is gzipped, whee! :D */
uint32 real_size;
recvData >> real_size;
uLongf rsize = real_size;
ByteBuffer buf(real_size);
buf.resize(real_size);
if(uncompress((uint8*)buf.contents(), &rsize, recvData.contents() + 4, (u_long)recvData.size() - 4) != Z_OK)
{
printf("Uncompress of mapping failed.\n");
return;
}
uint32 account_id;
uint8 number_of_characters;
uint32 count;
uint32 realm_id;
buf >> realm_id;
Realm * realm = sInfoCore.GetRealm(realm_id);
if(!realm)
return;
sInfoCore.getRealmLock().Acquire();
HM_NAMESPACE::hash_map<uint32, uint8>::iterator itr;
buf >> count;
printf("Got mapping packet for realm %u, total of %u entries.\n", (unsigned int)realm_id, (unsigned int)count);
for(uint32 i = 0; i < count; ++i)
{
buf >> account_id >> number_of_characters;
itr = realm->CharacterMap.find(account_id);
if(itr != realm->CharacterMap.end())
itr->second = number_of_characters;
else
realm->CharacterMap.insert( make_pair( account_id, number_of_characters ) );
}
sInfoCore.getRealmLock().Release();
}
void CommServerSocket::HandleUpdateMapping(WorldPacket & recvData)
{
uint32 realm_id;
uint32 account_id;
uint8 chars_to_add;
recvData >> realm_id;
Realm * realm = sInfoCore.GetRealm(realm_id);
if(!realm)
return;
sInfoCore.getRealmLock().Acquire();
recvData >> account_id >> chars_to_add;
HM_NAMESPACE::hash_map<uint32, uint8>::iterator itr = realm->CharacterMap.find(account_id);
if(itr != realm->CharacterMap.end())
itr->second += chars_to_add;
else
realm->CharacterMap.insert( make_pair( account_id, chars_to_add ) );
sInfoCore.getRealmLock().Release();
}
void CommServerSocket::HandleTestConsoleLogin(WorldPacket & recvData)
{
WorldPacket data(RSMSG_CONSOLE_LOGIN_RESULT, 8);
uint32 request;
string accountname;
uint8 key[20];
recvData >> request;
recvData >> accountname;
recvData.read(key, 20);
data << request;
Account * pAccount = sAccountMgr.GetAccount(accountname);
if(pAccount == NULL)
{
data << uint32(0);
SendPacket(&data);
return;
}
if(pAccount->GMFlags == NULL || strchr(pAccount->GMFlags, 'z') == NULL)
{
data << uint32(0);
SendPacket(&data);
return;
}
if(memcmp(pAccount->SrpHash, key, 20) != 0)
{
data << uint32(0);
SendPacket(&data);
return;
}
data << uint32(1);
SendPacket(&data);
}
void CommServerSocket::HandleDatabaseModify(WorldPacket& recvData)
{
uint32 method;
recvData >> method;
switch(method)
{
case 1: // set account ban
{
string account;
uint32 duration;
recvData >> account >> duration;
// remember we expect this in uppercase
VENICE_TOUPPER(account);
Account * pAccount = sAccountMgr.GetAccount(account);
if( pAccount == NULL )
return;
pAccount->Banned = duration;
// update it in the sql (duh)
sSQL->Execute("UPDATE accounts SET banned = %u WHERE login = \"%s\"", duration, sSQL->EscapeString(account).c_str());
}break;
case 2: // set gm
{
string account;
string gm;
recvData >> account >> gm;
// remember we expect this in uppercase
VENICE_TOUPPER(account);
Account * pAccount = sAccountMgr.GetAccount(account);
if( pAccount == NULL )
return;
pAccount->SetGMFlags( account.c_str() );
// update it in the sql (duh)
sSQL->Execute("UPDATE accounts SET gm = \"%s\" WHERE login = \"%s\"", sSQL->EscapeString(gm).c_str(), sSQL->EscapeString(account).c_str());
}break;
case 3: // set mute
{
string account;
uint32 duration;
recvData >> account >> duration;
// remember we expect this in uppercase
VENICE_TOUPPER(account);
Account * pAccount = sAccountMgr.GetAccount(account);
if( pAccount == NULL )
return;
pAccount->Muted = duration;
// update it in the sql (duh)
sSQL->Execute("UPDATE accounts SET muted = %u WHERE login = \"%s\"", duration, sSQL->EscapeString(account).c_str());
}break;
case 4: // ip ban add
{
string ip;
uint32 duration;
recvData >> ip >> duration;
if( sIPBanner.Add( ip.c_str(), duration ) )
sSQL->Execute("INSERT INTO ipbans VALUES(\"%s\", %u)", sSQL->EscapeString(ip).c_str(), duration);
}break;
case 5: // ip ban reomve
{
string ip;
recvData >> ip;
if( sIPBanner.Remove( ip.c_str() ) )
sSQL->Execute("DELETE FROM ipbans WHERE ip = \"%s\"", sSQL->EscapeString(ip).c_str());
}break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -