From dac8673607e4c18ad4ef8c1ae8e6746589a639e4 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sat, 8 Jun 2019 13:32:10 -0400 Subject: [PATCH 1/8] test ID --- sopel_modules/SpiceBot/Tools.py | 8 ++ sopel_modules/SpiceBot/Users.py | 197 +++++++++++++++++--------------- 2 files changed, 110 insertions(+), 95 deletions(-) diff --git a/sopel_modules/SpiceBot/Tools.py b/sopel_modules/SpiceBot/Tools.py index 7942a60..4f44c47 100644 --- a/sopel_modules/SpiceBot/Tools.py +++ b/sopel_modules/SpiceBot/Tools.py @@ -237,6 +237,14 @@ def letters_in_string(text): return False +def is_number(n): + try: + float(n) + except ValueError: + return False + return True + + """Channel Functions""" diff --git a/sopel_modules/SpiceBot/Users.py b/sopel_modules/SpiceBot/Users.py index 95c2f03..1ea11aa 100644 --- a/sopel_modules/SpiceBot/Users.py +++ b/sopel_modules/SpiceBot/Users.py @@ -4,39 +4,45 @@ from __future__ import unicode_literals, absolute_import, division, print_functi from sopel.tools import Identifier -from .Database import db as botdb +from .Database import db as botdb, +from .Tools import is_number + +# TODO timestamp for new .seen class BotUsers(): def __init__(self): - # TODO timestamp for new .seen - self.all = botdb.get_bot_value('users') or dict() - self.online = [] - self.offline = [] - for user_id in list(self.all.keys()): - self.offline.append(int(user_id)) - self.current = {} + self.dict = { + "all": botdb.get_bot_value('users') or {}, + "online": [], + "offline": [], + "current": {}, + } + """during setup, all users from database are offline until marked online""" + self.dict["offline"] = list(self.dict["all"].keys()) - def whois(self, nick): - nick_id = self.whois_ident(nick) - self.add_to_all(nick, nick_id) - self.add_to_current(nick, nick_id) - return self.current[nick_id]["nick"] - - def whois_id(self, nick_id): - if nick_id in list(self.current.keys()): - return self.current[nick_id]["nick"] - elif nick_id in list(self.all.keys()) and len(self.all[nick_id]): - return self.all[nick_id][0] + def __getattr__(self, name): + ''' will only get called for undefined attributes ''' + """We will try to find a dict value, or return None""" + if name.lower() in list(self.dict.keys()): + return self.dict[str(name).lower()] else: - return None + raise Exception('User dict does not contain a function or key ' + name.lower()) - def whois_nick(self, nick): - nick_id = self.whois_ident(nick) - self.add_to_all(nick, nick_id) - self.add_to_current(nick, nick_id) - return nick_id + def ID(self, nick): + if is_number(nick): + if nick in list(self.dict["current"].keys()): + return self.dict["current"][nick]["nick"] + elif nick in list(self.dict["all"].keys()) and len(self.dict["all"][nick]): + return self.dict["all"][nick][0] + else: + raise Exception('ID ' + nick + ' does not appear to be associated with a nick') + else: + nick_id = self.whois_ident(nick) + self.add_to_all(nick, nick_id) + self.add_to_current(nick, nick_id) + return self.dict["current"][nick_id]["nick"] def whois_ident(self, nick): nick = Identifier(nick) @@ -44,25 +50,26 @@ class BotUsers(): return int(nick_id) def save_user_db(self): - botdb.set_bot_value('users', self.all) + botdb.set_bot_value('users', self.dict["all"]) def add_to_all(self, nick, nick_id=None): if not nick_id: - nick_id = self.whois_ident(nick) + nick_id = self.ID(nick) # add to all if not there - if nick_id not in list(self.all.keys()): - self.all[nick_id] = [] - # add nick alias - if nick not in self.all[nick_id]: - self.all[nick_id].append(nick) + if nick_id not in list(self.dict["all"].keys()): + self.dict["all"][nick_id] = [] + # add nick alias as index 0 + if nick in self.dict["all"][nick_id]: + self.dict["all"][nick_id].remove(nick) + self.dict["all"][nick_id].insert(0, nick) self.save_user_db() def add_to_current(self, nick, nick_id=None): if not nick_id: nick_id = self.whois_ident(nick) # add to current if not there - if nick_id not in list(self.current.keys()): - self.current[nick_id] = {"channels": [], "nick": nick} + if nick_id not in list(self.dict["current"].keys()): + self.dict["current"][nick_id] = {"channels": [], "nick": nick} def channel_scan(self, bot): for channel in list(bot.channels.keys()): @@ -74,15 +81,15 @@ class BotUsers(): # Verify nick is in the all list self.add_to_current(user, nick_id) # set current nick - self.current[nick_id]["nick"] = user + self.dict["current"][nick_id]["nick"] = user # add joined channel to nick list - if channel not in self.current[nick_id]["channels"]: - self.current[nick_id]["channels"].append(channel) + if channel not in self.dict["current"][nick_id]["channels"]: + self.dict["current"][nick_id]["channels"].append(channel) # mark user as online - if nick_id not in self.online: - self.online.append(int(nick_id)) - if nick_id in self.offline: - self.offline.remove(nick_id) + if nick_id not in self.dict["online"]: + self.dict["online"].append(int(nick_id)) + if nick_id in self.dict["offline"]: + self.dict["offline"].remove(nick_id) def join(self, bot, trigger): if trigger.nick == bot.nick: @@ -94,15 +101,15 @@ class BotUsers(): # Verify nick is in the all list self.add_to_current(user, nick_id) # set current nick - self.current[nick_id]["nick"] = user + self.dict["current"][nick_id]["nick"] = user # add joined channel to nick list - if trigger.sender not in self.current[nick_id]["channels"]: - self.current[nick_id]["channels"].append(trigger.sender) + if trigger.sender not in self.dict["current"][nick_id]["channels"]: + self.dict["current"][nick_id]["channels"].append(trigger.sender) # mark user as online - if nick_id not in self.online: - self.online.append(int(nick_id)) - if nick_id in self.offline: - self.offline.remove(nick_id) + if nick_id not in self.dict["online"]: + self.dict["online"].append(int(nick_id)) + if nick_id in self.dict["offline"]: + self.dict["offline"].remove(nick_id) return # Identify nick_id = self.whois_ident(trigger.nick) @@ -111,15 +118,15 @@ class BotUsers(): # Verify nick is in the all list self.add_to_current(trigger.nick, nick_id) # set current nick - self.current[nick_id]["nick"] = trigger.nick + self.dict["current"][nick_id]["nick"] = trigger.nick # add joined channel to nick list - if trigger.sender not in self.current[nick_id]["channels"]: - self.current[nick_id]["channels"].append(trigger.sender) + if trigger.sender not in self.dict["current"][nick_id]["channels"]: + self.dict["current"][nick_id]["channels"].append(trigger.sender) # mark user as online - if nick_id not in self.online: - self.online.append(int(nick_id)) - if nick_id in self.offline: - self.offline.remove(nick_id) + if nick_id not in self.dict["online"]: + self.dict["online"].append(int(nick_id)) + if nick_id in self.dict["offline"]: + self.dict["offline"].remove(nick_id) def quit(self, bot, trigger): if trigger.nick == bot.nick: @@ -131,25 +138,25 @@ class BotUsers(): # Verify nick is in the all list self.add_to_current(trigger.nick, nick_id) # empty nicks channel list - if trigger.sender in self.current[nick_id]["channels"]: - self.current[nick_id]["channels"].remove(trigger.sender) - self.current[nick_id]["channels"] = [] + if trigger.sender in self.dict["current"][nick_id]["channels"]: + self.dict["current"][nick_id]["channels"].remove(trigger.sender) + self.dict["current"][nick_id]["channels"] = [] # mark user as offline - if nick_id in self.online: - self.online.remove(nick_id) - if nick_id not in self.offline: - self.offline.append(int(nick_id)) + if nick_id in self.dict["online"]: + self.dict["online"].remove(nick_id) + if nick_id not in self.dict["offline"]: + self.dict["offline"].append(int(nick_id)) def part(self, bot, trigger): if trigger.nick == bot.nick: - for nick_id in list(self.current.keys()): - if trigger.sender in self.current[nick_id]["channels"]: - self.current[nick_id]["channels"].remove(trigger.sender) + for nick_id in list(self.dict["current"].keys()): + if trigger.sender in self.dict["current"][nick_id]["channels"]: + self.dict["current"][nick_id]["channels"].remove(trigger.sender) # mark offline - if not len(self.current[nick_id]["channels"]) and nick_id in self.online: - self.online.remove(nick_id) - if not len(self.current[nick_id]["channels"]) and nick_id not in self.offline: - self.offline.append(int(nick_id)) + if not len(self.dict["current"][nick_id]["channels"]) and nick_id in self.dict["online"]: + self.dict["online"].remove(nick_id) + if not len(self.dict["current"][nick_id]["channels"]) and nick_id not in self.dict["offline"]: + self.dict["offline"].append(int(nick_id)) return # Identify nick_id = self.whois_ident(trigger.nick) @@ -158,25 +165,25 @@ class BotUsers(): # Verify nick is in the all list self.add_to_current(trigger.nick, nick_id) # remove channel from nick list - if trigger.sender in self.current[nick_id]["channels"]: - self.current[nick_id]["channels"].remove(trigger.sender) + if trigger.sender in self.dict["current"][nick_id]["channels"]: + self.dict["current"][nick_id]["channels"].remove(trigger.sender) # mark offline - if not len(self.current[nick_id]["channels"]) and nick_id in self.online: - self.online.remove(nick_id) - if not len(self.current[nick_id]["channels"]) and nick_id not in self.offline: - self.offline.append(int(nick_id)) + if not len(self.dict["current"][nick_id]["channels"]) and nick_id in self.dict["online"]: + self.dict["online"].remove(nick_id) + if not len(self.dict["current"][nick_id]["channels"]) and nick_id not in self.dict["offline"]: + self.dict["offline"].append(int(nick_id)) def kick(self, bot, trigger): targetnick = Identifier(str(trigger.args[1])) if targetnick == bot.nick: - for nick_id in list(self.current.keys()): - if trigger.sender in self.current[nick_id]["channels"]: - self.current[nick_id]["channels"].remove(trigger.sender) + for nick_id in list(self.dict["current"].keys()): + if trigger.sender in self.dict["current"][nick_id]["channels"]: + self.dict["current"][nick_id]["channels"].remove(trigger.sender) # mark offline - if not len(self.current[nick_id]["channels"]) and nick_id in self.online: - self.online.remove(nick_id) - if not len(self.current[nick_id]["channels"]) and nick_id not in self.offline: - self.offline.append(int(nick_id)) + if not len(self.dict["current"][nick_id]["channels"]) and nick_id in self.dict["online"]: + self.dict["online"].remove(nick_id) + if not len(self.dict["current"][nick_id]["channels"]) and nick_id not in self.dict["offline"]: + self.dict["offline"].append(int(nick_id)) return # Identify nick_id = self.whois_ident(targetnick) @@ -185,13 +192,13 @@ class BotUsers(): # Verify nick is in the all list self.add_to_current(targetnick, nick_id) # remove channel from nick list - if trigger.sender in self.current[nick_id]["channels"]: - self.current[nick_id]["channels"].remove(trigger.sender) + if trigger.sender in self.dict["current"][nick_id]["channels"]: + self.dict["current"][nick_id]["channels"].remove(trigger.sender) # mark offline - if not len(self.current[nick_id]["channels"]) and nick_id in self.online: - self.online.remove(nick_id) - if not len(self.current[nick_id]["channels"]) and nick_id not in self.offline: - self.offline.append(int(nick_id)) + if not len(self.dict["current"][nick_id]["channels"]) and nick_id in self.dict["online"]: + self.dict["online"].remove(nick_id) + if not len(self.dict["current"][nick_id]["channels"]) and nick_id not in self.dict["offline"]: + self.dict["offline"].append(int(nick_id)) def nick(self, bot, trigger): newnick = Identifier(trigger) @@ -207,15 +214,15 @@ class BotUsers(): # Verify nick is in the all list self.add_to_current(newnick, nick_id) # set current nick - self.current[nick_id]["nick"] = newnick + self.dict["current"][nick_id]["nick"] = newnick # add joined channel to nick list - if trigger.sender not in self.current[nick_id]["channels"]: - self.current[nick_id]["channels"].append(trigger.sender) + if trigger.sender not in self.dict["current"][nick_id]["channels"]: + self.dict["current"][nick_id]["channels"].append(trigger.sender) # mark user as online - if nick_id not in self.online: - self.online.append(int(nick_id)) - if nick_id in self.offline: - self.offline.remove(nick_id) + if nick_id not in self.dict["online"]: + self.dict["online"].append(int(nick_id)) + if nick_id in self.dict["offline"]: + self.dict["offline"].remove(nick_id) def mode(self, bot, trigger): return From fcb1b0906eebc99e548f410131db35e33181bae8 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sat, 8 Jun 2019 13:36:23 -0400 Subject: [PATCH 2/8] bad comma, bad --- sopel_modules/SpiceBot/Users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Users.py b/sopel_modules/SpiceBot/Users.py index 1ea11aa..d25cb39 100644 --- a/sopel_modules/SpiceBot/Users.py +++ b/sopel_modules/SpiceBot/Users.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals, absolute_import, division, print_functi from sopel.tools import Identifier -from .Database import db as botdb, +from .Database import db as botdb from .Tools import is_number # TODO timestamp for new .seen From b38146a1541a3aed82a97c1417de02dafa4a055f Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sat, 8 Jun 2019 13:48:22 -0400 Subject: [PATCH 3/8] assure int --- sopel_modules/SpiceBot/Users.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sopel_modules/SpiceBot/Users.py b/sopel_modules/SpiceBot/Users.py index d25cb39..ae6407f 100644 --- a/sopel_modules/SpiceBot/Users.py +++ b/sopel_modules/SpiceBot/Users.py @@ -20,7 +20,8 @@ class BotUsers(): "current": {}, } """during setup, all users from database are offline until marked online""" - self.dict["offline"] = list(self.dict["all"].keys()) + for user_id in list(self.dict["all"].keys()): + self.dict["offline"].append(int(user_id)) def __getattr__(self, name): ''' will only get called for undefined attributes ''' @@ -28,7 +29,7 @@ class BotUsers(): if name.lower() in list(self.dict.keys()): return self.dict[str(name).lower()] else: - raise Exception('User dict does not contain a function or key ' + name.lower()) + raise Exception('User dict does not contain a function or key ' + str(name.lower())) def ID(self, nick): if is_number(nick): @@ -37,7 +38,7 @@ class BotUsers(): elif nick in list(self.dict["all"].keys()) and len(self.dict["all"][nick]): return self.dict["all"][nick][0] else: - raise Exception('ID ' + nick + ' does not appear to be associated with a nick') + raise Exception('ID ' + str(nick) + ' does not appear to be associated with a nick') else: nick_id = self.whois_ident(nick) self.add_to_all(nick, nick_id) From be6fe2eb8e3d86449f71882803cede8742d0af58 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sat, 8 Jun 2019 13:55:36 -0400 Subject: [PATCH 4/8] test --- sopel_modules/SpiceBot/Channels.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sopel_modules/SpiceBot/Channels.py b/sopel_modules/SpiceBot/Channels.py index 7692181..36faa2f 100644 --- a/sopel_modules/SpiceBot/Channels.py +++ b/sopel_modules/SpiceBot/Channels.py @@ -33,6 +33,14 @@ class BotChannels(): "InitialProcess": False } + def __getattr__(self, name): + ''' will only get called for undefined attributes ''' + """We will try to find a dict value, or return None""" + if name.lower() in list(self.dict.keys()): + return self.dict[str(name).lower()] + else: + raise Exception('Channel dict does not contain a function or key ' + str(name.lower())) + def setup_channels(self): botconfig.define_section("SpiceBot_Channels", SpiceBot_Channels_MainSection, validate=False) From 3b96eac446e58a428a7425b601118faef2fcc002 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sat, 8 Jun 2019 14:07:33 -0400 Subject: [PATCH 5/8] channels user list --- sopel_modules/SpiceBot/Channels.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/sopel_modules/SpiceBot/Channels.py b/sopel_modules/SpiceBot/Channels.py index 36faa2f..aac6c93 100644 --- a/sopel_modules/SpiceBot/Channels.py +++ b/sopel_modules/SpiceBot/Channels.py @@ -12,6 +12,7 @@ import threading from .Config import config as botconfig from .Database import db as botdb +from .Users import users as botusers class SpiceBot_Channels_MainSection(StaticSection): @@ -41,6 +42,23 @@ class BotChannels(): else: raise Exception('Channel dict does not contain a function or key ' + str(name.lower())) + def get_channel_users(self, channel, idtype="nick"): + + if channel.lower() not in list(self.dict["list"].keys()): + raise Exception('Channel ' + str(channel.lower()) + " does not seem to be on this server") + if 'users' not in list(self.dict["list"][channel.lower()].keys()): + raise Exception('Channel ' + str(channel.lower()) + " does not seem to be a channel the bot is in") + + nick_ids = self.dict["list"][channel.lower()]['users'] + if idtype.upper() == "ID": + return nick_ids + else: + nick_list = [] + for nick_id in nick_ids: + nickname = botusers.ID(nick_id) + nick_list.append(nickname) + return nick_list + def setup_channels(self): botconfig.define_section("SpiceBot_Channels", SpiceBot_Channels_MainSection, validate=False) From c59a36e278cd784d05235014c2af97b02843c562 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sat, 8 Jun 2019 14:10:51 -0400 Subject: [PATCH 6/8] ident better --- sopel_modules/SpiceBot/Users.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sopel_modules/SpiceBot/Users.py b/sopel_modules/SpiceBot/Users.py index ae6407f..4803306 100644 --- a/sopel_modules/SpiceBot/Users.py +++ b/sopel_modules/SpiceBot/Users.py @@ -41,9 +41,7 @@ class BotUsers(): raise Exception('ID ' + str(nick) + ' does not appear to be associated with a nick') else: nick_id = self.whois_ident(nick) - self.add_to_all(nick, nick_id) - self.add_to_current(nick, nick_id) - return self.dict["current"][nick_id]["nick"] + return nick_id def whois_ident(self, nick): nick = Identifier(nick) From 4af9696c6ca73665cb1b7c193432811ed2700b98 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sat, 8 Jun 2019 18:54:58 -0400 Subject: [PATCH 7/8] tweaks for readability --- sopel_modules/SpiceBot/Users.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/sopel_modules/SpiceBot/Users.py b/sopel_modules/SpiceBot/Users.py index 4803306..b246318 100644 --- a/sopel_modules/SpiceBot/Users.py +++ b/sopel_modules/SpiceBot/Users.py @@ -31,16 +31,18 @@ class BotUsers(): else: raise Exception('User dict does not contain a function or key ' + str(name.lower())) - def ID(self, nick): - if is_number(nick): - if nick in list(self.dict["current"].keys()): - return self.dict["current"][nick]["nick"] - elif nick in list(self.dict["all"].keys()) and len(self.dict["all"][nick]): - return self.dict["all"][nick][0] + def ID(self, nickinput): + if is_number(nickinput): + nick_id = nickinput + if nick_id in list(self.dict["current"].keys()): + nick = self.dict["current"][nick_id]["nick"] + elif nick_id in list(self.dict["all"].keys()) and len(self.dict["all"][nick_id]): + nick = self.dict["all"][nick_id][0] else: - raise Exception('ID ' + str(nick) + ' does not appear to be associated with a nick') + raise Exception('ID ' + str(nickinput) + ' does not appear to be associated with a nick') + return nick else: - nick_id = self.whois_ident(nick) + nick_id = self.whois_ident(nickinput) return nick_id def whois_ident(self, nick): From 3feeeb28ed43b72bc61a591f874345b9a154fd1d Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Tue, 11 Jun 2019 08:04:47 -0400 Subject: [PATCH 8/8] string --- sopel_modules/SpiceBot/Channels.py | 3 +++ sopel_modules/SpiceBot/Users.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/sopel_modules/SpiceBot/Channels.py b/sopel_modules/SpiceBot/Channels.py index aac6c93..22dcc6e 100644 --- a/sopel_modules/SpiceBot/Channels.py +++ b/sopel_modules/SpiceBot/Channels.py @@ -129,6 +129,7 @@ class BotChannels(): return nick_id def add_to_channel(self, channel, nick, nick_id=None): + channel = str(channel) if not nick_id: nick_id = self.whois_ident(nick) if channel.lower() not in list(self.dict['list'].keys()): @@ -139,6 +140,7 @@ class BotChannels(): self.dict['list'][channel.lower()]['users'].append(int(nick_id)) def remove_from_channel(self, channel, nick, nick_id=None): + channel = str(channel) if not nick_id: nick_id = self.whois_ident(nick) if channel.lower() not in list(self.dict['list'].keys()): @@ -149,6 +151,7 @@ class BotChannels(): self.dict['list'][channel.lower()]['users'].remove(nick_id) def remove_all_from_channel(self, channel): + channel = str(channel) if channel.lower() not in list(self.dict['list'].keys()): self.dict['list'][channel.lower()] = dict() if 'users' not in self.dict['list'][channel.lower()]: diff --git a/sopel_modules/SpiceBot/Users.py b/sopel_modules/SpiceBot/Users.py index b246318..6a54912 100644 --- a/sopel_modules/SpiceBot/Users.py +++ b/sopel_modules/SpiceBot/Users.py @@ -228,5 +228,8 @@ class BotUsers(): def mode(self, bot, trigger): return + def targetcheck(self): + return True + users = BotUsers()