Files
LGram16 dd97ddec92 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>
2025-11-29 20:17:20 +09:00

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;
}