Ban and suspend commands now require a reason that is recorded in the DB

This commit is contained in:
KimLS 2014-09-20 15:09:43 -07:00
parent 33b79a3588
commit 7140a2054f
4 changed files with 74 additions and 48 deletions

View File

@ -3,6 +3,7 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50)
== 09/20/2014 == == 09/20/2014 ==
demonstar55: Fix crash in SendEnterWorld on illegally long names demonstar55: Fix crash in SendEnterWorld on illegally long names
demonstar55: The client only lets you enter 15 characters for your name (UF at least) demonstar55: The client only lets you enter 15 characters for your name (UF at least)
KLS: #suspend and #ban now have required messages to record the reason for the ban/suspension.
== 09/19/2014 == == 09/19/2014 ==
demonstar55: Added Client::Tell_StringID (used in tell queue messages) demonstar55: Added Client::Tell_StringID (used in tell queue messages)

View File

@ -659,7 +659,7 @@ the name "name" or zero if no character with that name was found
Zero will also be returned if there is a database error. Zero will also be returned if there is a database error.
*/ */
uint32 Database::GetAccountIDByChar(const char* charname, uint32* oCharID) { uint32 Database::GetAccountIDByChar(const char* charname, uint32* oCharID) {
std::string query = StringFormat("SELECT account_id, id FROM character_ WHERE name='%s'", charname); std::string query = StringFormat("SELECT account_id, id FROM character_ WHERE name='%s'", EscapeString(charname).c_str());
auto results = QueryDatabase(query); auto results = QueryDatabase(query);

View File

@ -0,0 +1 @@
ALTER TABLE `account` ADD COLUMN `ban_reason` TEXT NULL DEFAULT NULL AFTER `expansion`, ADD COLUMN `suspend_reason` TEXT NULL DEFAULT NULL AFTER `ban_reason`;

View File

@ -6258,36 +6258,49 @@ void command_stun(Client *c, const Seperator *sep)
c->Message(0, "Usage: #stun [duration]"); c->Message(0, "Usage: #stun [duration]");
} }
void command_ban(Client *c, const Seperator *sep) void command_ban(Client *c, const Seperator *sep)
{ {
char errbuf[MYSQL_ERRMSG_SIZE]; char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0; char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
if(sep->arg[1][0] == 0) if(sep->arg[1][0] == 0 || sep->arg[2][0] == 0)
{ {
c->Message(0, "Usage: #ban [charname]"); c->Message(0, "Usage: #ban <charname> <message>");
} }
else else
{ {
database.RunQuery(query, MakeAnyLenString(&query, "SELECT account_id from character_ where name = '%s'", sep->arg[1]), errbuf, &result); auto account_id = database.GetAccountIDByChar(sep->arg[1]);
if(query)
{ std::string message;
safe_delete_array(query); int i = 2;
while(1) {
if(sep->arg[i][0] == 0) {
break;
} }
if(mysql_num_rows(result)) if(message.length() > 0) {
{ message.push_back(' ');
row = mysql_fetch_row(result); }
database.RunQuery(query, MakeAnyLenString(&query, "UPDATE account set status = -2 where id = %i", atoi(row[0])), errbuf, 0);
c->Message(13,"Account number %i with the character %s has been banned.", atoi(row[0]), sep->arg[1]);
ServerPacket* pack = new ServerPacket(ServerOP_FlagUpdate, 6); message += sep->arg[i];
*((uint32*) pack->pBuffer) = atoi(row[0]); ++i;
*((int16*) &pack->pBuffer[4]) = -2; }
worldserver.SendPacket(pack);
safe_delete(pack); if(message.length() == 0) {
c->Message(0, "Usage: #ban <charname> <message>");
return;
}
if(account_id > 0)
{
database.RunQuery(query, MakeAnyLenString(&query, "UPDATE account set status = -2, ban_reason = '%s' where id = %i", EscapeString(message).c_str(), account_id), errbuf, 0);
c->Message(13, "Account number %i with the character %s has been banned with message: \"%s\"", account_id, sep->arg[1], message.c_str());
ServerPacket pack(ServerOP_FlagUpdate, 6);
*((uint32*)&pack.pBuffer[0]) = account_id;
*((int16*)&pack.pBuffer[4]) = -2;
worldserver.SendPacket(&pack);
Client *client = nullptr; Client *client = nullptr;
client = entity_list.GetClientByName(sep->arg[1]); client = entity_list.GetClientByName(sep->arg[1]);
@ -6297,27 +6310,22 @@ void command_ban(Client *c, const Seperator *sep)
} }
else else
{ {
ServerPacket* pack = new ServerPacket(ServerOP_KickPlayer, sizeof(ServerKickPlayer_Struct)); ServerPacket pack(ServerOP_KickPlayer, sizeof(ServerKickPlayer_Struct));
ServerKickPlayer_Struct* skp = (ServerKickPlayer_Struct*) pack->pBuffer; ServerKickPlayer_Struct* skp = (ServerKickPlayer_Struct*)pack.pBuffer;
strcpy(skp->adminname, c->GetName()); strcpy(skp->adminname, c->GetName());
strcpy(skp->name, sep->arg[1]); strcpy(skp->name, sep->arg[1]);
skp->adminrank = c->Admin(); skp->adminrank = c->Admin();
worldserver.SendPacket(pack); worldserver.SendPacket(&pack);
safe_delete(pack);
} }
mysql_free_result(result);
} }
else else
{ {
c->Message(13, "Character does not exist."); c->Message(13, "Character does not exist.");
} }
if(query)
{
safe_delete_array(query); safe_delete_array(query);
} }
} }
}
void command_suspend(Client *c, const Seperator *sep) void command_suspend(Client *c, const Seperator *sep)
{ {
@ -6325,7 +6333,7 @@ void command_suspend(Client *c, const Seperator *sep)
char *query = nullptr; char *query = nullptr;
if((sep->arg[1][0] == 0) || (sep->arg[2][0] == 0)) if((sep->arg[1][0] == 0) || (sep->arg[2][0] == 0))
c->Message(0, "Usage: #suspend <charname> <days> (Specify 0 days to lift the suspension immediately)"); c->Message(0, "Usage: #suspend <charname> <days>(Specify 0 days to lift the suspension immediately) <message>");
else else
{ {
int Duration = atoi(sep->arg[2]); int Duration = atoi(sep->arg[2]);
@ -6333,20 +6341,38 @@ void command_suspend(Client *c, const Seperator *sep)
if(Duration < 0) if(Duration < 0)
Duration = 0; Duration = 0;
char *EscName = new char[strlen(sep->arg[1]) * 2 + 1]; std::string message;
if(Duration > 0) {
int i = 3;
while(1) {
if(sep->arg[i][0] == 0) {
break;
}
database.DoEscapeString(EscName, sep->arg[1], strlen(sep->arg[1])); if(message.length() > 0) {
message.push_back(' ');
}
message += sep->arg[i];
++i;
}
if(message.length() == 0) {
c->Message(0, "Usage: #suspend <charname> <days>(Specify 0 days to lift the suspension immediately) <message>");
return;
}
}
int AccountID; int AccountID;
if((AccountID = database.GetAccountIDByChar(EscName)) > 0) if((AccountID = database.GetAccountIDByChar(sep->arg[1])) > 0)
{ {
database.RunQuery(query, MakeAnyLenString(&query, "UPDATE `account` SET `suspendeduntil` = DATE_ADD(NOW(), INTERVAL %i DAY)" database.RunQuery(query, MakeAnyLenString(&query, "UPDATE `account` SET `suspendeduntil` = DATE_ADD(NOW(), INTERVAL %i DAY), "
" WHERE `id` = %i", Duration, AccountID), errbuf, 0); "suspend_reason = '%s' WHERE `id` = %i", Duration, EscapeString(message).c_str(), AccountID), errbuf, 0);
if(Duration) if(Duration)
c->Message(13,"Account number %i with the character %s has been temporarily suspended for %i day(s).", AccountID, sep->arg[1], c->Message(13, "Account number %i with the character %s has been temporarily suspended for %i day(s) with the message: \"%s\"", AccountID, sep->arg[1],
Duration); Duration, message.c_str());
else else
c->Message(13, "Account number %i with the character %s is no longer suspended.", AccountID, sep->arg[1]); c->Message(13, "Account number %i with the character %s is no longer suspended.", AccountID, sep->arg[1]);
@ -6358,22 +6384,20 @@ void command_suspend(Client *c, const Seperator *sep)
BannedClient->WorldKick(); BannedClient->WorldKick();
else else
{ {
ServerPacket* pack = new ServerPacket(ServerOP_KickPlayer, sizeof(ServerKickPlayer_Struct)); ServerPacket pack(ServerOP_KickPlayer, sizeof(ServerKickPlayer_Struct));
ServerKickPlayer_Struct* sks = (ServerKickPlayer_Struct*) pack->pBuffer; ServerKickPlayer_Struct* sks = (ServerKickPlayer_Struct*)pack.pBuffer;
strn0cpy(sks->adminname, c->GetName(), sizeof(sks->adminname)); strn0cpy(sks->adminname, c->GetName(), sizeof(sks->adminname));
strn0cpy(sks->name, sep->arg[1], sizeof(sks->name)); strn0cpy(sks->name, sep->arg[1], sizeof(sks->name));
sks->adminrank = c->Admin(); sks->adminrank = c->Admin();
worldserver.SendPacket(pack); worldserver.SendPacket(&pack);
safe_delete(pack);
} }
} else }
else {
c->Message(13, "Character does not exist."); c->Message(13, "Character does not exist.");
}
safe_delete_array(EscName);
} }
} }