def get_ban_arguments(connection, args): """ Parses duration and reason from arguments. It handles duration in two ways: interger mintues and human-friendly duration. It also handles cases where duration or reason are none. Note: It returns duration in seconds. """ default_duration = connection.protocol.default_ban_time reason = None if len(args) < 1: return default_duration, reason if len(args) > 1: reason = join_arguments(args[1:]) if args[0] == "perma": return None, reason if args[0].isdigit(): # all digits == duration in minutes duration = int(args[0]) * 60 elif has_digits(args[0]): # if it contains some digits maybe duration? duration = timeparse(args[0]) if not duration: raise ValueError("Invalid duration") else: # maybe just one long reason duration = default_duration reason = join_arguments(args[:]) return duration, reason
def start_votekick(connection, *args): protocol = connection.protocol if connection not in protocol.players: raise KeyError() player = connection if not protocol.votekick_enabled: return S_VOTEKICKING_DISABLED if not player.votekick_enabled: return S_VOTEKICK_DISALLOWED if not args: if protocol.votekick: # player requested votekick info protocol.votekick.send_chat_update(player) return raise ValueError() value = args[0] victim = get_player(protocol, value) reason = join_arguments(args[1:]) try: # attempt to start votekick votekick = Votekick.start(player, victim, reason) protocol.votekick = votekick except VotekickFailure as err: return str(err)
def start_votekick(connection, *args): protocol = connection.protocol if connection not in protocol.players: raise KeyError() player = connection if not args: if protocol.votekick: # player requested votekick info protocol.votekick.send_chat_update(player) return raise ValueError() value = args[0] try: # vanilla aos behavior victim = get_player(protocol, '#' + value) except InvalidPlayer: victim = get_player(protocol, value) reason = join_arguments(args[1:]) try: # attempt to start votekick votekick = Votekick.start(player, victim, reason) protocol.votekick = votekick except VotekickFailure as err: return str(err)
def start_votekick(connection, *args): """ Starts an votekick against a player /votekick <player name or id> <reason> """ protocol = connection.protocol player = connection if not protocol.votekick_enabled: return S_VOTEKICKING_DISABLED if not player.votekick_enabled: return S_VOTEKICK_DISALLOWED if not args: if protocol.votekick: # player requested votekick info protocol.votekick.send_chat_update(player) return raise ValueError("Target player is required") value = args[0] victim = get_player(protocol, value) reason = join_arguments(args[1:]) try: # attempt to start votekick votekick = Votekick.start(player, victim, reason) protocol.votekick = votekick except VotekickFailure as err: return str(err)
def wban(connection, value, *arg): """ Ban a given player for one week /wban <player> [reason] """ duration = timeparse("1week") reason = join_arguments(arg) player = get_player(connection.protocol, value) player.ban(reason, duration)
def hban(connection, value, *arg): """ Ban a given player for an hour /hban <player> [reason] """ duration = timeparse("1hour") reason = join_arguments(arg) player = get_player(connection.protocol, value) player.ban(reason, duration)
def kick(connection, value, *arg): """ Kick a given player /kick <player> Player is the #ID of the player, or an unique part of their name """ reason = join_arguments(arg) player = get_player(connection.protocol, value) player.kick(reason)
def pban(connection, value, *arg): """ Ban a given player permanently /pban <player> [reason] """ duration = 0 reason = join_arguments(arg) player = get_player(connection.protocol, value) player.ban(reason, duration)
def dban(connection, value, *arg): """ Ban a given player for one day /dban <player> [reason] """ duration = 1440 reason = join_arguments(arg) player = get_player(connection.protocol, value) player.ban(reason, duration)
def pm(connection, value, *arg): """ Send a private message to a given player /pm <player> <message> """ player = get_player(connection.protocol, value) message = join_arguments(arg) if len(message) == 0: return "Please specify your message" player.send_chat('PM from %s: %s' % (connection.name, message)) return 'PM sent to %s' % player.name
def get_ban_arguments(connection, arg): duration = None if len(arg): try: duration = int(arg[0]) arg = arg[1:] except (IndexError, ValueError): pass if duration is None: if len(arg) > 0 and arg[0] == "perma": arg = arg[1:] else: duration = connection.protocol.default_ban_time reason = join_arguments(arg) return duration, reason
def timed_mute(connection, *args): protocol = connection.protocol nick = args[0] time = int(args[1]) reason = join_arguments(args[2:]) player = get_player(protocol, nick) if time < 0: raise ValueError() if not player.mute: TimedMute(player, time, reason) else: return '%s is already muted!' % nick
def server_name(connection, *arg): """ Change the server name until it restarts /servername <new-name> Also affects the master list """ name = join_arguments(arg) protocol = connection.protocol protocol.set_server_name(name) message = "%s changed servername to '%s'" % (connection.name, name) log.info(message) connection.protocol.irc_say("* " + message) if connection in connection.protocol.players: return message return None
def timed_mute(connection, *args): protocol = connection.protocol if len(args) < 3: return '/tm <nick> <time> <reason>' nick = args[0] time = int(args[1]) reason = join_arguments(args[2:]) player = get_player(protocol, nick) if time < 0: raise ValueError("Time cannot be < 0") if not player.mute: TimedMute(player, time, reason) else: return '%s is already muted!' % nick
def to_admin(connection, *arg): """ Send a message to all admins currently online /admin <message> """ protocol = connection.protocol message = join_arguments(arg) if not message: return "Enter a message you want to send, like /admin I'm stuck" prefix = '(TO ADMINS)' irc_relay = protocol.irc_relay if irc_relay: if irc_relay.factory.bot and irc_relay.factory.bot.colors: prefix = '\x0304' + prefix + '\x0f' irc_relay.send(prefix + ' <%s> %s' % (connection.name, message)) for player in protocol.players.values(): if player.admin and player is not connection: player.send_chat('To ADMINS from %s: %s' % (connection.name, message)) return 'Message sent to all admins currently online'