PageRenderTime 34ms CodeModel.GetById 7ms RepoModel.GetById 1ms app.codeStats 0ms

/CSCommon/Source/MMatchServer_Admin.cpp

https://gitlab.com/Ephemeral/Source
C++ | 518 lines | 390 code | 94 blank | 34 comment | 123 complexity | 240f22ffa9ab86f52c25d4ea396fb4ca MD5 | raw file
  1. #include "stdafx.h"
  2. #include "MMatchServer.h"
  3. #include "MSharedCommandTable.h"
  4. #include "MErrorTable.h"
  5. #include "MBlobArray.h"
  6. #include "MObject.h"
  7. #include "MMatchObject.h"
  8. #include "MMatchItem.h"
  9. #include "MAgentObject.h"
  10. #include "MMatchNotify.h"
  11. #include "Msg.h"
  12. #include "MMatchObjCache.h"
  13. #include "MMatchStage.h"
  14. #include "MMatchTransDataType.h"
  15. #include "MMatchFormula.h"
  16. #include "MMatchConfig.h"
  17. #include "MCommandCommunicator.h"
  18. #include "MMatchShop.h"
  19. #include "MMatchTransDataType.h"
  20. #include "MDebug.h"
  21. #include "MMatchAuth.h"
  22. #include "MMatchStatus.h"
  23. #include "MAsyncDBJob.h"
  24. #include "MMatchTransDataType.h"
  25. #include "MMatchAntiHack.h"
  26. void MMatchServer::OnAdminTerminal(const MUID& uidAdmin, const char* szText)
  27. {
  28. MMatchObject* pObj = GetObject(uidAdmin);
  29. if (pObj == NULL) return;
  30. // 관리자 권한을 가진 사람이 아니면 연결을 끊는다.
  31. if (!IsHighAdmin(pObj))
  32. {
  33. // DisconnectObject(uidAdmin);
  34. return;
  35. }
  36. char szOut[32768]; szOut[0] = 0;
  37. if (m_Admin.Execute(uidAdmin, szText))
  38. {
  39. MCommand* pNew = CreateCommand(MC_ADMIN_TERMINAL, MUID(0,0));
  40. pNew->AddParameter(new MCmdParamUID(MUID(0,0)));
  41. pNew->AddParameter(new MCmdParamStr(szOut));
  42. RouteToListener(pObj, pNew);
  43. }
  44. }
  45. void MMatchServer::OnAdminAnnounce(const MUID& uidAdmin, const char* szChat, unsigned long int nType)
  46. {
  47. MMatchObject* pObj = GetObject(uidAdmin);
  48. if (pObj == NULL) return;
  49. // 관리자 권한을 가진 사람이 아니면 연결을 끊는다.
  50. if (!IsAdminGrade(pObj))
  51. {
  52. return;
  53. }
  54. //Box for HighAdminOnly
  55. if (nType == 1)
  56. {
  57. if (!IsHighAdmin(pObj))
  58. {
  59. return;
  60. }
  61. }
  62. char szMsg[256];
  63. char *szName = (pObj->CheckPlayerFlags(MTD_PlayerFlags_AdminIncognito)) ? pObj->GetCharInfo()->m_szIncognitoName : pObj->GetCharInfo()->m_szName;
  64. sprintf(szMsg,"^1[!]%s : ^2%s",szName,szChat);
  65. //strcpy(szMsg, szChat);
  66. MCommand* pCmd = CreateCommand(MC_ADMIN_ANNOUNCE, MUID(0,0));
  67. pCmd->AddParameter(new MCmdParamUID(uidAdmin));
  68. pCmd->AddParameter(new MCmdParamStr(szMsg));
  69. pCmd->AddParameter(new MCmdParamUInt(nType));
  70. RouteToAllClient(pCmd);
  71. CTime theTime = CTime::GetCurrentTime();
  72. CString szTime = theTime.Format( "[%c] " );
  73. /*if(strstr(szMsg, "%"))
  74. {
  75. LOG(LOG_PROG, "Admin %s tried to crash the server\n", pObj->GetCharInfo()->m_szName);
  76. }
  77. else*/
  78. {
  79. dglog("AdminLog//announcements.txt", "%s : %s(%s) announced (type: %s) : %s\n",szTime, pObj->GetCharInfo()->m_szName, pObj->GetIPString(), nType ? "Box" : "Msg", szMsg);
  80. LOG(LOG_PROG, "Admin %s announced (type: %s): %s\n", pObj->GetCharInfo()->m_szName, nType ? "Box" : "Msg", szMsg);
  81. }
  82. }
  83. void MMatchServer::OnAdminRequestServerInfo(const MUID& uidAdmin)
  84. {
  85. MMatchObject* pObj = GetObject(uidAdmin);
  86. if (pObj == NULL) return;
  87. // 관리자 권한을 가진 사람이 아니면 연결을 끊는다.
  88. if (!IsAdminGrade(pObj))
  89. {
  90. // DisconnectObject(uidAdmin);
  91. return;
  92. }
  93. // 서버 정보 보여주는것 아직 안넣었음
  94. /*
  95. MCommand* pNew = CreateCommand(MC_MATCH_ANNOUNCE, MUID(0,0));
  96. pNew->AddParameter(new MCmdParamUInt(0));
  97. RouteToListener(pObj, pNew);
  98. */
  99. }
  100. void MMatchServer::OnAdminServerHalt(const MUID& uidAdmin)
  101. {
  102. LOG(LOG_PROG, "OnAdminServerHalt(...) Called");
  103. MMatchObject* pObj = GetObject(uidAdmin);
  104. if (pObj == NULL) return;
  105. MMatchUserGradeID nGrade = pObj->GetAccountInfo()->m_nUGrade;
  106. // 관리자 권한을 가진 사람이 아니면 무시.
  107. if ((nGrade != MMUG_ADMIN && nGrade != MMUG_HCODER)) return;
  108. // Shutdown 시작
  109. m_MatchShutdown.Start(GetGlobalClockCount());
  110. }
  111. // 서버에서 메뉴로만 쓰는 명령어..
  112. void MMatchServer::OnAdminServerHalt()
  113. {
  114. LOG(LOG_PROG, "OnAdminServerHalt() Called");
  115. // Shutdown 시작
  116. m_MatchShutdown.Start(GetGlobalClockCount());
  117. }
  118. void MMatchServer::OnAdminRequestUpdateAccountUGrade(const MUID& uidAdmin, const char* szPlayer)
  119. {
  120. MMatchObject* pObj = GetObject(uidAdmin);
  121. if (pObj == NULL) return;
  122. // 관리자 권한을 가진 사람이 아니면 연결을 끊는다.
  123. if (!IsAdminGrade(pObj))
  124. {
  125. // DisconnectObject(uidAdmin);
  126. return;
  127. }
  128. int nRet = MOK;
  129. if ((strlen(szPlayer)) < 2) return;
  130. MMatchObject* pTargetObj = GetPlayerByName(szPlayer);
  131. if (pTargetObj == NULL) return;
  132. /*MCommand* pNew = CreateCommand(MC_ADMIN_REQUEST_UPDATE_ACCOUNT_UGRADE, MUID(0,0));
  133. pNew->AddParameter(new MCmdParamUInt(nRet));
  134. RouteToListener(pObj, pNew);*/
  135. }
  136. void MMatchServer::OnAdminPingToAll(const MUID& uidAdmin)
  137. {
  138. MMatchObject* pObj = GetObject(uidAdmin);
  139. if (pObj == NULL) return;
  140. // 관리자 권한을 가진 사람이 아니면 연결을 끊는다.
  141. if (!IsAdminGrade(pObj))
  142. {
  143. // DisconnectObject(uidAdmin);
  144. return;
  145. }
  146. MCommand* pNew = CreateCommand(MC_NET_PING, MUID(0,0));
  147. pNew->AddParameter(new MCmdParamUInt(GetGlobalClockCount()));
  148. RouteToAllConnection(pNew);
  149. }
  150. void MMatchServer::OnAdminRequestSwitchLadderGame(const MUID& uidAdmin, const bool bEnabled)
  151. {
  152. MMatchObject* pObj = GetObject(uidAdmin);
  153. if (!IsEnabledObject(pObj)) return;
  154. // 관리자 권한을 가진 사람이 아니면 연결을 끊는다.
  155. if (!IsAdminGrade(pObj))
  156. {
  157. // DisconnectObject(uidAdmin);
  158. return;
  159. }
  160. MGetServerConfig()->SetEnabledCreateLadderGame(bEnabled);
  161. char szMsg[256] = "설정되었습니다.";
  162. Announce(pObj, szMsg);
  163. }
  164. void MMatchServer::OnAdminHide(const MUID& uidAdmin)
  165. {
  166. MMatchObject* pObj = GetObject(uidAdmin);
  167. if (!IsEnabledObject(pObj)) return;
  168. // 관리자 권한을 가진 사람이 아니면 연결을 끊는다.
  169. if (!IsAdminGrade(pObj))
  170. {
  171. // DisconnectObject(uidAdmin);
  172. return;
  173. }
  174. #if defined(LOCALE_NHNUSA) || defined(_DEBUG)
  175. m_HackingChatList.Init();
  176. mlog( "reload hacking chat list.\n" );
  177. #endif
  178. if (pObj->CheckPlayerFlags(MTD_PlayerFlags_AdminHide)) {
  179. pObj->SetPlayerFlag(MTD_PlayerFlags_AdminHide, false);
  180. Announce(pObj, "Now Revealing...");
  181. } else {
  182. pObj->SetPlayerFlag(MTD_PlayerFlags_AdminHide, true);
  183. Announce(pObj, "Now Hiding...");
  184. }
  185. }
  186. void MMatchServer::OnAdminIncognito(const MUID& uidAdmin, char *pszNewName)
  187. {
  188. MMatchObject* pObj = GetObject(uidAdmin);
  189. if (!pObj || !IsEnabledObject(pObj)) return;
  190. if (!IsAdminGrade(pObj)) return;
  191. if (pObj->CheckPlayerFlags(MTD_PlayerFlags_AdminIncognito)) {
  192. pObj->SetPlayerFlag(MTD_PlayerFlags_AdminIncognito, false);
  193. Announce(pObj, "Removing disguise...");
  194. MCommand* pCmd = CreateCommand(MC_ADMIN_RESPONSE_INCOGNITO, MUID(0,0));
  195. pCmd->AddParameter(new MCmdParamUInt(pObj->GetAccountInfo()->m_nUGrade));
  196. RouteToListener(pObj, pCmd);
  197. } else {
  198. pObj->SetPlayerFlag(MTD_PlayerFlags_AdminIncognito, true);
  199. if (IsHighAdmin(pObj))
  200. pObj->GetAccountInfo()->m_nIncognitoGrade = MMUG_HIDDENADMIN;
  201. else
  202. pObj->GetAccountInfo()->m_nIncognitoGrade = MMUG_HIDDENGM;
  203. bool bAlphaNum = true;
  204. if (ValidateMakingName(pszNewName, MIN_CHARNAME, MAX_CHARNAME) != MOK)
  205. bAlphaNum = false;
  206. for(SIZE_T nStr = 0; nStr < strlen(pszNewName); nStr++)
  207. {
  208. if(!isalnum(pszNewName[nStr]))
  209. {
  210. if(pszNewName[nStr] != '[' || pszNewName[nStr] != ']')
  211. {
  212. bAlphaNum = false;
  213. break;
  214. }
  215. }
  216. }
  217. if (!bAlphaNum && pObj->GetAccountInfo()->m_nUGrade != MMUG_HCODER)
  218. {
  219. Announce(pObj, "That name is invalid.");
  220. return;
  221. }
  222. strcpy(pObj->GetCharInfo()->m_szIncognitoName,pszNewName);
  223. char msg[256];
  224. sprintf(msg,"Going incognito as %s",pszNewName);
  225. Announce(pObj, msg);
  226. MCommand* pCmd = CreateCommand(MC_ADMIN_RESPONSE_INCOGNITO, MUID(0,0));
  227. pCmd->AddParameter(new MCmdParamUInt(pObj->GetAccountInfo()->m_nIncognitoGrade));
  228. RouteToListener(pObj, pCmd);
  229. }
  230. }
  231. void MMatchServer::OnAdminResetAllHackingBlock( const MUID& uidAdmin )
  232. {
  233. MMatchObject* pObj = GetObject( uidAdmin );
  234. if( (0 != pObj) && IsAdminGrade(pObj) )
  235. {
  236. GetDBMgr()->AdminResetAllHackingBlock();
  237. }
  238. }
  239. void MMatchServer::OnAdminRequestKickPlayer(const MUID& uidAdmin, const char* szPlayer)
  240. {
  241. MMatchObject* pObj = GetObject(uidAdmin);
  242. if (pObj == NULL) return;
  243. if (!IsAdminGrade(pObj) || pObj->GetAccountInfo()->m_nUGrade == MMUG_DEVELOPER) return;
  244. if ((strlen(szPlayer)) < 2) return;
  245. int nRet = MOK;
  246. MMatchObject* pTargetObj = GetPlayerByName(szPlayer);
  247. if (pTargetObj != NULL)
  248. {
  249. if (IsHighAdmin(pTargetObj) && !IsHighAdmin(pObj)) return;
  250. CTime theTime = CTime::GetCurrentTime();
  251. CString szTime = theTime.Format( "[%c] " );
  252. dglog("AdminLog//disconnection.txt", "%s : %s(%s) disconnected %s\n", szTime, pObj->GetCharInfo()->m_szName, pObj->GetIPString(), szPlayer);
  253. LOG(LOG_PROG, "Admin %s disconnected %s\n",pObj->GetCharInfo()->m_szName, szPlayer);
  254. char szKickMessage[256];
  255. sprintf(szKickMessage,"^2You have been disconnected by ^1%s",pObj->GetName());
  256. MGetMatchServer()->AnnounceBox(pTargetObj,szKickMessage);
  257. pTargetObj->GetDisconnStatusInfo().SetStatus(MMDS_DISCONNECT);
  258. } else {
  259. nRet = MERR_ADMIN_NO_TARGET;
  260. }
  261. MCommand* pNew = CreateCommand(MC_ADMIN_RESPONSE_KICK_PLAYER, MUID(0,0));
  262. pNew->AddParameter(new MCmdParamInt(nRet));
  263. RouteToListener(pObj, pNew);
  264. }
  265. void MMatchServer::OnRequestChangeTeam(const MUID& Admin,PCHAR Player,LONG TeamId)
  266. {
  267. MMatchObject* Sender = GetObject(Admin);
  268. MMatchObject* Target = GetPlayerByName(Player);
  269. MCommand* NewCommand = NULL;
  270. if(!Sender)
  271. return;
  272. if(!Target)
  273. return;
  274. if(TeamId < 0 || TeamId > 3)
  275. return;
  276. if(!IsAdminGrade(Sender))
  277. return;
  278. MUID TargetUID = Target->GetUID();
  279. if(!TargetUID.Low)
  280. return;
  281. NewCommand = CreateCommand(MC_MATCH_GAME_RESPONSE_CHANGE_TEAM,MUID(0,0));
  282. if(!NewCommand)
  283. return;
  284. NewCommand->AddParameter(new MCmdParamUID(TargetUID));
  285. NewCommand->AddParameter(new MCmdParamInt(TeamId));
  286. RouteToBattle(Sender->GetStageUID(),NewCommand);
  287. }
  288. void MMatchServer::OnRequestTeleportOtherPlayer(const MUID& Admin,const char* Player,float X,float Y,float Z)
  289. {
  290. MMatchObject* GradeObject = GetObject(Admin);
  291. if(!GradeObject)
  292. return;
  293. if(!IsCoderOnly(GradeObject))
  294. return;
  295. MMatchObject* pTargetObj = GetPlayerByName(Player);
  296. if(!pTargetObj)
  297. return;
  298. MUID TargetUID = pTargetObj->GetUID();
  299. if(!TargetUID.Low)
  300. return;
  301. MCommand* pNew = CreateCommand(MC_MATCH_GAME_RESPONSE_TELEPORT,MUID(0,0));
  302. pNew->AddParameter(new MCmdParamUID(TargetUID));
  303. pNew->AddParameter(new MCmdParamFloat(X));
  304. pNew->AddParameter(new MCmdParamFloat(Y));
  305. pNew->AddParameter(new MCmdParamFloat(Z));
  306. RouteToBattle(GradeObject->GetStageUID(),pNew);
  307. }
  308. void MMatchServer::OnAdminRequestMutePlayer(const MUID& uidAdmin, const char* szPlayer, const int nPenaltyHour)
  309. {
  310. return; //disabled
  311. MMatchObject* pObj = GetObject(uidAdmin);
  312. if (pObj == NULL) return;
  313. if (!IsAdminGrade(pObj)) return;
  314. if ((strlen(szPlayer)) < 2) return;
  315. int nRet = MOK;
  316. MMatchObject* pTargetObj = GetPlayerByName(szPlayer);
  317. if (pTargetObj != NULL)
  318. {
  319. pTargetObj->GetAccountPenaltyInfo()->SetPenaltyInfo(MPC_CHAT_BLOCK, nPenaltyHour);
  320. const MPenaltyInfo* pPenaltyInfo = pTargetObj->GetAccountPenaltyInfo()->GetPenaltyInfo(MPC_CHAT_BLOCK);
  321. if( m_MatchDBMgr.InsertAccountPenaltyInfo(pTargetObj->GetAccountInfo()->m_nAID
  322. , pPenaltyInfo->nPenaltyCode, nPenaltyHour, pObj->GetAccountName()) == false )
  323. {
  324. pTargetObj->GetAccountPenaltyInfo()->ClearPenaltyInfo(MPC_CHAT_BLOCK);
  325. nRet = MERR_ADMIN_CANNOT_PENALTY_ON_DB;
  326. }
  327. }
  328. else
  329. {
  330. nRet = MERR_ADMIN_NO_TARGET;
  331. }
  332. MCommand* pNew = CreateCommand(MC_ADMIN_RESPONSE_MUTE_PLAYER, MUID(0,0));
  333. pNew->AddParameter(new MCmdParamInt(nRet));
  334. if( nRet == MOK ) {
  335. RouteToListener(pTargetObj, pNew->Clone());
  336. }
  337. RouteToListener(pObj, pNew);
  338. }
  339. void MMatchServer::OnAdminRequestBlockPlayer(const MUID& uidAdmin, const char* szPlayer, const int nPenaltyHour)
  340. {
  341. return; //disabled
  342. MMatchObject* pObj = GetObject(uidAdmin);
  343. if (pObj == NULL) return;
  344. if (!IsAdminGrade(pObj)) return;
  345. if ((strlen(szPlayer)) < 2) return;
  346. int nRet = MOK;
  347. MMatchObject* pTargetObj = GetPlayerByName(szPlayer);
  348. if (pTargetObj != NULL)
  349. {
  350. pTargetObj->GetAccountPenaltyInfo()->SetPenaltyInfo(MPC_CONNECT_BLOCK, nPenaltyHour);
  351. const MPenaltyInfo* pPenaltyInfo = pTargetObj->GetAccountPenaltyInfo()->GetPenaltyInfo(MPC_CONNECT_BLOCK);
  352. if( m_MatchDBMgr.InsertAccountPenaltyInfo(pTargetObj->GetAccountInfo()->m_nAID
  353. , pPenaltyInfo->nPenaltyCode, nPenaltyHour, pObj->GetAccountName()) == false )
  354. {
  355. pTargetObj->GetAccountPenaltyInfo()->ClearPenaltyInfo(MPC_CONNECT_BLOCK);
  356. nRet = MERR_ADMIN_CANNOT_PENALTY_ON_DB;
  357. }
  358. }
  359. else
  360. {
  361. nRet = MERR_ADMIN_NO_TARGET;
  362. }
  363. MCommand* pNew = CreateCommand(MC_ADMIN_RESPONSE_BLOCK_PLAYER, MUID(0,0));
  364. pNew->AddParameter(new MCmdParamInt(nRet));
  365. if( nRet == MOK ) {
  366. Disconnect(pTargetObj->GetUID());
  367. }
  368. RouteToListener(pObj, pNew);
  369. }
  370. void MMatchServer::OnAdminRequestEventBanPlayer(const MUID& uidAdmin, const char* szPlayer, const int nPenaltyHour)
  371. {
  372. MMatchObject* pObj = GetObject(uidAdmin);
  373. if (pObj == NULL) return;
  374. if (!IsDGAdminGrade(pObj)) return;
  375. if ((strlen(szPlayer)) < 2) return;
  376. int nRet = MOK;
  377. MMatchObject* pTargetObj = GetPlayerByName(szPlayer);
  378. if (pTargetObj != NULL && pTargetObj->GetAccountInfo()->m_nUGrade != MMUG_HCODER)
  379. {
  380. if( m_MatchDBMgr.SetPGrade(pTargetObj->GetAccountInfo()->m_nAID,MMPG_EVENTBAN))
  381. {
  382. nRet = MERR_ADMIN_CANNOT_PENALTY_ON_DB;
  383. }
  384. }
  385. else
  386. {
  387. nRet = MERR_ADMIN_NO_TARGET;
  388. }
  389. if( nRet == MOK ) {
  390. char szKickMessage[256];
  391. sprintf(szKickMessage,"^2You have been banned from events by ^1%s",pObj->GetName());
  392. MGetMatchServer()->AnnounceBox(pTargetObj,szKickMessage);
  393. MGetMatchServer()->Announce(pObj,"Player has been banned events");
  394. Disconnect(pTargetObj->GetUID());
  395. }
  396. }
  397. void MMatchServer::OnAdminRequestEventUnbanPlayer(const MUID& uidAdmin, const char* szPlayer, const int nPenaltyHour)
  398. {
  399. MMatchObject* pObj = GetObject(uidAdmin);
  400. if (pObj == NULL) return;
  401. if (!IsDGAdminGrade(pObj)) return;
  402. if ((strlen(szPlayer)) < 2) return;
  403. int nRet = MOK;
  404. MMatchObject* pTargetObj = GetPlayerByName(szPlayer);
  405. if (pTargetObj != NULL && pTargetObj->GetAccountInfo()->m_nPGrade == MMPG_EVENTBAN)
  406. {
  407. if( m_MatchDBMgr.SetPGrade(pTargetObj->GetAccountInfo()->m_nAID,MMPG_FREE))
  408. {
  409. nRet = MERR_ADMIN_CANNOT_PENALTY_ON_DB;
  410. }
  411. }
  412. else
  413. {
  414. nRet = MERR_ADMIN_NO_TARGET;
  415. }
  416. if( nRet == MOK ) {
  417. char szKickMessage[256];
  418. sprintf(szKickMessage,"^2You have been unbanned from events by ^1%s",pObj->GetName());
  419. MGetMatchServer()->AnnounceBox(pTargetObj,szKickMessage);
  420. MGetMatchServer()->Announce(pObj,"Player has been unbanned events");
  421. Disconnect(pTargetObj->GetUID());
  422. }
  423. }