// Mattie EventScripts v2+
//  clanvoteban - Script
//      for Counter-Strike: Source
//
// * Description:
//   voteban for clan members
//
// * Install instructions:
//       1. Install Mattie's EventScripts plugins:
//           http://mattie.info/cs
//
//       2. Copy and upload this script to:
//           cstrike/addons/eventscripts/clanvoteban/...
//
//       3. Add the following line somewhere in autoexec.cfg:
//           es_load clanvoteban
//
//       4. Review the config settings below and tweak
//
// ******************************

block config
{
	//ban time if only one member is online (no real vote required)
	es_xset cvb_bantime1 60

	//ban time if more than one members must vote to ban
	es_xset cvb_bantime2 120

	//ban time if only one member is online (no real vote required)
	es_xset cvb_kicktime1 0

	//ban time if more than one members must vote to ban
	es_xset cvb_kicktime2 5

	es_xset cvb_ban_message "You have been banned with time limit by members vote."

	es_xset cvb_kick_message "You have been kicked by members vote."
	//not used anymore:
	//es_xset cvb_kick_message2 "You have been banned by members vote for 5 minutes."

	//chat command to start a voteban
	es_xsetinfo cvb_start_voteban "!clanvb"

	//chat command to start a votekick
	es_xsetinfo cvb_start_votekick "!clanvk"
}

block unload
{
	es_xkeygroupdelete cvb_members
	es_xkeygroupdelete cvb_admin_vote_menu_items
	es_xkeygroupdelete cvb_vote_menu_items

	es clientcmd delete say server_var(cvb_start_voteban)
	es clientcmd delete say server_var(cvb_start_votekick)
}

block remove_bots_and_members
{
	es_xset cvb_count 1

        es_xset isbot 0
        es getplayerinfo isbot server_var(cvb_tmp_user_id) isbot
        if( server_var(isbot) != 0 ) do
        {
                es_keydelete cvb_tmp_playerlist server_var(cvb_tmp_user_id)
		es_xset cvb_count 0
        }

	es_xset cvb_playersteamid "unknown"
	es_getplayersteamid cvb_playersteamid server_var(cvb_tmp_user_id)
	es_xset check 0
	es_exists check keyvalue cvb_members "member" server_var(cvb_playersteamid)
	if( server_var(check) == 1 ) do
        {
                es_keydelete cvb_tmp_playerlist server_var(cvb_tmp_user_id)
		es_xset cvb_count 0
        }

	if( server_var(cvb_count) == 1 ) do
	{
		es_xmath cvb_player_count + 1
	}
}

block create_player_list
{
	es_xcreateplayerlist cvb_playerlist
	es_xkeygroupcopy cvb_playerlist cvb_tmp_playerlist
	es_xforeachkey cvb_tmp_user_id in cvb_playerlist "es_xdoblock clanvoteban/remove_bots_and_members"
	es_xkeygroupdelete cvb_playerlist
	es_xkeygroupcopy cvb_tmp_playerlist cvb_playerlist
	es_xkeygroupdelete cvb_tmp_playerlist
}

block remove_non_members_and_count
{
	es_xset cvb_playersteamid "unknown"
	es_getplayersteamid cvb_playersteamid server_var(cvb_tmp_user_id)
	es_xset check 0
	es_exists check keyvalue cvb_members "member" server_var(cvb_playersteamid)
	if( server_var(check) == 0 ) do
        {
                es_keydelete cvb_tmp_memberlist server_var(cvb_tmp_user_id)
        }
	else do
	{
		es_xset isAdmin 0
		es_keygetvalue isAdmin cvb_members "member" server_var(cvb_playersteamid)
		if( server_var(isAdmin) == 1 ) do
		{
			es_xmath cvb_admin_count + 1
			es_xmath cvb_member_count + 1
		}
		else do
		{
			es_xmath cvb_member_count + 1
		}
	}
}

block create_member_list_and_count
{
	es_xcreateplayerlist cvb_memberlist
	es_xkeygroupcopy cvb_memberlist cvb_tmp_memberlist
	es_xforeachkey cvb_tmp_user_id in cvb_memberlist "es_xdoblock clanvoteban/remove_non_members_and_count"
	es_xkeygroupdelete cvb_memberlist
	es_xkeygroupcopy cvb_tmp_memberlist cvb_memberlist
	es_xkeygroupdelete cvb_tmp_memberlist
}

block vote_end
{

es_log "clanvoteban:vote_end:" server_var(cvb_member_count) server_var(cvb_admin_count) server_var(cvb_yes_count) server_var(cvb_no_count) server_var(cvb_abstain_count) server_var(cvb_force_yes_count) server_var(cvb_force_no_count) server_var(cvb_timeout_count) server_var(cvb_cancel_count) server_var(cvb_vote_count)

	if( server_var(cvb_voteban_running) == 1 ) do

		es_xset cvb_voteban_running 0

		es_xset check 0
		keymenu exists check cvb_admin_vote_menu
		if (server_var(check) != 0) do
		{
			keymenu delete cvb_admin_vote_menu
		}
		es_xset check 0
		keymenu exists check cvb_vote_menu
		if (server_var(check) != 0) do
		{
			keymenu delete cvb_vote_menu
		}

		es_xset cvb_ban 0
		if( server_var(cvb_force_yes_count) > 0 ) do
		{
			if( server_var(cvb_force_yes_count) >= server_var(cvb_force_no_count) ) do
			{
				es_xset cvb_ban 1
			}
		}
		if( server_var(cvb_force_no_count) == 0 ) do
		{
			if( server_var(cvb_yes_count) >= server_var(cvb_no_count) ) do
			{
				es_xset cvb_ban 1
			}
		}
		if( server_var(cvb_ban) == 1 ) do
		{
			//ban now
			if( server_var(cvb_member_count) == 1 ) do
			{
				es_xset check 0
				es_exists check userid server_var(cvb_ban_playerid)
				if( server_var(check) == 0 ) do
				{
					es_log "[clanvoteban]" server_var(cvb_ban_playername) server_var(cvb_ban_playerid) server_var(cvb_ban_playersteamid) " already left the server"
				}
				else do
				{
					if (server_var(cvb_kick_or_ban) == 0) do
					{
						es_log "[clanvoteban]" server_var(cvb_ban_playername) server_var(cvb_ban_playersteamid) "was banned for" server_var(cvb_bantime1) "minutes."
						es_msg #multi #lightgreen[clanvoteban]#green server_var(cvb_ban_playername) "was banned for" server_var(cvb_bantime1) "minutes."

						es_format cvb_message "You have been banned by members vote for %1 minutes." server_var(cvb_bantime1)

						es banid server_var(cvb_bantime1) server_var(cvb_ban_playerid) server_var(cvb_message)
						es kickid server_var(cvb_ban_playerid) server_var(cvb_message)
					}
					else do
					{
						es_log "[clanvoteban]" server_var(cvb_ban_playername) server_var(cvb_ban_playersteamid) "was kicked."
						es_msg #multi #lightgreen[clanvoteban]#green server_var(cvb_ban_playername) "was kicked."
						//es banid server_var(cvb_bantime1) server_var(cvb_ban_playerid) server_var(cvb_ban_message)
						es kickid server_var(cvb_ban_playerid) server_var(cvb_kick_message)
					}
				}
			}
			else do
			{
				es_xset check 0
				es_exists check userid server_var(cvb_ban_playerid)
				if( server_var(check) == 0 ) do
				{
					es_log "[clanvoteban]" server_var(cvb_ban_playername) server_var(cvb_ban_playerid) server_var(cvb_ban_playersteamid) " already left the server"
				}
				else do
				{
					if (server_var(cvb_kick_or_ban) == 0) do
					{
						es_log "[clanvoteban]" server_var(cvb_ban_playername) server_var(cvb_ban_playersteamid) "was banned for" server_var(cvb_bantime2) "minutes."
						es_msg #multi #lightgreen[clanvoteban]#green server_var(cvb_ban_playername) "was banned for" server_var(cvb_bantime2) "minutes."
						es_format cvb_message "You have been banned by members vote for %1 minutes." server_var(cvb_bantime2)
						es banid server_var(cvb_bantime2) server_var(cvb_ban_playerid) server_var(cvb_message)
						es kickid server_var(cvb_ban_playerid) server_var(cvb_message)
					}
					else do
					{
						es_log "[clanvoteban]" server_var(cvb_ban_playername) server_var(cvb_ban_playersteamid) "was banned for" server_var(cvb_kicktime2) "minutes."
						es_msg #multi #lightgreen[clanvoteban]#green server_var(cvb_ban_playername) "was banned for" server_var(cvb_kicktime2) "minutes."
						es_format cvb_message "You have been banned by members vote for %1 minutes." server_var(cvb_kicktime2)
						es banid server_var(cvb_kicktime2) server_var(cvb_ban_playerid) server_var(cvb_message)
						es kickid server_var(cvb_ban_playerid) server_var(cvb_message)
					}
				}
			}
		}
		else do
		{
			es_log "[clanvoteban] Vote end:" server_var(cvb_ban_playername) server_var(cvb_ban_playersteamid) "was not banned."
			if (server_var(cvb_kick_or_ban) == 0) do
			{
				es_msg #multi #lightgreen[clanvoteban]#green "Vote end:" server_var(cvb_ban_playername) "was not banned."
			}
			else do
			{
				es_msg #multi #lightgreen[clanvoteban]#green "Vote end:" server_var(cvb_ban_playername) "was not kicked."
			}
		}
	}
}

block process_single_vote
{
	es_xset cvb_voteplayer_id ""
	es_set cvb_voteplayer_id server_var(_popup_userid)

	es_xset cvb_vote_playername "unknown"
	es_getplayername cvb_vote_playername server_var(cvb_voteplayer_id)
	es_xset cvb_vote_playersteamid "unknown"
	es_getplayersteamid cvb_vote_playersteamid server_var(cvb_voteplayer_id)

	es_xmath cvb_vote_count + 1

	if( server_var(cvb_vote) == 1 ) do
	{
		es_xmath cvb_yes_count + 1
es_log "clanvoteban:process_single_vote:yes" server_var(cvb_voteplayer_id)
	}
	if( server_var(cvb_vote) == 2 ) do
	{
		es_xmath cvb_no_count + 1
es_log "clanvoteban:process_single_vote:no" server_var(cvb_voteplayer_id)
	}
	if( server_var(cvb_vote) == 3 ) do
	{
		es_xmath cvb_abstain_count + 1
es_log "clanvoteban:process_single_vote:abstain" server_var(cvb_voteplayer_id)
	}
	if( server_var(cvb_vote) == 4 ) do
	{
		es_xmath cvb_force_yes_count + 1
es_log "clanvoteban:process_single_vote:force_yes" server_var(cvb_voteplayer_id)
	}
	if( server_var(cvb_vote) == 5 ) do
	{
		es_xmath cvb_force_no_count + 1
es_log "clanvoteban:process_single_vote:force_no" server_var(cvb_voteplayer_id)
	}
	if( server_var(cvb_vote) == 10 ) do
	{
		es_xmath cvb_timeout_count + 1
es_log "clanvoteban:process_single_vote:timeout" server_var(cvb_voteplayer_id)
	}
	if( server_var(cvb_vote) == 0 ) do
	{
		es_xmath cvb_cancel_count + 1
es_log "clanvoteban:process_single_vote:cancel" server_var(cvb_voteplayer_id)
	}

	es_log "[clanvoteban]" server_var(cvb_vote_playername) server_var(cvb_vote_playersteamid) "voted" server_var(cvb_vote)
	if( server_var(cvb_force_yes_count) > 0 ) do
	{
			if (server_var(cvb_kick_or_ban) == 0) do
			{
				es_msg #multi #lightgreen[clanvoteban]#green "Ban" server_var(cvb_ban_playername) "? admin forced yes:" server_var(cvb_force_yes_count) "no:" server_var(cvb_force_no_count)
			}
			else do
			{
				es_msg #multi #lightgreen[clanvoteban]#green "Kick" server_var(cvb_ban_playername) "? admin forced yes:" server_var(cvb_force_yes_count) "no:" server_var(cvb_force_no_count)
			}
	}
	else do
	{
		if( server_var(cvb_force_no_count) > 0 ) do
		{
			if (server_var(cvb_kick_or_ban) == 0) do
			{
				es_msg #multi #lightgreen[clanvoteban]#green "Ban" server_var(cvb_ban_playername) "? admin forced yes:" server_var(cvb_force_yes_count) "no:" server_var(cvb_force_no_count)
			}
			else do
			{
				es_msg #multi #lightgreen[clanvoteban]#green "Kick" server_var(cvb_ban_playername) "? admin forced yes:" server_var(cvb_force_yes_count) "no:" server_var(cvb_force_no_count)
			}
		}
		else do
		{
			if (server_var(cvb_kick_or_ban) == 0) do
			{
				es_msg #multi #lightgreen[clanvoteban]#green "Ban" server_var(cvb_ban_playername) "? yes:" server_var(cvb_yes_count) "no:" server_var(cvb_no_count)
			}
			else do
			{
				es_msg #multi #lightgreen[clanvoteban]#green "Kick" server_var(cvb_ban_playername) "? yes:" server_var(cvb_yes_count) "no:" server_var(cvb_no_count)
			}
		}
	}

	if( server_var(cvb_vote_count) == server_var(cvb_member_count) ) do
	{
		es_xdoblock clanvoteban/vote_end
	}
}

block show_vote_menu
{
	es_xset cvb_membersteamid "unknown"
	es_getplayersteamid cvb_membersteamid server_var(cvb_memberid)
	es_xset cvb_memberplayername "unknown"
	es_getplayername cvb_memberplayername server_var(cvb_memberid)

	es_xset isAdmin 0
	es_keygetvalue isAdmin cvb_members "member" server_var(cvb_membersteamid)
	if( server_var(isAdmin) == 1 ) do
	{
		es keymenu send cvb_admin_vote_menu server_var(cvb_memberid)
es_log "clanvoteban:show_vote_menu: send admin menu to" server_var(cvb_memberplayername) server_var(cvb_membersteamid)
	}
	else do
	{
		es keymenu send cvb_vote_menu server_var(cvb_memberid)
es_log "clanvoteban:show_vote_menu: send normal member menu to" server_var(cvb_memberplayername) server_var(cvb_membersteamid)
	}
}

block run_vote_on_player
{
	if( server_var(cvb_voteban_running) == 1 ) do
	{
		es_tell server_var(cvb_playerid) #multi #lightgreen[clanvoteban]#green An ongoing vote has to be finished first!
	}
	else do
	{
		es_xset cvb_voteban_running 1
	
		es_xset cvb_member_count 0
		es_xset cvb_admin_count 0
		es_xset cvb_yes_count 0
		es_xset cvb_no_count 0
		es_xset cvb_abstain_count 0
		es_xset cvb_force_yes_count 0
		es_xset cvb_force_no_count 0
		es_xset cvb_timeout_count 0
		es_xset cvb_cancel_count 0
		es_xset cvb_vote_count 0

		es_xset cvb_ban_playername "unknown"
		es_getplayername cvb_ban_playername server_var(cvb_ban_playerid)
		es_xset cvb_ban_playersteamid "unknown"
		es_getplayersteamid cvb_ban_playersteamid server_var(cvb_ban_playerid)

		es_log "[clanvoteban]" server_var(cvb_playername) server_var(cvb_playersteamid) "started a members only voteban against" server_var(cvb_ban_playername) server_var(cvb_ban_playersteamid)
		if (server_var(cvb_kick_or_ban) == 0) do
		{
			es_msg #multi #lightgreen[clanvoteban]#green server_var(cvb_playername) "started a members only voteban against" server_var(cvb_ban_playername)
		}
		else do
		{
			es_msg #multi #lightgreen[clanvoteban]#green server_var(cvb_playername) "started a members only votekick against" server_var(cvb_ban_playername)
		}

		es_xdoblock clanvoteban/create_member_list_and_count

		es_xset check 0
		keymenu exists check cvb_vote_menu
		if (server_var(check) != 0) do
		{
			keymenu delete cvb_vote_menu
		}

		if (server_var(cvb_kick_or_ban) == 0) do
		{
			es keymenu create cvb_vote_menu cvb_vote clanvoteban/process_single_vote cvb_vote_menu_items #keyvalue menu_text #key Ban user server_var(cvb_ban_playername) "(" server_var(cvb_ban_playersteamid) ")?"
		}
		else do
		{
			es keymenu create cvb_vote_menu cvb_vote clanvoteban/process_single_vote cvb_vote_menu_items #keyvalue menu_text #key Kick user server_var(cvb_ban_playername) "(" server_var(cvb_ban_playersteamid) ")?"
		}

		es_xset check 0
		keymenu exists check cvb_admin_vote_menu
		if (server_var(check) != 0) do
		{
			keymenu delete cvb_admin_vote_menu
		}
		if (server_var(cvb_kick_or_ban) == 0) do
		{
			es keymenu create cvb_admin_vote_menu cvb_vote clanvoteban/process_single_vote cvb_admin_vote_menu_items #keyvalue menu_text #key Ban user server_var(cvb_ban_playername) "(" server_var(cvb_ban_playersteamid) ")?"
		}
		else do
		{
			es keymenu create cvb_admin_vote_menu cvb_vote clanvoteban/process_single_vote cvb_admin_vote_menu_items #keyvalue menu_text #key Kick user server_var(cvb_ban_playername) "(" server_var(cvb_ban_playersteamid) ")?"
		}

		es_xforeachkey cvb_memberid in cvb_memberlist "es_xdoblock clanvoteban/show_vote_menu"
	
		es_xkeygroupdelete cvb_memberlist

		es_delayed 30 es_xdoblock clanvoteban/vote_end
	}
}

block run_vote_on_player_dummy
{
es_log "clanvoteban:run_vote_on_player_dummy:"
	es_xset cvb_voteban_running 0
}

block show_player_menu
{
	if( server_var(cvb_voteban_running) == 1 ) do
	{
		es_tell server_var(cvb_playerid) #multi #lightgreen[clanvoteban]#green An ongoing vote has to be finished first!
	}
	else do
	{
		es_xset check 0
		keymenu exists check cvb_player_menu
		if (server_var(check) != 0) do
		{
			keymenu delete cvb_player_menu
		}
		if (server_var(cvb_kick_or_ban) == 0) do
		{
			es keymenu create cvb_player_menu cvb_ban_playerid clanvoteban/run_vote_on_player cvb_playerlist #keyvalue name #key Which player to voteban?
		}
		else do
		{
			es keymenu create cvb_player_menu cvb_ban_playerid clanvoteban/run_vote_on_player cvb_playerlist #keyvalue name #key Which player to votekick?
		}
		es keymenu send cvb_player_menu server_var(cvb_playerid)
		es_xkeygroupdelete cvb_playerlist
	}
}

block start_voteban
{
	es_xset cvb_playerid ""
	es_xgetcmduserid cvb_playerid

	es_xset cvb_playersteamid "unknown"
	es_getplayersteamid cvb_playersteamid server_var(cvb_playerid)

	es_xset check 0
	es_exists check keyvalue cvb_members member server_var(cvb_playersteamid)
	if( server_var(check) == 0 ) do
        {
		es_tell server_var(cvb_playerid) #multi #lightgreen[clanvoteban]#green Not authorized
	}
	else do
	{
		if( server_var(cvb_voteban_running) == 1 ) do
		{
			es_tell server_var(cvb_playerid) #multi #lightgreen[clanvoteban]#green An ongoing vote has to be finished first!
		}
		else do
		{
			es_xset cvb_playername "unknown"
			es_getplayername cvb_playername server_var(cvb_playerid)
es_log "clanvoteban:start_voteban:" server_var(cvb_playerid) server_var(cvb_playername)

			es_xset cvb_player_count 0
			es_xdoblock clanvoteban/create_player_list
			if( server_var(cvb_player_count) > 0 ) do
			{
				es_xset cvb_kick_or_ban 0  //0=ban,1=kick
				es_xdoblock clanvoteban/show_player_menu
			}
			else do
			{
				es_tell server_var(cvb_playerid) #multi #lightgreen[clanvoteban]#green Nobody to ban online
			}
		}
	}
}

block start_votekick
{
	es_xset cvb_playerid ""
	es_xgetcmduserid cvb_playerid

	es_xset cvb_playersteamid "unknown"
	es_getplayersteamid cvb_playersteamid server_var(cvb_playerid)

	es_xset check 0
	es_exists check keyvalue cvb_members member server_var(cvb_playersteamid)
	if( server_var(check) == 0 ) do
        {
		es_tell server_var(cvb_playerid) #multi #lightgreen[clanvoteban]#green Not authorized
	}
	else do
	{
		if( server_var(cvb_voteban_running) == 1 ) do
		{
			es_tell server_var(cvb_playerid) #multi #lightgreen[clanvoteban]#green An ongoing vote has to be finished first!
		}
		else do
		{
			es_xset cvb_playername "unknown"
			es_getplayername cvb_playername server_var(cvb_playerid)
es_log "clanvoteban:start_votekick:" server_var(cvb_playerid) server_var(cvb_playername)

			es_xset cvb_player_count 0
			es_xdoblock clanvoteban/create_player_list
			if( server_var(cvb_player_count) > 0 ) do
			{
				es_xset cvb_kick_or_ban 1  //0=ban,1=kick
				es_xdoblock clanvoteban/show_player_menu
			}
			else do
			{
				es_tell server_var(cvb_playerid) #multi #lightgreen[clanvoteban]#green Nobody to kick online
			}
		}
	}
}

block load
{
	es_load corelib
	es_load popup
	es_load keymenu

	es_xset cvb_voteban_running 0

	es_xset cvb_member_count 0
	es_xset cvb_admin_count 0
	es_xset cvb_yes_count 0
	es_xset cvb_no_count 0
	es_xset cvb_abstain_count 0
	es_xset cvb_force_yes_count 0
	es_xset cvb_force_no_count 0
	es_xset cvb_timeout_count 0
	es_xset cvb_cancel_count 0
	es_xset cvb_vote_count 0

	es_xset cvb_kick_or_ban 0  //0=ban,1=kick

	es_xdoblock clanvoteban/config

	es_xkeygroupload cvb_members |clanvoteban
	es_xkeygroupload cvb_admin_vote_menu_items |clanvoteban
	es_xkeygroupload cvb_vote_menu_items |clanvoteban

	es clientcmd create say server_var(cvb_start_votekick) "clanvoteban/start_votekick" "start_cvk" #all
	es clientcmd create say server_var(cvb_start_voteban) "clanvoteban/start_voteban" "start_cvb" #all

}


