sm-plugins/sbchecker/scripting/sbchecker.sp

627 lines
16 KiB
SourcePawn

#include <sourcemod>
#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] = "<Unknown>";
//char bannedby[MAX_NAME_LENGTH] = "<Unknown>";
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] = "<Unknown>";
char createddate[11] = "<Unknown>";
char bannedby[MAX_NAME_LENGTH] = "<Unknown>";
char ip[17] = "<Unknown>";
char lenstring[32] = "N/A";
char enddate[11] = "N/A";
char reason[32];
char RemoveType[9] = " ";
char BanType[12] = "<Unknown>";
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] = "<Unknown>";
char removedby[MAX_NAME_LENGTH] = "<Unknown>";
char ureason[32] = "<Unknown>";
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] = "<Unknown>";
char addedby[MAX_NAME_LENGTH] = "<Unknown>";
char comment[128] = "<None>";
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;
}
}
}