added a way for a command callback to neatly ask to only be available for people with a rank or above, added a channel_op module to utilise this.

This commit is contained in:
jesopo 2016-04-18 16:50:19 +01:00
parent 100fad4599
commit 1127682872
No known key found for this signature in database
GPG key ID: 0BBDEB2AEFCFFCB3
3 changed files with 66 additions and 0 deletions

View file

@ -26,6 +26,8 @@ class Channel(object):
self.users.add(user) self.users.add(user)
def remove_user(self, user): def remove_user(self, user):
self.users.remove(user) self.users.remove(user)
def has_user(self, user):
return user in self.users
def add_mode(self, mode, args=None): def add_mode(self, mode, args=None):
if not mode in self.modes: if not mode in self.modes:
self.modes[mode] = set([]) self.modes[mode] = set([])
@ -59,6 +61,11 @@ class Channel(object):
self.server.send_message(self.name, text) self.server.send_message(self.name, text)
def send_mode(self, mode=None, target=None): def send_mode(self, mode=None, target=None):
self.server.send_mode(self.name, mode, target) self.server.send_mode(self.name, mode, target)
def send_kick(self, target, reason=None):
self.server.send_kick(self.name, target, reason)
def send_ban(self, hostmask):
self.server.send_mode(self.name, "+b", hostmask)
def mode_or_above(self, nickname, mode): def mode_or_above(self, nickname, mode):
mode_orders = list(self.server.mode_prefixes.values()) mode_orders = list(self.server.mode_prefixes.values())
mode_index = mode_orders.index(mode) mode_index = mode_orders.index(mode)

44
modules/channel_op.py Normal file
View file

@ -0,0 +1,44 @@
class Module(object):
_name = "Channel Op"
def __init__(self, bot):
self.bot = bot
bot.events.on("received").on("command").on("kick", "k"
).hook(self.kick, channel_only=True, require_mode="o",
min_args=1)
bot.events.on("received").on("command").on("ban"
).hook(self.ban, channel_only=True, require_mode="o",
min_args=1)
bot.events.on("received").on("command").on("kickban", "kb"
).hook(self.kickban, channel_only=True, require_mode="o",
min_args=1)
def kick(self, event):
target = event["args_split"][0]
target_user = event["server"].get_user(target)
if event["args_split"][1:]:
reason = " ".join(event["args_split"][1:])
else:
reason = None
event["stderr"].set_prefix("Kick")
if event["target"].has_user(target_user):
if not event["server"].is_own_nickname(target):
event["target"].send_kick(target, reason)
else:
event["stderr"].write("Nope.")
else:
event["stderr"].write("That user is not in this channel")
def ban(self, event):
target_user = event["server"].get_user(event["args_split"][0])
if event["target"].has_user(target_user):
event["target"].send_ban("*!%s@%s" % (target_user.username,
target_user.hostname))
else:
event["target"].send_ban(event["args_split"][0])
def kickban(self, event):
if event["server"].has_user(event["args_split"][0]):
self.ban(event)
self.kick(event)

15
modules/check_mode.py Normal file
View file

@ -0,0 +1,15 @@
class Module(object):
def __init__(self, bot):
self.bot = bot
bot.events.on("preprocess").on("command").hook(
self.preprocess_command)
def preprocess_command(self, event):
if event["is_channel"] and event["hook"].kwargs.get(
"require_mode"):
required_mode = event["hook"].kwargs.get("require_mode")[0]
if not event["target"].mode_or_above(event["user"].nickname,
required_mode):
return "You do not have permission to do this"