mirror of
https://github.com/iio612/DEFENDER.git
synced 2026-02-13 11:14:23 +00:00
164 lines
5.9 KiB
Python
164 lines
5.9 KiB
Python
from typing import TYPE_CHECKING, Literal, Optional
|
|
from mods.votekick.schemas import VoteChannelModel
|
|
|
|
if TYPE_CHECKING:
|
|
from mods.votekick.mod_votekick import Votekick
|
|
|
|
class VotekickManager:
|
|
|
|
VOTE_CHANNEL_DB:list[VoteChannelModel] = []
|
|
|
|
def __init__(self, uplink: 'Votekick'):
|
|
self.uplink = uplink
|
|
self.Logs = uplink.ctx.Logs
|
|
self.Utils = uplink.ctx.Utils
|
|
|
|
def activate_new_channel(self, channel_name: str) -> bool:
|
|
"""Activate a new channel in the votekick systeme
|
|
|
|
Args:
|
|
channel_name (str): The channel name you want to activate
|
|
|
|
Returns:
|
|
bool: True if it was activated
|
|
"""
|
|
votec = self.get_vote_channel_model(channel_name)
|
|
|
|
if votec is None:
|
|
self.VOTE_CHANNEL_DB.append(
|
|
VoteChannelModel(
|
|
channel_name=channel_name,
|
|
target_user='',
|
|
voter_users=[],
|
|
vote_for=0,
|
|
vote_against=0
|
|
)
|
|
)
|
|
self.Logs.debug(f"[VOTEKICK MANAGER] {channel_name} has been activated.")
|
|
return True
|
|
|
|
return False
|
|
|
|
def init_vote_system(self, channel_name: str) -> bool:
|
|
"""Initializes or resets the votekick system for a given channel.
|
|
|
|
This method clears the current target, voter list, and vote counts
|
|
in preparation for a new votekick session.
|
|
|
|
Args:
|
|
channel_name (str): The name of the channel for which the votekick system should be initialized.
|
|
|
|
Returns:
|
|
bool: True if the votekick system was successfully initialized, False if the channel is not found.
|
|
"""
|
|
votec = self.get_vote_channel_model(channel_name)
|
|
|
|
if votec is None:
|
|
self.Logs.debug(f"[VOTEKICK MANAGER] The channel ({channel_name}) is not active!")
|
|
return False
|
|
|
|
votec.target_user = ''
|
|
votec.voter_users = []
|
|
votec.vote_for = 0
|
|
votec.vote_against = 0
|
|
self.Logs.debug(f"[VOTEKICK MANAGER] The channel ({channel_name}) has been successfully initialized!")
|
|
return True
|
|
|
|
def get_vote_channel_model(self, channel_name: str) -> Optional[VoteChannelModel]:
|
|
"""Get Vote Channel Object model
|
|
|
|
Args:
|
|
channel_name (str): The channel name you want to activate
|
|
|
|
Returns:
|
|
(VoteChannelModel | None): The VoteChannelModel if exist
|
|
"""
|
|
for vote in self.VOTE_CHANNEL_DB:
|
|
if vote.channel_name.lower() == channel_name.lower():
|
|
self.Logs.debug(f"[VOTEKICK MANAGER] {channel_name} has been found in the VOTE_CHANNEL_DB")
|
|
return vote
|
|
|
|
return None
|
|
|
|
def drop_vote_channel_model(self, channel_name: str) -> bool:
|
|
"""Drop a channel from the votekick system.
|
|
|
|
Args:
|
|
channel_name (str): The channel name you want to drop
|
|
|
|
Returns:
|
|
bool: True if the channel has been droped.
|
|
"""
|
|
votec = self.get_vote_channel_model(channel_name)
|
|
|
|
if votec:
|
|
self.VOTE_CHANNEL_DB.remove(votec)
|
|
self.Logs.debug(f"[VOTEKICK MANAGER] {channel_name} has been removed from the VOTE_CHANNEL_DB")
|
|
return True
|
|
|
|
return False
|
|
|
|
def is_vote_ongoing(self, channel_name: str) -> bool:
|
|
"""Check if there is an angoing vote on the channel provided
|
|
|
|
Args:
|
|
channel_name (str): The channel name to check
|
|
|
|
Returns:
|
|
bool: True if there is an ongoing vote on the channel provided.
|
|
"""
|
|
|
|
votec = self.get_vote_channel_model(channel_name)
|
|
|
|
if votec is None:
|
|
self.Logs.debug(f"[VOTEKICK MANAGER] {channel_name} is not activated!")
|
|
return False
|
|
|
|
if votec.target_user:
|
|
self.Logs.debug(f'[VOTEKICK MANAGER] A vote is ongoing on {channel_name}')
|
|
return True
|
|
|
|
self.Logs.debug(f'[VOTEKICK MANAGER] {channel_name} is activated but there is no ongoing vote!')
|
|
|
|
return False
|
|
|
|
def action_vote(self, channel_name: str, nickname: str, action: Literal['+', '-']) -> bool:
|
|
"""
|
|
Registers a vote (for or against) in an active votekick session on a channel.
|
|
|
|
Args:
|
|
channel_name (str): The name of the channel where the votekick session is active.
|
|
nickname (str): The nickname of the user casting the vote.
|
|
action (Literal['+', '-']): The vote action. Use '+' to vote for kicking, '-' to vote against.
|
|
|
|
Returns:
|
|
bool: True if the vote was successfully registered, False otherwise.
|
|
This can fail if:
|
|
- The action is invalid (not '+' or '-')
|
|
- The user has already voted
|
|
- The channel has no active votekick session
|
|
"""
|
|
if action not in ['+', '-']:
|
|
self.Logs.debug(f"[VOTEKICK MANAGER] The action must be + or - while you have provided ({action})")
|
|
return False
|
|
votec = self.get_vote_channel_model(channel_name)
|
|
|
|
if votec:
|
|
client_obj = self.uplink.User.get_user(votec.target_user)
|
|
client_to_punish = votec.target_user if client_obj is None else client_obj.nickname
|
|
if nickname in votec.voter_users:
|
|
self.Logs.debug(f"[VOTEKICK MANAGER] This nickname ({nickname}) has already voted for ({client_to_punish})")
|
|
return False
|
|
else:
|
|
if action == '+':
|
|
votec.vote_for += 1
|
|
elif action == '-':
|
|
votec.vote_against += 1
|
|
|
|
votec.voter_users.append(nickname)
|
|
self.Logs.debug(f"[VOTEKICK MANAGER] The ({nickname}) has voted to ban ({client_to_punish})")
|
|
return True
|
|
else:
|
|
self.Logs.debug(f"[VOTEKICK MANAGER] This channel {channel_name} is not active!")
|
|
return False
|