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