From 8c9ec57c87fcae89487ef175175c5c46cc3a94e3 Mon Sep 17 00:00:00 2001 From: Pan32 Date: Tue, 23 Oct 2018 12:55:38 +0200 Subject: [PATCH] Finished this piece of shit --- sbchecker | 629 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 629 insertions(+) create mode 100644 sbchecker diff --git a/sbchecker b/sbchecker new file mode 100644 index 00000000..110388a8 --- /dev/null +++ b/sbchecker @@ -0,0 +1,629 @@ +#include + +#define VERSION "2.3.1" +#define LISTBANS_USAGE "sm_listbans <#userid|name> - Lists a user's prior bans from Sourcebans" +#define DATABASE_PREFIX "sb" + +Menu g_PlayersMainMenu[MAXPLAYERS]; +int g_CurrentBanID[MAXPLAYERS]; +Database g_DB; + +public Plugin myinfo = +{ + name = "Sourcebans Ban Checker", + author = "TRANSLUCENT / MySQL by psychonic & Ca$h Munny", + description = "Looks up if a player has been a bad boy", + version = VERSION, + url = "http://www.unloze.com" +}; + +public void OnPluginStart() +{ + LoadTranslations("common.phrases"); + + RegAdminCmd("sm_listbans", 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, %s_admins.user, length, reason, RemoveType FROM %s_bans LEFT JOIN %s_admins ON %s_bans.aid = %s_admins.aid 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)", DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, DATABASE_PREFIX, 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)); + } + + if (!results.IsFieldNull(2)) + { + results.FetchString(2, bannedby, sizeof(bannedby)); + } + + // NOT NULL + int length = results.FetchInt(3); + if (length == 0) + { + Format(lenstring, sizeof(lenstring), "Permanent"); + } + if (length > 0) + { + CalculateLength(length, lenstring, sizeof(lenstring)); + } + + + // NOT NULL + results.FetchString(4, reason, sizeof(reason)); + + if (!results.IsFieldNull(5)) + { + results.FetchString(5, 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), "Banned in %s\n\nBanned by: %s\nLength: %s(%s)\nReason: %s\n ", createddate, bannedby, 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; + } + } +} \ No newline at end of file