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