#include #define VERSION "2.3.4" #define LISTBANS_USAGE "sm_banlist/listban/s <#userid|name> - Lists a user's prior bans" #define DATABASE_PREFIX "sb" Menu g_PlayersMainMenu[MAXPLAYERS]; int g_CurrentBanID[MAXPLAYERS]; Database g_DB; public Plugin myinfo = { name = "Sourcebans Ban Checker", author = "Pan32", description = "Looks up if a player has been a bad boy. Shoutouts to my boy ici", version = VERSION, url = "http://www.unloze.com" }; public void OnPluginStart() { LoadTranslations("common.phrases"); RegAdminCmd("sm_listbans", OnListSourceBansCmd, ADMFLAG_BAN, LISTBANS_USAGE); RegAdminCmd("sm_listban", OnListSourceBansCmd, ADMFLAG_BAN, LISTBANS_USAGE); RegAdminCmd("sm_banlist", OnListSourceBansCmd, ADMFLAG_BAN, LISTBANS_USAGE) Database.Connect(OnDatabaseConnected, "sourcebans"); } public void OnMapStart() { for (int i; i < MAXPLAYERS; i++) { g_CurrentBanID[i] = 0; g_PlayersMainMenu[i] = null; } } public void OnDatabaseConnected(Database db, const char[] error, any data) { if (db == null) SetFailState("Failed to connect to SB db, %s", error); g_DB = db; } public Action OnListSourceBansCmd(int client, int args) { if (args < 1) { ReplyToCommand(client, LISTBANS_USAGE); return Plugin_Handled; } if (client == 0) { ReplyToCommand(client, "This command is not supported through console."); return Plugin_Handled; } if (g_DB == INVALID_HANDLE) { ReplyToCommand(client, "Error: database not ready."); return Plugin_Handled; } char pattern[MAX_TARGET_LENGTH], target_name[MAX_TARGET_LENGTH]; int target_list[MAXPLAYERS], target_count; bool tn_is_ml; GetCmdArg(1, pattern, sizeof(pattern)); if ((target_count = ProcessTargetString(pattern, client, target_list, MAXPLAYERS, COMMAND_FILTER_NO_BOTS|COMMAND_FILTER_NO_MULTI, target_name, sizeof(target_name), tn_is_ml)) <= 0) { ReplyToTargetError(client, target_count, true); return Plugin_Handled; } char auth[32]; if (!GetClientAuthId(target_list[0], AuthId_Steam2, auth, sizeof(auth)) || auth[0] == 'B' || auth[9] == 'L') { ReplyToCommand(client, "Error: could not retrieve %N's steam id.", target_list[0]); return Plugin_Handled; } char query[1024]; char ip[30]; GetClientIP(target_list[0], ip, sizeof(ip)); FormatEx(query, sizeof(query), "SELECT bid, created, length, reason, RemoveType FROM %s_bans WHERE ((type = 0 AND %s_bans.authid REGEXP '^STEAM_[0-9]:%s$') OR (type = 1 AND ip = '%s')) AND ((length > '0' AND ends > UNIX_TIMESTAMP()) OR RemoveType IS NOT NULL) ORDER BY created DESC;", DATABASE_PREFIX, DATABASE_PREFIX, auth[8], ip); char targetName[MAX_NAME_LENGTH]; GetClientName(target_list[0], targetName, sizeof(targetName)); DataPack pack = new DataPack(); pack.WriteCell(GetClientUserId(client)); pack.WriteString(targetName); g_DB.Query(OnListBans, query, pack, DBPrio_Low); return Plugin_Handled; } public void OnListBans(Database db, DBResultSet results, const char[] error, DataPack pack) { pack.Reset(); int clientuid = pack.ReadCell(); int client = GetClientOfUserId(clientuid); char targetName[MAX_NAME_LENGTH]; pack.ReadString(targetName, sizeof(targetName)); delete pack; if (client == 0) return; if (db == null) { PrintToChat(client, "[SBChecker] Could not establish connection to the database"); return; } if (results == null) { PrintToChat(client, "[SBChecker] DB error while retrieving bans for %s:\n%s", targetName, error); return; } int count = results.RowCount; if (count == 0) { PrintToChat(client, "[SBChecker] No bans found for %s.", targetName); return; } char cBuffer[512]; Menu menu = new Menu(SBCheckerCallback); Format(cBuffer, sizeof(cBuffer), "Previous bans of %s (%i):\n ", targetName, count); menu.SetTitle(cBuffer); while (results.FetchRow()) { char banid[12]; char createddate[11] = ""; //char bannedby[MAX_NAME_LENGTH] = ""; char lenstring[32] = "N/A"; char reason[28]; char RemoveType[9] = " "; if (!results.IsFieldNull(0)) { IntToString(results.FetchInt(0), banid, sizeof(banid)); } if (!results.IsFieldNull(1)) { FormatTime(createddate, sizeof(createddate), "%Y-%m-%d", results.FetchInt(1)); } // NOT NULL int length = results.FetchInt(2); if (length == 0) { Format(lenstring, sizeof(lenstring), "Permanent"); } if (length > 0) { CalculateLength(length, lenstring, sizeof(lenstring)); } // NOT NULL results.FetchString(3, reason, sizeof(reason)); if (!results.IsFieldNull(4)) { results.FetchString(4, RemoveType, sizeof(RemoveType)); if (StrEqual(RemoveType, "E", false)) Format(RemoveType, sizeof(RemoveType), "Expired"); if (StrEqual(RemoveType, "U", false)) Format(RemoveType, sizeof(RemoveType), "Unbanned"); } Format(cBuffer, sizeof(cBuffer), "%s\n%s(%s)\nReason: %s\n ", createddate, lenstring, RemoveType, reason); menu.AddItem(banid, cBuffer); } menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } public int SBCheckerCallback(Menu menu, MenuAction action, int client, int choice) { switch(action) { case MenuAction_Select: { g_PlayersMainMenu[client] = menu; char cBanid[12]; int Banid; menu.GetItem(choice, cBanid, sizeof(cBanid)); Banid = StringToInt(cBanid); g_CurrentBanID[client] = Banid; RequestBan(client, Banid); } case MenuAction_End: { if (choice != MenuEnd_Selected) delete menu; } } } void CalculateLength(int banLength, char[] time, int len) // banLength in secs { static const int secs[6] = {31536000, 2592000, 604800, 86400, 3600, 60 }; static const char names[6][6] = { "years", "months", "weeks", "days", "hours", "mins" } int values[6] int timeLeft = banLength; for (int i; i < 6; i++) { values[i] = timeLeft / secs[i]; timeLeft = timeLeft % secs[i]; } // print based on these ints, if they're 0, skip FormatEx(time, len, ""); for (int i; i < 6; i++) { if(values[i]) { Format(time, len, "%s%d %s ", time, values[i], names[i]); } } } void RequestBan(int client, int banid) { char query[1024]; Format(query, sizeof(query), "SELECT %s_bans.bid, ip, name, created, %s_admins.user, ends, length, reason, %s_bans.type, RemoveType, admins2.user, RemovedOn, ureason, COUNT(%s_comments.bid) AS nc FROM %s_bans LEFT JOIN %s_admins ON %s_bans.aid = %s_admins.aid LEFT JOIN %s_admins admins2 ON %s_bans.RemovedBy = admins2.aid LEFT JOIN %s_comments ON %s_comments.bid = %s_bans.bid WHERE (%s_bans.bid = '%i');", DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, banid); //PrintToConsole(client, "%s", query); DataPack pack = new DataPack(); pack.WriteCell(client); pack.WriteCell(GetClientUserId(client)); g_DB.Query(DetailBanInfo, query, pack, DBPrio_Low); } public void DetailBanInfo(Database db, DBResultSet results, const char[] error, DataPack pack) { pack.Reset(); int client = pack.ReadCell(); int checkclient = GetClientOfUserId(pack.ReadCell()); if (checkclient == 0) { delete g_PlayersMainMenu[client]; return; } if (db == null) { PrintToChat(client, "[SBChecker] Could not establish connection to the database"); delete g_PlayersMainMenu[client]; return; } if (results == null) { PrintToChat(client, "[SBChecker] DB error while retrieving bans for the requested ban ID:\n%s", error); delete g_PlayersMainMenu[client]; return; } int count = results.RowCount; if (count == 0) { PrintToChat(client, "[SBChecker] No bans found with that ban id."); delete g_PlayersMainMenu[client]; return; } results.FetchRow(); int banid = results.FetchInt(0); char cBuffer[512]; Panel panel = new Panel(); Format(cBuffer, sizeof(cBuffer), "More information on Ban ID %i:\n ", banid); panel.SetTitle(cBuffer); char nickname[MAX_NAME_LENGTH] = ""; char createddate[11] = ""; char bannedby[MAX_NAME_LENGTH] = ""; char ip[17] = ""; char lenstring[32] = "N/A"; char enddate[11] = "N/A"; char reason[32]; char RemoveType[9] = " "; char BanType[12] = ""; int comments = 0; bool unbanned = false; if (!results.IsFieldNull(1)) { results.FetchString(1, ip, sizeof(ip)); } if (!results.IsFieldNull(2)) { results.FetchString(2, nickname, sizeof(nickname)); } if (!results.IsFieldNull(3)) { FormatTime(createddate, sizeof(createddate), "%Y-%m-%d", results.FetchInt(3)); } if (!results.IsFieldNull(4)) { results.FetchString(4, bannedby, sizeof(bannedby)); } if (!results.IsFieldNull(5)) { FormatTime(enddate, sizeof(enddate), "%Y-%m-%d", results.FetchInt(5)); } int length = results.FetchInt(6); if (length == 0) { Format(lenstring, sizeof(lenstring), "Permanent"); } if (length) { CalculateLength(length, lenstring, sizeof(lenstring)); } if (!results.IsFieldNull(7)) { results.FetchString(7, reason, sizeof(reason)); } int banidtype = results.FetchInt(8); if (!banidtype) Format(BanType, sizeof(BanType), "Steam ID"); if (banidtype == 1) Format(BanType, sizeof(BanType), "IP Address"); if (!results.IsFieldNull(9)) { results.FetchString(9, RemoveType, sizeof(RemoveType)); if (StrEqual(RemoveType, "E", false)) Format(RemoveType, sizeof(RemoveType), "Expired"); if (StrEqual(RemoveType, "U", false)) { unbanned = true; Format(RemoveType, sizeof(RemoveType), "Unbanned"); } } Format(cBuffer, sizeof(cBuffer), "Banned on: %s", createddate); panel.DrawText(cBuffer); Format(cBuffer, sizeof(cBuffer), "Name when banned: %s", nickname); panel.DrawText(cBuffer); Format(cBuffer, sizeof(cBuffer), "IP Address: %s", ip); panel.DrawText(cBuffer); Format(cBuffer, sizeof(cBuffer), "Banned by: %s", bannedby); panel.DrawText(cBuffer); Format(cBuffer, sizeof(cBuffer), "Length: %s", lenstring); panel.DrawText(cBuffer); Format(cBuffer, sizeof(cBuffer), "Reason: %s", reason); panel.DrawText(cBuffer); Format(cBuffer, sizeof(cBuffer), "Ends on: %s (%s)", enddate, RemoveType); panel.DrawText(cBuffer); Format(cBuffer, sizeof(cBuffer), "Ban Type: %s\n ", BanType); panel.DrawText(cBuffer); if (unbanned) { char removedon[11] = ""; char removedby[MAX_NAME_LENGTH] = ""; char ureason[32] = ""; if (!results.IsFieldNull(10)) { results.FetchString(10, removedby, sizeof(removedby)); } if (!results.IsFieldNull(11)) { FormatTime(removedon, sizeof(removedon), "%Y-%m-%d", results.FetchInt(11)); } if (!results.IsFieldNull(12)) { results.FetchString(12, ureason, sizeof(ureason)); } Format(cBuffer, sizeof(cBuffer), "Unbanned on: %s", removedon); panel.DrawText(cBuffer); Format(cBuffer, sizeof(cBuffer), "Unbanned by: %s", removedby); panel.DrawText(cBuffer); Format(cBuffer, sizeof(cBuffer), "Unban reason: %s\n ", ureason); panel.DrawText(cBuffer); } comments = results.FetchInt(13); panel.CurrentKey = 2; if (!comments) panel.DrawItem("View Comments (0)", ITEMDRAW_DISABLED); else { Format(cBuffer, sizeof(cBuffer), "View Comments (%i)", comments); panel.DrawItem(cBuffer); } panel.CurrentKey = 8; panel.DrawItem("Back", ITEMDRAW_CONTROL); panel.CurrentKey = 10; panel.DrawItem("Exit", ITEMDRAW_CONTROL); //menu.ExitButton = true; //menu.ExitBackButton = true; panel.Send(client, DetailBanCallback, MENU_TIME_FOREVER); delete panel; } public int DetailBanCallback(Menu menu, MenuAction action, int client, int choice) { switch(action) { case MenuAction_Select: { if (choice == 2) RequestComments(client, g_CurrentBanID[client]); if (choice == 8) g_PlayersMainMenu[client].Display(client, MENU_TIME_FOREVER); if (choice == 10) { g_CurrentBanID[client] = 0; delete g_PlayersMainMenu[client]; } } case MenuAction_Cancel: { delete g_PlayersMainMenu[client]; g_CurrentBanID[client] = 0; } } } void RequestComments(int client, int banid) { char query[1024]; FormatEx(query, sizeof(query), "SELECT added, %s_admins.user, commenttxt FROM %s_comments LEFT JOIN %s_admins ON %s_comments.aid = %s_admins.aid WHERE (%s_comments.bid = '%i');", DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, banid); DataPack pack = new DataPack(); pack.WriteCell(client); pack.WriteCell(GetClientUserId(client)); g_DB.Query(CommentsBanInfo, query, pack, DBPrio_Low); } public void CommentsBanInfo(Database db, DBResultSet results, const char[] error, DataPack pack) { pack.Reset(); int client = pack.ReadCell(); int checkclient = GetClientOfUserId(pack.ReadCell()); if (checkclient == 0) { delete g_PlayersMainMenu[client]; g_CurrentBanID[client] = 0; return; } if (db == null) { PrintToChat(client, "[SBChecker] Could not establish connection to the database, returning to ban information."); RequestBan( client, g_CurrentBanID[client]); return; } if (results == null) { PrintToChat(client, "[SBChecker] DB error while retrieving comments for the requested ban ID: %s, returning to ban information.", error); RequestBan(client, g_CurrentBanID[client]); return; } int count = results.RowCount; if (count == 0) { PrintToChat(client, "[SBChecker] No comments with that ban id, returning to ban information."); RequestBan(client, g_CurrentBanID[client]); return; } char cBuffer[512]; Panel panel = new Panel(); Format(cBuffer, sizeof(cBuffer), "Comments on Ban ID %i:\n ", g_CurrentBanID[client]); panel.SetTitle(cBuffer); while (results.FetchRow()) { char addeddate[11] = ""; char addedby[MAX_NAME_LENGTH] = ""; char comment[128] = ""; FormatTime(addeddate, sizeof(addeddate), "%Y-%m-%d", results.FetchInt(0)); if (!results.IsFieldNull(1)) { results.FetchString(1, addedby, sizeof(addedby)); } if (!results.IsFieldNull(2)) { results.FetchString(2, comment, sizeof(comment)); } Format(cBuffer, sizeof(cBuffer), "Added on: %s", addeddate); panel.DrawItem(cBuffer, ITEMDRAW_DISABLED) Format(cBuffer, sizeof(cBuffer), "By: %s", addedby); panel.DrawText(cBuffer); Format(cBuffer, sizeof(cBuffer), "Comment:\n%s\n ", comment); panel.DrawText(cBuffer); } panel.CurrentKey = 8; panel.DrawItem("Back", ITEMDRAW_CONTROL); panel.CurrentKey = 10; panel.DrawItem("Exit", ITEMDRAW_CONTROL); panel.Send(client, CommentsBanCallback, MENU_TIME_FOREVER); delete panel; } public int CommentsBanCallback(Menu menu, MenuAction action, int client, int choice) { switch(action) { case MenuAction_Select: { if (choice == 8) RequestBan(client, g_CurrentBanID[client]); if (choice == 10) { g_CurrentBanID[client] = 0; delete g_PlayersMainMenu[client]; } } case MenuAction_Cancel: { delete g_PlayersMainMenu[client]; g_CurrentBanID[client] = 0; } } }