Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,543 @@
|
||||
#include "stdafx.h"
|
||||
#include "ToolUserManageTable.h"
|
||||
|
||||
#include <tchar.h>
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
#include <Stream/Buffer/Buffer.h>
|
||||
#include <Stream/Buffer/BufferFactory.h>
|
||||
|
||||
#include <Network/Session/Session.h>
|
||||
#include <Network/Dispatch/SendManagePacket.h>
|
||||
#include <Network/Dispatch/ManageServer/ManageToolServerDispatch.h>
|
||||
|
||||
#include <DB/SQLite.h>
|
||||
#include <DB/ManageServerDB.h>
|
||||
#include <Setup/RylServerGroupSetup.h>
|
||||
|
||||
|
||||
CToolUserManager& CToolUserManager::GetInstance()
|
||||
{
|
||||
static CToolUserManager toolUserManager(CManageServerDB::GetInstance());
|
||||
return toolUserManager;
|
||||
}
|
||||
|
||||
|
||||
inline void SetUserInfo(ServerManage::UserInfo& UserInfo_Out,
|
||||
const char* szID, const char* szPass,
|
||||
const char* szFullName, const char* szIP,
|
||||
const char* szAdminLevel)
|
||||
{
|
||||
_snprintf(UserInfo_Out.szID, ServerManage::UserInfo::ID_LEN - 1, "%s", szID);
|
||||
UserInfo_Out.szID[ServerManage::UserInfo::ID_LEN - 1] = 0;
|
||||
|
||||
_snprintf(UserInfo_Out.szPassword, ServerManage::UserInfo::PASS_LEN - 1, "%s", szPass);
|
||||
UserInfo_Out.szPassword[ServerManage::UserInfo::PASS_LEN - 1] = 0;
|
||||
|
||||
_snprintf(UserInfo_Out.szFullName, ServerManage::UserInfo::NAME_LEN - 1, "%s", szFullName);
|
||||
UserInfo_Out.szFullName[ServerManage::UserInfo::NAME_LEN - 1] = 0;
|
||||
|
||||
UserInfo_Out.dwIP = inet_addr(szIP);
|
||||
UserInfo_Out.usAdminLevel = atoi(szAdminLevel);
|
||||
}
|
||||
|
||||
|
||||
|
||||
CToolUserManager::ToolUser::ToolUser(CManageToolServerDispatch* lpDispatch,
|
||||
ServerManage::UserInfo& userInfo)
|
||||
: m_lpDispatch(lpDispatch), m_UserInfo(userInfo)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CToolUserManager::ToolUser::ToolUser()
|
||||
: m_lpDispatch(0)
|
||||
{
|
||||
memset(&m_UserInfo, 0, sizeof(ServerManage::UserInfo));
|
||||
}
|
||||
|
||||
|
||||
enum ToolUserConst
|
||||
{
|
||||
TOOLUSER_MAX_QUERY = 1024
|
||||
};
|
||||
|
||||
|
||||
CToolUserManager::CToolUserManager(CManageServerDB& ManageServerDB)
|
||||
: m_ManageServerDB(ManageServerDB)
|
||||
{
|
||||
memset(&m_ManageUser, 0, sizeof(ServerManage::UserInfo));
|
||||
}
|
||||
|
||||
CToolUserManager::~CToolUserManager()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// UserManagement
|
||||
bool CToolUserManager::AddUser(const ServerManage::UserInfo& userInfo)
|
||||
{
|
||||
char szQuery[TOOLUSER_MAX_QUERY];
|
||||
|
||||
in_addr addr;
|
||||
addr.S_un.S_addr = userInfo.dwIP;
|
||||
|
||||
int nQueryLen = _snprintf(szQuery, TOOLUSER_MAX_QUERY - 1,
|
||||
"INSERT INTO TblManageToolUser values('%s', '%s', '%s', '%s', %d)",
|
||||
userInfo.szID, userInfo.szPassword, userInfo.szFullName,
|
||||
inet_ntoa(addr), userInfo.usAdminLevel);
|
||||
|
||||
szQuery[TOOLUSER_MAX_QUERY - 1] = 0;
|
||||
|
||||
if(0 < nQueryLen)
|
||||
{
|
||||
CSQLite::Dataset addUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
|
||||
|
||||
if(addUserQuery.Compile() && addUserQuery.Execute())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
ERRLOG2(g_Log, "AddUser failed - query failed : %s(Query:%s)",
|
||||
addUserQuery.GetLastError(), szQuery);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "AddUser failed - make query failed : (Query:%s)", szQuery);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool CToolUserManager::GetUserInfo(const char* szID_In,
|
||||
ServerManage::UserInfo& userInfo_Out)
|
||||
{
|
||||
char szQuery[TOOLUSER_MAX_QUERY];
|
||||
|
||||
int nQueryLen = _snprintf(szQuery, TOOLUSER_MAX_QUERY - 1,
|
||||
"SELECT ID, PASS, NAME, IP, LEVEL FROM TblManageToolUser WHERE ID = '%s'", szID_In);
|
||||
|
||||
szQuery[TOOLUSER_MAX_QUERY - 1] = 0;
|
||||
|
||||
if(0 < nQueryLen)
|
||||
{
|
||||
CSQLite::Dataset getUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
|
||||
|
||||
int nColNum = 0;
|
||||
const char** pazValue = 0;
|
||||
const char** pazColumn = 0;
|
||||
|
||||
if(getUserQuery.Compile() &&
|
||||
getUserQuery.Execute(&nColNum, &pazValue, &pazColumn))
|
||||
{
|
||||
if(5 == nColNum && 0 != pazValue)
|
||||
{
|
||||
SetUserInfo(userInfo_Out, pazValue[0], pazValue[1],
|
||||
pazValue[2], pazValue[3], pazValue[4]);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
ERRLOG2(g_Log, "Getuser failed - query error : %s(Query:%s)",
|
||||
getUserQuery.GetLastError(), szQuery);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "Getuser failed - create query failed : (Query:%s)", szQuery);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CToolUserManager::DelUser(const char* szID)
|
||||
{
|
||||
char szQuery[TOOLUSER_MAX_QUERY];
|
||||
|
||||
int nQueryLen = _snprintf(szQuery, TOOLUSER_MAX_QUERY - 1,
|
||||
"DELETE FROM TblManageToolUser WHERE ID = '%s'", szID);
|
||||
|
||||
szQuery[TOOLUSER_MAX_QUERY - 1] = 0;
|
||||
|
||||
if(0 < nQueryLen)
|
||||
{
|
||||
CSQLite::Dataset delUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
|
||||
|
||||
if(delUserQuery.Compile() && delUserQuery.Execute())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
ERRLOG2(g_Log, "Deluser failed - query error : %s(Query:%s)",
|
||||
delUserQuery.GetLastError(), szQuery);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "Deluser failed - create query error : %s", szQuery);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CToolUserManager::ModifyUser(const ServerManage::UserInfo& modified)
|
||||
{
|
||||
char szQuery[TOOLUSER_MAX_QUERY];
|
||||
|
||||
in_addr addr;
|
||||
addr.S_un.S_addr = modified.dwIP;
|
||||
|
||||
int nQueryLen = _snprintf(szQuery, TOOLUSER_MAX_QUERY - 1,
|
||||
"UPDATE TblManageToolUser SET PASS = '%s', NAME = '%s', IP = '%s', LEVEL = %d WHERE ID = '%s'",
|
||||
modified.szPassword, modified.szFullName, inet_ntoa(addr),
|
||||
modified.usAdminLevel, modified.szID);
|
||||
|
||||
szQuery[TOOLUSER_MAX_QUERY - 1] = 0;
|
||||
|
||||
if(0 < nQueryLen)
|
||||
{
|
||||
CSQLite::Dataset modUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
|
||||
|
||||
if(modUserQuery.Compile() && modUserQuery.Execute())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
ERRLOG2(g_Log, "Moduser failed - query error : %s(Query:%s)",
|
||||
modUserQuery.GetLastError(), szQuery);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "Moduser failed - create query error : %s", szQuery);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool CToolUserManager::SendAllUserInfo(CSession& Session)
|
||||
{
|
||||
const int MAX_USER_INFO = (PktMaxLen - sizeof(ServerManage::UserCommand)) / sizeof(ServerManage::UserInfo);
|
||||
ServerManage::UserInfo tempUserInfo[MAX_USER_INFO];
|
||||
|
||||
CBufferFactory& bufferFactory = Session.GetPolicy().GetBufferFactory();
|
||||
const char* szQuery = "SELECT ID, PASS, NAME, IP, LEVEL FROM TblManageToolUser";
|
||||
|
||||
CSQLite::Dataset getUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
|
||||
|
||||
if(getUserQuery.Compile())
|
||||
{
|
||||
int nColNum = 0;
|
||||
const char** pazValue = 0;
|
||||
const char** pazColumn = 0;
|
||||
|
||||
int nRowCount = 0;
|
||||
|
||||
while(getUserQuery.Execute(&nColNum, &pazValue, &pazColumn))
|
||||
{
|
||||
if(5 == nColNum && 0 != pazValue)
|
||||
{
|
||||
SetUserInfo(tempUserInfo[nRowCount], pazValue[0],
|
||||
pazValue[1], pazValue[2], pazValue[3], pazValue[4]);
|
||||
|
||||
memset(tempUserInfo[nRowCount].szPassword, 0,
|
||||
ServerManage::UserInfo::PASS_LEN);
|
||||
|
||||
++nRowCount;
|
||||
}
|
||||
|
||||
if(nRowCount == MAX_USER_INFO)
|
||||
{
|
||||
ServerManage::SendUserInfo(bufferFactory, &Session, tempUserInfo,
|
||||
nRowCount, ServerManage::CMD::UserList, 0);
|
||||
|
||||
nRowCount = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(0 < nRowCount)
|
||||
{
|
||||
ServerManage::SendUserInfo(bufferFactory, &Session, tempUserInfo,
|
||||
nRowCount, ServerManage::CMD::UserList, 0);
|
||||
}
|
||||
|
||||
if(0 != getUserQuery.GetLastError())
|
||||
{
|
||||
ERRLOG2(g_Log, "Getuser failed - query error : %s(Query:%s)",
|
||||
getUserQuery.GetLastError(), szQuery);
|
||||
}
|
||||
}
|
||||
else if(0 != getUserQuery.GetLastError())
|
||||
{
|
||||
ERRLOG2(g_Log, "Getuser failed - compile query failed : %s(Query:%s)",
|
||||
getUserQuery.GetLastError(), szQuery);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CToolUserManager::GetUserInfo(UserList& userList_Out)
|
||||
{
|
||||
const unsigned char MAX_USER_INFO = 100;
|
||||
ServerManage::UserInfo tempUserInfo[MAX_USER_INFO];
|
||||
const char* szQuery = "SELECT ID, PASS, NAME, IP, LEVEL FROM TblManageToolUser";
|
||||
|
||||
CSQLite::Dataset getUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
|
||||
|
||||
if(getUserQuery.Compile())
|
||||
{
|
||||
int nColNum = 0;
|
||||
const char** pazValue = 0;
|
||||
const char** pazColumn = 0;
|
||||
|
||||
int nRowCount = 0;
|
||||
|
||||
while(getUserQuery.Execute(&nColNum, &pazValue, &pazColumn))
|
||||
{
|
||||
if(5 == nColNum && 0 != pazValue)
|
||||
{
|
||||
SetUserInfo(tempUserInfo[nRowCount], pazValue[0],
|
||||
pazValue[1], pazValue[2], pazValue[3], pazValue[4]);
|
||||
|
||||
++nRowCount;
|
||||
}
|
||||
|
||||
if(nRowCount == MAX_USER_INFO)
|
||||
{
|
||||
userList_Out.insert(userList_Out.end(), tempUserInfo, tempUserInfo + nRowCount);
|
||||
nRowCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(0 < nRowCount)
|
||||
{
|
||||
userList_Out.insert(userList_Out.end(), tempUserInfo, tempUserInfo + nRowCount);
|
||||
}
|
||||
|
||||
if(0 != getUserQuery.GetLastError())
|
||||
{
|
||||
ERRLOG2(g_Log, "Getuser failed - query error : %s(Query:%s)",
|
||||
getUserQuery.GetLastError(), szQuery);
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if(0 != getUserQuery.GetLastError())
|
||||
{
|
||||
ERRLOG2(g_Log, "Getuser failed - compile query failed : %s(Query:%s)",
|
||||
getUserQuery.GetLastError(), szQuery);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Login/Logout
|
||||
ServerManage::UserCommandError CToolUserManager::Authorize(CManageToolServerDispatch& dispatch,
|
||||
ServerManage::UserInfo& userInfo_inout)
|
||||
{
|
||||
ServerManage::UserInfo foundUserInfo;
|
||||
memset(&foundUserInfo, 0, sizeof(ServerManage::UserInfo));
|
||||
|
||||
ServerManage::UserCommandError eUserCommandErr = ServerManage::NO_USER_COMMAND_ERROR;
|
||||
|
||||
int iCheck =
|
||||
GetPrivateProfileInt("SETTING", "USER_IP_CHECK", 1, CRylServerGroupSetup::GetInstance().GetSetupFileName());
|
||||
|
||||
if(IsLogin(userInfo_inout.szID))
|
||||
{
|
||||
eUserCommandErr = ServerManage::ALREADY_LOGINED;
|
||||
}
|
||||
else if(!GetUserInfo(userInfo_inout.szID, foundUserInfo))
|
||||
{
|
||||
eUserCommandErr = ServerManage::CANNOT_AUTHORIZE_NOT_USER;
|
||||
}
|
||||
else if(0 != strncmp(foundUserInfo.szPassword, userInfo_inout.szPassword,
|
||||
ServerManage::UserInfo::PASS_LEN))
|
||||
{
|
||||
eUserCommandErr = ServerManage::CANNOT_AUTHORIZE_INVALID_PASSWORD;
|
||||
}
|
||||
else if((1 == iCheck) && (foundUserInfo.dwIP != userInfo_inout.dwIP))
|
||||
{
|
||||
eUserCommandErr = ServerManage::CANNOT_AUTHORIZE_INVALID_IPADDRESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
// ID, Password<72><64> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
Logout(foundUserInfo.szID);
|
||||
|
||||
m_LoginUserList.push_back(ToolUser(&dispatch, foundUserInfo));
|
||||
userInfo_inout = foundUserInfo;
|
||||
}
|
||||
|
||||
return eUserCommandErr;
|
||||
}
|
||||
|
||||
|
||||
bool CToolUserManager::IsLogin(const char* szName)
|
||||
{
|
||||
CurrentUserList::iterator pos = m_LoginUserList.begin();
|
||||
CurrentUserList::iterator end = m_LoginUserList.end();
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
ToolUser& toolUser = *pos;
|
||||
|
||||
if(0 == strncmp(toolUser.m_UserInfo.szID, szName, ServerManage::UserInfo::ID_LEN))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool CToolUserManager::Logout(const char* szName)
|
||||
{
|
||||
CurrentUserList::iterator pos = m_LoginUserList.begin();
|
||||
CurrentUserList::iterator end = m_LoginUserList.end();
|
||||
|
||||
int nEraseCount = 0;
|
||||
|
||||
for(; pos != end;)
|
||||
{
|
||||
ToolUser& toolUser = *pos;
|
||||
|
||||
if(0 == strncmp(toolUser.m_UserInfo.szID, szName, ServerManage::UserInfo::ID_LEN))
|
||||
{
|
||||
// Logout info<66><6F> <20>ش<EFBFBD>.
|
||||
ServerManage::SendUserInfo(toolUser.m_lpDispatch->GetBufferFactory(), 0,
|
||||
&toolUser.m_UserInfo, 1, ServerManage::CMD::UserLogout, 0);
|
||||
|
||||
if(IsManageUser(toolUser.m_UserInfo))
|
||||
{
|
||||
memset(&m_ManageUser, 0, sizeof(ServerManage::UserInfo));
|
||||
|
||||
ServerManage::SendUserInfo(toolUser.m_lpDispatch->GetBufferFactory(), 0,
|
||||
&m_ManageUser, 1, ServerManage::CMD::ManagerInfo, 0);
|
||||
}
|
||||
|
||||
pos = m_LoginUserList.erase(pos);
|
||||
++nEraseCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
++pos;
|
||||
}
|
||||
}
|
||||
|
||||
return (0 < nEraseCount);
|
||||
}
|
||||
|
||||
|
||||
// Send packets to all users
|
||||
bool CToolUserManager::SendToAllLoginUser(const char* szBuffer, unsigned short usBufferSize, unsigned char cCmd_In)
|
||||
{
|
||||
CurrentUserList::iterator pos = m_LoginUserList.begin();
|
||||
CurrentUserList::iterator end = m_LoginUserList.end();
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
ToolUser& toolUser = *pos;
|
||||
CManageToolServerDispatch* lpDispatch = toolUser.m_lpDispatch;
|
||||
|
||||
if(0 != lpDispatch)
|
||||
{
|
||||
lpDispatch->GetSendStream().PutBuffer(szBuffer, usBufferSize, cCmd_In);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CToolUserManager::SendAllLoginUserInfo(CSession& Session)
|
||||
{
|
||||
const unsigned char MAX_USER_INFO = 100;
|
||||
ServerManage::UserInfo tempUserInfo[MAX_USER_INFO];
|
||||
|
||||
CBufferFactory& bufferFactory = Session.GetPolicy().GetBufferFactory();
|
||||
|
||||
CurrentUserList::iterator pos = m_LoginUserList.begin();
|
||||
CurrentUserList::iterator end = m_LoginUserList.end();
|
||||
|
||||
unsigned char cSendNum = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
tempUserInfo[cSendNum] = pos->m_UserInfo;
|
||||
memset(tempUserInfo[cSendNum].szPassword, 0, ServerManage::UserInfo::PASS_LEN);
|
||||
|
||||
++cSendNum;
|
||||
|
||||
if(cSendNum == MAX_USER_INFO)
|
||||
{
|
||||
ServerManage::SendUserInfo(bufferFactory, &Session,
|
||||
tempUserInfo, cSendNum, ServerManage::CMD::UserLogin, 0);
|
||||
|
||||
cSendNum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(0 < cSendNum)
|
||||
{
|
||||
ServerManage::SendUserInfo(bufferFactory, &Session,
|
||||
tempUserInfo, cSendNum, ServerManage::CMD::UserLogin, 0);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
CManageToolServerDispatch* CToolUserManager::GetUserDispatch(unsigned long dwIP)
|
||||
{
|
||||
CurrentUserList::iterator pos = m_LoginUserList.begin();
|
||||
CurrentUserList::iterator end = m_LoginUserList.end();
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
ToolUser& toolUser = *pos;
|
||||
|
||||
if(toolUser.m_UserInfo.dwIP == dwIP)
|
||||
{
|
||||
return toolUser.m_lpDispatch;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
CManageToolServerDispatch* CToolUserManager::GetUserDispatch(const char* szID)
|
||||
{
|
||||
CurrentUserList::iterator pos = m_LoginUserList.begin();
|
||||
CurrentUserList::iterator end = m_LoginUserList.end();
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
ToolUser& toolUser = *pos;
|
||||
|
||||
if(0 == strncmp(toolUser.m_UserInfo.szID, szID, ServerManage::UserInfo::ID_LEN))
|
||||
{
|
||||
return toolUser.m_lpDispatch;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
bool CToolUserManager::IsManageUser(const ServerManage::UserInfo& UserInfo)
|
||||
{
|
||||
if(0 == strncmp(m_ManageUser.szID, UserInfo.szID, ServerManage::UserInfo::ID_LEN))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
#ifndef _GM_MANAGE_LIB_TOOL_USER_MANAGE_TABLE_H_
|
||||
#define _GM_MANAGE_LIB_TOOL_USER_MANAGE_TABLE_H_
|
||||
|
||||
#include <list>
|
||||
#include <Network/Packet/ManagePacketCmd.h>
|
||||
|
||||
// forward decl.
|
||||
class CManageServerDB;
|
||||
class CSession;
|
||||
class CManageToolServerDispatch;
|
||||
|
||||
class CToolUserManager
|
||||
{
|
||||
public:
|
||||
|
||||
typedef std::list<ServerManage::UserInfo> UserList;
|
||||
|
||||
enum Level
|
||||
{
|
||||
MASTER = 0,
|
||||
GENERAL = 1,
|
||||
MONITORING = 2
|
||||
};
|
||||
|
||||
static CToolUserManager& GetInstance();
|
||||
|
||||
// UserManagement ( Use File Database )
|
||||
bool AddUser(const ServerManage::UserInfo& userInfo);
|
||||
bool DelUser(const char* szID);
|
||||
bool ModifyUser(const ServerManage::UserInfo& modified);
|
||||
bool GetUserInfo(const char* szID_In, ServerManage::UserInfo& userInfo_Out);
|
||||
bool GetUserInfo(UserList& userList_Out);
|
||||
|
||||
// Login/Logout (In Server)
|
||||
ServerManage::UserCommandError Authorize(
|
||||
CManageToolServerDispatch& dispatch,
|
||||
ServerManage::UserInfo& userInfo_inout);
|
||||
|
||||
bool IsLogin(const char* szName);
|
||||
bool Logout(const char* szName);
|
||||
|
||||
// Send packets to all users
|
||||
bool SendToAllLoginUser(const char* szBuffer, unsigned short usBufferSize, unsigned char cCmd_In);
|
||||
|
||||
bool SendAllLoginUserInfo(CSession& Session);
|
||||
bool SendAllUserInfo(CSession& Session);
|
||||
|
||||
// ProcessAll
|
||||
template<typename FnProcess>
|
||||
void ProcessCurrentUser(FnProcess fnProcess)
|
||||
{
|
||||
CurrentUserList::iterator pos = m_LoginUserList.begin();
|
||||
CurrentUserList::iterator end = m_LoginUserList.end();
|
||||
|
||||
for(;pos != end; ++pos)
|
||||
{
|
||||
fnProcess(*pos->m_lpDispatch);
|
||||
}
|
||||
}
|
||||
|
||||
CManageToolServerDispatch* GetUserDispatch(unsigned long dwIP);
|
||||
CManageToolServerDispatch* GetUserDispatch(const char* szID);
|
||||
|
||||
void Promote(const ServerManage::UserInfo& promoteUser) { m_ManageUser = promoteUser; }
|
||||
|
||||
bool IsManageUser(const ServerManage::UserInfo& UserInfo);
|
||||
const ServerManage::UserInfo& GetManageUser() const { return m_ManageUser; }
|
||||
CManageToolServerDispatch* GetManageUserDispatch() { return GetUserDispatch(m_ManageUser.szID); }
|
||||
|
||||
private:
|
||||
|
||||
CToolUserManager(CManageServerDB& ManageServerDB);
|
||||
~CToolUserManager();
|
||||
|
||||
struct ToolUser
|
||||
{
|
||||
CManageToolServerDispatch* m_lpDispatch;
|
||||
ServerManage::UserInfo m_UserInfo;
|
||||
|
||||
ToolUser();
|
||||
ToolUser(CManageToolServerDispatch* lpDispatch, ServerManage::UserInfo& userInfo);
|
||||
};
|
||||
|
||||
typedef std::list<ToolUser> CurrentUserList;
|
||||
|
||||
CManageServerDB& m_ManageServerDB;
|
||||
CurrentUserList m_LoginUserList; // Logged user list;
|
||||
ServerManage::UserInfo m_ManageUser; // Current master user list;
|
||||
};
|
||||
|
||||
#endif
|
||||
492
Server/ManageTool/ManageLibrary/UserManage/UserStatistics.cpp
Normal file
492
Server/ManageTool/ManageLibrary/UserManage/UserStatistics.cpp
Normal file
@@ -0,0 +1,492 @@
|
||||
#include "stdafx.h"
|
||||
#include "UserStatistics.h"
|
||||
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/ManagePacketCmd.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
#include <Network/Dispatch/SingleDispatchStorage.h>
|
||||
#include <Network/Dispatch/ManageServer/StatServerMultiDispatch.h>
|
||||
#include <atlTime.h>
|
||||
|
||||
|
||||
const TCHAR* g_szAppName = _T("HANGAME_SEND_USER_INFO");
|
||||
|
||||
|
||||
CUserStatistics& CUserStatistics::GetInstance()
|
||||
{
|
||||
static CUserStatistics userStatistics;
|
||||
return userStatistics;
|
||||
}
|
||||
|
||||
CUserStatistics::CUserStatistics()
|
||||
{
|
||||
SetSetupFileName(_T("./RylSetupServerGroup.ini"));
|
||||
Load();
|
||||
}
|
||||
|
||||
CUserStatistics::~CUserStatistics()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CUserStatistics::SetSetupFileName(const TCHAR* szFileName)
|
||||
{
|
||||
if(0 != szFileName)
|
||||
{
|
||||
_sntprintf(m_szSetupFileName, MAX_PATH - 1, "%s", szFileName);
|
||||
m_szSetupFileName[MAX_PATH - 1] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool CUserStatistics::Load()
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
|
||||
TCHAR szKeyName[MAX_PATH];
|
||||
TCHAR szValue[MAX_PATH];
|
||||
|
||||
m_ServerGroupNames.clear();
|
||||
|
||||
unsigned long dwMaxServerGroup = GetPrivateProfileInt(g_szAppName, "MAX_GROUP_NAME", 0, m_szSetupFileName);
|
||||
|
||||
for(unsigned long dwCount = 0; dwCount < dwMaxServerGroup; ++dwCount)
|
||||
{
|
||||
_sntprintf(szKeyName, MAX_PATH - 1, "GROUP_KEY%u", dwCount);
|
||||
szKeyName[MAX_PATH - 1] = 0;
|
||||
|
||||
unsigned long dwKey = GetPrivateProfileInt(g_szAppName, szKeyName, 0xFFFFFFFF, m_szSetupFileName);
|
||||
|
||||
if(dwKey != 0xFFFFFFFF)
|
||||
{
|
||||
_sntprintf(szKeyName, MAX_PATH - 1, "GROUP_NAME%u", dwCount);
|
||||
szKeyName[MAX_PATH - 1] = 0;
|
||||
|
||||
GetPrivateProfileString(g_szAppName, szKeyName, 0, szValue, MAX_PATH, m_szSetupFileName);
|
||||
|
||||
m_ServerGroupNames.insert(ServerGroupNames::value_type(dwKey, szValue));
|
||||
}
|
||||
}
|
||||
|
||||
GetPrivateProfileString(g_szAppName, "HANGAME_SERVER_DOMAIN", 0, szValue, MAX_PATH, m_szSetupFileName);
|
||||
unsigned short usPort = static_cast<unsigned short>(
|
||||
GetPrivateProfileInt(g_szAppName, "HANGAME_SERVER_PORT", 0, m_szSetupFileName));
|
||||
|
||||
hostent* lphost = gethostbyname(szValue);
|
||||
if (0 != lphost)
|
||||
{
|
||||
for (int nCount = 0; 0 != lphost->h_addr_list[nCount]; ++nCount )
|
||||
{
|
||||
m_HangameAddress.push_back(
|
||||
INET_Addr(*(in_addr*)lphost->h_addr_list[nCount], usPort));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CUserStatistics::InternalSetUserNum(unsigned long dwRunID, unsigned long dwServerID, int nCurrentUserNum)
|
||||
{
|
||||
// ServerID <20><>Ģ üũ dwServerID
|
||||
|
||||
SERVER_ID serverID;
|
||||
serverID.dwID = dwServerID;
|
||||
|
||||
if(0 <= serverID.GetChannel() && 0 <= serverID.GetGroup() && 0 <= serverID.GetZone())
|
||||
{
|
||||
UserNumTable::iterator pos = m_CurrentUsers.find(dwServerID);
|
||||
if(pos != m_CurrentUsers.end())
|
||||
{
|
||||
// <20><> <20><><EFBFBD><EFBFBD>
|
||||
pos->second = nCurrentUserNum;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><> <20><><EFBFBD><EFBFBD>
|
||||
pos = m_CurrentUsers.insert(pos, UserNumTable::value_type(dwServerID, nCurrentUserNum));
|
||||
m_RunIDTable.insert(RunIDTable::value_type(dwRunID, pos));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int CUserStatistics::GetUserNum(unsigned long dwServerID)
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
UserNumTable::iterator find = m_CurrentUsers.find(dwServerID);
|
||||
return (find != m_CurrentUsers.end()) ? find->second : 0;
|
||||
}
|
||||
|
||||
int CUserStatistics::GetTotalUserNum()
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
|
||||
UserNumTable::iterator pos = m_CurrentUsers.begin();
|
||||
UserNumTable::iterator end = m_CurrentUsers.end();
|
||||
|
||||
int nTotalUser = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
int nCurrentUser = pos->second;
|
||||
|
||||
if(0 < nCurrentUser)
|
||||
{
|
||||
nTotalUser += pos->second;
|
||||
}
|
||||
}
|
||||
|
||||
return nTotalUser;
|
||||
}
|
||||
|
||||
int CUserStatistics::GetGroupUserNum(char cGroupNum)
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
|
||||
UserNumTable::iterator pos = m_CurrentUsers.begin();
|
||||
UserNumTable::iterator end = m_CurrentUsers.end();
|
||||
|
||||
int nTotalUser = 0;
|
||||
|
||||
SERVER_ID serverID;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
serverID.dwID = pos->first;
|
||||
|
||||
if(cGroupNum == serverID.GetGroup())
|
||||
{
|
||||
int nCurrentUser = pos->second;
|
||||
|
||||
if(0 < nCurrentUser)
|
||||
{
|
||||
nTotalUser += pos->second;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nTotalUser;
|
||||
}
|
||||
|
||||
void CUserStatistics::InternalClearRunID_UserNum(unsigned long dwRunID)
|
||||
{
|
||||
std::pair<RunIDTable::iterator, RunIDTable::iterator>
|
||||
resultPair = m_RunIDTable.equal_range(dwRunID);
|
||||
|
||||
RunIDTable::iterator pos = resultPair.first;
|
||||
|
||||
for(; pos != resultPair.second; ++pos)
|
||||
{
|
||||
if(0 != pos->second->second)
|
||||
{
|
||||
pos->second->second = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CUserStatistics::InternalClearGroupUserNum(unsigned char cGroupNum)
|
||||
{
|
||||
UserNumTable::iterator pos = m_CurrentUsers.begin();
|
||||
UserNumTable::iterator end = m_CurrentUsers.end();
|
||||
|
||||
SERVER_ID serverID;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
serverID.dwID = pos->first;
|
||||
|
||||
if(cGroupNum == serverID.GetGroup())
|
||||
{
|
||||
pos->second = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CUserStatistics::SerializeIn(unsigned long dwRunID,
|
||||
ServerManage::UserNumPair* lpUserNumPair, unsigned long dwPairNum)
|
||||
{
|
||||
if(0 != lpUserNumPair)
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
|
||||
ServerManage::UserNumPair* lpUserNumPairEnd = lpUserNumPair + dwPairNum;
|
||||
|
||||
for(; lpUserNumPair != lpUserNumPairEnd; ++lpUserNumPair)
|
||||
{
|
||||
InternalSetUserNum(dwRunID, lpUserNumPair->m_dwServerID,
|
||||
lpUserNumPair->m_nUserNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CUserStatistics::SendStatisticsToHanGame()
|
||||
{
|
||||
if(0 == GetPrivateProfileInt(g_szAppName, "SEND_HANGAME_INFO", 0, m_szSetupFileName))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
||||
return;
|
||||
}
|
||||
|
||||
char szGameID[256];
|
||||
GetPrivateProfileString(g_szAppName, "SEND_GAME_ID", _T("RYL"), szGameID, 256, m_szSetupFileName);
|
||||
|
||||
UserNumTable CurrentUsers;
|
||||
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
CurrentUsers = m_CurrentUsers;
|
||||
}
|
||||
|
||||
const int MAX_BUFFER = 3192;
|
||||
char szBuffer[MAX_BUFFER];
|
||||
|
||||
SERVER_ID ServerID;
|
||||
int nUserNum = 0;
|
||||
int nLength = 0;
|
||||
|
||||
size_t nMaxGroupName = m_ServerGroupNames.size();
|
||||
|
||||
SOCKADDR_IN ServerAddr;
|
||||
memset(&ServerAddr, 0, sizeof(SOCKADDR_IN));
|
||||
|
||||
UserNumTable::iterator pos = CurrentUsers.begin();
|
||||
UserNumTable::iterator end = CurrentUsers.end();
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
ServerID.dwID = pos->first;
|
||||
nUserNum = pos->second;
|
||||
|
||||
if(ServerID.GetZone() - 1 < 0 || ServerID.GetChannel() < 0)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
else if(0 < nUserNum)
|
||||
{
|
||||
ServerGroupNames::iterator pos = m_ServerGroupNames.find(ServerID.GetGroup());
|
||||
|
||||
if(pos != m_ServerGroupNames.end())
|
||||
{
|
||||
// TODO : Sparrowhawk.
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD><C8B2>.. ù <20><><EFBFBD><EFBFBD> GrandCost<73><74> <20><> <20><>ȣ<EFBFBD><C8A3> 1<>̴<EFBFBD>.
|
||||
// <20><EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>ȣ<EFBFBD><C8A3> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
// GetServerSession<6F><6E><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
|
||||
nLength = _snprintf(szBuffer, MAX_BUFFER,
|
||||
"GET /gamestatic/gameconn.nhn?m=gameconn&gameid=%s&servername=%s-%d-%d&conncount=%d\n\n",
|
||||
szGameID,
|
||||
pos->second.c_str(),
|
||||
ServerID.GetZone() - 1,
|
||||
ServerID.GetChannel(),
|
||||
nUserNum);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>
|
||||
AddressList::iterator pos = m_HangameAddress.begin();
|
||||
AddressList::iterator end = m_HangameAddress.end();
|
||||
|
||||
bool bSucceeded = false;
|
||||
|
||||
for (; pos != end && !bSucceeded; ++pos)
|
||||
{
|
||||
INET_Addr& address = *pos;
|
||||
|
||||
SOCKET hSocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED);
|
||||
if (INVALID_SOCKET == hSocket)
|
||||
{
|
||||
ERRLOG1(g_Log, "Hangame user send failed : socket create failed - %d", WSAGetLastError());
|
||||
}
|
||||
else if (SOCKET_ERROR == connect(hSocket, &address.get_addr(), address.get_size()))
|
||||
{
|
||||
ERRLOG1(g_Log, "Hangame user send failed : connect failed - %d", WSAGetLastError());
|
||||
}
|
||||
else if (SOCKET_ERROR == send(hSocket, szBuffer, nLength, 0))
|
||||
{
|
||||
ERRLOG1(g_Log, "Hangame user send failed : send failed - %d", WSAGetLastError());
|
||||
}
|
||||
else
|
||||
{
|
||||
INFLOG2(g_Log, "'%s':%d bytes send complete", szBuffer, nLength);
|
||||
bSucceeded = true;
|
||||
}
|
||||
|
||||
shutdown(hSocket, SD_SEND);
|
||||
closesocket(hSocket);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CUserStatistics::SendStatisticsToStatServer()
|
||||
{
|
||||
int nSendGlobal =
|
||||
GetPrivateProfileInt("STATSERVER_INFO", "SEND_STAT_SERVER_1ST", 0, m_szSetupFileName);
|
||||
|
||||
int nSendLocal =
|
||||
GetPrivateProfileInt("STATSERVER_INFO", "SEND_STAT_SERVER_2ND", 0, m_szSetupFileName);
|
||||
|
||||
int nNation =
|
||||
GetPrivateProfileInt("GENERAL", "NATION_INDEX", 0, m_szSetupFileName);
|
||||
|
||||
if((0 == nSendGlobal) && (0 == nSendLocal))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(UCHAR_MAX < nNation)
|
||||
{
|
||||
ERRLOG1(g_Log, "Nation index is invalid: NationIndex-%d", nNation);
|
||||
return;
|
||||
}
|
||||
|
||||
SERVER_ID ServerID;
|
||||
int nUserNum = 0;
|
||||
|
||||
UserNumTable CurrentUsers;
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
CurrentUsers = m_CurrentUsers;
|
||||
}
|
||||
|
||||
const int MAX_USER_STAT = 1000;
|
||||
const int BUFFER_SIZE = sizeof(ServerManage::PktUserStat) +
|
||||
sizeof(ServerManage::UserStatData) * MAX_USER_STAT;
|
||||
|
||||
char szBuffer[BUFFER_SIZE];
|
||||
|
||||
ServerManage::PktUserStat* lpPktUserStat =
|
||||
reinterpret_cast<ServerManage::PktUserStat*>(szBuffer);
|
||||
|
||||
ServerManage::UserStatData* lpUserStatData =
|
||||
reinterpret_cast<ServerManage::UserStatData*>(lpPktUserStat + 1);
|
||||
|
||||
unsigned short nUserStatData = 0;
|
||||
|
||||
SYSTEMTIME stCurrentTime;
|
||||
GetLocalTime(&stCurrentTime);
|
||||
|
||||
_snprintf(lpPktUserStat->m_szSendingTime, ServerManage::PktUserStat::MAX_DATE,
|
||||
"%04d-%02d-%02d %02d:%02d:%02d",
|
||||
stCurrentTime.wYear, stCurrentTime.wMonth, stCurrentTime.wDay,
|
||||
stCurrentTime.wHour, stCurrentTime.wMinute, stCurrentTime.wSecond);
|
||||
|
||||
UserNumTable::iterator pos = CurrentUsers.begin();
|
||||
UserNumTable::iterator end = CurrentUsers.end();
|
||||
|
||||
const int MAX_BUFFER = 256;
|
||||
char szGlobalStatServerIP[MAX_BUFFER], szLocalStatServerIP[MAX_BUFFER];
|
||||
|
||||
GetPrivateProfileString("STATSERVER_INFO", "STAT_SERVER_1ST_IP", 0,
|
||||
szGlobalStatServerIP, MAX_BUFFER, m_szSetupFileName);
|
||||
GetPrivateProfileString("STATSERVER_INFO", "STAT_SERVER_2ND_IP", 0,
|
||||
szLocalStatServerIP, MAX_BUFFER, m_szSetupFileName);
|
||||
|
||||
GET_MULTI_DISPATCH(lpGlobalStatDispatch, inet_addr(szGlobalStatServerIP),
|
||||
CStatServerMultiDispatch, CStatServerMultiDispatch::GetDispatchTable());
|
||||
GET_MULTI_DISPATCH(lpLocalStatDispatch, inet_addr(szLocalStatServerIP),
|
||||
CStatServerMultiDispatch, CStatServerMultiDispatch::GetDispatchTable());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
ServerID.dwID = pos->first;
|
||||
nUserNum = pos->second;
|
||||
|
||||
if(nUserNum < 0)
|
||||
{
|
||||
nUserNum = 0;
|
||||
}
|
||||
|
||||
if(ServerID.GetZone() - 1 < 0 || ServerID.GetChannel() < 0)
|
||||
{
|
||||
ERRLOG1(g_Log, "Invalid serverID: %u", ServerID.dwID);
|
||||
}
|
||||
else if(CServerSetup::GameServer == ServerID.GetType())
|
||||
{
|
||||
lpUserStatData->m_dwServerID = ServerID.dwID;
|
||||
lpUserStatData->m_nNation = nNation;
|
||||
lpUserStatData->m_nUserNum = nUserNum;
|
||||
|
||||
INFLOG3(g_Log, "[UserStat Sended] NationCode: %d/ServerID: 0x%08x/UserNum: %d",
|
||||
nNation, ServerID.dwID, nUserNum);
|
||||
|
||||
++lpUserStatData;
|
||||
++nUserStatData;
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if(nUserStatData == MAX_USER_STAT - 1)
|
||||
{
|
||||
lpPktUserStat->m_usUserStatDataNum = nUserStatData;
|
||||
|
||||
if((NULL != lpGlobalStatDispatch) && (1 == nSendGlobal))
|
||||
{
|
||||
lpGlobalStatDispatch->GetSendStream().WrapCompress(szBuffer,
|
||||
sizeof(ServerManage::PktUserStat) + sizeof(ServerManage::UserStatData) * nUserStatData,
|
||||
ServerManage::CMD::UPDATE_USER_STATUS, 0, 0);
|
||||
}
|
||||
|
||||
if((NULL != lpLocalStatDispatch) && (1 == nSendLocal))
|
||||
{
|
||||
lpLocalStatDispatch->GetSendStream().WrapCompress(szBuffer,
|
||||
sizeof(ServerManage::PktUserStat) + sizeof(ServerManage::UserStatData) * nUserStatData,
|
||||
ServerManage::CMD::UPDATE_USER_STATUS, 0, 0);
|
||||
}
|
||||
|
||||
lpUserStatData = reinterpret_cast<ServerManage::UserStatData*>(lpPktUserStat + 1);
|
||||
nUserStatData = 0;
|
||||
}
|
||||
|
||||
if(0 < nUserStatData)
|
||||
{
|
||||
lpPktUserStat->m_usUserStatDataNum = nUserStatData;
|
||||
|
||||
if((NULL != lpGlobalStatDispatch) && (1 == nSendGlobal))
|
||||
{
|
||||
lpGlobalStatDispatch->GetSendStream().WrapCompress(szBuffer,
|
||||
sizeof(ServerManage::PktUserStat) + sizeof(ServerManage::UserStatData) * nUserStatData,
|
||||
ServerManage::CMD::UPDATE_USER_STATUS, 0, 0);
|
||||
}
|
||||
|
||||
if((NULL != lpLocalStatDispatch) && (1 == nSendLocal))
|
||||
{
|
||||
lpLocalStatDispatch->GetSendStream().WrapCompress(szBuffer,
|
||||
sizeof(ServerManage::PktUserStat) + sizeof(ServerManage::UserStatData) * nUserStatData,
|
||||
ServerManage::CMD::UPDATE_USER_STATUS, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CUserStatistics::CheckClearUser(PktBase* lpPktBase)
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
|
||||
if(sizeof(ServerManage::ManageCommand) <= lpPktBase->GetLen())
|
||||
{
|
||||
ServerManage::ManageCommand* lpManageCommand =
|
||||
reinterpret_cast<ServerManage::ManageCommand*>(lpPktBase);
|
||||
|
||||
int nProcessStatusNum = int(lpManageCommand->usDataLen / sizeof(ServerManage::ProcessStatus));
|
||||
|
||||
if(sizeof(ServerManage::ManageCommand) + lpManageCommand->usDataLen == lpPktBase->GetLen()
|
||||
&& lpManageCommand->usDataLen == nProcessStatusNum * sizeof(ServerManage::ProcessStatus))
|
||||
{
|
||||
ServerManage::ProcessStatus* lpProcessStatus =
|
||||
reinterpret_cast<ServerManage::ProcessStatus*>(lpManageCommand + 1);
|
||||
|
||||
ServerManage::ProcessStatus* lpProcessStatusEnd = lpProcessStatus + nProcessStatusNum;
|
||||
|
||||
for(; lpProcessStatus != lpProcessStatusEnd; ++lpProcessStatus)
|
||||
{
|
||||
if(0 == (ServerManage::PROCESS_RUNNING & lpProcessStatus->m_dwStatusFlags))
|
||||
{
|
||||
InternalClearRunID_UserNum(lpProcessStatus->m_dwRunID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
96
Server/ManageTool/ManageLibrary/UserManage/UserStatistics.h
Normal file
96
Server/ManageTool/ManageLibrary/UserManage/UserStatistics.h
Normal file
@@ -0,0 +1,96 @@
|
||||
#ifndef _MANAGE_TOOL_SERVER_USER_STATISTICS_H_
|
||||
#define _MANAGE_TOOL_SERVER_USER_STATISTICS_H_
|
||||
|
||||
#pragma warning(disable:4800)
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <list>
|
||||
#include <tchar.h>
|
||||
#include <Thread/Lock.h>
|
||||
#include <Network/Address/INET_Addr.h>
|
||||
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
|
||||
// forward decl.
|
||||
namespace ServerManage
|
||||
{
|
||||
struct UserNumPair;
|
||||
}
|
||||
|
||||
struct PktBase;
|
||||
|
||||
|
||||
class CUserStatistics
|
||||
{
|
||||
public:
|
||||
|
||||
static CUserStatistics& GetInstance();
|
||||
|
||||
bool Load();
|
||||
void SetSetupFileName(const TCHAR* szFileName);
|
||||
|
||||
void SetUserNum(unsigned long dwRunID, unsigned long dwServerID, int nCurrentUserNum)
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
InternalSetUserNum(dwRunID, dwServerID, nCurrentUserNum);
|
||||
}
|
||||
|
||||
int GetUserNum(unsigned long dwServerID);
|
||||
int GetTotalUserNum();
|
||||
int GetGroupUserNum(char cGroupNum);
|
||||
|
||||
void ClearRunID_UserNum(unsigned long dwRunID)
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
InternalClearRunID_UserNum(dwRunID);
|
||||
}
|
||||
void ClearGroupUserNum(unsigned char cGroupNum)
|
||||
{
|
||||
StatisticsLock::Syncronize sync(m_Lock);
|
||||
InternalClearGroupUserNum(cGroupNum);
|
||||
}
|
||||
|
||||
void CheckClearUser(PktBase* lpPktBase);
|
||||
|
||||
void SerializeIn(unsigned long dwRunID,
|
||||
ServerManage::UserNumPair* lpUserNumPair, unsigned long dwPairNum);
|
||||
|
||||
void SendStatisticsToHanGame();
|
||||
void SendStatisticsToStatServer();
|
||||
|
||||
private:
|
||||
|
||||
CUserStatistics();
|
||||
~CUserStatistics();
|
||||
|
||||
void InternalSetUserNum(unsigned long dwRunID, unsigned long dwServerID, int nCurrentUserNum);
|
||||
void InternalClearRunID_UserNum(unsigned long dwRunID);
|
||||
void InternalClearGroupUserNum(unsigned char cGroupNum);
|
||||
|
||||
typedef CCSLock StatisticsLock;
|
||||
|
||||
typedef std::map<unsigned long, int, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, int> > > UserNumTable;
|
||||
|
||||
typedef std::multimap<unsigned long, UserNumTable::iterator, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, UserNumTable::iterator> > > RunIDTable;
|
||||
|
||||
|
||||
typedef std::map<unsigned long, std::string> ServerGroupNames;
|
||||
typedef std::list<INET_Addr> AddressList;
|
||||
|
||||
StatisticsLock m_Lock;
|
||||
CACHE_PAD(StatisticsLockPad, sizeof(StatisticsLock));
|
||||
|
||||
UserNumTable m_CurrentUsers;
|
||||
RunIDTable m_RunIDTable;
|
||||
|
||||
ServerGroupNames m_ServerGroupNames;
|
||||
AddressList m_HangameAddress;
|
||||
|
||||
TCHAR m_szSetupFileName[MAX_PATH];
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user