diff --git a/changelog.txt b/changelog.txt index b521da3fe..dcf2d55ed 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,6 +3,7 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) == 09/20/2014 == demonstar55: Fix crash in SendEnterWorld on illegally long names 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 == demonstar55: Added Client::Tell_StringID (used in tell queue messages) diff --git a/common/database.cpp b/common/database.cpp index ca287c3b5..4e7517f16 100644 --- a/common/database.cpp +++ b/common/database.cpp @@ -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. */ 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); diff --git a/utils/sql/git/required/2014_09_20_ban_messages.sql b/utils/sql/git/required/2014_09_20_ban_messages.sql new file mode 100644 index 000000000..4612f9962 --- /dev/null +++ b/utils/sql/git/required/2014_09_20_ban_messages.sql @@ -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`; diff --git a/zone/command.cpp b/zone/command.cpp index b2f08d3eb..36dc95921 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -6258,36 +6258,49 @@ void command_stun(Client *c, const Seperator *sep) c->Message(0, "Usage: #stun [duration]"); } + void command_ban(Client *c, const Seperator *sep) { char errbuf[MYSQL_ERRMSG_SIZE]; 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 "); } else { - database.RunQuery(query, MakeAnyLenString(&query, "SELECT account_id from character_ where name = '%s'", sep->arg[1]), errbuf, &result); - if(query) - { - safe_delete_array(query); + auto account_id = database.GetAccountIDByChar(sep->arg[1]); + + std::string message; + int i = 2; + while(1) { + if(sep->arg[i][0] == 0) { + break; + } + + if(message.length() > 0) { + message.push_back(' '); + } + + message += sep->arg[i]; + ++i; } - if(mysql_num_rows(result)) - { - 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]); + if(message.length() == 0) { + c->Message(0, "Usage: #ban "); + return; + } - ServerPacket* pack = new ServerPacket(ServerOP_FlagUpdate, 6); - *((uint32*) pack->pBuffer) = atoi(row[0]); - *((int16*) &pack->pBuffer[4]) = -2; - worldserver.SendPacket(pack); - safe_delete(pack); + 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 = entity_list.GetClientByName(sep->arg[1]); @@ -6297,25 +6310,20 @@ void command_ban(Client *c, const Seperator *sep) } else { - ServerPacket* pack = new ServerPacket(ServerOP_KickPlayer, sizeof(ServerKickPlayer_Struct)); - ServerKickPlayer_Struct* skp = (ServerKickPlayer_Struct*) pack->pBuffer; + ServerPacket pack(ServerOP_KickPlayer, sizeof(ServerKickPlayer_Struct)); + ServerKickPlayer_Struct* skp = (ServerKickPlayer_Struct*)pack.pBuffer; strcpy(skp->adminname, c->GetName()); strcpy(skp->name, sep->arg[1]); skp->adminrank = c->Admin(); - worldserver.SendPacket(pack); - safe_delete(pack); + worldserver.SendPacket(&pack); } - - mysql_free_result(result); } else { - c->Message(13,"Character does not exist."); - } - if(query) - { - safe_delete_array(query); + c->Message(13, "Character does not exist."); } + + safe_delete_array(query); } } @@ -6325,7 +6333,7 @@ void command_suspend(Client *c, const Seperator *sep) char *query = nullptr; if((sep->arg[1][0] == 0) || (sep->arg[2][0] == 0)) - c->Message(0, "Usage: #suspend (Specify 0 days to lift the suspension immediately)"); + c->Message(0, "Usage: #suspend (Specify 0 days to lift the suspension immediately) "); else { int Duration = atoi(sep->arg[2]); @@ -6333,22 +6341,40 @@ void command_suspend(Client *c, const Seperator *sep) if(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 (Specify 0 days to lift the suspension immediately) "); + return; + } + } 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)" - " WHERE `id` = %i", Duration, AccountID), errbuf, 0); + database.RunQuery(query, MakeAnyLenString(&query, "UPDATE `account` SET `suspendeduntil` = DATE_ADD(NOW(), INTERVAL %i DAY), " + "suspend_reason = '%s' WHERE `id` = %i", Duration, EscapeString(message).c_str(), AccountID), errbuf, 0); if(Duration) - c->Message(13,"Account number %i with the character %s has been temporarily suspended for %i day(s).", AccountID, sep->arg[1], - Duration); + 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, message.c_str()); 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]); safe_delete_array(query); @@ -6358,22 +6384,20 @@ void command_suspend(Client *c, const Seperator *sep) BannedClient->WorldKick(); else { - ServerPacket* pack = new ServerPacket(ServerOP_KickPlayer, sizeof(ServerKickPlayer_Struct)); - ServerKickPlayer_Struct* sks = (ServerKickPlayer_Struct*) pack->pBuffer; + ServerPacket pack(ServerOP_KickPlayer, sizeof(ServerKickPlayer_Struct)); + ServerKickPlayer_Struct* sks = (ServerKickPlayer_Struct*)pack.pBuffer; strn0cpy(sks->adminname, c->GetName(), sizeof(sks->adminname)); strn0cpy(sks->name, sep->arg[1], sizeof(sks->name)); sks->adminrank = c->Admin(); - worldserver.SendPacket(pack); - - safe_delete(pack); + worldserver.SendPacket(&pack); } - } else - c->Message(13,"Character does not exist."); - - safe_delete_array(EscName); + } + else { + c->Message(13, "Character does not exist."); + } } }