plugins/basebans.sp
author David Anderson <dvander@alliedmods.net>
Sat Dec 22 08:57:08 2007 +0000 (2007-12-22)
changeset 1813 372939c88bc7
parent 1736 c40db9557030
child 1947 e73a1e51833b
permissions -rw-r--r--
fixed amb1305 by making OnClientPostAdminCheck() always occur after OnClientPutInServer(). this is now GUARANTEED. it was undefined before, however the usual case was opposite. if plugins were relying on this, they were written poorly and shouldn't have worked in the first place, especially with the threaded SQL plugin.
dvander@1423
     1
/**
dvander@1423
     2
 * vim: set ts=4 :
dvander@1423
     3
 * =============================================================================
dvander@1423
     4
 * SourceMod Basic Commands Plugin
dvander@1423
     5
 * Implements basic admin commands.
dvander@1423
     6
 *
dvander@1423
     7
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@1423
     8
 * =============================================================================
dvander@1423
     9
 *
dvander@1423
    10
 * This program is free software; you can redistribute it and/or modify it under
dvander@1423
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@1423
    12
 * Free Software Foundation.
dvander@1423
    13
 * 
dvander@1423
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@1423
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@1423
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@1423
    17
 * details.
dvander@1423
    18
 *
dvander@1423
    19
 * You should have received a copy of the GNU General Public License along with
dvander@1423
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1423
    21
 *
dvander@1423
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@1423
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@1423
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@1423
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@1423
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@1423
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@1423
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@1423
    29
 * or <http://www.sourcemod.net/license.php>.
dvander@1423
    30
 *
dvander@1423
    31
 * Version: $Id$
dvander@1423
    32
 */
dvander@1423
    33
dvander@1423
    34
#pragma semicolon 1
dvander@1423
    35
dvander@1423
    36
#include <sourcemod>
pred@1536
    37
#undef REQUIRE_PLUGIN
pred@1536
    38
#include <adminmenu>
dvander@1423
    39
dvander@1423
    40
public Plugin:myinfo =
dvander@1423
    41
{
dvander@1423
    42
	name = "Basic Ban Commands",
dvander@1423
    43
	author = "AlliedModders LLC",
dvander@1423
    44
	description = "Basic Banning Commands",
dvander@1423
    45
	version = SOURCEMOD_VERSION,
dvander@1423
    46
	url = "http://www.sourcemod.net/"
dvander@1423
    47
};
dvander@1423
    48
pred@1536
    49
new Handle:hTopMenu = INVALID_HANDLE;
pred@1536
    50
pred@1536
    51
new g_BanTarget[MAXPLAYERS+1];
pred@1536
    52
new g_BanTime[MAXPLAYERS+1];
pred@1536
    53
pred@1536
    54
#include "basebans/ban.sp"
pred@1536
    55
dvander@1423
    56
public OnPluginStart()
dvander@1423
    57
{
dvander@1423
    58
	LoadTranslations("common.phrases");
dvander@1625
    59
	LoadTranslations("basebans.phrases");
dvander@1423
    60
dvander@1423
    61
	RegAdminCmd("sm_ban", Command_Ban, ADMFLAG_BAN, "sm_ban <#userid|name> <minutes|0> [reason]");
dvander@1423
    62
	RegAdminCmd("sm_unban", Command_Unban, ADMFLAG_UNBAN, "sm_unban <steamid>");
dvander@1423
    63
	RegAdminCmd("sm_addban", Command_AddBan, ADMFLAG_RCON, "sm_addban <time> <steamid> [reason]");
dvander@1423
    64
	RegAdminCmd("sm_banip", Command_BanIp, ADMFLAG_BAN, "sm_banip <time> <ip|#userid|name> [reason]");
pred@1536
    65
	
pred@1536
    66
	/* Account for late loading */
pred@1536
    67
	new Handle:topmenu;
pred@1536
    68
	if (LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE))
pred@1536
    69
	{
pred@1536
    70
		OnAdminMenuReady(topmenu);
pred@1536
    71
	}
pred@1536
    72
}
pred@1536
    73
pred@1536
    74
public OnAdminMenuReady(Handle:topmenu)
pred@1536
    75
{
pred@1536
    76
	/* Block us from being called twice */
pred@1536
    77
	if (topmenu == hTopMenu)
pred@1536
    78
	{
pred@1536
    79
		return;
pred@1536
    80
	}
pred@1536
    81
	
pred@1536
    82
	/* Save the Handle */
pred@1536
    83
	hTopMenu = topmenu;
pred@1536
    84
	
pred@1536
    85
	/* Find the "Player Commands" category */
pred@1536
    86
	new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS);
pred@1536
    87
pred@1536
    88
	if (player_commands != INVALID_TOPMENUOBJECT)
pred@1536
    89
	{
pred@1536
    90
		AddToTopMenu(hTopMenu,
dvander@1600
    91
			"sm_ban",
pred@1536
    92
			TopMenuObject_Item,
pred@1536
    93
			AdminMenu_Ban,
pred@1536
    94
			player_commands,
pred@1536
    95
			"sm_ban",
pred@1536
    96
			ADMFLAG_BAN);
pred@1536
    97
			
pred@1536
    98
	}
dvander@1423
    99
}
dvander@1423
   100
dvander@1423
   101
public Action:Command_BanIp(client, args)
dvander@1423
   102
{
dvander@1423
   103
	if (args < 2)
dvander@1423
   104
	{
dvander@1423
   105
		ReplyToCommand(client, "[SM] Usage: sm_banip <time> <ip|#userid|name> [reason]");
dvander@1423
   106
		return Plugin_Handled;
dvander@1423
   107
	}
dvander@1423
   108
dvander@1672
   109
	decl len, next_len;
dvander@1672
   110
	decl String:Arguments[256];
dvander@1423
   111
	decl String:arg[50], String:time[20];
dvander@1672
   112
	
dvander@1672
   113
	GetCmdArgString(Arguments, sizeof(Arguments));
dvander@1672
   114
	len = BreakString(Arguments, arg, sizeof(arg));
dvander@1423
   115
	
dvander@1672
   116
	if ((next_len = BreakString(Arguments[len], time, sizeof(time))) != -1)
dvander@1672
   117
	{
dvander@1672
   118
		len += next_len;
dvander@1672
   119
	}
dvander@1672
   120
	else
dvander@1672
   121
	{
dvander@1672
   122
		len = 0;
dvander@1672
   123
		Arguments[0] = '\0';
dvander@1672
   124
	}
dvander@1672
   125
dvander@1423
   126
	if (StrEqual(arg, "0"))
dvander@1423
   127
	{
dvander@1423
   128
		ReplyToCommand(client, "[SM] %t", "Cannot ban that IP");
dvander@1423
   129
		return Plugin_Handled;
dvander@1423
   130
	}
dvander@1423
   131
	
dvander@1627
   132
	decl String:target_name[MAX_TARGET_LENGTH];
dvander@1627
   133
	decl target_list[1], bool:tn_is_ml;
dvander@1627
   134
	new found_client = -1;
dvander@1627
   135
	
dvander@1627
   136
	if (ProcessTargetString(
dvander@1627
   137
			arg,
dvander@1627
   138
			client, 
dvander@1627
   139
			target_list, 
dvander@1627
   140
			1, 
dvander@1627
   141
			COMMAND_FILTER_CONNECTED|COMMAND_FILTER_NO_MULTI,
dvander@1627
   142
			target_name,
dvander@1627
   143
			sizeof(target_name),
dvander@1627
   144
			tn_is_ml) > 0)
dvander@1627
   145
	{
dvander@1627
   146
		found_client = target_list[0];
dvander@1627
   147
	}
dvander@1627
   148
	
dvander@1423
   149
	new bool:has_rcon;
dvander@1423
   150
	
dvander@1423
   151
	if (client == 0 || (client == 1 && !IsDedicatedServer()))
dvander@1423
   152
	{
dvander@1423
   153
		has_rcon = true;
dvander@1627
   154
	}
dvander@1627
   155
	else
dvander@1627
   156
	{
dvander@1423
   157
		new AdminId:id = GetUserAdmin(client);
dvander@1423
   158
		has_rcon = (id == INVALID_ADMIN_ID) ? false : GetAdminFlag(id, Admin_RCON);
dvander@1423
   159
	}
dvander@1423
   160
	
dvander@1423
   161
	new hit_client = -1;
dvander@1627
   162
	if (found_client != -1
dvander@1627
   163
		&& !IsFakeClient(found_client)
dvander@1627
   164
		&& (has_rcon || CanUserTarget(client, found_client)))
dvander@1423
   165
	{
dvander@1627
   166
		GetClientIP(found_client, arg, sizeof(arg));
dvander@1627
   167
		hit_client = found_client;
dvander@1423
   168
	}
dvander@1423
   169
	
dvander@1423
   170
	if (hit_client == -1 && !has_rcon)
dvander@1423
   171
	{
dvander@1423
   172
		ReplyToCommand(client, "[SM] %t", "No Access");
dvander@1423
   173
		return Plugin_Handled;
dvander@1423
   174
	}
dvander@1423
   175
dvander@1423
   176
	new minutes = StringToInt(time);
dvander@1423
   177
dvander@1423
   178
	LogAction(client, 
dvander@1423
   179
			  hit_client, 
dvander@1423
   180
			  "\"%L\" added ban (minutes \"%d\") (ip \"%s\") (reason \"%s\")", 
dvander@1423
   181
			  client, 
dvander@1423
   182
			  minutes, 
dvander@1423
   183
			  arg, 
dvander@1672
   184
			  Arguments[len]);
dvander@1627
   185
				
dvander@1627
   186
	ReplyToCommand(client, "[SM] %t", "Ban added");
dvander@1627
   187
	
dvander@1423
   188
	BanIdentity(arg, 
dvander@1423
   189
				minutes, 
dvander@1423
   190
				BANFLAG_IP, 
dvander@1672
   191
				Arguments[len], 
dvander@1423
   192
				"sm_banip", 
dvander@1423
   193
				client);
dvander@1627
   194
				
dvander@1627
   195
	if (hit_client != -1)
dvander@1627
   196
	{
dvander@1672
   197
		KickClient(hit_client, "Banned: %s", Arguments[len]);
dvander@1627
   198
	}
dvander@1423
   199
dvander@1423
   200
	return Plugin_Handled;
dvander@1423
   201
}
dvander@1423
   202
dvander@1423
   203
public Action:Command_AddBan(client, args)
dvander@1423
   204
{
dvander@1423
   205
	if (args < 2)
dvander@1423
   206
	{
dvander@1423
   207
		ReplyToCommand(client, "[SM] Usage: sm_addban <time> <steamid> [reason]");
dvander@1423
   208
		return Plugin_Handled;
dvander@1423
   209
	}
dvander@1423
   210
dvander@1423
   211
	decl String:arg_string[256];
dvander@1423
   212
	new String:time[50];
dvander@1423
   213
	new String:authid[50];
dvander@1423
   214
dvander@1423
   215
	GetCmdArgString(arg_string, sizeof(arg_string));
dvander@1423
   216
dvander@1423
   217
	new len, total_len;
dvander@1423
   218
dvander@1423
   219
	/* Get time */
dvander@1423
   220
	if ((len = BreakString(arg_string, time, sizeof(time))) == -1)
dvander@1423
   221
	{
dvander@1423
   222
		ReplyToCommand(client, "t[SM] Usage: sm_addban <time> <steamid> [reason]");
dvander@1423
   223
		return Plugin_Handled;
dvander@1423
   224
	}	
dvander@1423
   225
	total_len += len;
dvander@1423
   226
dvander@1423
   227
	/* Get steamid */
dvander@1423
   228
	if ((len = BreakString(arg_string[total_len], authid, sizeof(authid))) != -1)
dvander@1423
   229
	{
dvander@1423
   230
		total_len += len;
pred@1736
   231
	}
pred@1736
   232
	else
pred@1736
   233
	{
pred@1736
   234
		total_len = 0;
pred@1736
   235
		arg_string[0] = '\0';
dvander@1423
   236
	}
dvander@1423
   237
dvander@1423
   238
	/* Verify steamid */
dvander@1423
   239
	if (strncmp(authid, "STEAM_0:", 8) != 0)
dvander@1423
   240
	{
dvander@1423
   241
		ReplyToCommand(client, "[SM] %t", "Invalid SteamID specified");
dvander@1423
   242
		return Plugin_Handled;
dvander@1423
   243
	}
dvander@1423
   244
dvander@1423
   245
	new minutes = StringToInt(time);
dvander@1423
   246
dvander@1423
   247
	LogAction(client, 
dvander@1423
   248
			  -1, 
dvander@1423
   249
			  "\"%L\" added ban (minutes \"%d\") (id \"%s\") (reason \"%s\")", 
dvander@1423
   250
			  client, 
dvander@1423
   251
			  minutes, 
dvander@1423
   252
			  authid, 
pred@1736
   253
			  arg_string[total_len]);
dvander@1423
   254
	BanIdentity(authid, 
dvander@1423
   255
				minutes, 
dvander@1423
   256
				BANFLAG_AUTHID, 
pred@1736
   257
				arg_string[total_len], 
dvander@1423
   258
				"sm_addban", 
dvander@1423
   259
				client);
dvander@1423
   260
dvander@1423
   261
	ReplyToCommand(client, "[SM] %t", "Ban added");
dvander@1423
   262
dvander@1423
   263
	return Plugin_Handled;
dvander@1423
   264
}
dvander@1423
   265
dvander@1423
   266
public Action:Command_Unban(client, args)
dvander@1423
   267
{
dvander@1423
   268
	if (args < 1)
dvander@1423
   269
	{
dvander@1423
   270
		ReplyToCommand(client, "[SM] Usage: sm_unban <steamid|ip>");
dvander@1423
   271
		return Plugin_Handled;
dvander@1423
   272
	}
dvander@1423
   273
dvander@1423
   274
	decl String:arg[50];
dvander@1423
   275
	GetCmdArgString(arg, sizeof(arg));
dvander@1423
   276
dvander@1423
   277
	ReplaceString(arg, sizeof(arg), "\"", "");	
dvander@1423
   278
dvander@1423
   279
	new ban_flags;
dvander@1423
   280
	if (strncmp(arg, "STEAM_0:", 8) == 0)
dvander@1423
   281
	{
dvander@1423
   282
		ban_flags |= BANFLAG_AUTHID;
dvander@1423
   283
	}
dvander@1423
   284
	else
dvander@1423
   285
	{
dvander@1423
   286
		ban_flags |= BANFLAG_IP;
dvander@1423
   287
	}
dvander@1423
   288
dvander@1423
   289
	LogAction(client, -1, "\"%L\" removed ban (filter \"%s\")", client, arg);
dvander@1423
   290
	RemoveBan(arg, ban_flags, "sm_unban", client);
dvander@1423
   291
dvander@1423
   292
	ReplyToCommand(client, "[SM] %t", "Removed bans matching", arg);
dvander@1423
   293
dvander@1423
   294
	return Plugin_Handled;
dvander@1423
   295
}
dvander@1423
   296