From 541cb46e130e08fdb82c22ad43e8e34f94722a78 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 7 Jun 2019 15:53:07 -0400 Subject: [PATCH] track users in both user and channel classes --- sopel_modules/SpiceBot/Channels.py | 77 +++++++++++++++++++ .../SpiceBot_Core_Processing/Channels.py | 30 ++++++++ 2 files changed, 107 insertions(+) diff --git a/sopel_modules/SpiceBot/Channels.py b/sopel_modules/SpiceBot/Channels.py index ddf89ce..cbe46ab 100644 --- a/sopel_modules/SpiceBot/Channels.py +++ b/sopel_modules/SpiceBot/Channels.py @@ -4,12 +4,14 @@ from __future__ import unicode_literals, absolute_import, division, print_functi This is the SpiceBot Channels system. """ import sopel +from sopel.tools import Identifier from sopel.config.types import StaticSection, ValidatedAttribute, ListAttribute import re import threading from .Config import config as botconfig +from .Database import db as botdb class SpiceBot_Channels_MainSection(StaticSection): @@ -95,5 +97,80 @@ class BotChannels(): else: bot.part(channel) + def whois(self, nick): + nick = Identifier(nick) + nick_id = botdb.db.get_nick_id(nick, create=True) + return nick_id + + def add_to_channel(self, channel, nick, nick_id=None): + if not nick_id: + nick_id = self.whois(nick) + if nick_id not in self.dict['list'][channel.lower()]['users']: + self.dict['list'][channel.lower()]['users'].append(nick_id) + + def remove_from_channel(self, channel, nick, nick_id=None): + if not nick_id: + nick_id = self.whois(nick) + if nick_id in self.dict['list'][channel.lower()]['users']: + self.dict['list'][channel.lower()]['users'].remove(nick_id) + + def remove_all_from_channel(self, channel): + self.dict['list'][channel.lower()]['users'] = [] + + def join(self, bot, trigger): + # bot block + if trigger.nick == bot.nick: + for user in bot.channels[trigger.sender].privileges.keys(): + self.add_to_channel(self, trigger.sender, user) + return + # Identify + nick_id = self.whois(trigger.nick) + # Verify nick is in the channel list + self.add_to_channel(self, trigger.sender, trigger.nick, nick_id) + + def quit(self, bot, trigger): + # bot block + if trigger.nick == bot.nick: + self.remove_all_from_channel(trigger.sender) + return + # Identify + nick_id = self.whois(trigger.nick) + # Verify nick is not in the channel list + self.remove_from_channel(self, trigger.sender, trigger.nick, nick_id) + + def part(self, bot, trigger): + # bot block + if trigger.nick == bot.nick: + self.remove_all_from_channel(trigger.sender) + return + # Identify + nick_id = self.whois(trigger.nick) + # Verify nick is not in the channel list + self.remove_from_channel(self, trigger.sender, trigger.nick, nick_id) + + def kick(self, bot, trigger): + targetnick = Identifier(str(trigger.args[1])) + # bot block + if targetnick == bot.nick: + self.remove_all_from_channel(trigger.sender) + return + # Identify + nick_id = self.whois(targetnick) + # Verify nick is not in the channel list + self.remove_from_channel(self, trigger.sender, targetnick, nick_id) + + def nick(self, bot, trigger): + newnick = Identifier(trigger) + # bot block + if trigger.nick == bot.nick or newnick == bot.nick: + return + # alias the nick + if not botdb.check_nick_id(newnick): + botdb.alias_nick(trigger.nick, newnick) + # Identify + nick_id = self.whois(newnick) + # Verify nick is in the channel list + self.add_to_channel(self, trigger.sender, trigger.nick, nick_id) + channels = BotChannels() diff --git a/sopel_modules/SpiceBot_Core_Processing/Channels.py b/sopel_modules/SpiceBot_Core_Processing/Channels.py index 927b513..bd44c41 100644 --- a/sopel_modules/SpiceBot_Core_Processing/Channels.py +++ b/sopel_modules/SpiceBot_Core_Processing/Channels.py @@ -95,3 +95,33 @@ def trigger_channel_list_recurring(bot, trigger): if "*" in SpiceBot.channels.dict['list'].keys(): del SpiceBot.channels.dict['list']["*"] SpiceBot.channels.bot_part_empty(bot) + + +@sopel.module.event('JOIN') +@sopel.module.rule('.*') +def channels_users_join(bot, trigger): + SpiceBot.channels.join(bot, trigger) + + +@sopel.module.event('QUIT') +@sopel.module.rule('.*') +def channels_users_quit(bot, trigger): + SpiceBot.channels.quit(bot, trigger) + + +@sopel.module.event('PART') +@sopel.module.rule('.*') +def channels_users_part(bot, trigger): + SpiceBot.channels.part(bot, trigger) + + +@sopel.module.event('KICK') +@sopel.module.rule('.*') +def channels_users_kick(bot, trigger): + SpiceBot.channels.kick(bot, trigger) + + +@sopel.module.event('NICK') +@sopel.module.rule('.*') +def channels_users_nick(bot, trigger): + SpiceBot.channels.nick(bot, trigger)