//1.) Search for:
case HEADER_CG_REFINE:
Refine(ch, c_pData);
break;
//2.) Add after:
#ifdef ENABLE_ADMIN_BAN_MANAGER
case HEADER_CG_ADMIN_BAN_MANAGER:
SendAdminBanManager(ch, c_pData);
break;
#endif
//1.) Search for:
void CInputMain::Warp(LPCHARACTER ch, const char * pcData)
{
ch->WarpEnd();
}
//2.) Add after:
#ifdef ENABLE_ADMIN_BAN_MANAGER
enum ETypeActionBan
{
ACTION_BAN_PERMANENTLY = 0,
ACTION_BAN_IP = 1 ,
ACTION_BAN_TIME = 2,
};
bool CheckIsStaffAdmin(LPCHARACTER ch)
{
const char* arListMembers[] = /* Here add people member from staff what you want to have acces on administration area ban, unlimited slots !*/
{
"[DEV]VegaS",
"Slot 2",
"Slot 3",
"Slot 4",
"Slot 5",
"Slot 6"
};
for(unsigned int key = 0; key < _countof(arListMembers); key++) {
return ((!strcmp(arListMembers[key], ch->GetName())) && ch->GetGMLevel() > GM_PLAYER) ? true : false;
}
}
bool CheckIsBlocked(LPCHARACTER ch, const char* c_szName)
{
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT account_id FROM player.player WHERE name = '%s'", c_szName));
MYSQL_ROW row_id = mysql_fetch_row(pMsg->Get()->pSQLResult);
if (pMsg->uiSQLErrno != 0 || !pMsg->Get()->uiNumRows)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("admin_manager_error_cannot_find_user"), c_szName);
return false;
}
int account_id = 0;
str_to_number(account_id, row_id[0]);
std::auto_ptr<SQLMsg> pMsg2(DBManager::instance().DirectQuery("SELECT status FROM account.account WHERE id = '%d'", account_id));
MYSQL_ROW row_inf = mysql_fetch_row(pMsg2->Get()->pSQLResult);
const char* c_szStatus = row_inf[0];
if (!strcmp(c_szStatus, "BLOCK"))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("admin_manager_error_is_blocked"), c_szName);
return true;
}
return false;
}
void InsertLogsBan(const char* c_pszWho, const char* c_pszAction, const char* c_pszVictim, const char* c_pszReason)
{
DBManager::Instance().DirectQuery("INSERT INTO log.tool_ban (who, action, victim, reason, date) VALUES('%s', '%s', '%s', '%s', NOW())", c_pszWho, c_pszAction, c_pszVictim, c_pszReason);
}
void CInputMain::SendAdminBanManager(LPCHARACTER ch, const char* c_pData)
{
const TPacketCGAdminBanManger* p = reinterpret_cast<const TPacketCGAdminBanManger*>(c_pData);
if (!ch)
return;
if (!CheckIsStaffAdmin(ch))
{
ch->ChatPacket(CHAT_TYPE_INFO, "<Server> Error 0x01.");
return;
}
char szEscapedUserName[CHAT_MAX_LEN * 2 + 1];
DBManager::instance().EscapeString(szEscapedUserName, sizeof(szEscapedUserName), p->user_name, strlen(p->user_name));
char szEscapedReason[CHAT_MAX_LEN * 2 + 1];
DBManager::instance().EscapeString(szEscapedReason, sizeof(szEscapedReason), p->reason, strlen(p->reason));
if (!strcmp(szEscapedUserName, ch->GetName()))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("admin_manager_error_yourself"));
return;
}
if (CheckIsBlocked(ch, szEscapedUserName))
return;
switch (p->action)
{
case ACTION_BAN_PERMANENTLY:
case ACTION_BAN_TIME:
{
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT name, account_id FROM player.player WHERE name = '%s'", szEscapedUserName));
MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
if (pMsg->uiSQLErrno != 0 || !pMsg->Get()->uiNumRows)
return;
int account_id = 0;
str_to_number(account_id, row[1]);
if (p->action == ACTION_BAN_PERMANENTLY)
{
DBManager::Instance().DirectQuery("UPDATE account.account SET status = 'BLOCK', ban_reason = '%s' WHERE id = '%d'", p->reason, account_id);
InsertLogsBan(ch->GetName(), "ACTION_BAN_PERMANENTLY", szEscapedUserName, p->reason);
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("admin_manager_succes_ban_permanently"), szEscapedUserName);
}
else
{
if (p->duration < 300)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("admin_manager_error_timer"));
return;
}
DBManager::Instance().DirectQuery("UPDATE account.account SET availDt = FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) + %i), ban_reason = '%s' WHERE id = %d", p->duration, p->reason, account_id);
InsertLogsBan(ch->GetName(), "ACTION_BAN_TIME", szEscapedUserName, p->reason);
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("admin_manager_succes_ban_time"), szEscapedUserName);
}
}
break;
case ACTION_BAN_IP:
{
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT name, ip FROM player.player WHERE name = '%s'", szEscapedUserName));
MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
if (pMsg->uiSQLErrno != 0 || !pMsg->Get()->uiNumRows)
return;
std::auto_ptr<SQLMsg> pMsg2(DBManager::Instance().DirectQuery("UPDATE account.account INNER JOIN player.player ON player.account_id = account.id SET status = 'BLOCK', ban_reason = '%s' WHERE player.ip = '%s'", p->reason, row[1]));
InsertLogsBan(ch->GetName(), "ACTION_BAN_IP", szEscapedUserName, p->reason);
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("admin_manager_succes_ban_ip"), szEscapedUserName, pMsg2->Get()->uiAffectedRows);
}
break;
default:
return;
}
}
#endif