"""Channel management: kick, ban, unban, topic, mode, invite-join.""" import logging from derp.plugin import command, event log = logging.getLogger(__name__) def _require_channel(message): """Return True if the message originated in a channel.""" return message.is_channel @command("kick", help="Kick a user: !kick [reason]", admin=True) async def cmd_kick(bot, message): """Kick a user from the current channel.""" if not _require_channel(message): await bot.reply(message, "Must be used in a channel") return parts = message.text.split(None, 2) if len(parts) < 2: await bot.reply(message, "Usage: !kick [reason]") return nick = parts[1] reason = parts[2] if len(parts) > 2 else "" await bot.kick(message.target, nick, reason) @command("ban", help="Ban a hostmask: !ban ", admin=True) async def cmd_ban(bot, message): """Set +b on a hostmask in the current channel.""" if not _require_channel(message): await bot.reply(message, "Must be used in a channel") return parts = message.text.split(None, 1) if len(parts) < 2: await bot.reply(message, "Usage: !ban ") return mask = parts[1] await bot.mode(message.target, "+b", mask) @command("unban", help="Remove a ban: !unban ", admin=True) async def cmd_unban(bot, message): """Remove +b from a hostmask in the current channel.""" if not _require_channel(message): await bot.reply(message, "Must be used in a channel") return parts = message.text.split(None, 1) if len(parts) < 2: await bot.reply(message, "Usage: !unban ") return mask = parts[1] await bot.mode(message.target, "-b", mask) @command("topic", help="Set or query channel topic: !topic [text]", admin=True) async def cmd_topic(bot, message): """Set or query the channel topic.""" if not _require_channel(message): await bot.reply(message, "Must be used in a channel") return parts = message.text.split(None, 1) if len(parts) < 2: # Query current topic from derp.irc import format_msg await bot.conn.send(format_msg("TOPIC", message.target)) else: await bot.set_topic(message.target, parts[1]) @command("mode", help="Set channel mode: !mode [args]", admin=True) async def cmd_mode(bot, message): """Set a mode on the current channel.""" if not _require_channel(message): await bot.reply(message, "Must be used in a channel") return parts = message.text.split(None) if len(parts) < 2: await bot.reply(message, "Usage: !mode [args]") return mode_str = parts[1] args = parts[2:] await bot.mode(message.target, mode_str, *args) @event("INVITE") async def on_invite(bot, message): """Join a channel when invited by an admin or IRC operator.""" if not bot._is_admin(message): log.info("ignoring invite from non-admin %s", message.nick) return channel = message.params[1] if len(message.params) > 1 else None if not channel: return log.info("accepting invite to %s from %s", channel, message.nick) await bot.join(channel)