[C++] Logoljuk a felhasználók gépének adatait anoníman

Indította Distraught, 2018-05-04, 13:17:05

2018-05-04, 13:17:05 Utolsó szerkesztés: 2018-05-04, 13:34:01 Szerző: Distraught
Heyho embik :)

Biztos hasznotokra válna, ha tudnátok, hogy a felhasználóitok milyen gépet használnak.
Készítettem egy kis rendszert, amivel elmenthetitek a felhasználók RAM mennyiségét (GB-ban) és CPU sebességét (MHz-ben) az adatbázisba.

Kezdjük a kliens részével.
Végig a UserInterface-ben fogunk doglozni.
Nyisd meg a packet.h-t és keresd meg a

HEADER_CG_MARK_LOGIN = 100,

sort.
Ez elé írd be:

HEADER_CG_SYS_INFO_BY_DISTRAUGHT = 99,


Görgess lejjebb a typedef struct command_mark_login -ig.
Elé tedd be ezt:

struct sys_info_by_distraught
{
BYTE header;
float RAM;
int CPU;
};


A PythonNetworkStream.h-ban keresd meg az alábbi sort:

bool SendSpecial(int nLen, void * pvBuf);

Ez elé írd be:

bool SendSYSInfo();


Niysd meg a PythonNetworkStreamPhaseGame.cpp-t és a

BOOL gs_bEmpireLanuageEnable = TRUE;

sor után add hozzá ezeket:

//SYS INFO BY DISTRAUGHT
#define _WIN32_WINNT  0x0501
float GetRAM()
{
MEMORYSTATUSEX memstat;
memstat.dwLength = sizeof(memstat);
GlobalMemoryStatusEx(&memstat);
return (float)memstat.ullTotalPhys / (1024 * 1024 * 1024);
}
int GetCPUSpeedMHz()
{
char Buffer[MAX_PATH];
unsigned long BufSize = MAX_PATH;
unsigned long ulMHz = MAX_PATH;
HKEY hKey;
long lError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_READ, &hKey);
if (lError != ERROR_SUCCESS)
return 0;
RegQueryValueEx(hKey, "~MHz", NULL, NULL, (LPBYTE)&ulMHz, &BufSize);
return ulMHz;
}
bool CPythonNetworkStream::SendSYSInfo()
{
std::ifstream check("sentsys.txt");
if (check.good())
{
int i = 0;
check >> i;
if (i > 0) return false;
}
check.close();
sys_info_by_distraught packet;
packet.header = HEADER_CG_SYS_INFO_BY_DISTRAUGHT;
packet.RAM = GetRAM();
packet.CPU = GetCPUSpeedMHz();
if (!Send(sizeof(packet), &packet))
return false;
std::ofstream save("sentsys.txt");
save << "1";
save.close();
return SendSequence();
}
//SYS INFO END


Nyisd meg a PythonNetworkStreamPhaseLogin.cpp-t és keresd meg a SendLoginPacket függvényt.
Keresd meg ebben a függvényben a

if (!Send(sizeof(LoginPacket), &LoginPacket))

sort és elé írd be ezt:

SendSYSInfo();


Most keresd meg a SendLoginPacketNew függvényt is, majd abban is a

if (!Send(sizeof(LoginPacket), &LoginPacket))

sor elé írd be ezt:

SendSYSInfo();


Fordítsd le a kliens binaryt.

Most jön a szerveroldal.

Nyisd meg a packet.h -t és keresd meg ezt:

HEADER_CG_REFINE = 96,

Ez alá add hozzá:

HEADER_CG_SYS_INFO_BY_DISTRAUGHT = 99,


Keresd meg ezt a sort:

typedef struct SPacketGGSetup

Elé tedd be ezt:

struct sys_info_by_distraught
{
BYTE header;
float RAM;
int CPU;
};


Nyisd meg a packet_info.cpp -t és keress rá:

Set(HEADER_CG_TEXT, sizeof(TPacketCGText), "Text", false);

Add elé:

Set(HEADER_CG_SYS_INFO_BY_DISTRAUGHT, sizeof(sys_info_by_distraught), "SYSInfo", true);


Nyisd meg az input.h fájlt és keresd meg a CInputLogin osztályt.
Ezen belül keresd meg ezt a sort:

virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);

Add alá:

void SaveSYSInfo(const char* data);


Nyisd meg az input_login.cpp-t és keresd meg az Analyze függvényt.
Ezen belül keresd meg a

case HEADER_CG_PONG:

sort és add elé:

case HEADER_CG_SYS_INFO_BY_DISTRAUGHT:
SaveSYSInfo(c_pData);
break;


Keresd meg a

int CInputLogin::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)

sort és add elé:

void CInputLogin::SaveSYSInfo(const char* data)
{
sys_info_by_distraught* packet = (sys_info_by_distraught*)data;
DBManager::instance().Query("INSERT INTO system_info(ram, cpu, sent_at) VALUES (%f, %d, CURDATE());", packet->RAM, packet->CPU);
return;
}


Fordítsd le a game-et.

Egy adatbáziskezelővel csatlakozz a mysql-re és menj bele a player adatbázisba.
Itt futtasd le az alábbi queryt:

DROP TABLE IF EXISTS `system_info`;
CREATE TABLE `system_info` (
  `ram` float(12,0) DEFAULT NULL,
  `cpu` int(12) DEFAULT NULL,
  `sent_at` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


Ezután minden felhasználó belépéskor kiküldi a RAM mennyiségét GB-ban és a CPU sebességét MHz-ben.
Ezek az adatok a player adatbázis system_info táblázatában lesznek tárolva. (ram, cpu, mikor küldte el)
Mindenki csak egyszer küldi ki az adatait, ha azt szeretnéd, hogy újra küldjék el a felhasználók, akkor a patcheredbe a a kliens főmappájába tegyél egy sentsys.txt fájlt, aminek a tartalma csak egy 0 legyen.

C++ programmer at Gameloft