Files
Client/Server/RylServerProject/RylServerLibrary/Network/Packet/ManagePacketCmd.h
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

329 lines
9.1 KiB
C++

#ifndef _MANAGE_PACKET_COMMAND_H_
#define _MANAGE_PACKET_COMMAND_H_
#include <winsock2.h>
#include <windows.h>
#include <tchar.h>
#include <psapi.h>
#include <Network/Packet/PacketBase.h>
#include <Network/Packet/PacketCommand.h>
#include <ctime>
namespace ServerManage
{
namespace CMD
{
enum CMDType
{
// ManageClient, ManageServer, ManageTool 전부 사용하는 패킷 커맨드.
UpdateRunList = 0x00, // 실행 목룍을 준다 (ManageServer -> ManageClient, ManageTool), Ack없음.
RunProcess = 0x01, // 실행한다. (ManageTool -> ManageServer -> ManageClient), Ack는 반대 순서로 전송
QuitProcess = 0x02, // 종료한다. (ManageTool -> ManageServer -> ManageClient), Ack는 반대 순서로 전송
ForceTerminate = 0x03, // 강제 종료한다. (ManageTool -> ManageServer -> ManageClient), Ack는 반대 순서로 전송
ProcessStatus = 0x04, // 프로세스 상태 전송 (ManageClient -> ManageServer -> ManageTool), Ack없음.
RelayCommand = 0x05, // 패킷 커맨드를 윈도우 메시지를 써서 중계해서 넘긴다.
AutoPatch = 0x06, // 자기 자신을 패치한다
ChangeSetup = 0x07, // 설정을 바꾸고 저장한다.
ReloadSetup = 0x08, // 설정을 재로드한다.
ExecuteCommand = 0x09, // 콘솔 커맨드를 문자열로 전달한다.
// ManageServer <-> ManageTool
AuthUser = 0x10, // 유저 인증
AddUser = 0x11, // 유저 추가
DelUser = 0x12, // 유저 삭제
ModUser = 0x13, // 유저 정보 변경
RequestUserReaction = 0x14, // 유저에게 어떤 판단에 대해서 동의를 얻음.(usSubCommand 활용)
RequestPromote = 0x15, // 스스로 관리자가 되겠다고 선언
ManagerInfo = 0x16, // 현재 관리자 정보를 줌
// ManageServer -> ManageTool
UserList = 0x20, // 유저 리스트(유저 정보)
UserLogin = 0x21, // 서버에서 툴로 유저 정보를 준다. (유저가 로그인했음)
UserLogout = 0x22, // 서버에서 툴로 유저 정보를 준다. (유저가 로그아웃했음)
StatServerStatus= 0x23, // 관리서버, 통계서버간 연결 상태를 준다.
// ManageClient <-> Each Server
IPC_ManagePing = 0x30, // Each Server -> ManageClient (Alive여부 및 Window Name을 준다)
// ManageTool <-> ManageServer
Ping = CmdSysPing
};
enum RelaySubCmd
{
// UserInfo
SubCmd_ServerUserNum = 0x01
};
enum UserReactionSubCmd
{
// Promote
REQUEST_TAKEBACK_PROMOTE = 0x01,
ACK_TAKEBACK_PROMOTE = 0x02,
NAK_TAKEBACK_PROMOTE = 0x03
};
enum UserStatCMD
{
UPDATE_USER_STATUS = 0x01
};
};
#pragma pack(1)
// 패킷 뒤에 윈도우 이름, 추가 데이터가 붙어 온다.
// 사용 패킷 : ExecuteFile, RelayCommand, AutoPatch,
// ChangeSetup, ReloadSetup
//
struct ManageCommand : public PktBase
{
enum AutoPatchFlag
{
AUTOPATCH_OPENFILE = 1,
AUTOPATCH_DATA = 2
};
unsigned int nMessage; // 메시지 번호
WPARAM wParam; // 파라미터1
LPARAM lParam; // 파라미터2
unsigned long dwRunID; // 타겟 RunID
unsigned short usFlags; // 추가 데이터 플래그
unsigned short usDataLen; // 추가 데이터 길이
};
enum ManageCommandError
{
INVALID_MANAGE_PACKET_ERROR = 0,
CANNOT_FIND_CLIENT_DISPATCH = 1,
SEND_MANAGE_COMMAND_ERROR = 2,
UNKNOWN_RUN_INFO = 3,
INVALID_MANAGE_RIGHTS = 4
};
enum UpdateRunInfoFlags
{
SEND_RUNINFO_START = 0,
SEND_RUNINFO_NOW = 1,
SEND_RUNINFO_FINISH = 2
};
enum ProcessStatusFlags
{
PROCESS_RUNNING = (1 << 0)
};
struct ProcessStatus
{
unsigned long m_dwRunID;
unsigned long m_dwStatusFlags;
unsigned long m_dwCustomStatus;
unsigned long m_dwLastSetWindowHandleTime;
unsigned long m_dwCurrentTime;
FILETIME m_CreationTIme;
FILETIME m_ExitTime;
FILETIME m_KernelTime;
FILETIME m_UserTime;
PROCESS_MEMORY_COUNTERS m_ProcessMemoryCounters;
};
/*
사용 패킷 : AuthUser, AddUser, DelUser, ModUser, PromoteUser
AuthUser : 툴 -> 서버 (szID, szPassword),
서버 -> 툴 (szID, szPassword, szFullName, dwIP, usAdminLevel)
다른 툴들에게 전부 자신의 UserInfo 패킷을 보낸다.
로그인 된 사용자 전부의 정보를 받는다.
기능 : 유저 인증을 한다.
에러 코드 : INVALID_PACKET_ERROR,
AUTHORIZE_FAILED
AddUser : 툴 -> 서버 (szID, szPassword, szFullName, dwIP, usAdminLevel)
서버 -> 툴 (szID, szPassword, szFullName, dwIP, usAdminLevel)
기능 : 유저를 추가한다.
에러 코드 :
DelUser : 툴 -> 서버 (szID, szPassword, szFullName, dwIP, usAdminLevel)
서버 -> 툴 (szID, szPassword, szFullName, dwIP, usAdminLevel)
기능 : 유저를 삭제한다.
에러 코드 :
ModUser : 툴 -> 서버 (szID, szPassword, szFullName, dwIP, usAdminLevel)
서버 -> 툴 (szID, szPassword, szFullName, dwIP, usAdminLevel)
기능 : 유저 정보를 변경한다.
에러 코드 :
UserInfo : 툴 -> 서버
현재 로그인된 유저 정보를 요청한다. 데이터는 없다.
서버 -> 툴
현재 로그인된 유저 수만큼 UserInfo구조체가 뒤에 붙어 온다.
기능 : 사용자 정보를 전송한다.
에러 코드 :
Promote의 과정
0. 인증 성공시, 현재 Promote된 유저의 ID를 준다.
1. Manager가 없거나 Master의 Promote
서버로 Promote패킷을 보냄 -> 서버는 Master거나 Manager가 없음을 확인.
-> 확인 성공시 이 id에 Promote 권한을 준다.
-> 각 유저들에게 누가 Promote유저인지를 가르쳐 준다.
2. General의 Promote
서버로 Promote패킷을 보냄 -> 서버는 General인지 확인
-> 확인 성공시, 현재 Promote 권한이 있는 유저가 있는지 살피고 확인 패킷 보냄
-> 확인 패킷에서, ok가 오면, 권한을 넘기고, 각 유저들에게 Promote유저임을 준다.
-> 확인 패킷에서, no가 오면, Promote요청자에게 실패 메시지를 준다.
필요 패킷
1. ManageUserInfo (ManageServer -> ManageTool) ManagerID및 정보
2. Request Promote (ManageTool -> ManageServer) 정보 없음
3. Request Promote Ack (ManageServer -> ManageTool) 정보 없음
4. Request User Reaction (ManageServer -> ManageTool) 요구자 정보, 요구 타입(usSubCommand)
5. Request User Reaction Ack (ManageTool -> ManageServer) 요구자 정보, 요구 결과(usSubCommand)
*/
enum UserCommandError
{
NO_USER_COMMAND_ERROR = 0,
INVALID_USER_PACKET_ERROR = 1,
AUTHORIZE_FAILED = 2,
CANNOT_AUTHORIZE_NOT_USER = 3,
CANNOT_AUTHORIZE_INVALID_PASSWORD = 4,
CANNOT_AUTHORIZE_INVALID_IPADDRESS = 5,
ALREADY_LOGINED = 6,
ADD_USER_FAILED = 7,
DELETE_USER_FAILED = 8,
MODIFY_USER_FAILED = 9,
PROMOTE_USER_FAILED = 10,
PROMOTE_TAKEBACK_FAILED = 11,
REJECTED_PROMOTE_USER = 12,
SEND_USER_LIST_FAILED = 13,
INVALID_USERMANAGE_RIGHTS = 14
};
struct UserInfo
{
enum Const
{
// edith 2008.03.17 ID,PASS 길이조정
ID_LEN = 16,
PASS_LEN = 16,
NAME_LEN = 32
};
TCHAR szFullName[NAME_LEN];
TCHAR szID[ID_LEN];
TCHAR szPassword[PASS_LEN];
unsigned long dwIP;
unsigned short usAdminLevel;
unsigned short usSubCommand;
};
struct UserCommand : public PktBase
{
unsigned char cUserInfoNum;
// 뒤에 UserInfo구조체가 cUserInfoNum개 만큼 붙는다.
};
/*
Relay Command로 오는 커맨드
서버 정보
*/
struct RunInfo
{
enum Const
{
MAX_SERVER_NAME = 64,
MAX_PATH_LEN = 260,
MAX_OPT_LEN = 260
};
unsigned long m_dwRunID; // RunID(primary key)
unsigned long m_dwServerIP; // (network order ip)
unsigned long m_dwPathID; // PathID
unsigned long m_dwOptionID; // OptionID
char m_szServerName[MAX_SERVER_NAME];
char m_szPath[MAX_PATH_LEN];
char m_szOption[MAX_OPT_LEN];
};
struct PktManagePacket : public PktBase
{
unsigned long m_dwPID;
unsigned long m_dwStatusFlag;
unsigned long m_dwSubCommand;
PktManagePacket() : m_dwPID(GetCurrentProcessId()), m_dwStatusFlag(0), m_dwSubCommand(0) { }
};
struct PktManagePing : public PktManagePacket
{
char m_szAppFullPathName[MAX_PATH];
char m_szWindowName[MAX_PATH];
char m_szCommandLine[MAX_PATH * 2];
};
struct UserNumPair
{
unsigned long m_dwServerID;
int m_nUserNum;
};
struct PktManageUserNum : public PktManagePacket
{
unsigned long m_dwUserInfoNum;
};
struct PktUserStat : public PktBase
{
enum SIZE
{
MAX_DATE = 20
};
//time_t m_nTime;
char m_szSendingTime[MAX_DATE];
unsigned short m_usUserStatDataNum;
};
struct UserStatData
{
unsigned int m_nNation; // 국가 코드(AdminToolServer.ini 참조)
unsigned long m_dwServerID; // 정보를 전송해온 서버 ID
unsigned int m_nUserNum; // 접속 유저 수
};
struct StatServerStatus : public PktBase
{
bool m_bGlobalStatServerOK; // 글로번 통계서버와 관리서버 연결 상태
bool m_bLocalStatServerOK; // 로컬 통계서버와 관리서버 연결 상태
};
#pragma pack()
};
#endif