From 0febd01103268467835d803d1ad3000435077718 Mon Sep 17 00:00:00 2001 From: Frank Becker Date: Sun, 23 Feb 2020 22:17:07 +0100 Subject: [PATCH] restored from original master after accident --- config/logging.config | 28 -------- modules/devlugdispatch.py | 123 --------------------------------- modules/{off => }/googlecal.py | 0 modules/{off => }/ig.py | 0 modules/{off => }/metar.py | 0 modules/{off => }/notam.py | 0 modules/ping.py | 38 ---------- modules/{off => }/taf.py | 0 modules/task.py | 32 --------- modules/{off => }/teamup.py | 0 modules/{off => }/twitter.py | 0 modules/{off => }/url.py | 4 -- modules/weather.py | 18 ----- test/test_devlugdispatcher.py | 29 -------- 14 files changed, 272 deletions(-) delete mode 100644 config/logging.config delete mode 100644 modules/devlugdispatch.py rename modules/{off => }/googlecal.py (100%) rename modules/{off => }/ig.py (100%) rename modules/{off => }/metar.py (100%) rename modules/{off => }/notam.py (100%) delete mode 100755 modules/ping.py rename modules/{off => }/taf.py (100%) delete mode 100644 modules/task.py rename modules/{off => }/teamup.py (100%) rename modules/{off => }/twitter.py (100%) rename modules/{off => }/url.py (97%) delete mode 100644 modules/weather.py delete mode 100644 test/test_devlugdispatcher.py diff --git a/config/logging.config b/config/logging.config deleted file mode 100644 index 481e743..0000000 --- a/config/logging.config +++ /dev/null @@ -1,28 +0,0 @@ -[loggers] -keys=root,hemppa - -[handlers] -keys=console - -[formatters] -keys=hemppa - -[logger_root] -level=INFO -handlers=console - -[logger_hemppa] -level=NOTSET -handlers= -propagate=1 -qualname=hemppa - -[handler_console] -class=StreamHandler -level=NOTSET -formatter=hemppa -args=(sys.stdout,) - -[formatter_hemppa] -format=%(levelname)s - %(name)s - %(message)s -class=logging.Formatter diff --git a/modules/devlugdispatch.py b/modules/devlugdispatch.py deleted file mode 100644 index 0e0208b..0000000 --- a/modules/devlugdispatch.py +++ /dev/null @@ -1,123 +0,0 @@ -import re - -from nio import RoomMessageText - -from modules.common.module import BotModule - - -class MatterMessage: - def __init__(self, protocol, user, message): - self.protocol = protocol - self.username = user - self.message = message - - -class MatterBridgeParser: - - def __init__(self): - self.reg = re.compile(r"\[(.*)\] <(.*)> (.*)") - self.match = None - - def validate(self, message): - self.match = self.reg.match(message) - return self.match is not None - - def parse(self, message): - - if self.validate(message): - groups = self.match.group(1, 2, 3) - return MatterMessage(groups[0], groups[1], groups[2]) - else: - return None - - -class MatrixModule(BotModule): - """ - Everytime a matterbridge message is seen, the original message is delegated to the bot for command processing - """ - - def __init__(self, name): - super().__init__(name) - self.known_bots = [] - self.bot = None - self.parser = MatterBridgeParser() - - async def matrix_message(self, bot, room, event): - bot.must_be_admin(room, event) - - # todo: add subcommand to add administrators - # todo: add subcommand to add known matterbridge bot - args = event.body.split() - - if len(args) == 2: - if args[1] == 'list-bots': - await self.list_bots(room) - if len(args) > 2: - if args[1] == 'add-bot': - self.add_bot(args[2]) - elif args[1] == 'del-bot': - self.del_bot(args[2]) - - # todo: needs a mechanism to hook into admin check of the bot - - def help(self): - return "parses matterbridge messages and delegate the parsed message to the bot" - - def matrix_start(self, bot): - self.bot = bot - super().matrix_start(bot) - bot.client.add_event_callback(self.dispatch_cb, RoomMessageText) - - def matrix_stop(self, bot): - super().matrix_stop(bot) - bot.remove_callback(self.dispatch_cb) - - def get_settings(self): - data = super().get_settings() - data['known_bots'] = self.known_bots - return data - - def set_settings(self, data): - super().set_settings(data) - if data.get('known_bots'): - self.known_bots = data['known_bots'] - - async def dispatch_cb(self, room, event): - - if event.sender not in self.known_bots: - self.logger.debug(f"{event.sender} is not a known bot. skip processing.") - return - - # no content at all? - if len(event.body) < 1: - return - - matter_message = self.parser.parse(event.body) - - if matter_message is None: - return - - self.logger.info( - f"room: {room.name} protocol: {matter_message.protocol} user: {matter_message.username} - dispatch matterbridge message to bot") - - # dispatch. changing the body of the event triggers message_cb of the bot - event.body = matter_message.message - - def add_bot(self, bot_name): - self.logger.info("Add bot %s to known bots", bot_name) - self.known_bots.append(bot_name) - self.bot.save_settings() - - def del_bot(self, bot_name): - if bot_name in self.known_bots: - self.logger.info("Delete bot %s from list of known bots", bot_name) - self.known_bots.remove(bot_name) - self.bot.save_settings() - else: - self.logger.warning("%s not in list of known bots. skip delete.", bot_name) - - async def list_bots(self, room): - - await self.bot.send_text(room, f'Known Matterbridge Bots: {len(self.known_bots)}') - for bot_name in self.known_bots: - await self.bot.send_text(room, bot_name) diff --git a/modules/off/googlecal.py b/modules/googlecal.py similarity index 100% rename from modules/off/googlecal.py rename to modules/googlecal.py diff --git a/modules/off/ig.py b/modules/ig.py similarity index 100% rename from modules/off/ig.py rename to modules/ig.py diff --git a/modules/off/metar.py b/modules/metar.py similarity index 100% rename from modules/off/metar.py rename to modules/metar.py diff --git a/modules/off/notam.py b/modules/notam.py similarity index 100% rename from modules/off/notam.py rename to modules/notam.py diff --git a/modules/ping.py b/modules/ping.py deleted file mode 100755 index 325c7d6..0000000 --- a/modules/ping.py +++ /dev/null @@ -1,38 +0,0 @@ -from timeit import default_timer as timer -from urllib.request import urlopen - -from modules.common.module import BotModule - - -class MatrixModule(BotModule): - async def matrix_message(self, bot, room, event): - args = event.body.split() - args.pop(0) - - url = args[0] - - # check url - if not (url.startswith('http://') or url.startswith('https://')): - self.logger.debug("adding trailing https") - url = "https://" + url - - self.logger.info("ping: %s", url) - - start = timer() - try: - data = urlopen(url) - length = format(len(data.read()) / 1024, '.3g') # kB - retcode = data.getcode() - - except Exception as e: - await bot.send_text(room, "Ping failed: " + str(e)) - self.logger.error(str(e)) - return False - - end = timer() - - await bot.send_text(room, url + ": OK (" + str(retcode) + ") / " + "Size: " + str(length) + - " kB / Time: " + str(format(end - start, '.3g')) + " sec") - - def help(self): - return 'check if IP or URL is accessible' diff --git a/modules/off/taf.py b/modules/taf.py similarity index 100% rename from modules/off/taf.py rename to modules/taf.py diff --git a/modules/task.py b/modules/task.py deleted file mode 100644 index 8428ed8..0000000 --- a/modules/task.py +++ /dev/null @@ -1,32 +0,0 @@ -import subprocess - -from modules.common.module import BotModule - - -class MatrixModule(BotModule): - async def matrix_message(self, bot, room, event): - args = event.body.split() - args.pop(0) - encoding = "utf-8" - - allowed_args = ['list', 'add', 'del', 'done', 'undo', 'calc'] - - # wrap task - if not args: - args = ['list'] - - if args[0] not in allowed_args: - await bot.send_text(room, "command not allowed") - return () - - result = subprocess.check_output( - ["task", - "rc.confirmation:no", - "rc.verbose:list", - "rc.bulk:0", - "rc.recurrence.confirmation:yes"] - + args, stderr=subprocess.DEVNULL) - await bot.send_text(room, result.decode(encoding)) - - def help(self): - return ('taskwarrior') diff --git a/modules/off/teamup.py b/modules/teamup.py similarity index 100% rename from modules/off/teamup.py rename to modules/teamup.py diff --git a/modules/off/twitter.py b/modules/twitter.py similarity index 100% rename from modules/off/twitter.py rename to modules/twitter.py diff --git a/modules/off/url.py b/modules/url.py similarity index 97% rename from modules/off/url.py rename to modules/url.py index 24c5ec4..9221f34 100644 --- a/modules/off/url.py +++ b/modules/url.py @@ -165,7 +165,3 @@ class MatrixModule(BotModule): def help(self): return "If I see a url in a message I will try to get the title from the page and spit it out" - - def dump(self, obj): - for attr in dir(obj): - self.logger.info("obj.%s = %r", attr, getattr(obj, attr)) diff --git a/modules/weather.py b/modules/weather.py deleted file mode 100644 index c86777e..0000000 --- a/modules/weather.py +++ /dev/null @@ -1,18 +0,0 @@ -import subprocess - -from modules.common.module import BotModule - - -class MatrixModule(BotModule): - async def matrix_message(self, bot, room, event): - args = event.body.split() - args.pop(0) - encoding = "utf-8" - - # get weather from ansiweather - result = subprocess.check_output(["ansiweather", "-a false", "-l", ' '.join(args)]) - - await bot.send_text(room, result.decode(encoding)) - - def help(self): - return ('How\'s the weather?') diff --git a/test/test_devlugdispatcher.py b/test/test_devlugdispatcher.py deleted file mode 100644 index 2ff1282..0000000 --- a/test/test_devlugdispatcher.py +++ /dev/null @@ -1,29 +0,0 @@ -import unittest -from modules.devlugdispatch import MatterBridgeParser - - -class DevlugDispatcherTest(unittest.TestCase): - - def test_recognizes_matterbridge_message(self): - """Test that a message was send by a matterbridge bot""" - message = "[irc] say something" - parser = MatterBridgeParser() - - self.assertEqual(parser.validate(message), True) - - def test_parse_returns_None_for_none_matter_bridge_messages(self): - """Test that a normal message gets parsed to None""" - message = "a normal message" - parser = MatterBridgeParser() - - self.assertEqual(parser.parse(message), None) - - def test_parse_returns_protocol_username_and_message(self): - - message = "[irc] say something" - parser = MatterBridgeParser() - - matter_msg = parser.parse(message) - self.assertEqual(matter_msg.protocol, "irc") - self.assertEqual(matter_msg.username, "ancho") - self.assertEqual(matter_msg.message, "say something")