plugins/sql-admin-manager.sp
author Nicholas Hastings <skamonkey@gmail.com>
Wed Jan 23 18:28:06 2013 -0500 (2013-01-23)
changeset 3756 114d52909940
parent 2549 8d2974380f78
permissions -rw-r--r--
Marked some missed Pb natives as optional (bug 5579).
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@1947
     7
 * SourceMod (C)2004-2008 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@1403
    39
#define CURRENT_SCHEMA_VERSION		1409
dvander@1403
    40
#define SCHEMA_UPGRADE_1			1409
dvander@1403
    41
dvander@1403
    42
new current_version[4] = {1, 0, 0, CURRENT_SCHEMA_VERSION};
dvander@1403
    43
dvander@1325
    44
public Plugin:myinfo = 
dvander@1325
    45
{
dvander@1325
    46
	name = "SQL Admin Manager",
dvander@1325
    47
	author = "AlliedModders LLC",
dvander@1325
    48
	description = "Manages SQL admins",
dvander@1325
    49
	version = SOURCEMOD_VERSION,
dvander@1325
    50
	url = "http://www.sourcemod.net/"
dvander@1325
    51
};
dvander@1325
    52
dvander@1325
    53
public OnPluginStart()
dvander@1325
    54
{
dvander@1325
    55
	LoadTranslations("common.phrases");
dvander@1325
    56
	LoadTranslations("sqladmins.phrases");
dvander@1325
    57
dvander@1325
    58
	RegAdminCmd("sm_sql_addadmin", Command_AddAdmin, ADMFLAG_ROOT, "Adds an admin to the SQL database");
dvander@1325
    59
	RegAdminCmd("sm_sql_deladmin", Command_DelAdmin, ADMFLAG_ROOT, "Removes an admin from the SQL database");
dvander@1325
    60
	RegAdminCmd("sm_sql_addgroup", Command_AddGroup, ADMFLAG_ROOT, "Adds a group to the SQL database");
dvander@1325
    61
	RegAdminCmd("sm_sql_delgroup", Command_DelGroup, ADMFLAG_ROOT, "Removes a group from the SQL database");
dvander@1325
    62
	RegAdminCmd("sm_sql_setadmingroups", Command_SetAdminGroups, ADMFLAG_ROOT, "Sets an admin's groups in the SQL database");
dvander@1403
    63
	RegServerCmd("sm_create_adm_tables", Command_CreateTables);
dvander@1403
    64
	RegServerCmd("sm_update_adm_tables", Command_UpdateTables);
dvander@1325
    65
}
dvander@1325
    66
dvander@1325
    67
Handle:Connect()
dvander@1325
    68
{
dvander@1325
    69
	decl String:error[255];
dvander@1325
    70
	new Handle:db;
dvander@1325
    71
	
dvander@1325
    72
	if (SQL_CheckConfig("admins"))
dvander@1325
    73
	{
dvander@1325
    74
		db = SQL_Connect("admins", true, error, sizeof(error));
dvander@1325
    75
	} else {
dvander@1325
    76
		db = SQL_Connect("default", true, error, sizeof(error));
dvander@1325
    77
	}
dvander@1325
    78
	
dvander@1325
    79
	if (db == INVALID_HANDLE)
dvander@1325
    80
	{
dvander@1325
    81
		LogError("Could not connect to database: %s", error);
dvander@1325
    82
	}
dvander@1325
    83
	
dvander@1325
    84
	return db;
dvander@1325
    85
}
dvander@1325
    86
dvander@1403
    87
CreateMySQL(client, Handle:db)
dvander@1403
    88
{
dvander@1403
    89
	new String:queries[7][] = 
dvander@1403
    90
	{
dvander@1403
    91
		"CREATE TABLE sm_admins (id int(10) unsigned NOT NULL auto_increment, authtype enum('steam','name','ip') NOT NULL, identity varchar(65) NOT NULL, password varchar(65), flags varchar(30) NOT NULL, name varchar(65) NOT NULL, immunity int(10) unsigned NOT NULL, PRIMARY KEY (id))",
dvander@1403
    92
		"CREATE TABLE sm_groups (id int(10) unsigned NOT NULL auto_increment, flags varchar(30) NOT NULL, name varchar(120) NOT NULL, immunity_level int(1) unsigned NOT NULL, PRIMARY KEY (id))",
dvander@1403
    93
		"CREATE TABLE sm_group_immunity (group_id int(10) unsigned NOT NULL, other_id int(10) unsigned NOT NULL,  PRIMARY KEY (group_id, other_id))",
dvander@1403
    94
		"CREATE TABLE sm_group_overrides (group_id int(10) unsigned NOT NULL, type enum('command','group') NOT NULL, name varchar(32) NOT NULL, access enum('allow','deny') NOT NULL, PRIMARY KEY (group_id, type, name))",
dvander@1403
    95
		"CREATE TABLE sm_overrides (type enum('command','group') NOT NULL, name varchar(32) NOT NULL, flags varchar(30) NOT NULL, PRIMARY KEY (type,name))",
dvander@1403
    96
		"CREATE TABLE sm_admins_groups (admin_id int(10) unsigned NOT NULL, group_id int(10) unsigned NOT NULL, inherit_order int(10) NOT NULL, PRIMARY KEY (admin_id, group_id))",
dvander@1403
    97
		"CREATE TABLE IF NOT EXISTS sm_config (cfg_key varchar(32) NOT NULL, cfg_value varchar(255) NOT NULL, PRIMARY KEY (cfg_key))"
dvander@1403
    98
	};
dvander@1403
    99
dvander@1403
   100
	for (new i = 0; i < 7; i++)
dvander@1403
   101
	{
dvander@1403
   102
		if (!DoQuery(client, db, queries[i]))
dvander@1403
   103
		{
dvander@1403
   104
			return;
dvander@1403
   105
		}
dvander@1403
   106
	}
dvander@1403
   107
dvander@1403
   108
	decl String:query[256];
dvander@1403
   109
	Format(query, 
dvander@1403
   110
		sizeof(query), 
dvander@1403
   111
		"INSERT INTO sm_config (cfg_key, cfg_value) VALUES ('admin_version', '1.0.0.%d') ON DUPLICATE KEY UPDATE cfg_value = '1.0.0.%d'",
dvander@1403
   112
		CURRENT_SCHEMA_VERSION,
dvander@1403
   113
		CURRENT_SCHEMA_VERSION);
dvander@1403
   114
dvander@1403
   115
	if (!DoQuery(client, db, query))
dvander@1403
   116
	{
dvander@1403
   117
		return;
dvander@1403
   118
	}
dvander@1403
   119
dvander@1403
   120
	ReplyToCommand(client, "[SM] Admin tables have been created.");
dvander@1403
   121
}
dvander@1403
   122
dvander@1403
   123
CreateSQLite(client, Handle:db)
dvander@1403
   124
{
dvander@1403
   125
	new String:queries[7][] = 
dvander@1403
   126
	{
dvander@1403
   127
		"CREATE TABLE sm_admins (id INTEGER PRIMARY KEY AUTOINCREMENT, authtype varchar(16) NOT NULL CHECK(authtype IN ('steam', 'ip', 'name')), identity varchar(65) NOT NULL, password varchar(65), flags varchar(30) NOT NULL, name varchar(65) NOT NULL, immunity INTEGER NOT NULL)",
dvander@1403
   128
		"CREATE TABLE sm_groups (id INTEGER PRIMARY KEY AUTOINCREMENT, flags varchar(30) NOT NULL, name varchar(120) NOT NULL, immunity_level INTEGER NOT NULL)",
dvander@1403
   129
		"CREATE TABLE sm_group_immunity (group_id INTEGER NOT NULL, other_id INTEGER NOT NULL, PRIMARY KEY (group_id, other_id))",
dvander@1403
   130
		"CREATE TABLE sm_group_overrides (group_id INTEGER NOT NULL, type varchar(16) NOT NULL CHECK (type IN ('command', 'group')), name varchar(32) NOT NULL, access varchar(16) NOT NULL CHECK (access IN ('allow', 'deny')), PRIMARY KEY (group_id, type, name))",
dvander@1403
   131
		"CREATE TABLE sm_overrides (type varchar(16) NOT NULL CHECK (type IN ('command', 'group')), name varchar(32) NOT NULL, flags varchar(30) NOT NULL, PRIMARY KEY (type,name))",
dvander@1403
   132
		"CREATE TABLE sm_admins_groups (admin_id INTEGER NOT NULL, group_id INTEGER NOT NULL, inherit_order int(10) NOT NULL, PRIMARY KEY (admin_id, group_id))",
dvander@1403
   133
		"CREATE TABLE IF NOT EXISTS sm_config (cfg_key varchar(32) NOT NULL, cfg_value varchar(255) NOT NULL, PRIMARY KEY (cfg_key))"
dvander@1403
   134
	};
dvander@1403
   135
dvander@1403
   136
	for (new i = 0; i < 7; i++)
dvander@1403
   137
	{
dvander@1403
   138
		if (!DoQuery(client, db, queries[i]))
dvander@1403
   139
		{
dvander@1403
   140
			return;
dvander@1403
   141
		}
dvander@1403
   142
	}
dvander@1403
   143
dvander@1403
   144
	decl String:query[256];
dvander@1403
   145
	Format(query, 
dvander@1403
   146
		sizeof(query), 
dvander@1403
   147
		"REPLACE INTO sm_config (cfg_key, cfg_value) VALUES ('admin_version', '1.0.0.%d')",
dvander@1403
   148
		CURRENT_SCHEMA_VERSION);
dvander@1403
   149
dvander@1403
   150
	if (!DoQuery(client, db, query))
dvander@1403
   151
	{
dvander@1403
   152
		return;
dvander@1403
   153
	}
dvander@1403
   154
dvander@1403
   155
	ReplyToCommand(client, "[SM] Admin tables have been created.");
dvander@1403
   156
}
dvander@1403
   157
dvander@1403
   158
public Action:Command_CreateTables(args)
dvander@1403
   159
{
dvander@1403
   160
	new client = 0;
dvander@1403
   161
	new Handle:db = Connect();
dvander@1403
   162
	if (db == INVALID_HANDLE)
dvander@1403
   163
	{
dvander@1403
   164
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1403
   165
		return Plugin_Handled;
dvander@1403
   166
	}
dvander@1403
   167
dvander@1403
   168
	new String:ident[16];
dvander@1403
   169
	SQL_ReadDriver(db, ident, sizeof(ident));
dvander@1403
   170
dvander@1403
   171
	if (strcmp(ident, "mysql") == 0)
dvander@1403
   172
	{
dvander@1403
   173
		CreateMySQL(client, db);
dvander@1403
   174
	} else if (strcmp(ident, "sqlite") == 0) {
dvander@1403
   175
		CreateSQLite(client, db);
dvander@1403
   176
	} else {
dvander@1403
   177
		ReplyToCommand(client, "[SM] Unknown driver type '%s', cannot create tables.", ident);
dvander@1403
   178
	}
dvander@1403
   179
dvander@1403
   180
	CloseHandle(db);
dvander@1403
   181
dvander@1403
   182
	return Plugin_Handled;
dvander@1403
   183
}
dvander@1403
   184
dvander@1403
   185
bool:GetUpdateVersion(client, Handle:db, versions[4])
dvander@1403
   186
{
dvander@1403
   187
	decl String:query[256];
dvander@1403
   188
	new Handle:hQuery;
dvander@1403
   189
dvander@1403
   190
	Format(query, sizeof(query), "SELECT cfg_value FROM sm_config WHERE cfg_key = 'admin_version'");
dvander@1403
   191
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1403
   192
	{
dvander@1403
   193
		DoError(client, db, query, "Version lookup query failed");
dvander@1403
   194
		return false;
dvander@1403
   195
	}
dvander@1403
   196
	if (SQL_FetchRow(hQuery))
dvander@1403
   197
	{
dvander@1403
   198
		decl String:version_string[255];
dvander@1403
   199
		SQL_FetchString(hQuery, 0, version_string, sizeof(version_string));
dvander@1403
   200
dvander@1403
   201
		decl String:version_numbers[4][12];
dvander@1403
   202
		if (ExplodeString(version_string, ".", version_numbers, 4, 12) == 4)
dvander@1403
   203
		{
dvander@1403
   204
			for (new i = 0; i < 4; i++)
dvander@1403
   205
			{
dvander@1403
   206
				versions[i] = StringToInt(version_numbers[i]);
dvander@1403
   207
			}
dvander@1403
   208
		}
dvander@1403
   209
	}
dvander@1403
   210
dvander@1403
   211
	CloseHandle(hQuery);
dvander@1403
   212
dvander@1403
   213
	if (current_version[3] < versions[3])
dvander@1403
   214
	{
dvander@1403
   215
		ReplyToCommand(client, "[SM] The database is newer than the expected version.");
dvander@1403
   216
		return false;
dvander@1403
   217
	}
dvander@1403
   218
dvander@1403
   219
	if (current_version[3] == versions[3])
dvander@1403
   220
	{
dvander@1403
   221
		ReplyToCommand(client, "[SM] Your tables are already up to date.");
dvander@1403
   222
		return false;
dvander@1403
   223
	}
dvander@1403
   224
dvander@1403
   225
dvander@1403
   226
	return true;
dvander@1403
   227
}
dvander@1403
   228
dvander@1403
   229
UpdateSQLite(client, Handle:db)
dvander@1403
   230
{
dvander@1403
   231
	decl String:query[512];
dvander@1403
   232
	new Handle:hQuery;
dvander@1403
   233
dvander@1403
   234
	Format(query, sizeof(query), "SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'sm_config'");
dvander@1403
   235
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1403
   236
	{
dvander@1403
   237
		DoError(client, db, query, "Table lookup query failed");
dvander@1403
   238
		return;
dvander@1403
   239
	}
dvander@1403
   240
dvander@1403
   241
	new bool:found = SQL_FetchRow(hQuery);
dvander@1403
   242
dvander@1403
   243
	CloseHandle(hQuery);
dvander@1403
   244
dvander@1403
   245
	new versions[4];
dvander@1403
   246
	if (found)
dvander@1403
   247
	{
dvander@1403
   248
		if (!GetUpdateVersion(client, db, versions))
dvander@1403
   249
		{
dvander@1403
   250
			return;
dvander@1403
   251
		}
dvander@1403
   252
	}
dvander@1403
   253
dvander@1403
   254
	/* We only know about one upgrade path right now... 
dvander@1403
   255
	 * 0 => 1
dvander@1403
   256
	 */
dvander@1403
   257
	if (versions[3] < SCHEMA_UPGRADE_1)
dvander@1403
   258
	{
dvander@1403
   259
		new String:queries[8][] = 
dvander@1403
   260
		{
dvander@1403
   261
			"ALTER TABLE sm_admins ADD immunity INTEGER DEFAULT 0 NOT NULL",
dvander@1403
   262
			"CREATE TABLE _sm_groups_temp (id INTEGER PRIMARY KEY AUTOINCREMENT, flags varchar(30) NOT NULL, name varchar(120) NOT NULL, immunity_level INTEGER DEFAULT 0 NOT NULL)",
dvander@1403
   263
			"INSERT INTO _sm_groups_temp (id, flags, name) SELECT id, flags, name FROM sm_groups",
dvander@1403
   264
			"UPDATE _sm_groups_temp SET immunity_level = 2 WHERE id IN (SELECT g.id FROM sm_groups g WHERE g.immunity = 'global')",
dvander@1403
   265
			"UPDATE _sm_groups_temp SET immunity_level = 1 WHERE id IN (SELECT g.id FROM sm_groups g WHERE g.immunity = 'default')",
dvander@1403
   266
			"DROP TABLE sm_groups",
dvander@1403
   267
			"ALTER TABLE _sm_groups_temp RENAME TO sm_groups",
dvander@1403
   268
			"CREATE TABLE IF NOT EXISTS sm_config (cfg_key varchar(32) NOT NULL, cfg_value varchar(255) NOT NULL, PRIMARY KEY (cfg_key))"
dvander@1403
   269
		};
dvander@1403
   270
dvander@1403
   271
		for (new i = 0; i < 8; i++)
dvander@1403
   272
		{
dvander@1403
   273
			if (!DoQuery(client, db, queries[i]))
dvander@1403
   274
			{
dvander@1403
   275
				return;
dvander@1403
   276
			}
dvander@1403
   277
		}
dvander@1403
   278
dvander@1403
   279
		Format(query, 
dvander@1403
   280
			sizeof(query), 
dvander@1403
   281
			"REPLACE INTO sm_config (cfg_key, cfg_value) VALUES ('admin_version', '1.0.0.%d')",
dvander@1403
   282
			SCHEMA_UPGRADE_1);
dvander@1403
   283
dvander@1403
   284
		if (!DoQuery(client, db, query))
dvander@1403
   285
		{
dvander@1403
   286
			return;
dvander@1403
   287
		}
dvander@1403
   288
dvander@1403
   289
		versions[3] = SCHEMA_UPGRADE_1;
dvander@1403
   290
	}
dvander@1403
   291
dvander@1403
   292
	ReplyToCommand(client, "[SM] Your tables are now up to date.");
dvander@1403
   293
}
dvander@1403
   294
dvander@1403
   295
UpdateMySQL(client, Handle:db)
dvander@1403
   296
{
dvander@1403
   297
	decl String:query[512];
dvander@1403
   298
	new Handle:hQuery;
dvander@1403
   299
	
dvander@1403
   300
	Format(query, sizeof(query), "SHOW TABLES");
dvander@1403
   301
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1403
   302
	{
dvander@1403
   303
		DoError(client, db, query, "Table lookup query failed");
dvander@1403
   304
		return;
dvander@1403
   305
	}
dvander@1403
   306
dvander@1403
   307
	decl String:table[64];
dvander@1403
   308
	new bool:found = false;
dvander@1403
   309
	while (SQL_FetchRow(hQuery))
dvander@1403
   310
	{
dvander@1403
   311
		SQL_FetchString(hQuery, 0, table, sizeof(table));
dvander@1403
   312
		if (strcmp(table, "sm_config") == 0)
dvander@1403
   313
		{
dvander@1403
   314
			found = true;
dvander@1403
   315
		}
dvander@1403
   316
	}
dvander@1403
   317
	CloseHandle(hQuery);
dvander@1403
   318
dvander@1403
   319
	new versions[4];
dvander@1403
   320
dvander@1403
   321
	if (found && !GetUpdateVersion(client, db, versions))
dvander@1403
   322
	{
dvander@1403
   323
		return;
dvander@1403
   324
	}
dvander@1403
   325
dvander@1403
   326
	/* We only know about one upgrade path right now... 
dvander@1403
   327
	 * 0 => 1
dvander@1403
   328
	 */
dvander@1403
   329
	if (versions[3] < SCHEMA_UPGRADE_1)
dvander@1403
   330
	{
dvander@1403
   331
		new String:queries[6][] = 
dvander@1403
   332
		{
dvander@1403
   333
			"CREATE TABLE IF NOT EXISTS sm_config (cfg_key varchar(32) NOT NULL, cfg_value varchar(255) NOT NULL, PRIMARY KEY (cfg_key))",
dvander@1403
   334
			"ALTER TABLE sm_admins ADD immunity INT UNSIGNED NOT NULL",
dvander@1403
   335
			"ALTER TABLE sm_groups ADD immunity_level INT UNSIGNED NOT NULL",
dvander@1403
   336
			"UPDATE sm_groups SET immunity_level = 2 WHERE immunity = 'default'",
dvander@1403
   337
			"UPDATE sm_groups SET immunity_level = 1 WHERE immunity = 'global'",
dvander@1403
   338
			"ALTER TABLE sm_groups DROP immunity"
dvander@1403
   339
		};
dvander@1403
   340
dvander@1403
   341
		for (new i = 0; i < 6; i++)
dvander@1403
   342
		{
dvander@1403
   343
			if (!DoQuery(client, db, queries[i]))
dvander@1403
   344
			{
dvander@1403
   345
				return;
dvander@1403
   346
			}
dvander@1403
   347
		}
dvander@1403
   348
dvander@1403
   349
		decl String:upgr[48];
dvander@1403
   350
		Format(upgr, sizeof(upgr), "1.0.0.%d", SCHEMA_UPGRADE_1);
dvander@1403
   351
dvander@1403
   352
		Format(query, sizeof(query), "INSERT INTO sm_config (cfg_key, cfg_value) VALUES ('admin_version', '%s') ON DUPLICATE KEY UPDATE cfg_value = '%s'", upgr, upgr);
dvander@1403
   353
		if (!DoQuery(client, db, query))
dvander@1403
   354
		{
dvander@1403
   355
			return;
dvander@1403
   356
		}
dvander@1403
   357
dvander@1403
   358
		versions[3] = SCHEMA_UPGRADE_1;
dvander@1403
   359
	}
dvander@1403
   360
dvander@1403
   361
	ReplyToCommand(client, "[SM] Your tables are now up to date.");
dvander@1403
   362
}
dvander@1403
   363
dvander@1403
   364
public Action:Command_UpdateTables(args)
dvander@1403
   365
{
dvander@1403
   366
	new client = 0;
dvander@1403
   367
	new Handle:db = Connect();
dvander@1403
   368
	if (db == INVALID_HANDLE)
dvander@1403
   369
	{
dvander@1403
   370
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1403
   371
		return Plugin_Handled;
dvander@1403
   372
	}
dvander@1403
   373
dvander@1403
   374
	new String:ident[16];
dvander@1403
   375
	SQL_ReadDriver(db, ident, sizeof(ident));
dvander@1403
   376
dvander@1403
   377
	if (strcmp(ident, "mysql") == 0)
dvander@1403
   378
	{
dvander@1403
   379
		UpdateMySQL(client, db);
dvander@1403
   380
	} else if (strcmp(ident, "sqlite") == 0) {
dvander@1403
   381
		UpdateSQLite(client, db);
dvander@1403
   382
	} else {
dvander@1403
   383
		ReplyToCommand(client, "[SM] Unknown driver type, cannot upgrade.");
dvander@1403
   384
	}
dvander@1403
   385
dvander@1403
   386
	CloseHandle(db);
dvander@1403
   387
dvander@1403
   388
	return Plugin_Handled;
dvander@1403
   389
}
dvander@1403
   390
dvander@1325
   391
public Action:Command_SetAdminGroups(client, args)
dvander@1325
   392
{
dvander@1325
   393
	if (args < 2)
dvander@1325
   394
	{
dvander@1325
   395
		ReplyToCommand(client, "[SM] Usage: sm_sql_setadmingroups <authtype> <identity> [group1] ... [group N]");
dvander@1325
   396
		return Plugin_Handled;
dvander@1325
   397
	}
dvander@1325
   398
	
dvander@1325
   399
	decl String:authtype[16];
dvander@1325
   400
	GetCmdArg(1, authtype, sizeof(authtype));
dvander@1325
   401
	
dvander@1325
   402
	if (!StrEqual(authtype, "steam")
dvander@1325
   403
		&& !StrEqual(authtype, "ip")
dvander@1325
   404
		&& !StrEqual(authtype, "name"))
dvander@1325
   405
	{
dvander@1325
   406
		ReplyToCommand(client, "[SM] %t", "Invalid authtype");
dvander@1325
   407
		return Plugin_Handled;
dvander@1325
   408
	}
dvander@1325
   409
	
dvander@1325
   410
	new Handle:db = Connect();
dvander@1325
   411
	if (db == INVALID_HANDLE)
dvander@1325
   412
	{
dvander@1325
   413
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1325
   414
		return Plugin_Handled;
dvander@1325
   415
	}
dvander@1325
   416
	
dvander@1325
   417
	decl String:identity[65];
dvander@1325
   418
	decl String:safe_identity[140];
dvander@1325
   419
	GetCmdArg(2, identity, sizeof(identity));
dvander@1874
   420
	SQL_EscapeString(db, identity, safe_identity, sizeof(safe_identity));
dvander@1325
   421
	
dvander@1325
   422
	decl String:query[255];
dvander@1325
   423
	Format(query, 
dvander@1325
   424
		sizeof(query),
dvander@1325
   425
		"SELECT id FROM sm_admins WHERE authtype = '%s' AND identity = '%s'",
dvander@1325
   426
		authtype,
dvander@1325
   427
		safe_identity);
dvander@1325
   428
		
dvander@1325
   429
	new Handle:hQuery;
dvander@1325
   430
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1325
   431
	{
dvander@1325
   432
		return DoError(client, db, query, "Admin lookup query failed");
dvander@1325
   433
	}
dvander@1325
   434
	
dvander@1325
   435
	if (!SQL_FetchRow(hQuery))
dvander@1325
   436
	{
dvander@1325
   437
		ReplyToCommand(client, "[SM] %t", "SQL Admin not found");
dvander@1325
   438
		CloseHandle(hQuery);
dvander@1325
   439
		CloseHandle(db);
dvander@1325
   440
		return Plugin_Handled;
dvander@1325
   441
	}
dvander@1325
   442
	
dvander@1325
   443
	new id = SQL_FetchInt(hQuery, 0);
dvander@1325
   444
	
dvander@1325
   445
	CloseHandle(hQuery);
dvander@1325
   446
	
dvander@1325
   447
	/**
dvander@1325
   448
	 * First delete all of the user's existing groups.
dvander@1325
   449
	 */
dvander@1325
   450
	Format(query, sizeof(query), "DELETE FROM sm_admins_groups WHERE admin_id = %d", id);
dvander@1325
   451
	if (!SQL_FastQuery(db, query))
dvander@1325
   452
	{
dvander@1325
   453
		return DoError(client, db, query, "Admin group deletion query failed");
dvander@1325
   454
	}
dvander@1325
   455
	
dvander@1325
   456
	if (args < 3)
dvander@1325
   457
	{
dvander@1325
   458
		ReplyToCommand(client, "[SM] %t", "SQL Admin groups reset");
dvander@1325
   459
		CloseHandle(db);
dvander@1325
   460
		return Plugin_Handled;
dvander@1325
   461
	}
dvander@1325
   462
	
dvander@1325
   463
	decl String:error[256];
dvander@1325
   464
	new Handle:hAddQuery, Handle:hFindQuery;
dvander@1325
   465
	
dvander@1325
   466
	Format(query, sizeof(query), "SELECT id FROM sm_groups WHERE name = ?");
dvander@1325
   467
	if ((hFindQuery = SQL_PrepareQuery(db, query, error, sizeof(error))) == INVALID_HANDLE)
dvander@1325
   468
	{
dvander@1325
   469
		return DoStmtError(client, db, query, error, "Group search prepare failed");
dvander@1325
   470
	}
dvander@1325
   471
	
dvander@1325
   472
	Format(query, 
dvander@1325
   473
		sizeof(query), 
dvander@1325
   474
		"INSERT INTO sm_admins_groups (admin_id, group_id, inherit_order) VALUES (%d, ?, ?)",
dvander@1325
   475
		id);
dvander@1325
   476
	if ((hAddQuery = SQL_PrepareQuery(db, query, error, sizeof(error))) == INVALID_HANDLE)
dvander@1325
   477
	{
dvander@1325
   478
		CloseHandle(hFindQuery);
dvander@1325
   479
		return DoStmtError(client, db, query, error, "Add admin group prepare failed");
dvander@1325
   480
	}
dvander@1325
   481
	
dvander@1325
   482
	decl String:name[80];
dvander@1325
   483
	new inherit_order = 0;
dvander@1325
   484
	for (new i=3; i<=args; i++)
dvander@1325
   485
	{
dvander@1325
   486
		GetCmdArg(i, name, sizeof(name));
dvander@1325
   487
		
dvander@1325
   488
		SQL_BindParamString(hFindQuery, 0, name, false);
dvander@1325
   489
		if (!SQL_Execute(hFindQuery) || !SQL_FetchRow(hFindQuery))
dvander@1325
   490
		{
dvander@1325
   491
			ReplyToCommand(client, "[SM] %t", "SQL Group X not found", name);
dvander@1325
   492
		} else {
dvander@1325
   493
			new gid = SQL_FetchInt(hFindQuery, 0);
dvander@1325
   494
			
dvander@1325
   495
			SQL_BindParamInt(hAddQuery, 0, gid);
dvander@1325
   496
			SQL_BindParamInt(hAddQuery, 1, ++inherit_order);
dvander@1325
   497
			if (!SQL_Execute(hAddQuery))
dvander@1325
   498
			{
dvander@1325
   499
				ReplyToCommand(client, "[SM] %t", "SQL Group X failed to bind", name);
dvander@1325
   500
				inherit_order--;
dvander@1325
   501
			}
dvander@1325
   502
		}
dvander@1325
   503
	}
dvander@1325
   504
	
dvander@1325
   505
	CloseHandle(hAddQuery);
dvander@1325
   506
	CloseHandle(hFindQuery);
dvander@1325
   507
	CloseHandle(db);
dvander@1325
   508
	
dvander@1325
   509
	if (inherit_order == 1)
dvander@1325
   510
	{
dvander@1325
   511
		ReplyToCommand(client, "[SM] %t", "Added group to user");
dvander@1325
   512
	} else if (inherit_order > 1) {
dvander@1325
   513
		ReplyToCommand(client, "[SM] %t", "Added groups to user", inherit_order);
dvander@1325
   514
	}
dvander@1325
   515
	
dvander@1325
   516
	return Plugin_Handled;
dvander@1325
   517
}
dvander@1325
   518
dvander@1325
   519
public Action:Command_DelGroup(client, args)
dvander@1325
   520
{
dvander@1325
   521
	if (args < 1)
dvander@1325
   522
	{
dvander@1327
   523
		ReplyToCommand(client, "[SM] Usage: sm_sql_delgroup <name>");
dvander@1325
   524
		return Plugin_Handled;
dvander@1325
   525
	}
dvander@1325
   526
dvander@1325
   527
	new Handle:db = Connect();
dvander@1325
   528
	if (db == INVALID_HANDLE)
dvander@1325
   529
	{
dvander@1325
   530
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1325
   531
		return Plugin_Handled;
dvander@1325
   532
	}
dvander@1325
   533
	
dvander@1325
   534
	new len;
dvander@1325
   535
	decl String:name[80];
dvander@1325
   536
	decl String:safe_name[180];
dvander@1325
   537
	GetCmdArgString(name, sizeof(name));
dvander@1325
   538
	
dvander@1325
   539
	/* Strip quotes in case the user tries to use them */
dvander@1325
   540
	len = strlen(name);
dvander@1325
   541
	if (len > 1 && (name[0] == '"' && name[len-1] == '"'))
dvander@1325
   542
	{
dvander@1325
   543
		name[--len] = '\0';
dvander@1874
   544
		SQL_EscapeString(db, name[1], safe_name, sizeof(safe_name));
dvander@1325
   545
	} else {
dvander@1874
   546
		SQL_EscapeString(db, name, safe_name, sizeof(safe_name));
dvander@1325
   547
	}
dvander@1325
   548
	
dvander@1325
   549
	decl String:query[256];
dvander@1325
   550
	
dvander@1326
   551
	new Handle:hQuery;
dvander@1326
   552
	Format(query, sizeof(query), "SELECT id FROM sm_groups WHERE name = '%s'", safe_name);
dvander@1326
   553
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1326
   554
	{
dvander@1326
   555
		return DoError(client, db, query, "Group retrieval query failed");
dvander@1326
   556
	}
dvander@1326
   557
	
dvander@1326
   558
	if (!SQL_FetchRow(hQuery))
dvander@1326
   559
	{
dvander@1326
   560
		ReplyToCommand(client, "[SM] %t", "SQL Group not found");
dvander@1326
   561
		CloseHandle(hQuery);
dvander@1326
   562
		CloseHandle(db);
dvander@1326
   563
		return Plugin_Handled;
dvander@1326
   564
	}
dvander@1326
   565
	
dvander@1326
   566
	new id = SQL_FetchInt(hQuery, 0);
dvander@1326
   567
	
dvander@1326
   568
	CloseHandle(hQuery);
dvander@1326
   569
	
dvander@1325
   570
	/* Delete admin inheritance for this group */
dvander@1326
   571
	Format(query, sizeof(query), "DELETE FROM sm_admins_groups WHERE group_id = %d", id);
dvander@1325
   572
	if (!SQL_FastQuery(db, query))
dvander@1325
   573
	{
dvander@1325
   574
		return DoError(client, db, query, "Admin group deletion query failed");
dvander@1325
   575
	}
dvander@1325
   576
	
dvander@1325
   577
	/* Delete group overrides */
dvander@1326
   578
	Format(query, sizeof(query), "DELETE FROM sm_group_overrides WHERE group_id = %d", id);
dvander@1325
   579
	if (!SQL_FastQuery(db, query))
dvander@1325
   580
	{
dvander@1325
   581
		return DoError(client, db, query, "Group override deletion query failed");
dvander@1325
   582
	}
dvander@1325
   583
	
dvander@1326
   584
	/* Delete immunity */
dvander@1326
   585
	Format(query, sizeof(query), "DELETE FROM sm_group_immunity WHERE group_id = %d OR other_id = %d", id, id);
dvander@1326
   586
	if (!SQL_FastQuery(db, query))
dvander@1326
   587
	{
dvander@1326
   588
		return DoError(client, db, query, "Group immunity deletion query failed");
dvander@1326
   589
	}
dvander@1326
   590
	
dvander@1325
   591
	/* Finally delete the group */
dvander@1326
   592
	Format(query, sizeof(query), "DELETE FROM sm_groups WHERE id = %d", id);
dvander@1325
   593
	if (!SQL_FastQuery(db, query))
dvander@1325
   594
	{
dvander@1325
   595
		return DoError(client, db, query, "Group deletion query failed");
dvander@1325
   596
	}
dvander@1325
   597
	
dvander@1326
   598
	ReplyToCommand(client, "[SM] %t", "SQL Group deleted");
dvander@1325
   599
	
dvander@1325
   600
	CloseHandle(db);
dvander@1325
   601
	
dvander@1325
   602
	return Plugin_Handled;
dvander@1325
   603
}
dvander@1325
   604
dvander@1325
   605
public Action:Command_AddGroup(client, args)
dvander@1325
   606
{
dvander@1325
   607
	if (args < 2)
dvander@1325
   608
	{
dvander@2549
   609
		ReplyToCommand(client, "[SM] Usage: sm_sql_addgroup <name> <flags> [immunity]");
dvander@1325
   610
		return Plugin_Handled;
dvander@1325
   611
	}
dvander@1325
   612
dvander@1403
   613
	new immunity;
dvander@1325
   614
	if (args >= 3)
dvander@1325
   615
	{
dvander@1403
   616
		new String:arg3[32];
dvander@1403
   617
		GetCmdArg(3, arg3, sizeof(arg3));
dvander@1403
   618
		if (!StringToIntEx(arg3, immunity))
dvander@1325
   619
		{
dvander@1325
   620
			ReplyToCommand(client, "[SM] %t", "Invalid immunity");
dvander@1325
   621
			return Plugin_Handled;
dvander@1325
   622
		}
dvander@1325
   623
	}
dvander@1325
   624
	
dvander@1325
   625
	new Handle:db = Connect();
dvander@1325
   626
	if (db == INVALID_HANDLE)
dvander@1325
   627
	{
dvander@1325
   628
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1325
   629
		return Plugin_Handled;
dvander@1325
   630
	}
dvander@1325
   631
	
dvander@1325
   632
	decl String:name[64];
dvander@1325
   633
	decl String:safe_name[64];
dvander@1325
   634
	GetCmdArg(1, name, sizeof(name));
dvander@1874
   635
	SQL_EscapeString(db, name, safe_name, sizeof(safe_name));
dvander@1325
   636
	
dvander@1325
   637
	new Handle:hQuery;
dvander@1325
   638
	decl String:query[256];
dvander@1325
   639
	Format(query, sizeof(query), "SELECT id FROM sm_groups WHERE name = '%s'", safe_name);
dvander@1325
   640
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1325
   641
	{
dvander@1325
   642
		return DoError(client, db, query, "Group retrieval query failed");
dvander@1325
   643
	}
dvander@1325
   644
	
dvander@1325
   645
	if (SQL_GetRowCount(hQuery) > 0)
dvander@1325
   646
	{
dvander@1325
   647
		ReplyToCommand(client, "[SM] %t", "SQL Group already exists");
dvander@1325
   648
		CloseHandle(hQuery);
dvander@1325
   649
		CloseHandle(db);
dvander@1325
   650
		return Plugin_Handled;
dvander@1325
   651
	}
dvander@1325
   652
	
dvander@1325
   653
	CloseHandle(hQuery);
dvander@1325
   654
	
dvander@1325
   655
	decl String:flags[30];
dvander@1325
   656
	decl String:safe_flags[64];
dvander@1325
   657
	GetCmdArg(2, flags, sizeof(safe_flags));
dvander@1874
   658
	SQL_EscapeString(db, flags, safe_flags, sizeof(safe_flags));
dvander@1325
   659
	
dvander@1325
   660
	Format(query, 
dvander@1325
   661
		sizeof(query),
dvander@1403
   662
		"INSERT INTO sm_groups (flags, name, immunity_level) VALUES ('%s', '%s', '%d')",
dvander@2549
   663
		safe_flags,
dvander@1405
   664
		safe_name,
dvander@1403
   665
		immunity);
dvander@1325
   666
	
dvander@1325
   667
	if (!SQL_FastQuery(db, query))
dvander@1325
   668
	{
dvander@1325
   669
		return DoError(client, db, query, "Group insertion query failed");
dvander@1325
   670
	}
dvander@1325
   671
	
dvander@1325
   672
	ReplyToCommand(client, "[SM] %t", "SQL Group added");
dvander@1325
   673
	
dvander@1325
   674
	CloseHandle(db);
dvander@1325
   675
		
dvander@1325
   676
	return Plugin_Handled;
dvander@1325
   677
}	
dvander@1325
   678
dvander@1325
   679
public Action:Command_DelAdmin(client, args)
dvander@1325
   680
{
dvander@1325
   681
	if (args < 2)
dvander@1325
   682
	{
dvander@1325
   683
		ReplyToCommand(client, "[SM] Usage: sm_sql_deladmin <authtype> <identity>");
dvander@1325
   684
		ReplyToCommand(client, "[SM] %t", "Invalid authtype");
dvander@1325
   685
		return Plugin_Handled;
dvander@1325
   686
	}
dvander@1325
   687
	
dvander@1325
   688
	decl String:authtype[16];
dvander@1325
   689
	GetCmdArg(1, authtype, sizeof(authtype));
dvander@1325
   690
	
dvander@1325
   691
	if (!StrEqual(authtype, "steam")
dvander@1325
   692
		&& !StrEqual(authtype, "ip")
dvander@1325
   693
		&& !StrEqual(authtype, "name"))
dvander@1325
   694
	{
dvander@1325
   695
		ReplyToCommand(client, "[SM] %t", "Invalid authtype");
dvander@1325
   696
		return Plugin_Handled;
dvander@1325
   697
	}
dvander@1325
   698
	
dvander@1325
   699
	new Handle:db = Connect();
dvander@1325
   700
	if (db == INVALID_HANDLE)
dvander@1325
   701
	{
dvander@1325
   702
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1325
   703
		return Plugin_Handled;
dvander@1325
   704
	}
dvander@1325
   705
	
dvander@1325
   706
	decl String:identity[65];
dvander@1325
   707
	decl String:safe_identity[140];
dvander@1325
   708
	GetCmdArg(2, identity, sizeof(identity));
dvander@1874
   709
	SQL_EscapeString(db, identity, safe_identity, sizeof(safe_identity));
dvander@1325
   710
	
dvander@1325
   711
	decl String:query[255];
dvander@1325
   712
	Format(query, 
dvander@1325
   713
		sizeof(query),
dvander@1325
   714
		"SELECT id FROM sm_admins WHERE authtype = '%s' AND identity = '%s'",
dvander@1325
   715
		authtype,
dvander@1325
   716
		safe_identity);
dvander@1325
   717
		
dvander@1325
   718
	new Handle:hQuery;
dvander@1325
   719
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1325
   720
	{
dvander@1325
   721
		return DoError(client, db, query, "Admin lookup query failed");
dvander@1325
   722
	}
dvander@1325
   723
	
dvander@1325
   724
	if (!SQL_FetchRow(hQuery))
dvander@1325
   725
	{
dvander@1325
   726
		ReplyToCommand(client, "[SM] %t", "SQL Admin not found");
dvander@1325
   727
		CloseHandle(hQuery);
dvander@1325
   728
		CloseHandle(db);
dvander@1325
   729
		return Plugin_Handled;
dvander@1325
   730
	}
dvander@1325
   731
	
dvander@1325
   732
	new id = SQL_FetchInt(hQuery, 0);
dvander@1325
   733
	
dvander@1325
   734
	CloseHandle(hQuery);
dvander@1325
   735
	
dvander@1325
   736
	/* Delete group bindings */
dvander@1325
   737
	Format(query, sizeof(query), "DELETE FROM sm_admins_groups WHERE admin_id = %d", id);
dvander@1325
   738
	if (!SQL_FastQuery(db, query))
dvander@1325
   739
	{
dvander@1325
   740
		return DoError(client, db, query, "Admin group deletion query failed");
dvander@1325
   741
	}
dvander@1325
   742
	
dvander@1325
   743
	Format(query, sizeof(query), "DELETE FROM sm_admins WHERE id = %d", id);
dvander@1325
   744
	if (!SQL_FastQuery(db, query))
dvander@1325
   745
	{
dvander@1325
   746
		return DoError(client, db, query, "Admin deletion query failed");
dvander@1325
   747
	}
dvander@1325
   748
	
dvander@1325
   749
	CloseHandle(db);
dvander@1325
   750
	
dvander@1325
   751
	ReplyToCommand(client, "[SM] %t", "SQL Admin deleted");
dvander@1325
   752
	
dvander@1325
   753
	return Plugin_Handled;
dvander@1325
   754
}
dvander@1325
   755
dvander@1325
   756
public Action:Command_AddAdmin(client, args)
dvander@1325
   757
{
dvander@1325
   758
	if (args < 4)
dvander@1325
   759
	{
dvander@1403
   760
		ReplyToCommand(client, "[SM] Usage: sm_sql_addadmin <alias> <authtype> <identity> <flags> [immunity] [password]");
dvander@1325
   761
		ReplyToCommand(client, "[SM] %t", "Invalid authtype");
dvander@1325
   762
		return Plugin_Handled;
dvander@1325
   763
	}
dvander@1325
   764
	
dvander@1325
   765
	decl String:authtype[16];
dvander@1325
   766
	GetCmdArg(2, authtype, sizeof(authtype));
dvander@1325
   767
	
dvander@1325
   768
	if (!StrEqual(authtype, "steam")
dvander@1325
   769
		&& !StrEqual(authtype, "ip")
dvander@1325
   770
		&& !StrEqual(authtype, "name"))
dvander@1325
   771
	{
dvander@1325
   772
		ReplyToCommand(client, "[SM] %t", "Invalid authtype");
dvander@1325
   773
		return Plugin_Handled;
dvander@1325
   774
	}
dvander@1403
   775
dvander@1403
   776
	new immunity;
dvander@1403
   777
	if (args >= 5)
dvander@1403
   778
	{
dvander@1403
   779
		new String:arg5[32];
dvander@1403
   780
		GetCmdArg(5, arg5, sizeof(arg5));
dvander@1403
   781
		if (!StringToIntEx(arg5, immunity))
dvander@1403
   782
		{
dvander@1403
   783
			ReplyToCommand(client, "[SM] %t", "Invalid immunity");
dvander@1403
   784
			return Plugin_Handled;
dvander@1403
   785
		}
dvander@1403
   786
	}
dvander@1325
   787
	
dvander@1325
   788
	decl String:identity[65];
dvander@1325
   789
	decl String:safe_identity[140];
dvander@1325
   790
	GetCmdArg(3, identity, sizeof(identity));
dvander@1325
   791
	
dvander@1325
   792
	decl String:query[256];
dvander@1325
   793
	new Handle:hQuery;
dvander@1325
   794
	new Handle:db = Connect();
dvander@1325
   795
	if (db == INVALID_HANDLE)
dvander@1325
   796
	{
dvander@1325
   797
		ReplyToCommand(client, "[SM] %t", "Could not connect to database");
dvander@1325
   798
		return Plugin_Handled;
dvander@1325
   799
	}
dvander@1325
   800
	
dvander@1874
   801
	SQL_EscapeString(db, identity, safe_identity, sizeof(safe_identity));
dvander@1325
   802
	
dvander@1325
   803
	Format(query, sizeof(query), "SELECT id FROM sm_admins WHERE authtype = '%s' AND identity = '%s'", authtype, identity);
dvander@1325
   804
	if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
dvander@1325
   805
	{
dvander@1325
   806
		return DoError(client, db, query, "Admin retrieval query failed");
dvander@1325
   807
	}
dvander@1325
   808
	
dvander@1325
   809
	if (SQL_GetRowCount(hQuery) > 0)
dvander@1325
   810
	{
dvander@1325
   811
		ReplyToCommand(client, "[SM] %t", "SQL Admin already exists");
dvander@1325
   812
		CloseHandle(hQuery);
dvander@1325
   813
		CloseHandle(db);
dvander@1325
   814
		return Plugin_Handled;
dvander@1325
   815
	}
dvander@1325
   816
	
dvander@1325
   817
	CloseHandle(hQuery);
dvander@1325
   818
	
dvander@1325
   819
	decl String:alias[64];
dvander@1325
   820
	decl String:safe_alias[140];
dvander@1325
   821
	GetCmdArg(1, alias, sizeof(alias));
dvander@1874
   822
	SQL_EscapeString(db, alias, safe_alias, sizeof(safe_alias));
dvander@1325
   823
	
dvander@1325
   824
	decl String:flags[30];
dvander@1325
   825
	decl String:safe_flags[64];
dvander@1325
   826
	GetCmdArg(4, flags, sizeof(flags));
dvander@1874
   827
	SQL_EscapeString(db, flags, safe_flags, sizeof(safe_flags));
dvander@1325
   828
	
dvander@1325
   829
	decl String:password[32];
dvander@1325
   830
	decl String:safe_password[80];
dvander@2435
   831
	if (args >= 6)
dvander@1325
   832
	{
dvander@2435
   833
		GetCmdArg(6, password, sizeof(password));
dvander@1874
   834
		SQL_EscapeString(db, password, safe_password, sizeof(safe_password));
dvander@1325
   835
	} else {
dvander@1325
   836
		safe_password[0] = '\0';
dvander@1325
   837
	}
dvander@1325
   838
	
dvander@1325
   839
	new len = 0;
dvander@1403
   840
	len += Format(query[len], sizeof(query)-len, "INSERT INTO sm_admins (authtype, identity, password, flags, name, immunity) VALUES");
dvander@1325
   841
	if (safe_password[0] == '\0')
dvander@1325
   842
	{
dvander@1403
   843
		len += Format(query[len], sizeof(query)-len, " ('%s', '%s', NULL, '%s', '%s', %d)", authtype, safe_identity, safe_flags, safe_alias, immunity);
dvander@1325
   844
	} else {
dvander@1403
   845
		len += Format(query[len], sizeof(query)-len, " ('%s', '%s', '%s', '%s', '%s', %d)", authtype, safe_identity, safe_password, safe_flags, safe_alias, immunity);
dvander@1325
   846
	}
dvander@1325
   847
	
dvander@1325
   848
	if (!SQL_FastQuery(db, query))
dvander@1325
   849
	{
dvander@1325
   850
		return DoError(client, db, query, "Admin insertion query failed");
dvander@1325
   851
	}
dvander@1325
   852
	
dvander@1325
   853
	ReplyToCommand(client, "[SM] %t", "SQL Admin added");
dvander@1325
   854
	
dvander@1325
   855
	CloseHandle(db);
dvander@1325
   856
		
dvander@1325
   857
	return Plugin_Handled;
dvander@1325
   858
}
dvander@1325
   859
dvander@1403
   860
stock bool:DoQuery(client, Handle:db, const String:query[])
dvander@1403
   861
{
dvander@1403
   862
	if (!SQL_FastQuery(db, query))
dvander@1403
   863
	{
dvander@1403
   864
		decl String:error[255];
dvander@1403
   865
		SQL_GetError(db, error, sizeof(error));
dvander@1403
   866
		LogError("Query failed: %s", error);
dvander@1403
   867
		LogError("Query dump: %s", query);
dvander@1403
   868
		ReplyToCommand(client, "[SM] %t", "Failed to query database");
dvander@1403
   869
		return false;
dvander@1403
   870
	}
dvander@1403
   871
dvander@1403
   872
	return true;
dvander@1403
   873
}
dvander@1403
   874
dvander@1325
   875
stock Action:DoError(client, Handle:db, const String:query[], const String:msg[])
dvander@1325
   876
{
dvander@1325
   877
		decl String:error[255];
dvander@1325
   878
		SQL_GetError(db, error, sizeof(error));
dvander@1325
   879
		LogError("%s: %s", msg, error);
dvander@1325
   880
		LogError("Query dump: %s", query);
dvander@1325
   881
		CloseHandle(db);
dvander@1325
   882
		ReplyToCommand(client, "[SM] %t", "Failed to query database");
dvander@1325
   883
		return Plugin_Handled;
dvander@1325
   884
}
dvander@1325
   885
dvander@1325
   886
stock Action:DoStmtError(client, Handle:db, const String:query[], const String:error[], const String:msg[])
dvander@1325
   887
{
dvander@1325
   888
		LogError("%s: %s", msg, error);
dvander@1325
   889
		LogError("Query dump: %s", query);
dvander@1325
   890
		CloseHandle(db);
dvander@1325
   891
		ReplyToCommand(client, "[SM] %t", "Failed to query database");
dvander@1325
   892
		return Plugin_Handled;
dvander@1325
   893
}
dvander@1325
   894