dvander@1325: /** dvander@1325: * sql-admin-manager.sp dvander@1325: * Adds/managers admins and groups in an SQL database. dvander@1325: * dvander@1325: * This file is part of SourceMod, Copyright (C) 2004-2007 AlliedModders LLC dvander@1325: * dvander@1325: * This program is free software; you can redistribute it and/or dvander@1325: * modify it under the terms of the GNU General Public License dvander@1325: * as published by the Free Software Foundation; either version 2 dvander@1325: * of the License, or (at your option) any later version. dvander@1325: * dvander@1325: * This program is distributed in the hope that it will be useful, dvander@1325: * but WITHOUT ANY WARRANTY; without even the implied warranty of dvander@1325: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dvander@1325: * GNU General Public License for more details. dvander@1325: * dvander@1325: * You should have received a copy of the GNU General Public License dvander@1325: * along with this program; if not, write to the Free Software dvander@1325: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. dvander@1325: * dvander@1325: * Version: $Id$ dvander@1325: */ dvander@1325: dvander@1325: /* We like semicolons */ dvander@1325: #pragma semicolon 1 dvander@1325: dvander@1325: #include dvander@1325: dvander@1325: public Plugin:myinfo = dvander@1325: { dvander@1325: name = "SQL Admin Manager", dvander@1325: author = "AlliedModders LLC", dvander@1325: description = "Manages SQL admins", dvander@1325: version = SOURCEMOD_VERSION, dvander@1325: url = "http://www.sourcemod.net/" dvander@1325: }; dvander@1325: dvander@1325: public OnPluginStart() dvander@1325: { dvander@1325: LoadTranslations("common.phrases"); dvander@1325: LoadTranslations("sqladmins.phrases"); dvander@1325: dvander@1325: RegAdminCmd("sm_sql_addadmin", Command_AddAdmin, ADMFLAG_ROOT, "Adds an admin to the SQL database"); dvander@1325: RegAdminCmd("sm_sql_deladmin", Command_DelAdmin, ADMFLAG_ROOT, "Removes an admin from the SQL database"); dvander@1325: RegAdminCmd("sm_sql_addgroup", Command_AddGroup, ADMFLAG_ROOT, "Adds a group to the SQL database"); dvander@1325: RegAdminCmd("sm_sql_delgroup", Command_DelGroup, ADMFLAG_ROOT, "Removes a group from the SQL database"); dvander@1325: RegAdminCmd("sm_sql_setadmingroups", Command_SetAdminGroups, ADMFLAG_ROOT, "Sets an admin's groups in the SQL database"); dvander@1325: } dvander@1325: dvander@1325: Handle:Connect() dvander@1325: { dvander@1325: decl String:error[255]; dvander@1325: new Handle:db; dvander@1325: dvander@1325: if (SQL_CheckConfig("admins")) dvander@1325: { dvander@1325: db = SQL_Connect("admins", true, error, sizeof(error)); dvander@1325: } else { dvander@1325: db = SQL_Connect("default", true, error, sizeof(error)); dvander@1325: } dvander@1325: dvander@1325: if (db == INVALID_HANDLE) dvander@1325: { dvander@1325: LogError("Could not connect to database: %s", error); dvander@1325: } dvander@1325: dvander@1325: return db; dvander@1325: } dvander@1325: dvander@1325: public Action:Command_SetAdminGroups(client, args) dvander@1325: { dvander@1325: if (args < 2) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] Usage: sm_sql_setadmingroups [group1] ... [group N]"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: decl String:authtype[16]; dvander@1325: GetCmdArg(1, authtype, sizeof(authtype)); dvander@1325: dvander@1325: if (!StrEqual(authtype, "steam") dvander@1325: && !StrEqual(authtype, "ip") dvander@1325: && !StrEqual(authtype, "name")) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "Invalid authtype"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: new Handle:db = Connect(); dvander@1325: if (db == INVALID_HANDLE) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "Could not connect to database"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: decl String:identity[65]; dvander@1325: decl String:safe_identity[140]; dvander@1325: GetCmdArg(2, identity, sizeof(identity)); dvander@1325: SQL_QuoteString(db, identity, safe_identity, sizeof(safe_identity)); dvander@1325: dvander@1325: decl String:query[255]; dvander@1325: Format(query, dvander@1325: sizeof(query), dvander@1325: "SELECT id FROM sm_admins WHERE authtype = '%s' AND identity = '%s'", dvander@1325: authtype, dvander@1325: safe_identity); dvander@1325: dvander@1325: new Handle:hQuery; dvander@1325: if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE) dvander@1325: { dvander@1325: return DoError(client, db, query, "Admin lookup query failed"); dvander@1325: } dvander@1325: dvander@1325: if (!SQL_FetchRow(hQuery)) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "SQL Admin not found"); dvander@1325: CloseHandle(hQuery); dvander@1325: CloseHandle(db); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: new id = SQL_FetchInt(hQuery, 0); dvander@1325: dvander@1325: CloseHandle(hQuery); dvander@1325: dvander@1325: /** dvander@1325: * First delete all of the user's existing groups. dvander@1325: */ dvander@1325: Format(query, sizeof(query), "DELETE FROM sm_admins_groups WHERE admin_id = %d", id); dvander@1325: if (!SQL_FastQuery(db, query)) dvander@1325: { dvander@1325: return DoError(client, db, query, "Admin group deletion query failed"); dvander@1325: } dvander@1325: dvander@1325: if (args < 3) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "SQL Admin groups reset"); dvander@1325: CloseHandle(db); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: decl String:error[256]; dvander@1325: new Handle:hAddQuery, Handle:hFindQuery; dvander@1325: dvander@1325: Format(query, sizeof(query), "SELECT id FROM sm_groups WHERE name = ?"); dvander@1325: if ((hFindQuery = SQL_PrepareQuery(db, query, error, sizeof(error))) == INVALID_HANDLE) dvander@1325: { dvander@1325: return DoStmtError(client, db, query, error, "Group search prepare failed"); dvander@1325: } dvander@1325: dvander@1325: Format(query, dvander@1325: sizeof(query), dvander@1325: "INSERT INTO sm_admins_groups (admin_id, group_id, inherit_order) VALUES (%d, ?, ?)", dvander@1325: id); dvander@1325: if ((hAddQuery = SQL_PrepareQuery(db, query, error, sizeof(error))) == INVALID_HANDLE) dvander@1325: { dvander@1325: CloseHandle(hFindQuery); dvander@1325: return DoStmtError(client, db, query, error, "Add admin group prepare failed"); dvander@1325: } dvander@1325: dvander@1325: decl String:name[80]; dvander@1325: new inherit_order = 0; dvander@1325: for (new i=3; i<=args; i++) dvander@1325: { dvander@1325: GetCmdArg(i, name, sizeof(name)); dvander@1325: dvander@1325: SQL_BindParamString(hFindQuery, 0, name, false); dvander@1325: if (!SQL_Execute(hFindQuery) || !SQL_FetchRow(hFindQuery)) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "SQL Group X not found", name); dvander@1325: } else { dvander@1325: new gid = SQL_FetchInt(hFindQuery, 0); dvander@1325: dvander@1325: SQL_BindParamInt(hAddQuery, 0, gid); dvander@1325: SQL_BindParamInt(hAddQuery, 1, ++inherit_order); dvander@1325: if (!SQL_Execute(hAddQuery)) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "SQL Group X failed to bind", name); dvander@1325: inherit_order--; dvander@1325: } dvander@1325: } dvander@1325: } dvander@1325: dvander@1325: CloseHandle(hAddQuery); dvander@1325: CloseHandle(hFindQuery); dvander@1325: CloseHandle(db); dvander@1325: dvander@1325: if (inherit_order == 1) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "Added group to user"); dvander@1325: } else if (inherit_order > 1) { dvander@1325: ReplyToCommand(client, "[SM] %t", "Added groups to user", inherit_order); dvander@1325: } dvander@1325: dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: public Action:Command_DelGroup(client, args) dvander@1325: { dvander@1325: if (args < 1) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] Usage: sm_sql_addgroup "); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: new Handle:db = Connect(); dvander@1325: if (db == INVALID_HANDLE) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "Could not connect to database"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: new len; dvander@1325: decl String:name[80]; dvander@1325: decl String:safe_name[180]; dvander@1325: GetCmdArgString(name, sizeof(name)); dvander@1325: dvander@1325: /* Strip quotes in case the user tries to use them */ dvander@1325: len = strlen(name); dvander@1325: if (len > 1 && (name[0] == '"' && name[len-1] == '"')) dvander@1325: { dvander@1325: name[--len] = '\0'; dvander@1325: SQL_QuoteString(db, name[1], safe_name, sizeof(safe_name)); dvander@1325: } else { dvander@1325: SQL_QuoteString(db, name, safe_name, sizeof(safe_name)); dvander@1325: } dvander@1325: dvander@1325: decl String:query[256]; dvander@1325: dvander@1326: new Handle:hQuery; dvander@1326: Format(query, sizeof(query), "SELECT id FROM sm_groups WHERE name = '%s'", safe_name); dvander@1326: if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE) dvander@1326: { dvander@1326: return DoError(client, db, query, "Group retrieval query failed"); dvander@1326: } dvander@1326: dvander@1326: if (!SQL_FetchRow(hQuery)) dvander@1326: { dvander@1326: ReplyToCommand(client, "[SM] %t", "SQL Group not found"); dvander@1326: CloseHandle(hQuery); dvander@1326: CloseHandle(db); dvander@1326: return Plugin_Handled; dvander@1326: } dvander@1326: dvander@1326: new id = SQL_FetchInt(hQuery, 0); dvander@1326: dvander@1326: CloseHandle(hQuery); dvander@1326: dvander@1325: /* Delete admin inheritance for this group */ dvander@1326: Format(query, sizeof(query), "DELETE FROM sm_admins_groups WHERE group_id = %d", id); dvander@1325: if (!SQL_FastQuery(db, query)) dvander@1325: { dvander@1325: return DoError(client, db, query, "Admin group deletion query failed"); dvander@1325: } dvander@1325: dvander@1325: /* Delete group overrides */ dvander@1326: Format(query, sizeof(query), "DELETE FROM sm_group_overrides WHERE group_id = %d", id); dvander@1325: if (!SQL_FastQuery(db, query)) dvander@1325: { dvander@1325: return DoError(client, db, query, "Group override deletion query failed"); dvander@1325: } dvander@1325: dvander@1326: /* Delete immunity */ dvander@1326: Format(query, sizeof(query), "DELETE FROM sm_group_immunity WHERE group_id = %d OR other_id = %d", id, id); dvander@1326: if (!SQL_FastQuery(db, query)) dvander@1326: { dvander@1326: return DoError(client, db, query, "Group immunity deletion query failed"); dvander@1326: } dvander@1326: dvander@1325: /* Finally delete the group */ dvander@1326: Format(query, sizeof(query), "DELETE FROM sm_groups WHERE id = %d", id); dvander@1325: if (!SQL_FastQuery(db, query)) dvander@1325: { dvander@1325: return DoError(client, db, query, "Group deletion query failed"); dvander@1325: } dvander@1325: dvander@1326: ReplyToCommand(client, "[SM] %t", "SQL Group deleted"); dvander@1325: dvander@1325: CloseHandle(db); dvander@1325: dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: public Action:Command_AddGroup(client, args) dvander@1325: { dvander@1325: if (args < 2) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] Usage: sm_sql_addgroup [immunity]"); dvander@1325: ReplyToCommand(client, "[SM] %t", "Invalid immunity"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: new String:immunity[32] = "none"; dvander@1325: if (args >= 3) dvander@1325: { dvander@1325: GetCmdArg(3, immunity, sizeof(immunity)); dvander@1325: if (!StrEqual(immunity, "none") dvander@1325: && !StrEqual(immunity, "global") dvander@1325: && !StrEqual(immunity, "default")) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "Invalid immunity"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: } dvander@1325: dvander@1325: new Handle:db = Connect(); dvander@1325: if (db == INVALID_HANDLE) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "Could not connect to database"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: decl String:name[64]; dvander@1325: decl String:safe_name[64]; dvander@1325: GetCmdArg(1, name, sizeof(name)); dvander@1325: SQL_QuoteString(db, name, safe_name, sizeof(safe_name)); dvander@1325: dvander@1325: new Handle:hQuery; dvander@1325: decl String:query[256]; dvander@1325: Format(query, sizeof(query), "SELECT id FROM sm_groups WHERE name = '%s'", safe_name); dvander@1325: if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE) dvander@1325: { dvander@1325: return DoError(client, db, query, "Group retrieval query failed"); dvander@1325: } dvander@1325: dvander@1325: if (SQL_GetRowCount(hQuery) > 0) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "SQL Group already exists"); dvander@1325: CloseHandle(hQuery); dvander@1325: CloseHandle(db); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: CloseHandle(hQuery); dvander@1325: dvander@1325: decl String:flags[30]; dvander@1325: decl String:safe_flags[64]; dvander@1325: GetCmdArg(2, flags, sizeof(safe_flags)); dvander@1325: SQL_QuoteString(db, flags, safe_flags, sizeof(safe_flags)); dvander@1325: dvander@1325: Format(query, dvander@1325: sizeof(query), dvander@1325: "INSERT INTO sm_groups (immunity, flags, name) VALUES ('%s', '%s', '%s')", dvander@1325: immunity, dvander@1325: safe_flags, dvander@1325: safe_name); dvander@1325: dvander@1325: if (!SQL_FastQuery(db, query)) dvander@1325: { dvander@1325: return DoError(client, db, query, "Group insertion query failed"); dvander@1325: } dvander@1325: dvander@1325: ReplyToCommand(client, "[SM] %t", "SQL Group added"); dvander@1325: dvander@1325: CloseHandle(db); dvander@1325: dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: public Action:Command_DelAdmin(client, args) dvander@1325: { dvander@1325: if (args < 2) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] Usage: sm_sql_deladmin "); dvander@1325: ReplyToCommand(client, "[SM] %t", "Invalid authtype"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: decl String:authtype[16]; dvander@1325: GetCmdArg(1, authtype, sizeof(authtype)); dvander@1325: dvander@1325: if (!StrEqual(authtype, "steam") dvander@1325: && !StrEqual(authtype, "ip") dvander@1325: && !StrEqual(authtype, "name")) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "Invalid authtype"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: new Handle:db = Connect(); dvander@1325: if (db == INVALID_HANDLE) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "Could not connect to database"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: decl String:identity[65]; dvander@1325: decl String:safe_identity[140]; dvander@1325: GetCmdArg(2, identity, sizeof(identity)); dvander@1325: SQL_QuoteString(db, identity, safe_identity, sizeof(safe_identity)); dvander@1325: dvander@1325: decl String:query[255]; dvander@1325: Format(query, dvander@1325: sizeof(query), dvander@1325: "SELECT id FROM sm_admins WHERE authtype = '%s' AND identity = '%s'", dvander@1325: authtype, dvander@1325: safe_identity); dvander@1325: dvander@1325: new Handle:hQuery; dvander@1325: if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE) dvander@1325: { dvander@1325: return DoError(client, db, query, "Admin lookup query failed"); dvander@1325: } dvander@1325: dvander@1325: if (!SQL_FetchRow(hQuery)) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "SQL Admin not found"); dvander@1325: CloseHandle(hQuery); dvander@1325: CloseHandle(db); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: new id = SQL_FetchInt(hQuery, 0); dvander@1325: dvander@1325: CloseHandle(hQuery); dvander@1325: dvander@1325: /* Delete group bindings */ dvander@1325: Format(query, sizeof(query), "DELETE FROM sm_admins_groups WHERE admin_id = %d", id); dvander@1325: if (!SQL_FastQuery(db, query)) dvander@1325: { dvander@1325: return DoError(client, db, query, "Admin group deletion query failed"); dvander@1325: } dvander@1325: dvander@1325: Format(query, sizeof(query), "DELETE FROM sm_admins WHERE id = %d", id); dvander@1325: if (!SQL_FastQuery(db, query)) dvander@1325: { dvander@1325: return DoError(client, db, query, "Admin deletion query failed"); dvander@1325: } dvander@1325: dvander@1325: CloseHandle(db); dvander@1325: dvander@1325: ReplyToCommand(client, "[SM] %t", "SQL Admin deleted"); dvander@1325: dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: public Action:Command_AddAdmin(client, args) dvander@1325: { dvander@1325: if (args < 4) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] Usage: sm_sql_addadmin [password]"); dvander@1325: ReplyToCommand(client, "[SM] %t", "Invalid authtype"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: decl String:authtype[16]; dvander@1325: GetCmdArg(2, authtype, sizeof(authtype)); dvander@1325: dvander@1325: if (!StrEqual(authtype, "steam") dvander@1325: && !StrEqual(authtype, "ip") dvander@1325: && !StrEqual(authtype, "name")) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "Invalid authtype"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: decl String:identity[65]; dvander@1325: decl String:safe_identity[140]; dvander@1325: GetCmdArg(3, identity, sizeof(identity)); dvander@1325: dvander@1325: decl String:query[256]; dvander@1325: new Handle:hQuery; dvander@1325: new Handle:db = Connect(); dvander@1325: if (db == INVALID_HANDLE) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "Could not connect to database"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: SQL_QuoteString(db, identity, safe_identity, sizeof(safe_identity)); dvander@1325: dvander@1325: Format(query, sizeof(query), "SELECT id FROM sm_admins WHERE authtype = '%s' AND identity = '%s'", authtype, identity); dvander@1325: if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE) dvander@1325: { dvander@1325: return DoError(client, db, query, "Admin retrieval query failed"); dvander@1325: } dvander@1325: dvander@1325: if (SQL_GetRowCount(hQuery) > 0) dvander@1325: { dvander@1325: ReplyToCommand(client, "[SM] %t", "SQL Admin already exists"); dvander@1325: CloseHandle(hQuery); dvander@1325: CloseHandle(db); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: CloseHandle(hQuery); dvander@1325: dvander@1325: decl String:alias[64]; dvander@1325: decl String:safe_alias[140]; dvander@1325: GetCmdArg(1, alias, sizeof(alias)); dvander@1325: SQL_QuoteString(db, alias, safe_alias, sizeof(safe_alias)); dvander@1325: dvander@1325: decl String:flags[30]; dvander@1325: decl String:safe_flags[64]; dvander@1325: GetCmdArg(4, flags, sizeof(flags)); dvander@1325: SQL_QuoteString(db, flags, safe_flags, sizeof(safe_flags)); dvander@1325: dvander@1325: decl String:password[32]; dvander@1325: decl String:safe_password[80]; dvander@1325: if (args > 4) dvander@1325: { dvander@1325: GetCmdArg(5, password, sizeof(password)); dvander@1325: SQL_QuoteString(db, password, safe_password, sizeof(safe_password)); dvander@1325: } else { dvander@1325: safe_password[0] = '\0'; dvander@1325: } dvander@1325: dvander@1325: new len = 0; dvander@1325: len += Format(query[len], sizeof(query)-len, "INSERT INTO sm_admins (authtype, identity, password, flags, name) VALUES"); dvander@1325: if (safe_password[0] == '\0') dvander@1325: { dvander@1325: len += Format(query[len], sizeof(query)-len, " ('%s', '%s', NULL, '%s', '%s')", authtype, safe_identity, safe_flags, safe_alias); dvander@1325: } else { dvander@1325: len += Format(query[len], sizeof(query)-len, " ('%s', '%s', '%s', '%s', '%s')", authtype, safe_identity, safe_password, safe_flags, safe_alias); dvander@1325: } dvander@1325: dvander@1325: if (!SQL_FastQuery(db, query)) dvander@1325: { dvander@1325: return DoError(client, db, query, "Admin insertion query failed"); dvander@1325: } dvander@1325: dvander@1325: ReplyToCommand(client, "[SM] %t", "SQL Admin added"); dvander@1325: dvander@1325: CloseHandle(db); dvander@1325: dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: stock Action:DoError(client, Handle:db, const String:query[], const String:msg[]) dvander@1325: { dvander@1325: decl String:error[255]; dvander@1325: SQL_GetError(db, error, sizeof(error)); dvander@1325: LogError("%s: %s", msg, error); dvander@1325: LogError("Query dump: %s", query); dvander@1325: CloseHandle(db); dvander@1325: ReplyToCommand(client, "[SM] %t", "Failed to query database"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: dvander@1325: stock Action:DoStmtError(client, Handle:db, const String:query[], const String:error[], const String:msg[]) dvander@1325: { dvander@1325: LogError("%s: %s", msg, error); dvander@1325: LogError("Query dump: %s", query); dvander@1325: CloseHandle(db); dvander@1325: ReplyToCommand(client, "[SM] %t", "Failed to query database"); dvander@1325: return Plugin_Handled; dvander@1325: } dvander@1325: