diff -r 000000000000 -r b7aa2b626807 plugins/basevotes/voteban.sp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/basevotes/voteban.sp Sun Mar 30 07:00:22 2008 +0000 @@ -0,0 +1,182 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod Basevotes Plugin + * Provides ban functionality + * + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id: admin-flatfile.sp 1438 2007-09-16 03:45:06Z dvander $ + */ + +DisplayVoteBanMenu(client, target) +{ + g_voteClient[VOTE_CLIENTID] = target; + g_voteClient[VOTE_USERID] = GetClientUserId(target); + + GetClientName(target, g_voteInfo[VOTE_NAME], sizeof(g_voteInfo[])); + GetClientAuthString(target, g_voteInfo[VOTE_AUTHID], sizeof(g_voteInfo[])); + GetClientIP(target, g_voteInfo[VOTE_IP], sizeof(g_voteInfo[])); + + LogAction(client, target, "\"%L\" initiated a ban vote against \"%L\"", client, target); + ShowActivity2(client, "[SM] ", "%t", "Initiated Vote Ban", g_voteInfo[VOTE_NAME]); + + g_voteType = voteType:ban; + + g_hVoteMenu = CreateMenu(Handler_VoteCallback, MenuAction:MENU_ACTIONS_ALL); + SetMenuTitle(g_hVoteMenu, "Voteban Player"); + AddMenuItem(g_hVoteMenu, VOTE_YES, "Yes"); + AddMenuItem(g_hVoteMenu, VOTE_NO, "No"); + SetMenuExitButton(g_hVoteMenu, false); + VoteMenuToAll(g_hVoteMenu, 20); +} + +DisplayBanTargetMenu(client) +{ + new Handle:menu = CreateMenu(MenuHandler_Ban); + + decl String:title[100]; + Format(title, sizeof(title), "%T:", "Ban vote", client); + SetMenuTitle(menu, title); + SetMenuExitBackButton(menu, true); + + AddTargetsToMenu(menu, client, false, false); + + DisplayMenu(menu, client, MENU_TIME_FOREVER); +} + +public AdminMenu_VoteBan(Handle:topmenu, + TopMenuAction:action, + TopMenuObject:object_id, + param, + String:buffer[], + maxlength) +{ + if (action == TopMenuAction_DisplayOption) + { + Format(buffer, maxlength, "%T", "Ban vote", param); + } + else if (action == TopMenuAction_SelectOption) + { + DisplayBanTargetMenu(param); + } + else if (action == TopMenuAction_DrawOption) + { + /* disable this option if a vote is already running */ + buffer[0] = !IsNewVoteAllowed() ? ITEMDRAW_IGNORE : ITEMDRAW_DEFAULT; + } +} + +public MenuHandler_Ban(Handle:menu, MenuAction:action, param1, param2) +{ + if (action == MenuAction_End) + { + CloseHandle(menu); + } + else if (action == MenuAction_Cancel) + { + if (param2 == MenuCancel_ExitBack && hTopMenu != INVALID_HANDLE) + { + DisplayTopMenu(hTopMenu, param1, TopMenuPosition_LastCategory); + } + } + else if (action == MenuAction_Select) + { + decl String:info[32], String:name[32]; + new userid, target; + + GetMenuItem(menu, param2, info, sizeof(info), _, name, sizeof(name)); + userid = StringToInt(info); + + if ((target = GetClientOfUserId(userid)) == 0) + { + PrintToChat(param1, "[SM] %t", "Player no longer available"); + } + else if (!CanUserTarget(param1, target)) + { + PrintToChat(param1, "[SM] %t", "Unable to target"); + } + else + { + g_voteArg[0] = '\0'; + DisplayVoteBanMenu(param1, target); + } + } +} + +public Action:Command_Voteban(client, args) +{ + if (args < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_voteban [reason]"); + return Plugin_Handled; + } + + if (IsVoteInProgress()) + { + ReplyToCommand(client, "[SM] %t", "Vote in Progress"); + return Plugin_Handled; + } + + if (!TestVoteDelay(client)) + { + return Plugin_Handled; + } + + decl String:text[256], String:arg[64]; + GetCmdArgString(text, sizeof(text)); + + new len = BreakString(text, arg, sizeof(arg)); + + if (len != -1) + { + strcopy(g_voteArg, sizeof(g_voteArg), text[len]); + } + else + { + g_voteArg[0] = '\0'; + } + + decl String:target_name[MAX_TARGET_LENGTH]; + decl target_list[MAXPLAYERS], target_count, bool:tn_is_ml; + + if ((target_count = ProcessTargetString( + arg, + client, + target_list, + MAXPLAYERS, + COMMAND_FILTER_NO_MULTI|COMMAND_FILTER_NO_BOTS, + target_name, + sizeof(target_name), + tn_is_ml)) <= 0) + { + ReplyToTargetError(client, target_count); + return Plugin_Handled; + } + + DisplayVoteBanMenu(client, target_list[0]); + + return Plugin_Handled; +}