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>
522 lines
12 KiB
C++
522 lines
12 KiB
C++
#include "stdafx.h"
|
|
|
|
|
|
#include <Log/ServerLog.h>
|
|
#include <Parser/ServerInfo.h>
|
|
#include <DBComponent/Ryl_AdminMgrDB.h>
|
|
#include <Network/Protocol/Ryl_AdminMgrProtocol.h>
|
|
|
|
|
|
CDBAdminTool& CDBAdminTool::GetInstance()
|
|
{
|
|
static CDBAdminTool dbAdminTool;
|
|
return dbAdminTool;
|
|
}
|
|
|
|
bool CDBAdminTool::ConnectAdminToolDB()
|
|
{
|
|
const int MAX_BUFFER = 255;
|
|
|
|
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
|
|
|
|
if(!ServerInfoTXT.Reload())
|
|
{
|
|
ERRLOG0(g_Log, "서버 셋업 파일 로드 실패");
|
|
return false;
|
|
}
|
|
|
|
const char* DBAddress = ServerInfoTXT.GetValue("ADMINTOOL_DB_IP");
|
|
const char* DBName = ServerInfoTXT.GetValue("ADMINTOOL_DB_NAME");
|
|
const char* DBAccount = ServerInfoTXT.GetValue("ADMINTOOL_DB_ACCOUNT");
|
|
const char* DBPass = ServerInfoTXT.GetValue("ADMINTOOL_DB_PASS");
|
|
|
|
char szDBAddress[MAX_BUFFER];
|
|
char szDBName[MAX_BUFFER];
|
|
char szDBAccount[MAX_BUFFER];
|
|
char szDBPass[MAX_BUFFER];
|
|
|
|
strncpy(szDBAddress, DBAddress, MAX_BUFFER); szDBAddress[MAX_BUFFER - 1] = 0;
|
|
strncpy(szDBName, DBName, MAX_BUFFER); szDBName[MAX_BUFFER - 1] = 0;
|
|
strncpy(szDBAccount, DBAccount, MAX_BUFFER); szDBAccount[MAX_BUFFER - 1] = 0;
|
|
strncpy(szDBPass, DBPass, MAX_BUFFER); szDBPass[MAX_BUFFER - 1] = 0;
|
|
|
|
if(!ConnectSQLServer(szDBAddress, szDBName, szDBAccount, szDBPass, OleDB::ConnType_MSSQL))
|
|
{
|
|
ERRLOG4(g_Log, "운영DB 연결 실패. %s/%s/%s/%s",
|
|
szDBAddress, szDBName, szDBAccount, szDBPass);
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDBAdminTool::UpdateZoneList(unsigned int UID, char* In_Data)
|
|
{
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH, "SELECT binZone FROM TblToolAdmin WHERE uid=%d", UID);
|
|
|
|
if(ExecuteQuery(m_szQry, OleDB::Rowset_Update))
|
|
{
|
|
if(!SetBinaryData(1, (OleDB::LPSET_BINARY)In_Data))
|
|
{
|
|
ERRLOG0(g_Log, "바이너리 데이터 셋팅 실패");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDBAdminTool::GetZoneList(unsigned int UID, char* Out_Data)
|
|
{
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH, "SELECT binZone FROM TblToolAdmin WHERE uid=%d", UID);
|
|
|
|
if(!ExecuteQueryGetData(m_szQry, Out_Data))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. 쿼리-%s, 에러-%s", m_szQry, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 관리자 계정 로그인
|
|
BYTE CDBAdminTool::Login(char* szAccount, char* szPassword)
|
|
{
|
|
char szGetedPassword[PktAdminMgr::MAX_PASSWORD];
|
|
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"SELECT strPasswd FROM TblToolAdmin WHERE strAdminID='%s'", szAccount);
|
|
|
|
ZeroMemory(szGetedPassword, PktAdminMgr::MAX_PASSWORD);
|
|
|
|
if(!ExecuteQueryGetData(m_szQry, (void*)szGetedPassword))
|
|
{
|
|
// 계정이 존재 하지 않음
|
|
return PktAdminMgr::PktResult::Err_Account;
|
|
}
|
|
|
|
if(NULL != szGetedPassword)
|
|
{
|
|
if(!stricmp(szGetedPassword, szPassword))
|
|
{
|
|
// 로그인 성공
|
|
return PktAdminMgr::PktResult::Success_Login;
|
|
}
|
|
else
|
|
{
|
|
// 패스워드 다름
|
|
return PktAdminMgr::PktResult::Err_Passwd;
|
|
}
|
|
}
|
|
|
|
return PktAdminMgr::PktResult::Err_Unknown;
|
|
}
|
|
|
|
// 해당 관리자 계정 접속 아이피 체크
|
|
BYTE CDBAdminTool::CheckIP(char* AdminID, char* szIP)
|
|
{
|
|
char strIP[16];
|
|
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"SELECT strIP FROM TblToolAdmin WHERE strAdminID='%s'", AdminID);
|
|
|
|
ZeroMemory(strIP, sizeof(strIP));
|
|
|
|
if(!ExecuteQueryGetData(m_szQry, (void*)strIP))
|
|
{
|
|
// 해당 ID 에대한 값을 찾을수 없거나 데이터 베이스 에러
|
|
return PktAdminMgr::PktResult::Err_Database;
|
|
}
|
|
|
|
if(NULL != strIP)
|
|
{
|
|
if(!stricmp(szIP, strIP))
|
|
{
|
|
// 성공
|
|
return PktAdminMgr::PktResult::Success_ConnectIP;
|
|
}
|
|
else
|
|
{
|
|
// 등록되어 있는 아이피가 아님
|
|
return PktAdminMgr::PktResult::Err_ConnectIP;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return PktAdminMgr::PktResult::Err_Database;
|
|
}
|
|
|
|
return PktAdminMgr::PktResult::Err_Unknown;
|
|
}
|
|
|
|
// 선택아이디가 있냐? 없냐?
|
|
bool CDBAdminTool::AccountCheck(char* AdminID)
|
|
{
|
|
char strAdminID[20];
|
|
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"SELECT strAdminID FROM TblToolAdmin WHERE strAdminID='%s'", AdminID);
|
|
|
|
ZeroMemory(strAdminID, sizeof(strAdminID));
|
|
|
|
if(!ExecuteQueryGetData(m_szQry, (void*)strAdminID))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// 로그를 시작..
|
|
bool CDBAdminTool::StartupLog(unsigned int UID, char* UseIP)
|
|
{
|
|
char szDate[30];
|
|
if(!UID) return false;
|
|
|
|
if(GetDate(szDate))
|
|
{
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"INSERT INTO TblLog(UID, Login, UseIP) VALUES(%d, '%s', '%s')", UID, szDate, UseIP);
|
|
|
|
if(!ExecuteQuery(m_szQry))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. 쿼리- %s, Err- %s",
|
|
m_szQry, GetErrorString());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 로그를 마친다
|
|
bool CDBAdminTool::EndLog(unsigned int UID)
|
|
{
|
|
char szDate[30];
|
|
int LogID;
|
|
|
|
if(!UID) return false;
|
|
|
|
if(GetDate(szDate))
|
|
{
|
|
if((LogID = GetNowLogID(UID)) > 0)
|
|
{
|
|
return UpdateLogoutDate(LogID, szDate);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// 관리자의 UID를 가져온다.
|
|
int CDBAdminTool::GetMyUID(char* szAccount)
|
|
{
|
|
int UID;
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"SELECT UID FROM TblToolAdmin WHERE strAdminID='%s'", szAccount);
|
|
|
|
if(ExecuteQuery(m_szQry))
|
|
{
|
|
if(GetData(&UID))
|
|
{
|
|
return UID;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
// 관리자 계정삭제.
|
|
bool CDBAdminTool::DelAdmin( char* AdminID )
|
|
{
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH, "DELETE TblToolAdmin WHERE strAdminID='%s'", AdminID);
|
|
|
|
if(!ExecuteQuery(m_szQry))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. 쿼리- %s, Err- %s",
|
|
m_szQry, GetErrorString());
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// 로그를 마친다.
|
|
bool CDBAdminTool::UpdateExitLog( unsigned int LogID, char* szExitLog )
|
|
{
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"UPDATE TblLog SET UseMsg='%s' WHERE LogID=%d", szExitLog, LogID);
|
|
|
|
if(!ExecuteQuery(m_szQry))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. 쿼리- %s, Err- %s",
|
|
m_szQry, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 관리자 레벨변경
|
|
bool CDBAdminTool::UpdateLevel(PktAdminMgr::PktUpdateLevel* UpdateLev)
|
|
{
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"UPDATE TblToolAdmin SET strLevel='%c' WHERE strAdminID='%s'",
|
|
UpdateLev->m_szLevel, UpdateLev->m_szAccount);
|
|
|
|
if(!ExecuteQuery(m_szQry))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. 쿼리- %s, Err- %s",
|
|
m_szQry, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 관리자 접속 아이피 변경
|
|
bool CDBAdminTool::UpdateIP(PktAdminMgr::PktUpdateIP* UpdateIP)
|
|
{
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"UPDATE TblToolAdmin SET strIP = '%s' WHERE strAdminID = '%s'",
|
|
UpdateIP->m_szIP, UpdateIP->m_szAccount);
|
|
|
|
if(!ExecuteQuery(m_szQry))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. 쿼리- %s, Err- %s",
|
|
m_szQry, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 관리자 로그아웃날자 변경
|
|
bool CDBAdminTool::UpdateLogoutDate(int LogID, char* szDate)
|
|
{
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"UPDATE TblLog SET Logout='%s' WHERE LogID=%d", szDate, LogID);
|
|
|
|
if(!ExecuteQuery(m_szQry))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. 쿼리- %s, Err- %s",
|
|
m_szQry, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 데이터 베이스에서 날자를 가져온다
|
|
bool CDBAdminTool::GetDate(char* DateTime)
|
|
{
|
|
if(ExecuteQuery("SELECT CONVERT(varchar(30), getdate(), 120)"))
|
|
{
|
|
if(GetData(DateTime))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// 접속 할때 부여받은 로그 ID 얻기
|
|
int CDBAdminTool::GetNowLogID(unsigned int UID)
|
|
{
|
|
int GetLogID = 0;
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"SELECT LogID FROM TblLog WHERE UID = %d ORDER BY LogID DESC", UID);
|
|
|
|
if(ExecuteQuery(m_szQry))
|
|
{
|
|
if(GetData(&GetLogID))
|
|
{
|
|
return GetLogID;
|
|
}
|
|
}
|
|
|
|
ERRLOG1(g_Log, "로그 ID를 얻는데 실패했습니다. Err- %s", GetErrorString());
|
|
return -1;
|
|
}
|
|
|
|
// 패스워드 변경
|
|
bool CDBAdminTool::UpdatePasswd( PktAdminMgr::PktUpdatePasswd* UpdatePwd )
|
|
{
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"UPDATE TblToolAdmin SET strPasswd = '%s' WHERE strAdminID = '%s'",
|
|
UpdatePwd->m_szPasswd, UpdatePwd->m_szAccount);
|
|
|
|
if(!ExecuteQuery(m_szQry))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. 쿼리- %s, Err- %s",
|
|
m_szQry, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 새로운 관리자 계정을 생성한다.
|
|
BYTE CDBAdminTool::NewAdmin(PktAdminMgr::PktNewAdmin* NewAdmin)
|
|
{
|
|
if(AccountCheck(NewAdmin->m_szAccount)) // 사용 여부 체크
|
|
{
|
|
_snprintf(m_szQry, MAX_QUERY_LENGTH,
|
|
"INSERT INTO TblToolAdmin(strAdminID, strPasswd, strLevel, strName, strIP) VALUES('%s', '%s', '%c', '%s', '%s')",
|
|
NewAdmin->m_szAccount, NewAdmin->m_szPasswd, NewAdmin->m_szLev, NewAdmin->m_szName, NewAdmin->m_szIP);
|
|
|
|
if(!ExecuteQuery(m_szQry))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. 쿼리- %s, Err- %s",
|
|
m_szQry, GetErrorString());
|
|
|
|
return PktAdminMgr::PktResult::Err_Database; // 켁~
|
|
}
|
|
return PktAdminMgr::PktResult::Success_NewAdmin; // 만들기 성공~
|
|
}
|
|
else
|
|
{
|
|
return PktAdminMgr::PktResult::Err_OverlapID; // 씨또 중복아이디다.
|
|
}
|
|
|
|
return PktAdminMgr::PktResult::Err_Unknown; // ㅡ.ㅡ;
|
|
}
|
|
|
|
bool CDBAdminTool::AddBlockUser(PktAdminMgr::PktAddBlockUser* lpBlock, char* lpAdminName, char* szClientID)
|
|
{
|
|
char szQuery[MAX_QUERY_LENGTH];
|
|
_snprintf(szQuery, MAX_QUERY_LENGTH,
|
|
"dbo.CMS_DoingRestraintChar '%d', '%d', '%s', '%s', '%d', '%d', '%s', '%s', '%s'",
|
|
lpBlock->m_cServerGroup, lpBlock->m_dwUID, szClientID, lpBlock->m_szCharacterName,
|
|
lpBlock->m_cBlockTarget, lpBlock->m_cBlockTerm, lpBlock->m_szBlockFinishDateTime,
|
|
lpAdminName, lpBlock->m_szDescription);
|
|
|
|
unsigned long dwResult = 0;
|
|
|
|
if (false == ExecuteQueryGetData(szQuery, &dwResult))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. query- %s, Err- %s", szQuery, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
if(0 < dwResult)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CDBAdminTool::DelBlockUser(PktAdminMgr::PktDelBlockUser* lpDelBlock)
|
|
{
|
|
char szQuery[MAX_QUERY_LENGTH];
|
|
_snprintf(szQuery, MAX_QUERY_LENGTH, "dbo.USPDeleteRestraintChar '%d', '%d'",
|
|
lpDelBlock->m_cServerGroup, lpDelBlock->m_nidx);
|
|
|
|
unsigned long dwResult = 0;
|
|
|
|
if (false == ExecuteQueryGetData(szQuery, &dwResult))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. query- %s, Err- %s", szQuery, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
if(0 < dwResult)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CDBAdminTool::InsertGMLogMsg(PktAdminMgr::PktGMLogMsg* lpPktGMLogMsg, char* szAdminID)
|
|
{
|
|
char szQuery[MAX_QUERY_LENGTH];
|
|
_snprintf(szQuery, MAX_QUERY_LENGTH,
|
|
"INSERT INTO TblGMLogMsg(UID, CID, ServerGroupID, LogMsg, AdminID) VALUES(%u, %u, %u, '%s', '%s')",
|
|
lpPktGMLogMsg->m_dwUID, lpPktGMLogMsg->m_dwCID, lpPktGMLogMsg->m_dwServerGroup,
|
|
lpPktGMLogMsg->m_szLogMsg, szAdminID);
|
|
|
|
if (false == ExecuteQuery(szQuery))
|
|
{
|
|
ERRLOG2(g_Log, "운영자 로그 삽입 실패. 쿼리- %s, Err- %s", szQuery, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDBAdminTool::UpdateGMLogMsg(PktAdminMgr::PktGMLogMsg* lpPktGMLogMsg, char* szAdminID)
|
|
{
|
|
char szQuery[MAX_QUERY_LENGTH];
|
|
_snprintf(szQuery, MAX_QUERY_LENGTH,
|
|
"UPDATE TblGMLogMsg SET LogMsg = '%s', AdminID = '%s'"
|
|
" WHERE LogID = %u AND UID = %u AND CID = %u AND ServerGroupID = %u",
|
|
lpPktGMLogMsg->m_szLogMsg, szAdminID, lpPktGMLogMsg->m_dwLogID, lpPktGMLogMsg->m_dwUID,
|
|
lpPktGMLogMsg->m_dwCID, lpPktGMLogMsg->m_dwServerGroup);
|
|
|
|
if (false == ExecuteQuery(szQuery))
|
|
{
|
|
ERRLOG2(g_Log, "운영자 로그 업데이트 실패. 쿼리- %s, Err- %s", szQuery, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDBAdminTool::DeleteGMLogMsg(PktAdminMgr::PktGMLogMsg* lpPktGMLogMsg)
|
|
{
|
|
char szQuery[MAX_QUERY_LENGTH];
|
|
_snprintf(szQuery, MAX_QUERY_LENGTH,
|
|
"INSERT INTO TblGMLogMsg_Log(LogID, UID, CID, ServerGroupID, EditDate, LogMsg, AdminID) "
|
|
"SELECT LogID, UID, CID, ServerGroupID, EditDate, LogMsg, AdminID FROM TblGMLogMsg WHERE LogID = %u",
|
|
lpPktGMLogMsg->m_dwLogID);
|
|
|
|
if (false == ExecuteQuery(szQuery))
|
|
{
|
|
ERRLOG2(g_Log, "운영자 로그 삭제 실패(로그 남기기). 쿼리- %s, Err- %s", szQuery, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
_snprintf(szQuery, MAX_QUERY_LENGTH,
|
|
"DELETE FROM TblGMLogMsg WHERE LogID = %u", lpPktGMLogMsg->m_dwLogID);
|
|
|
|
if (false == ExecuteQuery(szQuery))
|
|
{
|
|
ERRLOG2(g_Log, "운영자 로그 삭제 실패(로그 삭제). 쿼리- %s, Err- %s", szQuery, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDBAdminTool::IsExistLogMsg(PktAdminMgr::PktGMLogMsg* lpPktGMLogMsg)
|
|
{
|
|
char szQuery[MAX_QUERY_LENGTH];
|
|
if (0 == lpPktGMLogMsg->m_dwCID)
|
|
{
|
|
_snprintf(szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT TOP 1 LogID FROM TblGMLogMsg WHERE UID = %u AND CID = 0 AND ServerGroupID = %u",
|
|
lpPktGMLogMsg->m_dwUID, lpPktGMLogMsg->m_dwServerGroup);
|
|
}
|
|
else
|
|
{
|
|
_snprintf(szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT TOP 1 LogID FROM TblGMLogMsg WHERE CID = %u AND ServerGroupID = %u",
|
|
lpPktGMLogMsg->m_dwCID, lpPktGMLogMsg->m_dwServerGroup);
|
|
}
|
|
|
|
unsigned long dwLogID = 0;
|
|
if (false == ExecuteQueryGetData(szQuery, &dwLogID))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (0 == dwLogID)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
} |