plugins/sql-admin-manager.sp
author David Anderson <dvander@alliedmods.net>
Wed Aug 29 00:28:19 2007 +0000 (2007-08-29)
changeset 1381 a200ec1310f0
parent 1330 ab94316bb52b
child 1403 ecb9c66fd4bb
permissions -rw-r--r--
added note about putinserver and steamids
dvander@1325
     1
/**
ds@1330
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
ds@1330
     4
 * SourceMod SQL Admin Manager Plugin
dvander@1325
     5
 * Adds/managers admins and groups in an SQL database.
dvander@1325
     6
 *
ds@1330
     7
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     8
 * =============================================================================
dvander@1325
     9
 *
ds@1330
    10
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    12
 * Free Software Foundation.
ds@1330
    13
 * 
ds@1330
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    17
 * details.
dvander@1325
    18
 *
ds@1330
    19
 * You should have received a copy of the GNU General Public License along with
ds@1330
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ds@1330
    21
 *
ds@1330
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    29
 * or <http://www.sourcemod.net/license.php>.
dvander@1325
    30
 *
dvander@1325
    31
 * Version: $Id$
dvander@1325
    32
 */
dvander@1325
    33
dvander@1325
    34
/* We like semicolons */
dvander@1325
    35
#pragma semicolon 1
dvander@1325
    36
dvander@1325
    37
#include <sourcemod>
dvander@1325
    38
dvander@1325
    39
public Plugin:myinfo = 
dvander@1325
    40
{
dvander@1325
    41
	name = "SQL Admin Manager",
dvander@1325
    42
	author = "AlliedModders LLC",
dvander@1325
    43
	description = "Manages SQL admins",
dvander@1325
    44
	version = SOURCEMOD_VERSION,
dvander@1325
    45
	url = "http://www.sourcemod.net/"
dvander@1325
    46
};
dvander@1325
    47
dvander@1325
    48
public OnPluginStart()
dvander@1325
    49
{
dvander@1325
    50
	LoadTranslations("common.phrases");
dvander@1325
    51
	LoadTranslations("sqladmins.phrases");
dvander@1325
    52
dvander@1325
    53
	RegAdminCmd("sm_sql_addadmin", Command_AddAdmin, ADMFLAG_ROOT, "Adds an admin to the SQL database");
dvander@1325
    54
	RegAdminCmd("sm_sql_deladmin", Command_DelAdmin, ADMFLAG_ROOT, "Removes an admin from the SQL database");
dvander@1325
    55
	RegAdminCmd("sm_sql_addgroup", Command_AddGroup, ADMFLAG_ROOT, "Adds a group to the SQL database");
dvander@1325
    56
	RegAdminCmd("sm_sql_delgroup", Command_DelGroup, ADMFLAG_ROOT, "Removes a group from the SQL database");
dvander@1325
    57
	RegAdminCmd("sm_sql_setadmingroups", Command_SetAdminGroups, ADMFLAG_ROOT, "Sets an admin's groups in the SQL database");
dvander@1325
    58
}
dvander@1325
    59
dvander@1325
    60
Handle:Connect()
dvander@1325
    61
{
dvander@1325
    62
	decl String:error[255];
dvander@1325
    63
	new Handle:db;
dvander@1325
    64
	
dvander@1325
    65
	if (SQL_CheckConfig("admins"))
dvander@1325
    66
	{
dvander@1325
    67
		db = SQL_Connect("admins", true, error, sizeof(error));
dvander@1325
    68
	} else {
dvander@1325
    69
		db = SQL_Connect("default", true, error, sizeof(error));
dvander@1325
    70
	}
dvander@1325
    71
	
dvander@1325
    72
	if (db == INVALID_HANDLE)
dvander@1325
    73
	{
dvander@1325
    74
		LogError("Could not connect to database: %s", error);
dvander@1325
    75
	}
dvander@1325
    76
	
dvander@1325
    77
	return db;
dvander@1325
    78
}
dvander@1325
    79
dvander@1325
    80
public Action:Command_SetAdminGroups(client, args)
dvander@1325
    81
{
dvander@1325
    82
	if (args < 2)
dvander@1325
    83
	{
dvander@1325
    84
		ReplyToCommand(client, "[SM] Usage: sm_sql_setadmingroups <authtype> <identity> [group1] ... [group N]");
dvander@1325
    85
		return Plugin_Handled;
dvander@1325
    86
	}
dvander@1325
    87
	
dvander@1325
    88
	decl String:authtype[16];
dvander@1325
    89
	GetCmdArg(1, authtype, sizeof(authtype));
dvander@1325
    90
	
dvander@1325
    91
	if (!StrEqual(authtype, "steam")
dvander@1325
    92
		&& !StrEqual(authtype, "ip")
dvander@1325
    93
		&& !StrEqual(authtype, "name"))
dvander@1325
    94
	{
dvander@1325
    95
		ReplyToCommand(client, "[SM] %t", "Invalid authtype");
dvander@1325
    96
		return Plugin_Handled;
dvander@1325
    97
	}
dvander@1325
    98
	
dvander@1325
    99
	new Handle:db = Connect();
dvander@1325
   100
	if (db == INVALID_HANDLE)
dvander@1325
   101
	{
dvander@1325
   102
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1325
   103
		return Plugin_Handled;
dvander@1325
   104
	}
dvander@1325
   105
	
dvander@1325
   106
	decl String:identity[65];
dvander@1325
   107
	decl String:safe_identity[140];
dvander@1325
   108
	GetCmdArg(2, identity, sizeof(identity));
dvander@1325
   109
	SQL_QuoteString(db, identity, safe_identity, sizeof(safe_identity));
dvander@1325
   110
	
dvander@1325
   111
	decl String:query[255];
dvander@1325
   112
	Format(query, 
dvander@1325
   113
		sizeof(query),
dvander@1325
   114
		"SELECT id FROM sm_admins WHERE authtype = '%s' AND identity = '%s'",
dvander@1325
   115
		authtype,
dvander@1325
   116
		safe_identity);
dvander@1325
   117
		
dvander@1325
   118
	new Handle:hQuery;
dvander@1325
   119
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1325
   120
	{
dvander@1325
   121
		return DoError(client, db, query, "Admin lookup query failed");
dvander@1325
   122
	}
dvander@1325
   123
	
dvander@1325
   124
	if (!SQL_FetchRow(hQuery))
dvander@1325
   125
	{
dvander@1325
   126
		ReplyToCommand(client, "[SM] %t", "SQL Admin not found");
dvander@1325
   127
		CloseHandle(hQuery);
dvander@1325
   128
		CloseHandle(db);
dvander@1325
   129
		return Plugin_Handled;
dvander@1325
   130
	}
dvander@1325
   131
	
dvander@1325
   132
	new id = SQL_FetchInt(hQuery, 0);
dvander@1325
   133
	
dvander@1325
   134
	CloseHandle(hQuery);
dvander@1325
   135
	
dvander@1325
   136
	/**
dvander@1325
   137
	 * First delete all of the user's existing groups.
dvander@1325
   138
	 */
dvander@1325
   139
	Format(query, sizeof(query), "DELETE FROM sm_admins_groups WHERE admin_id = %d", id);
dvander@1325
   140
	if (!SQL_FastQuery(db, query))
dvander@1325
   141
	{
dvander@1325
   142
		return DoError(client, db, query, "Admin group deletion query failed");
dvander@1325
   143
	}
dvander@1325
   144
	
dvander@1325
   145
	if (args < 3)
dvander@1325
   146
	{
dvander@1325
   147
		ReplyToCommand(client, "[SM] %t", "SQL Admin groups reset");
dvander@1325
   148
		CloseHandle(db);
dvander@1325
   149
		return Plugin_Handled;
dvander@1325
   150
	}
dvander@1325
   151
	
dvander@1325
   152
	decl String:error[256];
dvander@1325
   153
	new Handle:hAddQuery, Handle:hFindQuery;
dvander@1325
   154
	
dvander@1325
   155
	Format(query, sizeof(query), "SELECT id FROM sm_groups WHERE name = ?");
dvander@1325
   156
	if ((hFindQuery = SQL_PrepareQuery(db, query, error, sizeof(error))) == INVALID_HANDLE)
dvander@1325
   157
	{
dvander@1325
   158
		return DoStmtError(client, db, query, error, "Group search prepare failed");
dvander@1325
   159
	}
dvander@1325
   160
	
dvander@1325
   161
	Format(query, 
dvander@1325
   162
		sizeof(query), 
dvander@1325
   163
		"INSERT INTO sm_admins_groups (admin_id, group_id, inherit_order) VALUES (%d, ?, ?)",
dvander@1325
   164
		id);
dvander@1325
   165
	if ((hAddQuery = SQL_PrepareQuery(db, query, error, sizeof(error))) == INVALID_HANDLE)
dvander@1325
   166
	{
dvander@1325
   167
		CloseHandle(hFindQuery);
dvander@1325
   168
		return DoStmtError(client, db, query, error, "Add admin group prepare failed");
dvander@1325
   169
	}
dvander@1325
   170
	
dvander@1325
   171
	decl String:name[80];
dvander@1325
   172
	new inherit_order = 0;
dvander@1325
   173
	for (new i=3; i<=args; i++)
dvander@1325
   174
	{
dvander@1325
   175
		GetCmdArg(i, name, sizeof(name));
dvander@1325
   176
		
dvander@1325
   177
		SQL_BindParamString(hFindQuery, 0, name, false);
dvander@1325
   178
		if (!SQL_Execute(hFindQuery) || !SQL_FetchRow(hFindQuery))
dvander@1325
   179
		{
dvander@1325
   180
			ReplyToCommand(client, "[SM] %t", "SQL Group X not found", name);
dvander@1325
   181
		} else {
dvander@1325
   182
			new gid = SQL_FetchInt(hFindQuery, 0);
dvander@1325
   183
			
dvander@1325
   184
			SQL_BindParamInt(hAddQuery, 0, gid);
dvander@1325
   185
			SQL_BindParamInt(hAddQuery, 1, ++inherit_order);
dvander@1325
   186
			if (!SQL_Execute(hAddQuery))
dvander@1325
   187
			{
dvander@1325
   188
				ReplyToCommand(client, "[SM] %t", "SQL Group X failed to bind", name);
dvander@1325
   189
				inherit_order--;
dvander@1325
   190
			}
dvander@1325
   191
		}
dvander@1325
   192
	}
dvander@1325
   193
	
dvander@1325
   194
	CloseHandle(hAddQuery);
dvander@1325
   195
	CloseHandle(hFindQuery);
dvander@1325
   196
	CloseHandle(db);
dvander@1325
   197
	
dvander@1325
   198
	if (inherit_order == 1)
dvander@1325
   199
	{
dvander@1325
   200
		ReplyToCommand(client, "[SM] %t", "Added group to user");
dvander@1325
   201
	} else if (inherit_order > 1) {
dvander@1325
   202
		ReplyToCommand(client, "[SM] %t", "Added groups to user", inherit_order);
dvander@1325
   203
	}
dvander@1325
   204
	
dvander@1325
   205
	return Plugin_Handled;
dvander@1325
   206
}
dvander@1325
   207
dvander@1325
   208
public Action:Command_DelGroup(client, args)
dvander@1325
   209
{
dvander@1325
   210
	if (args < 1)
dvander@1325
   211
	{
dvander@1327
   212
		ReplyToCommand(client, "[SM] Usage: sm_sql_delgroup <name>");
dvander@1325
   213
		return Plugin_Handled;
dvander@1325
   214
	}
dvander@1325
   215
dvander@1325
   216
	new Handle:db = Connect();
dvander@1325
   217
	if (db == INVALID_HANDLE)
dvander@1325
   218
	{
dvander@1325
   219
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1325
   220
		return Plugin_Handled;
dvander@1325
   221
	}
dvander@1325
   222
	
dvander@1325
   223
	new len;
dvander@1325
   224
	decl String:name[80];
dvander@1325
   225
	decl String:safe_name[180];
dvander@1325
   226
	GetCmdArgString(name, sizeof(name));
dvander@1325
   227
	
dvander@1325
   228
	/* Strip quotes in case the user tries to use them */
dvander@1325
   229
	len = strlen(name);
dvander@1325
   230
	if (len > 1 && (name[0] == '"' && name[len-1] == '"'))
dvander@1325
   231
	{
dvander@1325
   232
		name[--len] = '\0';
dvander@1325
   233
		SQL_QuoteString(db, name[1], safe_name, sizeof(safe_name));
dvander@1325
   234
	} else {
dvander@1325
   235
		SQL_QuoteString(db, name, safe_name, sizeof(safe_name));
dvander@1325
   236
	}
dvander@1325
   237
	
dvander@1325
   238
	decl String:query[256];
dvander@1325
   239
	
dvander@1326
   240
	new Handle:hQuery;
dvander@1326
   241
	Format(query, sizeof(query), "SELECT id FROM sm_groups WHERE name = '%s'", safe_name);
dvander@1326
   242
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1326
   243
	{
dvander@1326
   244
		return DoError(client, db, query, "Group retrieval query failed");
dvander@1326
   245
	}
dvander@1326
   246
	
dvander@1326
   247
	if (!SQL_FetchRow(hQuery))
dvander@1326
   248
	{
dvander@1326
   249
		ReplyToCommand(client, "[SM] %t", "SQL Group not found");
dvander@1326
   250
		CloseHandle(hQuery);
dvander@1326
   251
		CloseHandle(db);
dvander@1326
   252
		return Plugin_Handled;
dvander@1326
   253
	}
dvander@1326
   254
	
dvander@1326
   255
	new id = SQL_FetchInt(hQuery, 0);
dvander@1326
   256
	
dvander@1326
   257
	CloseHandle(hQuery);
dvander@1326
   258
	
dvander@1325
   259
	/* Delete admin inheritance for this group */
dvander@1326
   260
	Format(query, sizeof(query), "DELETE FROM sm_admins_groups WHERE group_id = %d", id);
dvander@1325
   261
	if (!SQL_FastQuery(db, query))
dvander@1325
   262
	{
dvander@1325
   263
		return DoError(client, db, query, "Admin group deletion query failed");
dvander@1325
   264
	}
dvander@1325
   265
	
dvander@1325
   266
	/* Delete group overrides */
dvander@1326
   267
	Format(query, sizeof(query), "DELETE FROM sm_group_overrides WHERE group_id = %d", id);
dvander@1325
   268
	if (!SQL_FastQuery(db, query))
dvander@1325
   269
	{
dvander@1325
   270
		return DoError(client, db, query, "Group override deletion query failed");
dvander@1325
   271
	}
dvander@1325
   272
	
dvander@1326
   273
	/* Delete immunity */
dvander@1326
   274
	Format(query, sizeof(query), "DELETE FROM sm_group_immunity WHERE group_id = %d OR other_id = %d", id, id);
dvander@1326
   275
	if (!SQL_FastQuery(db, query))
dvander@1326
   276
	{
dvander@1326
   277
		return DoError(client, db, query, "Group immunity deletion query failed");
dvander@1326
   278
	}
dvander@1326
   279
	
dvander@1325
   280
	/* Finally delete the group */
dvander@1326
   281
	Format(query, sizeof(query), "DELETE FROM sm_groups WHERE id = %d", id);
dvander@1325
   282
	if (!SQL_FastQuery(db, query))
dvander@1325
   283
	{
dvander@1325
   284
		return DoError(client, db, query, "Group deletion query failed");
dvander@1325
   285
	}
dvander@1325
   286
	
dvander@1326
   287
	ReplyToCommand(client, "[SM] %t", "SQL Group deleted");
dvander@1325
   288
	
dvander@1325
   289
	CloseHandle(db);
dvander@1325
   290
	
dvander@1325
   291
	return Plugin_Handled;
dvander@1325
   292
}
dvander@1325
   293
dvander@1325
   294
public Action:Command_AddGroup(client, args)
dvander@1325
   295
{
dvander@1325
   296
	if (args < 2)
dvander@1325
   297
	{
dvander@1325
   298
		ReplyToCommand(client, "[SM] Usage: sm_sql_addgroup <name> <flags> [immunity]");
dvander@1325
   299
		ReplyToCommand(client, "[SM] %t", "Invalid immunity");
dvander@1325
   300
		return Plugin_Handled;
dvander@1325
   301
	}
dvander@1325
   302
dvander@1325
   303
	new String:immunity[32] = "none";
dvander@1325
   304
	if (args >= 3)
dvander@1325
   305
	{
dvander@1325
   306
		GetCmdArg(3, immunity, sizeof(immunity));
dvander@1325
   307
		if (!StrEqual(immunity, "none")
dvander@1325
   308
			&& !StrEqual(immunity, "global")
dvander@1325
   309
			&& !StrEqual(immunity, "default"))
dvander@1325
   310
		{
dvander@1325
   311
			ReplyToCommand(client, "[SM] %t", "Invalid immunity");
dvander@1325
   312
			return Plugin_Handled;
dvander@1325
   313
		}
dvander@1325
   314
	}
dvander@1325
   315
	
dvander@1325
   316
	new Handle:db = Connect();
dvander@1325
   317
	if (db == INVALID_HANDLE)
dvander@1325
   318
	{
dvander@1325
   319
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1325
   320
		return Plugin_Handled;
dvander@1325
   321
	}
dvander@1325
   322
	
dvander@1325
   323
	decl String:name[64];
dvander@1325
   324
	decl String:safe_name[64];
dvander@1325
   325
	GetCmdArg(1, name, sizeof(name));
dvander@1325
   326
	SQL_QuoteString(db, name, safe_name, sizeof(safe_name));
dvander@1325
   327
	
dvander@1325
   328
	new Handle:hQuery;
dvander@1325
   329
	decl String:query[256];
dvander@1325
   330
	Format(query, sizeof(query), "SELECT id FROM sm_groups WHERE name = '%s'", safe_name);
dvander@1325
   331
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1325
   332
	{
dvander@1325
   333
		return DoError(client, db, query, "Group retrieval query failed");
dvander@1325
   334
	}
dvander@1325
   335
	
dvander@1325
   336
	if (SQL_GetRowCount(hQuery) > 0)
dvander@1325
   337
	{
dvander@1325
   338
		ReplyToCommand(client, "[SM] %t", "SQL Group already exists");
dvander@1325
   339
		CloseHandle(hQuery);
dvander@1325
   340
		CloseHandle(db);
dvander@1325
   341
		return Plugin_Handled;
dvander@1325
   342
	}
dvander@1325
   343
	
dvander@1325
   344
	CloseHandle(hQuery);
dvander@1325
   345
	
dvander@1325
   346
	decl String:flags[30];
dvander@1325
   347
	decl String:safe_flags[64];
dvander@1325
   348
	GetCmdArg(2, flags, sizeof(safe_flags));
dvander@1325
   349
	SQL_QuoteString(db, flags, safe_flags, sizeof(safe_flags));
dvander@1325
   350
	
dvander@1325
   351
	Format(query, 
dvander@1325
   352
		sizeof(query),
dvander@1325
   353
		"INSERT INTO sm_groups (immunity, flags, name) VALUES ('%s', '%s', '%s')",
dvander@1325
   354
		immunity,
dvander@1325
   355
		safe_flags,
dvander@1325
   356
		safe_name);
dvander@1325
   357
	
dvander@1325
   358
	if (!SQL_FastQuery(db, query))
dvander@1325
   359
	{
dvander@1325
   360
		return DoError(client, db, query, "Group insertion query failed");
dvander@1325
   361
	}
dvander@1325
   362
	
dvander@1325
   363
	ReplyToCommand(client, "[SM] %t", "SQL Group added");
dvander@1325
   364
	
dvander@1325
   365
	CloseHandle(db);
dvander@1325
   366
		
dvander@1325
   367
	return Plugin_Handled;
dvander@1325
   368
}	
dvander@1325
   369
dvander@1325
   370
public Action:Command_DelAdmin(client, args)
dvander@1325
   371
{
dvander@1325
   372
	if (args < 2)
dvander@1325
   373
	{
dvander@1325
   374
		ReplyToCommand(client, "[SM] Usage: sm_sql_deladmin <authtype> <identity>");
dvander@1325
   375
		ReplyToCommand(client, "[SM] %t", "Invalid authtype");
dvander@1325
   376
		return Plugin_Handled;
dvander@1325
   377
	}
dvander@1325
   378
	
dvander@1325
   379
	decl String:authtype[16];
dvander@1325
   380
	GetCmdArg(1, authtype, sizeof(authtype));
dvander@1325
   381
	
dvander@1325
   382
	if (!StrEqual(authtype, "steam")
dvander@1325
   383
		&& !StrEqual(authtype, "ip")
dvander@1325
   384
		&& !StrEqual(authtype, "name"))
dvander@1325
   385
	{
dvander@1325
   386
		ReplyToCommand(client, "[SM] %t", "Invalid authtype");
dvander@1325
   387
		return Plugin_Handled;
dvander@1325
   388
	}
dvander@1325
   389
	
dvander@1325
   390
	new Handle:db = Connect();
dvander@1325
   391
	if (db == INVALID_HANDLE)
dvander@1325
   392
	{
dvander@1325
   393
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1325
   394
		return Plugin_Handled;
dvander@1325
   395
	}
dvander@1325
   396
	
dvander@1325
   397
	decl String:identity[65];
dvander@1325
   398
	decl String:safe_identity[140];
dvander@1325
   399
	GetCmdArg(2, identity, sizeof(identity));
dvander@1325
   400
	SQL_QuoteString(db, identity, safe_identity, sizeof(safe_identity));
dvander@1325
   401
	
dvander@1325
   402
	decl String:query[255];
dvander@1325
   403
	Format(query, 
dvander@1325
   404
		sizeof(query),
dvander@1325
   405
		"SELECT id FROM sm_admins WHERE authtype = '%s' AND identity = '%s'",
dvander@1325
   406
		authtype,
dvander@1325
   407
		safe_identity);
dvander@1325
   408
		
dvander@1325
   409
	new Handle:hQuery;
dvander@1325
   410
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1325
   411
	{
dvander@1325
   412
		return DoError(client, db, query, "Admin lookup query failed");
dvander@1325
   413
	}
dvander@1325
   414
	
dvander@1325
   415
	if (!SQL_FetchRow(hQuery))
dvander@1325
   416
	{
dvander@1325
   417
		ReplyToCommand(client, "[SM] %t", "SQL Admin not found");
dvander@1325
   418
		CloseHandle(hQuery);
dvander@1325
   419
		CloseHandle(db);
dvander@1325
   420
		return Plugin_Handled;
dvander@1325
   421
	}
dvander@1325
   422
	
dvander@1325
   423
	new id = SQL_FetchInt(hQuery, 0);
dvander@1325
   424
	
dvander@1325
   425
	CloseHandle(hQuery);
dvander@1325
   426
	
dvander@1325
   427
	/* Delete group bindings */
dvander@1325
   428
	Format(query, sizeof(query), "DELETE FROM sm_admins_groups WHERE admin_id = %d", id);
dvander@1325
   429
	if (!SQL_FastQuery(db, query))
dvander@1325
   430
	{
dvander@1325
   431
		return DoError(client, db, query, "Admin group deletion query failed");
dvander@1325
   432
	}
dvander@1325
   433
	
dvander@1325
   434
	Format(query, sizeof(query), "DELETE FROM sm_admins WHERE id = %d", id);
dvander@1325
   435
	if (!SQL_FastQuery(db, query))
dvander@1325
   436
	{
dvander@1325
   437
		return DoError(client, db, query, "Admin deletion query failed");
dvander@1325
   438
	}
dvander@1325
   439
	
dvander@1325
   440
	CloseHandle(db);
dvander@1325
   441
	
dvander@1325
   442
	ReplyToCommand(client, "[SM] %t", "SQL Admin deleted");
dvander@1325
   443
	
dvander@1325
   444
	return Plugin_Handled;
dvander@1325
   445
}
dvander@1325
   446
dvander@1325
   447
public Action:Command_AddAdmin(client, args)
dvander@1325
   448
{
dvander@1325
   449
	if (args < 4)
dvander@1325
   450
	{
dvander@1325
   451
		ReplyToCommand(client, "[SM] Usage: sm_sql_addadmin <alias> <authtype> <identity> <flags> [password]");
dvander@1325
   452
		ReplyToCommand(client, "[SM] %t", "Invalid authtype");
dvander@1325
   453
		return Plugin_Handled;
dvander@1325
   454
	}
dvander@1325
   455
	
dvander@1325
   456
	decl String:authtype[16];
dvander@1325
   457
	GetCmdArg(2, authtype, sizeof(authtype));
dvander@1325
   458
	
dvander@1325
   459
	if (!StrEqual(authtype, "steam")
dvander@1325
   460
		&& !StrEqual(authtype, "ip")
dvander@1325
   461
		&& !StrEqual(authtype, "name"))
dvander@1325
   462
	{
dvander@1325
   463
		ReplyToCommand(client, "[SM] %t", "Invalid authtype");
dvander@1325
   464
		return Plugin_Handled;
dvander@1325
   465
	}
dvander@1325
   466
	
dvander@1325
   467
	decl String:identity[65];
dvander@1325
   468
	decl String:safe_identity[140];
dvander@1325
   469
	GetCmdArg(3, identity, sizeof(identity));
dvander@1325
   470
	
dvander@1325
   471
	decl String:query[256];
dvander@1325
   472
	new Handle:hQuery;
dvander@1325
   473
	new Handle:db = Connect();
dvander@1325
   474
	if (db == INVALID_HANDLE)
dvander@1325
   475
	{
dvander@1325
   476
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1325
   477
		return Plugin_Handled;
dvander@1325
   478
	}
dvander@1325
   479
	
dvander@1325
   480
	SQL_QuoteString(db, identity, safe_identity, sizeof(safe_identity));
dvander@1325
   481
	
dvander@1325
   482
	Format(query, sizeof(query), "SELECT id FROM sm_admins WHERE authtype = '%s' AND identity = '%s'", authtype, identity);
dvander@1325
   483
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1325
   484
	{
dvander@1325
   485
		return DoError(client, db, query, "Admin retrieval query failed");
dvander@1325
   486
	}
dvander@1325
   487
	
dvander@1325
   488
	if (SQL_GetRowCount(hQuery) > 0)
dvander@1325
   489
	{
dvander@1325
   490
		ReplyToCommand(client, "[SM] %t", "SQL Admin already exists");
dvander@1325
   491
		CloseHandle(hQuery);
dvander@1325
   492
		CloseHandle(db);
dvander@1325
   493
		return Plugin_Handled;
dvander@1325
   494
	}
dvander@1325
   495
	
dvander@1325
   496
	CloseHandle(hQuery);
dvander@1325
   497
	
dvander@1325
   498
	decl String:alias[64];
dvander@1325
   499
	decl String:safe_alias[140];
dvander@1325
   500
	GetCmdArg(1, alias, sizeof(alias));
dvander@1325
   501
	SQL_QuoteString(db, alias, safe_alias, sizeof(safe_alias));
dvander@1325
   502
	
dvander@1325
   503
	decl String:flags[30];
dvander@1325
   504
	decl String:safe_flags[64];
dvander@1325
   505
	GetCmdArg(4, flags, sizeof(flags));
dvander@1325
   506
	SQL_QuoteString(db, flags, safe_flags, sizeof(safe_flags));
dvander@1325
   507
	
dvander@1325
   508
	decl String:password[32];
dvander@1325
   509
	decl String:safe_password[80];
dvander@1325
   510
	if (args > 4)
dvander@1325
   511
	{
dvander@1325
   512
		GetCmdArg(5, password, sizeof(password));
dvander@1325
   513
		SQL_QuoteString(db, password, safe_password, sizeof(safe_password));
dvander@1325
   514
	} else {
dvander@1325
   515
		safe_password[0] = '\0';
dvander@1325
   516
	}
dvander@1325
   517
	
dvander@1325
   518
	new len = 0;
dvander@1325
   519
	len += Format(query[len], sizeof(query)-len, "INSERT INTO sm_admins (authtype, identity, password, flags, name) VALUES");
dvander@1325
   520
	if (safe_password[0] == '\0')
dvander@1325
   521
	{
dvander@1325
   522
		len += Format(query[len], sizeof(query)-len, " ('%s', '%s', NULL, '%s', '%s')", authtype, safe_identity, safe_flags, safe_alias);
dvander@1325
   523
	} else {
dvander@1325
   524
		len += Format(query[len], sizeof(query)-len, " ('%s', '%s', '%s', '%s', '%s')", authtype, safe_identity, safe_password, safe_flags, safe_alias);
dvander@1325
   525
	}
dvander@1325
   526
	
dvander@1325
   527
	if (!SQL_FastQuery(db, query))
dvander@1325
   528
	{
dvander@1325
   529
		return DoError(client, db, query, "Admin insertion query failed");
dvander@1325
   530
	}
dvander@1325
   531
	
dvander@1325
   532
	ReplyToCommand(client, "[SM] %t", "SQL Admin added");
dvander@1325
   533
	
dvander@1325
   534
	CloseHandle(db);
dvander@1325
   535
		
dvander@1325
   536
	return Plugin_Handled;
dvander@1325
   537
}
dvander@1325
   538
dvander@1325
   539
stock Action:DoError(client, Handle:db, const String:query[], const String:msg[])
dvander@1325
   540
{
dvander@1325
   541
		decl String:error[255];
dvander@1325
   542
		SQL_GetError(db, error, sizeof(error));
dvander@1325
   543
		LogError("%s: %s", msg, error);
dvander@1325
   544
		LogError("Query dump: %s", query);
dvander@1325
   545
		CloseHandle(db);
dvander@1325
   546
		ReplyToCommand(client, "[SM] %t", "Failed to query database");
dvander@1325
   547
		return Plugin_Handled;
dvander@1325
   548
}
dvander@1325
   549
dvander@1325
   550
stock Action:DoStmtError(client, Handle:db, const String:query[], const String:error[], const String:msg[])
dvander@1325
   551
{
dvander@1325
   552
		LogError("%s: %s", msg, error);
dvander@1325
   553
		LogError("Query dump: %s", query);
dvander@1325
   554
		CloseHandle(db);
dvander@1325
   555
		ReplyToCommand(client, "[SM] %t", "Failed to query database");
dvander@1325
   556
		return Plugin_Handled;
dvander@1325
   557
}
dvander@1325
   558