dvander@910: /** ds@1330: * vim: set ts=4 : ds@1330: * ============================================================================= ds@1330: * SourceMod Basic Commands Plugin ds@913: * Implements basic admin commands. ds@1330: * ds@1330: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. ds@1330: * ============================================================================= dvander@910: * ds@1330: * This program is free software; you can redistribute it and/or modify it under ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the ds@1330: * Free Software Foundation. ds@1330: * ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ds@1330: * details. dvander@910: * ds@1330: * You should have received a copy of the GNU General Public License along with ds@1330: * this program. If not, see . teame06@1211: * ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants ds@1330: * this exception to all derivative works. AlliedModders LLC defines further ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), ds@1330: * or . ds@913: * ds@913: * Version: $Id$ dvander@910: */ dvander@910: ds@989: #pragma semicolon 1 dvander@910: ds@989: #include dvander@1510: #undef REQUIRE_PLUGIN dvander@1510: #include ds@913: teame06@1211: public Plugin:myinfo = dvander@910: { dvander@910: name = "Basic Commands", dvander@910: author = "AlliedModders LLC", dvander@910: description = "Basic Admin Commands", dvander@910: version = SOURCEMOD_VERSION, dvander@910: url = "http://www.sourcemod.net/" dvander@910: }; dvander@910: dvander@1510: new Handle:hTopMenu = INVALID_HANDLE; dvander@1510: dvander@1510: #include "basecommands/kick.sp" dvander@1510: dvander@910: public OnPluginStart() dvander@910: { dvander@1027: LoadTranslations("common.phrases"); teame06@1211: dvander@910: RegAdminCmd("sm_kick", Command_Kick, ADMFLAG_KICK, "sm_kick <#userid|name> [reason]"); dvander@917: RegAdminCmd("sm_map", Command_Map, ADMFLAG_CHANGEMAP, "sm_map "); dvander@918: RegAdminCmd("sm_rcon", Command_Rcon, ADMFLAG_RCON, "sm_rcon "); dvander@920: RegAdminCmd("sm_cvar", Command_Cvar, ADMFLAG_CONVARS, "sm_cvar [value]"); dvander@921: RegAdminCmd("sm_execcfg", Command_ExecCfg, ADMFLAG_CONFIG, "sm_execcfg "); dvander@923: RegAdminCmd("sm_who", Command_Who, ADMFLAG_GENERIC, "sm_who [#userid|name]"); dvander@1162: RegAdminCmd("sm_reloadadmins", Command_ReloadAdmins, ADMFLAG_BAN, "sm_reloadadmins"); ferret99gt@1276: RegAdminCmd("sm_cancelvote", Command_CancelVote, ADMFLAG_VOTE, "sm_cancelvote"); dvander@1510: dvander@1510: /* Account for late loading */ dvander@1510: new Handle:topmenu; dvander@1510: if (LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE)) dvander@1510: { dvander@1510: OnAdminMenuReady(topmenu); dvander@1510: } dvander@1510: } dvander@1510: dvander@1510: public OnAdminMenuReady(Handle:topmenu) dvander@1510: { dvander@1510: /* Block us from being called twice */ dvander@1510: if (topmenu == hTopMenu) dvander@1510: { dvander@1510: return; dvander@1510: } dvander@1510: dvander@1510: /* Save the Handle */ dvander@1510: hTopMenu = topmenu; dvander@1510: dvander@1510: /* Build the "Player Commands" category */ dvander@1510: new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS); dvander@1510: dvander@1510: if (player_commands != INVALID_TOPMENUOBJECT) dvander@1510: { dvander@1510: AddToTopMenu(hTopMenu, dvander@1510: "Kick", dvander@1510: TopMenuObject_Item, dvander@1510: AdminMenu_Kick, dvander@1510: player_commands, dvander@1510: "sm_kick", dvander@1510: ADMFLAG_KICK); dvander@1510: } dvander@1510: } dvander@1510: dvander@1510: public OnLibraryRemoved(const String:name[]) dvander@1510: { dvander@1510: if (strcmp(name, "adminmenu") == 0) dvander@1510: { dvander@1510: hTopMenu = INVALID_HANDLE; dvander@1510: } dvander@927: } dvander@927: dvander@1162: public Action:Command_ReloadAdmins(client, args) dvander@1162: { dvander@1162: /* Dump it all! */ dvander@1162: DumpAdminCache(AdminCache_Groups, true); dvander@1162: DumpAdminCache(AdminCache_Overrides, true); teame06@1211: dvander@1378: LogAction(client, -1, "\"%L\" refreshed the admin cache.", client); dvander@1162: ReplyToCommand(client, "[SM] %t", "Admin cache refreshed"); teame06@1211: dvander@1162: return Plugin_Handled; dvander@1162: } dvander@1162: dvander@923: #define FLAG_STRINGS 14 dvander@923: new String:g_FlagNames[FLAG_STRINGS][20] = dvander@923: { dvander@1376: "res", dvander@923: "admin", dvander@923: "kick", dvander@923: "ban", dvander@923: "unban", dvander@923: "slay", dvander@923: "map", dvander@923: "cvars", dvander@923: "cfg", dvander@923: "chat", dvander@923: "vote", dvander@923: "pass", dvander@923: "rcon", dvander@923: "cheat" dvander@923: }; dvander@923: dvander@1376: CustomFlagsToString(String:buffer[], maxlength, flags) dvander@1376: { dvander@1376: decl String:joins[6][6]; dvander@1376: new total; dvander@1376: dvander@1376: for (new i=_:Admin_Custom1; i<=_:Admin_Custom6; i++) dvander@1376: { dvander@1376: if (flags & (1< 1) { dvander@923: ReplyToCommand(client, "[SM] %t", "More than one client matches", arg); dvander@923: return Plugin_Handled; dvander@923: } teame06@1211: dvander@923: new flags = GetUserFlagBits(clients[0]); faluco@1118: decl String:flagstring[255]; dvander@923: if (flags == 0) dvander@923: { dvander@923: strcopy(flagstring, sizeof(flagstring), "none"); dvander@923: } else if (flags & ADMFLAG_ROOT) { dvander@923: strcopy(flagstring, sizeof(flagstring), "root"); dvander@923: } else { dvander@923: FlagsToString(flagstring, sizeof(flagstring), flags); dvander@923: } teame06@1211: dvander@923: ReplyToCommand(client, "[SM] %t: %s", "Access", flagstring); teame06@1211: dvander@923: return Plugin_Handled; dvander@921: } dvander@921: dvander@921: public Action:Command_ExecCfg(client, args) dvander@921: { dvander@921: if (args < 1) dvander@921: { dvander@921: ReplyToCommand(client, "[SM] Usage: sm_execcfg "); dvander@921: return Plugin_Handled; dvander@921: } teame06@1211: dvander@921: new String:path[64] = "cfg/"; dvander@921: GetCmdArg(1, path[4], sizeof(path)-4); teame06@1211: dvander@921: if (!FileExists(path)) dvander@921: { dvander@921: ReplyToCommand(client, "[SM] %t", "Config not found", path[4]); dvander@921: return Plugin_Handled; dvander@921: } teame06@1211: dvander@924: ShowActivity(client, "%t", "Executed config", path[4]); teame06@1211: dvander@1378: LogAction(client, -1, "\"%L\" executed config (file \"%s\")", client, path[4]); teame06@1211: dvander@921: ServerCommand("exec \"%s\"", path[4]); teame06@1211: dvander@921: return Plugin_Handled; dvander@920: } dvander@920: dvander@920: public Action:Command_Cvar(client, args) dvander@920: { dvander@920: if (args < 1) dvander@920: { dvander@920: ReplyToCommand(client, "[SM] Usage: sm_cvar [value]"); dvander@920: return Plugin_Handled; dvander@920: } teame06@1211: faluco@1118: decl String:cvarname[33]; dvander@920: GetCmdArg(1, cvarname, sizeof(cvarname)); teame06@1211: dvander@920: new Handle:hndl = FindConVar(cvarname); dvander@920: if (hndl == INVALID_HANDLE) dvander@920: { dvander@920: ReplyToCommand(client, "[SM] %t", "Unable to find cvar", cvarname); dvander@920: return Plugin_Handled; dvander@920: } teame06@1211: dvander@920: new bool:allowed = false; dvander@920: if (GetConVarFlags(hndl) & FCVAR_PROTECTED) dvander@920: { dvander@920: /* If they're root, allow anything */ dvander@920: if ((GetUserFlagBits(client) & ADMFLAG_ROOT) == ADMFLAG_ROOT) dvander@920: { dvander@920: allowed = true; dvander@920: } dvander@920: /* If they're not root, and getting sv_password, see if they have ADMFLAG_PASSWORD */ dvander@920: else if (StrEqual(cvarname, "sv_password") && (GetUserFlagBits(client) & ADMFLAG_PASSWORD)) dvander@920: { dvander@920: allowed = true; dvander@920: } teame06@1211: } dvander@920: /* Do a check for the cheat cvar */ dvander@920: else if (StrEqual(cvarname, "sv_cheats")) dvander@920: { dvander@929: if (GetUserFlagBits(client) & ADMFLAG_CHEATS dvander@929: || GetUserFlagBits(client) & ADMFLAG_ROOT) dvander@920: { dvander@920: allowed = true; dvander@920: } dvander@920: } dvander@920: /* If we drop down to here, it was a normal cvar. */ dvander@920: else dvander@920: { dvander@920: allowed = true; dvander@920: } teame06@1211: dvander@920: if (!allowed) dvander@920: { dvander@920: ReplyToCommand(client, "[SM] %t", "No access to cvar"); dvander@920: return Plugin_Handled; dvander@920: } teame06@1211: dvander@920: decl String:value[255]; dvander@920: if (args < 2) dvander@920: { dvander@920: GetConVarString(hndl, value, sizeof(value)); teame06@1211: dvander@920: ReplyToCommand(client, "[SM] %t", "Value of cvar", cvarname, value); dvander@920: return Plugin_Handled; dvander@920: } teame06@1211: dvander@920: GetCmdArg(2, value, sizeof(value)); teame06@1211: dvander@920: if ((GetConVarFlags(hndl) & FCVAR_PROTECTED) != FCVAR_PROTECTED) dvander@920: { dvander@920: ShowActivity(client, "%t", "Cvar changed", cvarname, value); dvander@924: } else { dvander@924: ReplyToCommand(client, "[SM] %t", "Cvar changed", cvarname, value); dvander@920: } teame06@1211: dvander@1378: LogAction(client, -1, "\"%L\" changed cvar (cvar \"%s\") (value \"%s\")", client, cvarname, value); teame06@1211: ds@937: SetConVarString(hndl, value, true); teame06@1211: dvander@920: return Plugin_Handled; dvander@918: } dvander@918: dvander@918: public Action:Command_Rcon(client, args) dvander@918: { dvander@918: if (args < 1) dvander@918: { dvander@918: ReplyToCommand(client, "[SM] Usage: sm_rcon "); dvander@918: return Plugin_Handled; dvander@918: } teame06@1211: dvander@918: decl String:argstring[255]; dvander@918: GetCmdArgString(argstring, sizeof(argstring)); teame06@1211: dvander@1378: LogAction(client, -1, "\"%L\" console command (cmdline \"%s\")", client, argstring); teame06@1211: dvander@918: ServerCommand("%s", argstring); teame06@1211: dvander@918: return Plugin_Handled; dvander@917: } dvander@917: dvander@917: public Action:Command_Map(client, args) dvander@917: { dvander@917: if (args < 1) dvander@917: { dvander@917: ReplyToCommand(client, "[SM] Usage: sm_map "); dvander@917: return Plugin_Handled; dvander@917: } teame06@1211: faluco@1118: decl String:map[64]; dvander@917: GetCmdArg(1, map, sizeof(map)); teame06@1211: dvander@917: if (!IsMapValid(map)) dvander@917: { dvander@917: ReplyToCommand(client, "[SM] %t", "Map was not found", map); dvander@917: return Plugin_Handled; dvander@917: } teame06@1211: dvander@924: ShowActivity(client, "%t", "Changing map", map); teame06@1211: dvander@1378: LogAction(client, -1, "\"%L\" changed map to \"%s\"", client, map); teame06@1211: dvander@918: new Handle:dp; dvander@917: CreateDataTimer(3.0, Timer_ChangeMap, dp); dvander@917: WritePackString(dp, map); teame06@1211: dvander@917: return Plugin_Handled; dvander@917: } dvander@917: dvander@917: public Action:Timer_ChangeMap(Handle:timer, Handle:dp) dvander@917: { faluco@1118: decl String:map[65]; teame06@1211: dvander@917: ResetPack(dp); dvander@917: ReadPackString(dp, map, sizeof(map)); teame06@1211: dvander@917: ServerCommand("changelevel \"%s\"", map); teame06@1211: dvander@917: return Plugin_Stop; dvander@910: } dvander@910: ferret99gt@1276: public Action:Command_CancelVote(client, args) ferret99gt@1276: { ferret99gt@1278: if (!IsVoteInProgress()) ferret99gt@1276: { ferret99gt@1276: ReplyToCommand(client, "[SM] %t", "Vote Not In Progress"); ferret99gt@1276: return Plugin_Handled; ferret99gt@1276: } ferret99gt@1276: ferret99gt@1276: ShowActivity(client, "%t", "Cancelled Vote"); ferret99gt@1276: ferret99gt@1276: CancelVote(); ferret99gt@1276: ferret99gt@1276: return Plugin_Handled; dvander@1417: } dvander@1510: