plugins/sql-admin-manager.sp
author Scott Ehlert <ds@alliedmods.net>
Wed Aug 15 06:19:30 2007 +0000 (2007-08-15)
changeset 1330 ab94316bb52b
parent 1327 f9e17837ae3b
child 1403 ecb9c66fd4bb
permissions -rw-r--r--
Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.

(This day shall henceforth be known as the Eighty Column Massacre of '07)
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