plugins/include/helpers.inc
author Phong Dang <teame06@gmail.com>
Sun Jul 29 00:26:18 2007 +0000 (2007-07-29)
changeset 1200 623603b49096
parent 1177 90c066adfa6b
child 1330 ab94316bb52b
permissions -rw-r--r--
Fixed AskPluginLoad would still allowed plugin to load even if it returned false.
dvander@460
     1
/**
ds@475
     2
 * vim: set ts=4 :
dvander@460
     3
 * ===============================================================
dvander@460
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@460
     5
 * ===============================================================
dvander@460
     6
 *
dvander@460
     7
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be used 
dvander@460
     8
 * or modified under the Terms and Conditions of its License Agreement, which is found 
dvander@460
     9
 * in LICENSE.txt.  The Terms and Conditions for making SourceMod extensions/plugins 
dvander@460
    10
 * may change at any time.  To view the latest information, see:
dvander@460
    11
 *   http://www.sourcemod.net/license.php
dvander@460
    12
 *
dvander@460
    13
 * Version: $Id$
dvander@460
    14
 */
dvander@460
    15
 
dvander@460
    16
#if defined _helpers_included
dvander@460
    17
 #endinput
dvander@460
    18
#endif
dvander@460
    19
#define _helpers_included
dvander@460
    20
dvander@460
    21
/**
dvander@926
    22
 * Provided by basecommands.sp when sm_ban is called.
dvander@926
    23
 *
dvander@927
    24
 * @param admin			Admin client index (0 for server).
dvander@926
    25
 * @param client		Client index which will be banned.
dvander@927
    26
 * @param time			Minutes banned for (0 is permanent).
dvander@926
    27
 * @param reason		Ban reason (may be empty if none exists).
dvander@982
    28
 * @return				Pl_Handled to block output, Pl_Stop to block output and action.
dvander@926
    29
 */
dvander@982
    30
forward Action:OnClientBanned(admin, client, time, const String:reason[]);
dvander@927
    31
dvander@927
    32
/**
dvander@927
    33
 * Provided by basecommands.sp when sm_addban or sm_banip is called.
dvander@927
    34
 *
dvander@927
    35
 * @param admin			Admin client index (0 for server).
dvander@927
    36
 * @param info			User info (either steamid or ip).
dvander@927
    37
 * @param time			Minutes banned for (0 is permanent).
dvander@927
    38
 * @param reason		Ban reason (may be empty if none exists).
dvander@982
    39
 * @return				Pl_Handled to block output, Pl_Stop to block output and action.
dvander@927
    40
 */
dvander@982
    41
forward Action:OnBanAdded(admin, const String:info[], time, const String:reason[]);
dvander@927
    42
dvander@927
    43
/**
dvander@927
    44
 * Provided by basecommands.sp when sm_unban or sm_unbanip is called.
dvander@927
    45
 *
dvander@927
    46
 * @param admin			Admin client index (0 for server).
dvander@927
    47
 * @param info 			User info (either steamid or ip).
dvander@982
    48
 * @return				Pl_Handled to block output, Pl_Stop to block output and action.
dvander@927
    49
 */
dvander@982
    50
forward Action:OnBanRemoved(admin, const String:info[]);
dvander@926
    51
dvander@926
    52
/**
dvander@982
    53
 * Formats a user's info as log text.  This is usually not needed because
dvander@982
    54
 * %L can be used to auto-format client information into a string.
dvander@460
    55
 *
dvander@460
    56
 * @param client		Client index.
dvander@460
    57
 * @param buffer		Buffer for text.
dvander@460
    58
 * @param maxlength		Maximum length of text.
dvander@460
    59
 */
dvander@460
    60
stock FormatUserLogText(client, String:buffer[], maxlength)
dvander@460
    61
{
dvander@460
    62
	decl String:auth[32];
dvander@460
    63
	decl String:name[40];
dvander@460
    64
	
dvander@460
    65
	new userid = GetClientUserId(client);
dvander@460
    66
	if (!GetClientAuthString(client, auth, sizeof(auth)))
dvander@460
    67
	{
ds@1083
    68
		strcopy(auth, sizeof(auth), "UNKNOWN");
dvander@460
    69
	}
dvander@460
    70
	if (!GetClientName(client, name, sizeof(name)))
dvander@460
    71
	{
ds@1083
    72
		strcopy(name, sizeof(name), "UNKNOWN");
dvander@460
    73
	}
dvander@460
    74
	
dvander@460
    75
	/** Currently, no team stuff ... */
dvander@460
    76
	
dvander@460
    77
	Format(buffer, maxlength, "\"%s<%d><%s><>\"", name, userid, auth);
dvander@460
    78
}
ds@621
    79
ds@621
    80
/**
ds@621
    81
 * Returns plugin handle from plugin filename.
ds@621
    82
 *
ds@621
    83
 * @param filename		Filename of the plugin to search for.
ds@622
    84
 * @return				Handle to plugin if found, INVALID_HANDLE otherwise.
ds@621
    85
 */
ds@621
    86
stock Handle:FindPluginByFile(const String:filename[])
ds@621
    87
{
ds@621
    88
	decl String:buffer[256];
ds@621
    89
	
ds@621
    90
	new Handle:iter = GetPluginIterator();
ds@621
    91
	new Handle:pl;
ds@621
    92
	
ds@621
    93
	while (MorePlugins(iter))
ds@621
    94
	{
ds@621
    95
		pl = ReadPlugin(iter);
ds@621
    96
		
ds@621
    97
		GetPluginFilename(pl, buffer, sizeof(buffer));
ds@1083
    98
		if (strcmp(buffer, filename, false) == 0)
ds@621
    99
		{
dvander@982
   100
			CloseHandle(iter);
ds@621
   101
			return pl;
ds@621
   102
		}
ds@621
   103
	}
ds@621
   104
	
ds@650
   105
	CloseHandle(iter);
ds@650
   106
	
ds@621
   107
	return INVALID_HANDLE;
ds@621
   108
}
dvander@902
   109
dvander@902
   110
/**
dvander@902
   111
 * Searches for clients that match an input string.
dvander@902
   112
 *
dvander@902
   113
 * Allowed patterns: 
dvander@902
   114
 *  1) #<userid> or #<exact name>
dvander@902
   115
 *  2) <partial or full name>
dvander@903
   116
 *
dvander@903
   117
 * @param pattern		Pattern to search for.
dvander@903
   118
 * @param clients		Array to store matching clients in.
dvander@903
   119
 * @param maxClients	Maximum clients in the array.
dvander@903
   120
 * @return				Number of clients found.
dvander@902
   121
 */
dvander@902
   122
stock SearchForClients(const String:pattern[], clients[], maxClients)
dvander@902
   123
{
dvander@902
   124
	new maxclients = GetMaxClients();
dvander@902
   125
	new total = 0;
dvander@902
   126
	
dvander@902
   127
	if (maxClients == 0)
dvander@902
   128
	{
dvander@902
   129
		return 0;
dvander@902
   130
	}
dvander@902
   131
	
dvander@902
   132
	if (pattern[0] == '#')
dvander@902
   133
	{
dvander@902
   134
		new input = StringToInt(pattern[1]);
dvander@902
   135
		if (!input)
dvander@902
   136
		{
dvander@902
   137
			decl String:name[65]
dvander@902
   138
			for (new i=1; i<=maxclients; i++)
dvander@902
   139
			{
dvander@902
   140
				if (!IsClientInGame(i))
dvander@902
   141
				{
dvander@902
   142
					continue;
dvander@902
   143
				}
dvander@902
   144
				GetClientName(i, name, sizeof(name));
ds@1083
   145
				if (strcmp(name, pattern, false) == 0)
dvander@902
   146
				{
dvander@902
   147
					clients[0] = i;
dvander@902
   148
					return 1;
dvander@902
   149
				}
dvander@902
   150
			}
dvander@902
   151
		} else {
dvander@902
   152
			new client = GetClientOfUserId(input);
dvander@902
   153
			if (client)
dvander@902
   154
			{
dvander@902
   155
				clients[0] = client;
dvander@902
   156
				return 1;
dvander@902
   157
			}
dvander@902
   158
		}
dvander@902
   159
	}
dvander@902
   160
	
dvander@902
   161
	decl String:name[65]
dvander@902
   162
	for (new i=1; i<=maxclients; i++)
dvander@902
   163
	{
dvander@902
   164
		if (!IsClientInGame(i))
dvander@902
   165
		{
dvander@902
   166
			continue;
dvander@902
   167
		}
dvander@902
   168
		GetClientName(i, name, sizeof(name));
dvander@902
   169
		if (StrContains(name, pattern, false) != -1)
dvander@902
   170
		{
dvander@902
   171
			clients[total++] = i;
dvander@902
   172
			if (total >= maxClients)
dvander@902
   173
			{
dvander@902
   174
				break;
dvander@902
   175
			}
dvander@902
   176
		}
dvander@902
   177
	}
dvander@902
   178
	
dvander@902
   179
	return total;
dvander@902
   180
}
ferret99gt@1177
   181
ferret99gt@1177
   182
/**
ferret99gt@1177
   183
 * Wraps SearchForClients and handles producing error messages for
ferret99gt@1177
   184
 * bad targets.
ferret99gt@1177
   185
 *
ferret99gt@1177
   186
 * @param client	Client who issued command
ferret99gt@1177
   187
 * @param target	Client's target argument
ferret99gt@1177
   188
 * @param nobots	Optional. Set to true if bots should NOT be targetted
ferret99gt@1177
   189
 * @param immunity	Optional. Set to false to ignore target immunity.
ferret99gt@1177
   190
 * @return		Index of target client, or -1 on error.
ferret99gt@1177
   191
 */
ferret99gt@1177
   192
stock FindTarget(client, const String:target[], bool:nobots = false, bool:immunity = true)
ferret99gt@1177
   193
{
ferret99gt@1177
   194
	new clients[2];
ferret99gt@1177
   195
	new numClients = SearchForClients(target, clients, 2);
ferret99gt@1177
   196
	
ferret99gt@1177
   197
	if (numClients == 0)
ferret99gt@1177
   198
	{
ferret99gt@1177
   199
		ReplyToCommand(client, "[SM] %t", "No matching client");
ferret99gt@1177
   200
		return -1;
ferret99gt@1177
   201
	}
ferret99gt@1177
   202
	else if (numClients > 1)
ferret99gt@1177
   203
	{
ferret99gt@1177
   204
		ReplyToCommand(client, "[SM] %t", "More than one client matches", target);
ferret99gt@1177
   205
		return -1;
ferret99gt@1177
   206
	}
ferret99gt@1177
   207
	else if (immunity && !CanUserTarget(client, clients[0]))
ferret99gt@1177
   208
	{
ferret99gt@1177
   209
		ReplyToCommand(client, "[SM] %t", "Unable to target");
ferret99gt@1177
   210
		return -1;
ferret99gt@1177
   211
	}
ferret99gt@1177
   212
	else if (nobots && IsFakeClient(clients[0]))
ferret99gt@1177
   213
	{
ferret99gt@1177
   214
		ReplyToCommand(client, "[SM] %t", "Cannot target bot");
ferret99gt@1177
   215
		return -1;
ferret99gt@1177
   216
	}
ferret99gt@1177
   217
	
ferret99gt@1177
   218
	return clients[0];
ferret99gt@1177
   219
}