From 48e9228b2a969650616408dd22374f11eaa724d9 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 17 May 2019 16:11:14 -0400 Subject: [PATCH] part logic --- sopel_modules/SpiceBot_Channels/Channels.py | 9 +- .../SpiceBot_Channels/Channels_Command.py | 4 +- sopel_modules/SpiceBot_Logs/Logs.py | 156 ++++++++++++++---- sopel_modules/SpiceBot_SBTools/__init__.py | 19 +-- 4 files changed, 133 insertions(+), 55 deletions(-) diff --git a/sopel_modules/SpiceBot_Channels/Channels.py b/sopel_modules/SpiceBot_Channels/Channels.py index 0305aaa..15a0ed4 100644 --- a/sopel_modules/SpiceBot_Channels/Channels.py +++ b/sopel_modules/SpiceBot_Channels/Channels.py @@ -65,6 +65,8 @@ def trigger_channel_list_initial(bot, trigger): # Unkickable bot.write(('SAMODE', bot.nick, '+q')) + bot_part_empty(bot) + bot.write(['LIST']) bot.memory['SpiceBot_Channels']['ProcessLock'] = True @@ -89,6 +91,7 @@ def trigger_channel_list_initial(bot, trigger): if "*" in bot.memory['SpiceBot_Channels']['channels']: del bot.memory['SpiceBot_Channels']['channels']["*"] + bot_part_empty(bot) botevents.trigger(bot, botevents.BOT_CHANNELS, "SpiceBot_Channels") @@ -98,6 +101,7 @@ def trigger_channel_list_recurring(bot, trigger): while True: try: time.sleep(1800) + bot_part_empty(bot) oldlist = list(bot.memory['SpiceBot_Channels']['channels'].keys()) bot.write(['LIST']) @@ -118,14 +122,13 @@ def trigger_channel_list_recurring(bot, trigger): if "*" in bot.memory['SpiceBot_Channels']['channels']: del bot.memory['SpiceBot_Channels']['channels']["*"] + bot_part_empty(bot) except KeyError: return -@sopel.module.event(botevents.BOT_CHANNELS) -@sopel.module.rule('.*') -def bot_part_empty(bot, trigger): +def bot_part_empty(bot): """Don't stay in empty channels""" ignorepartlist = [] if bot.config.SpiceBot_Logs.logging_channel: diff --git a/sopel_modules/SpiceBot_Channels/Channels_Command.py b/sopel_modules/SpiceBot_Channels/Channels_Command.py index 14e6b70..5648f2f 100644 --- a/sopel_modules/SpiceBot_Channels/Channels_Command.py +++ b/sopel_modules/SpiceBot_Channels/Channels_Command.py @@ -11,6 +11,7 @@ from sopel_modules.SpiceBot_SBTools import ( sopel_triggerargs, inlist, channel_privs, join_all_channels, channel_list_current, ) +from .Channels import bot_part_empty @botevents.check_ready([botevents.BOT_LOADED]) @@ -54,6 +55,7 @@ def nickname_comand_channels(bot, trigger): if not trigger.admin: bot.osd("You do not have permission to update the channel listing.") return + bot_part_empty(bot) bot.write(['LIST']) bot.osd(["[SpiceBot_Channels]", "I am now updating the channel listing for this server."]) @@ -63,7 +65,7 @@ def nickname_comand_channels(bot, trigger): join_all_channels(bot) foundchannelcount = len(bot.memory['SpiceBot_Channels']['channels'].keys()) bot.osd("[SpiceBot_Channels]", "Channel listing finished!", str(foundchannelcount) + " channel(s) found.") - + bot_part_empty(bot) return elif commandused == 'topic': diff --git a/sopel_modules/SpiceBot_Logs/Logs.py b/sopel_modules/SpiceBot_Logs/Logs.py index b3fd17d..62311b5 100644 --- a/sopel_modules/SpiceBot_Logs/Logs.py +++ b/sopel_modules/SpiceBot_Logs/Logs.py @@ -13,56 +13,144 @@ import os import spicemanip -def configure(config): - config.define_section("SpiceBot_Logs", SpiceBot_Logs_MainSection, validate=False) - config.SpiceBot_Logs.configure_setting('logging_channel', 'SpiceBot_Logs channels') +# coding=utf8 +from __future__ import unicode_literals, absolute_import, division, print_function + +__author__ = 'Sam Zick' +__email__ = 'sam@deathbybandaid.net' +__version__ = '0.1.1' + +import sopel.module +import sopel.tools +import sopel.config + +import os + +import spicemanip -class SpiceBot_Logs_MainSection(StaticSection): - logging_channel = ValidatedAttribute('logging_channel', default=False) +class BotLogs(): + """This Is a contained source of log information""" + def __init__(self): + self.SpiceBot_Logs = { + "list": {"Sopel_systemd": [], "Sopel_stdio": []}, + "queue": [] + } + self.sopel_config = { + "logging_channel": True + } + + def log(self, logtype, logentry, stdio=False): + logtitle = "[" + logtype + "]" + logmessage = logtitle + " " + logentry + + if self.sopel_config["logging_channel"]: + self.SpiceBot_Logs["queue"].append(logmessage) + + if stdio: + sopel.tools.stderr(logmessage) + + if logtype not in self.SpiceBot_Logs["list"].keys(): + self.SpiceBot_Logs["list"][logtype] = [] + self.SpiceBot_Logs["list"][logtype].append(logentry) + + def get_logs(self): + return [] + + def stdio_logs_fetch(self, bot): + + stdio_ignore = [] + for logtype in botlogs.SpiceBot_Logs["list"].keys(): + stdio_ignore.append("[" + logtype + "]") + + logfile = os.path.os.path.join(bot.config.core.logdir, 'stdio.log') + + try: + log_file_lines = [] + log_file = open(logfile, 'r') + lines = log_file.readlines() + for line in lines: + log_file_lines.append(line) + log_file.close() + + currentline, linenumindex = 0, [] + for line in log_file_lines: + if line.startswith("Welcome to Sopel. Loading modules..."): + linenumindex.append(currentline) + currentline += 1 + last_start = max(linenumindex) + filelines = log_file_lines[last_start:] + except Exception as e: + debuglines = e + filelines = [] + + debuglines = [] + loadedmodules = [] + for line in filelines: + if line.startswith("Loaded:"): + loadedmodules.append(str(line).split("Loaded:")[-1]) + else: + if not line.startswith(tuple(stdio_ignore)) and not line.isspace(): + debuglines.append(str(line)) + loadedmodules = "Loaded: " + spicemanip.main(loadedmodules, 'andlist') + debuglines.insert(1, loadedmodules) + + return debuglines + + def systemd_logs_fetch(self, bot): + servicepid = self.get_running_pid(bot) + debuglines = [] + for line in os.popen(str("sudo journalctl _PID=" + str(servicepid))).read().split('\n'): + line = str(line).split(str(os.uname()[1] + " "))[-1] + lineparts = str(line).split(": ") + del lineparts[0] + line = spicemanip.main(lineparts, 0) + if not line.isspace(): + debuglines.append(str(line)) + return debuglines + + def get_running_pid(self, bot): + try: + filename = "/run/sopel/sopel-" + str(bot.nick) + ".pid" + with open(filename, 'r') as pid_file: + pidnum = int(pid_file.read()) + except Exception as e: + pidnum = e + pidnum = str(os.popen("systemctl show " + str(bot.nick) + " --property=MainPID").read()).split("=")[-1] + return pidnum + + +botlogs = BotLogs() def setup(bot): - bot_logging(bot, 'SpiceBot_Logs', "Starting Setup Procedure") - bot.config.define_section("SpiceBot_Logs", SpiceBot_Logs_MainSection, validate=False) - - botevents.startup_add([botevents.BOT_LOGS]) - - bot_logs_setup_check(bot) - - botevents.trigger(bot, botevents.BOT_LOGS, "SpiceBot_Logs") + botlogs.log('SpiceBot_Logs', "Starting Setup Procedure") -def bot_logs_setup_check(bot): - if 'SpiceBot_Logs' not in bot.memory: - bot.memory['SpiceBot_Logs'] = {"logs": {"Sopel_systemd": [], "Sopel_stdio": []}, "queue": []} - - -def shutdown(bot): - if "SpiceBot_Logs" in bot.memory: - del bot.memory["SpiceBot_Logs"] - - -@sopel.module.event(botevents.BOT_CONNECTED) +@sopel.module.event('001') @sopel.module.rule('.*') def join_log_channel(bot, trigger): - if bot.config.SpiceBot_Logs.logging_channel: - channel = bot.config.SpiceBot_Logs.logging_channel + if bot.config.core.logging_channel: + channel = bot.config.core.logging_channel if channel not in bot.channels.keys(): bot.write(('JOIN', bot.nick, channel)) if channel not in bot.channels.keys() and bot.config.SpiceBot_Channels.operadmin: bot.write(('SAJOIN', bot.nick, channel)) - bot_logs_setup_check(bot) - while True: - try: - if len(bot.memory['SpiceBot_Logs']["queue"]): - bot.say(str(bot.memory['SpiceBot_Logs']["queue"][0]), channel) - del bot.memory['SpiceBot_Logs']["queue"][0] - except KeyError: - return + if len(botlogs.SpiceBot_Logs["queue"]): + bot.say(str(botlogs.SpiceBot_Logs["queue"][0]), channel) + del botlogs.SpiceBot_Logs["queue"][0] + else: + botlogs.sopel_config["logging_channel"] = False + botlogs.SpiceBot_Logs["queue"] = [] + + +def setup(bot): + bot_logging(bot, 'SpiceBot_Logs', "Starting Setup Procedure") + botevents.startup_add([botevents.BOT_LOGS]) + botevents.trigger(bot, botevents.BOT_LOGS, "SpiceBot_Logs") def stdio_logs_fetch(bot): diff --git a/sopel_modules/SpiceBot_SBTools/__init__.py b/sopel_modules/SpiceBot_SBTools/__init__.py index 1bb1bed..961b762 100644 --- a/sopel_modules/SpiceBot_SBTools/__init__.py +++ b/sopel_modules/SpiceBot_SBTools/__init__.py @@ -97,23 +97,8 @@ def command_permissions_check(bot, trigger, privslist): def bot_logging(bot, logtype, logentry, stdio=False): - - if 'SpiceBot_Logs' not in bot.memory: - bot.memory['SpiceBot_Logs'] = {"logs": {"Sopel_systemd": [], "Sopel_stdio": []}, "queue": []} - - logmessage = "[" + logtype + "] " + logentry + "" - - bot.memory['SpiceBot_Logs']["queue"].append(logmessage) - - if stdio: - sopel.tools.stderr(logmessage) - - if logtype not in bot.memory['SpiceBot_Logs']["logs"].keys(): - bot.memory['SpiceBot_Logs']["logs"][logtype] = [] - - bot.memory['SpiceBot_Logs']["logs"][logtype].append(logentry) - if len(bot.memory['SpiceBot_Logs']["logs"][logtype]) > 10: - del bot.memory['SpiceBot_Logs']["logs"][logtype][0] + from sopel_modules.SpiceBot_Logs.Logs import botlogs + botlogs.log(logtype, logentry, stdio=False) """