627 lines
16 KiB
SourcePawn
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;
|
|
}
|
|
}
|
|
} |