from src import ModuleManager, utils

REASON = "User is banned from this channel"

@utils.export("channelset", utils.BoolSetting("ban-enforce",
    "Whether or not to parse new bans and kick who they affect"))
@utils.export("channelset", utils.IntSetting("ban-enforce-max",
    "Do not enforce ban if the ban effects more than this many users. Default is half of total channel users."))
class Module(ModuleManager.BaseModule):
    @utils.hook("received.mode.channel")
    def on_mode(self, event):
        if event["channel"].get_setting("ban-enforce", False):
            bans = []
            kicks = set([])
            for mode, arg in event["modes"]:
                if mode[0] == "+" and mode[1] == "b":
                    bans.append(arg)

            affected = 0
            defaultmax = len(event["channel"].users) // 2
            realmax = event["channel"].get_setting("ban-enforce-max", defaultmax)
            
            if bans:
                umasks = {u.hostmask(): u for u in event["channel"].users}
                for ban in bans:
                    mask = utils.irc.hostmask_parse(ban)
                    matches = list(utils.irc.hostmask_match_many(
                        umasks.keys(), mask))
                    for match in matches:
                        affected = affected + 1
                        kicks.add(umasks[match])
            if kicks:
                if affected > realmax:
                    return
                nicks = [u.nickname for u in kicks]
                event["channel"].send_kicks(sorted(nicks), REASON)