End Vote system

This commit is contained in:
Ayush Saini 2022-05-08 15:22:27 +05:30
parent db6bad9f59
commit a2c7b303d0
4 changed files with 154 additions and 72 deletions

View file

@ -5,40 +5,44 @@ from serverData import serverdata
from chatHandle.ChatCommands import Main from chatHandle.ChatCommands import Main
from tools import logger, servercheck from tools import logger, servercheck
from chatHandle.chatFilter import ChatFilter from chatHandle.chatFilter import ChatFilter
from features import EndVote
import ba, _ba import ba, _ba
import setting import setting
settings = setting.get_settings_data() settings = setting.get_settings_data()
def filter_chat_message(msg, client_id):
if client_id ==-1: def filter_chat_message(msg, client_id):
if client_id == -1:
if msg.startswith("/"): if msg.startswith("/"):
Main.Command(msg,client_id) Main.Command(msg, client_id)
return None return None
return msg return msg
acid="" acid = ""
displaystring="" displaystring = ""
currentname="" currentname = ""
for i in _ba.get_game_roster(): for i in _ba.get_game_roster():
if i['client_id'] == client_id: if i['client_id'] == client_id:
acid = i['account_id'] acid = i['account_id']
try: try:
currentname=i['players'][0]['name_full'] currentname = i['players'][0]['name_full']
except: except:
currentname="<in-lobby>" currentname = "<in-lobby>"
displaystring=i['display_string'] displaystring = i['display_string']
if acid: if acid:
msg=ChatFilter.filter(msg,acid,client_id) msg = ChatFilter.filter(msg, acid, client_id)
if msg.startswith("/"): if msg.startswith("/"):
return Main.Command(msg, client_id) return Main.Command(msg, client_id)
if msg.startswith(",") and settings["allowTeamChat"]: if msg.startswith(",") and settings["allowTeamChat"]:
return Main.QuickAccess(msg,client_id) return Main.QuickAccess(msg, client_id)
logger.log(acid+" | "+displaystring+"|"+currentname+"| " +msg,"chat") if msg == "end" and settings["allowEndVote"]:
EndVote.vote_end(acid, client_id)
logger.log(acid + " | " + displaystring + "|" + currentname + "| " + msg, "chat")
if acid in serverdata.clients and serverdata.clients[acid]["verified"]: if acid in serverdata.clients and serverdata.clients[acid]["verified"]:
@ -59,4 +63,3 @@ def filter_chat_message(msg, client_id):
else: else:
_ba.screenmessage("Fetching your account info , Wait a minute", transient=True, clients=[client_id]) _ba.screenmessage("Fetching your account info , Wait a minute", transient=True, clients=[client_id])
return None return None

View file

@ -14,6 +14,7 @@ from datetime import datetime
import _thread import _thread
import importlib import importlib
import time
import os import os
import ba import ba
import _ba import _ba
@ -29,11 +30,11 @@ from stats import mystats
from spazmod import modifyspaz from spazmod import modifyspaz
from tools import servercheck, ServerUpdate, logger from tools import servercheck, ServerUpdate, logger
from playersData import pdata from playersData import pdata
from features import EndVote
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Optional, Any from typing import Optional, Any
settings = setting.get_settings_data() settings = setting.get_settings_data()
@ -72,9 +73,9 @@ def bootstraping():
_ba.set_kickvote_msg_type(settings["KickVoteMsgType"]) _ba.set_kickvote_msg_type(settings["KickVoteMsgType"])
# check for auto update stats # check for auto update stats
_thread.start_new_thread(mystats.refreshStats,()) _thread.start_new_thread(mystats.refreshStats, ())
pdata.load_cache() pdata.load_cache()
_thread.start_new_thread(pdata.dump_cache,()) _thread.start_new_thread(pdata.dump_cache, ())
# import plugins # import plugins
if settings["elPatronPowerups"]["enable"]: if settings["elPatronPowerups"]["enable"]:
@ -108,65 +109,73 @@ def import_discord_bot() -> None:
"""Imports the discord bot.""" """Imports the discord bot."""
if settings["discordbot"]["enable"]: if settings["discordbot"]["enable"]:
from features import discord_bot from features import discord_bot
discord_bot.token=settings["discordbot"]["token"] discord_bot.token = settings["discordbot"]["token"]
discord_bot.liveStatsChannelID=settings["discordbot"]["liveStatsChannelID"] discord_bot.liveStatsChannelID = settings["discordbot"]["liveStatsChannelID"]
discord_bot.logsChannelID=settings["discordbot"]["logsChannelID"] discord_bot.logsChannelID = settings["discordbot"]["logsChannelID"]
discord_bot.liveChat=settings["discordbot"]["liveChat"] discord_bot.liveChat = settings["discordbot"]["liveChat"]
discord_bot.BsDataThread() discord_bot.BsDataThread()
discord_bot.init() discord_bot.init()
def import_games(): def import_games():
"""Imports the custom games from games directory.""" """Imports the custom games from games directory."""
import sys import sys
sys.path.append(_ba.env()['python_directory_user']+os.sep+"games") sys.path.append(_ba.env()['python_directory_user'] + os.sep + "games")
games=os.listdir("ba_root/mods/games") games = os.listdir("ba_root/mods/games")
for game in games: for game in games:
if game.endswith(".so"): if game.endswith(".so"):
importlib.import_module("games."+game.replace(".so","")) importlib.import_module("games." + game.replace(".so", ""))
maps=os.listdir("ba_root/mods/maps") maps = os.listdir("ba_root/mods/maps")
for _map in maps: for _map in maps:
if _map.endswith(".py") or _map.endswith(".so"): if _map.endswith(".py") or _map.endswith(".so"):
importlib.import_module("maps."+_map.replace(".so","").replace(".py","")) importlib.import_module("maps." + _map.replace(".so", "").replace(".py", ""))
def import_dual_team_score() -> None: def import_dual_team_score() -> None:
"""Imports the dual team score.""" """Imports the dual team score."""
if settings["newResultBoard"]: if settings["newResultBoard"]:
dualteamscore.TeamVictoryScoreScreenActivity= newdts.TeamVictoryScoreScreenActivity dualteamscore.TeamVictoryScoreScreenActivity = newdts.TeamVictoryScoreScreenActivity
multiteamscore.MultiTeamScoreScreenActivity.show_player_scores = newdts.show_player_scores multiteamscore.MultiTeamScoreScreenActivity.show_player_scores = newdts.show_player_scores
drawscore.DrawScoreScreenActivity=newdts.DrawScoreScreenActivity drawscore.DrawScoreScreenActivity = newdts.DrawScoreScreenActivity
org_begin = ba._activity.Activity.on_begin org_begin = ba._activity.Activity.on_begin
def new_begin(self): def new_begin(self):
"""Runs when game is began.""" """Runs when game is began."""
org_begin(self) org_begin(self)
night_mode() night_mode()
EndVote.voters = []
EndVote.game_started_on = time.time()
ba._activity.Activity.on_begin = new_begin ba._activity.Activity.on_begin = new_begin
org_end = ba._activity.Activity.end
org_end=ba._activity.Activity.end
def new_end(self,results:Any=None,delay:float=0.0,force:bool=False): def new_end(self, results: Any = None, delay: float = 0.0, force: bool = False):
"""Runs when game is ended.""" """Runs when game is ended."""
activity=_ba.get_foreground_host_activity() activity = _ba.get_foreground_host_activity()
if isinstance(activity,CoopScoreScreen): if isinstance(activity, CoopScoreScreen):
team_balancer.checkToExitCoop() team_balancer.checkToExitCoop()
org_end(self,results,delay,force) org_end(self, results, delay, force)
ba._activity.Activity.end=new_end
org_player_join=ba._activity.Activity.on_player_join ba._activity.Activity.end = new_end
org_player_join = ba._activity.Activity.on_player_join
def on_player_join(self, player) -> None: def on_player_join(self, player) -> None:
"""Runs when player joins the game.""" """Runs when player joins the game."""
team_balancer.on_player_join() team_balancer.on_player_join()
org_player_join(self,player) org_player_join(self, player)
ba._activity.Activity.on_player_join=on_player_join
ba._activity.Activity.on_player_join = on_player_join
def night_mode() -> None: def night_mode() -> None:
@ -174,9 +183,9 @@ def night_mode() -> None:
if settings['autoNightMode']['enable']: if settings['autoNightMode']['enable']:
start=datetime.strptime(settings['autoNightMode']['startTime'],"%H:%M") start = datetime.strptime(settings['autoNightMode']['startTime'], "%H:%M")
end=datetime.strptime(settings['autoNightMode']['endTime'],"%H:%M") end = datetime.strptime(settings['autoNightMode']['endTime'], "%H:%M")
now=datetime.now() now = datetime.now()
if now.time() > start.time() or now.time() < end.time(): if now.time() > start.time() or now.time() < end.time():
activity = _ba.get_foreground_host_activity() activity = _ba.get_foreground_host_activity()
@ -187,8 +196,7 @@ def night_mode() -> None:
fire_flies.factory(settings['autoNightMode']["fireflies_random_color"]) fire_flies.factory(settings['autoNightMode']["fireflies_random_color"])
def kick_vote_started(started_by: str, started_to: str) -> None:
def kick_vote_started(started_by: str,started_to: str) -> None:
"""Logs the kick vote.""" """Logs the kick vote."""
logger.log(f"{started_by} started kick vote for {started_to}.") logger.log(f"{started_by} started kick vote for {started_to}.")
@ -203,5 +211,5 @@ def on_kick_vote_end():
logger.log("Kick vote End") logger.log("Kick vote End")
_hooks.kick_vote_started=kick_vote_started _hooks.kick_vote_started = kick_vote_started
_hooks.on_kicked=on_kicked _hooks.on_kicked = on_kicked

70
dist/ba_root/mods/features/EndVote.py vendored Normal file
View file

@ -0,0 +1,70 @@
import _ba, ba
import time
"""
End Vote by mr.smoothy
with no timer and minimum message
for BCS scripts only
"""
last_end_vote_start_time = 0
end_vote_duration = 30
game_started_on = 0
min_game_duration_to_start_end_vote = 60
voters = []
def vote_end(pb_id, client_id):
global voters
global last_end_vote_start_time
now = time.time()
if now > last_end_vote_start_time + end_vote_duration:
voters = []
last_end_vote_start_time = now
if now < game_started_on + min_game_duration_to_start_end_vote:
_ba.screenmessage("Seems game just started, Try again after some time", transient=True,
clients=[client_id])
if len(voters) == 0:
_ba.chatmessage("end vote started")
# clean up voters list
active_players = []
for player in _ba.get_game_roster():
active_players.append(player['account_id'])
for voter in voters:
if voter not in active_players:
voters.remove(voter)
if pb_id not in voters:
voters.append(pb_id)
_ba.screenmessage("Thanks for vote , encourage other players to type 'end' too.", transient=True,
clients=[client_id])
if len(voters) >= required_votes(len(active_players)):
_ba.chatmessage("end vote succeed")
try:
with _ba.Context(_ba.get_foreground_host_activity()):
_ba.get_foreground_host_activity().end_game()
except:
pass
elif required_votes(len(active_players)) - len(
voters) == 3: # lets dont spam chat/screen message with votes required , only give message when only 3 votes left
_ba.chatmessage("3 more end votes required")
def required_votes(players):
if players == 2:
return 2
elif players == 3:
return 3
elif players == 4:
return 2
elif players == 5:
return 3
elif players == 6:
return 3
elif players == 7:
return 4
elif players == 8:
return 4
else:
return players - 3

View file

@ -87,6 +87,7 @@
"lobby_idle_time_in_secs":10 "lobby_idle_time_in_secs":10
}, },
"allowTeamChat":true, "allowTeamChat":true,
"allowEndVote":true,
"sameCharacterForTeam":false, "sameCharacterForTeam":false,
"newResultBoard":true, "newResultBoard":true,
"HostDeviceName":"v1.4", "HostDeviceName":"v1.4",