From 33dd1ac6859d74c1f9734b5c2bd6c5ceb32441c4 Mon Sep 17 00:00:00 2001 From: makefu Date: Fri, 14 Aug 2020 23:56:25 +0200 Subject: emergency initial commit --- default.nix | 10 +++ kalauerbot.py | 172 +++++++++++++++++++++++++++++++++++++++++++++++++++ python-matrixbot.nix | 30 +++++++++ 3 files changed, 212 insertions(+) create mode 100644 default.nix create mode 100644 kalauerbot.py create mode 100644 python-matrixbot.nix diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..5702f0a --- /dev/null +++ b/default.nix @@ -0,0 +1,10 @@ +with import {}; +python3.pkgs.buildPythonPackage { + name = "env"; + src = ./.; + propagatedBuildInputs = with python3.pkgs;[ + (callPackage ./python-matrixbot.nix {}) + googletrans + ]; + checkInputs = [ python3.pkgs.black ]; +} diff --git a/kalauerbot.py b/kalauerbot.py new file mode 100644 index 0000000..26dbe8f --- /dev/null +++ b/kalauerbot.py @@ -0,0 +1,172 @@ +from matrixbot import MatrixBot +from functools import partial +import random +import json +import logging +logging.basicConfig(level=logging.DEBUG) +log = logging.getLogger("Kalauerbot") +version = "1.0.0" + +class Kalauerbot(MatrixBot): + def __init__(self,host,display_name,token,user_id,dbpath = "kalauerdb.json",whitelist=None): + self.whitelist = whitelist + self.dbpath=dbpath + self.load_db() + super().__init__(host,display_name,token,user_id) + + def load_db(self): + try: + log.info(f"loading entries from {self.dbpath}") + self.db = json.load(open(self.dbpath)) + log.debug(self.db) + except: + log.info(f"Cannot open {self.dbpath}, creating empty db") + self.db = { "__chosen__": None } + self.save_db() + def save_db(self): + json.dump(self.db,open(self.dbpath,"w+")) + log.debug(f"saving db to {self.dbpath}") + + def active_db(self): + return dict(self._get_active()) + + def _get_active(self): + for name,entry in self.db.items(): + if name == "__chosen__": + continue # skip the __chosen__ special object + elif entry['active']: + yield name,entry + else: + log.debug(f"skipping {name} because user is inactive") + continue + def process_event(self, room, event): + # {'content': {'body': 'hello bot', 'msgtype': 'm.text'}, 'event_id': '$1597412611141040kQPEC:thales.citadel.team', 'origin_server_ts': 1597412611511, 'sender': '@frichter:thales.citadel.team', 'type': 'm.room.message', 'unsigned': {'age': 98}, 'room_id': '!eXmPERUmuMagsLVxar:thales.citadel.team'} + if self.user_id == event['sender']: return # don't answer own message + if event['type'] != 'm.room.message': return + msg = event['content']['body'] + if self.whitelist and room.room_id not in self.whitelist: + log.debug("Ignoring message {msg} because {room.room_id} is not in whitelist") + say = partial(self.say,room) + db = self.db + chosen = db['__chosen__'] + if msg == "!help" or msg == "!commands": + say(f""" + Kalauerbot Version {version} + + available commands: + !add - add a new person to the kalauer roster (alias: !activate, !reactivate) + !delete - deactivate the person from the roster (alias: !remove, !deactivate, !freeze) + !deactivate - deactivate person (e.g. because he is in holiday) + !activate - re-activate person + !kill - ultimately remove person from kalauer roster (cannot be reversed) + !choose - choose the next person to be the kalauer könig + !who - find out who was chosen to be todays kalauer könig (alias: !wer) + !ok - confirm the kalauer (alias: !gut !passt !reicht !approved) + !reject - reject the kalauer (alias: !zu-gut !zu-schlecht !französisch !french) + !demand - demand a certain person to be the new kalauer könig + !list - list the current roster and weight,totals + !kalauer - an emergency kalauer +""") + + try: command,args= msg.split(" ",1) + except: command = msg + + if command in ["!add", "!activate", "!reactivate"]: + name = args.strip() + if name in db and db[name]['active']: + say(f"{name} already part of the kalauer roster") + elif name in db and not db[name]['active']: + say(f"Reactivating {name}. Welcome back to the world of fun, {name}!") + db[name]['active'] = True + else: + say(f"{name} has been added to the kalauer roster, starting weight is 1") + db[name] = { "weight": 1, "total":0, "active": True} + self.save_db() + elif command in ["!delete","!remove","!deactivate","!freeze"]: + name = args.strip() + if name not in db: + say(f"Cannot deactiate someone who was never in kalauer db") + elif name in db and db[name]['active']: + say(f"Deactivating {name}, see you soon!") + db[name]['active'] = False + else: + say(f"{name} was already deactivated in the kalauer db") + self.save_db() + elif command == "!choose": + # TODO: refactor this, maybe? + names = [] + weights = [] + for name,entity in self.active_db().items(): + names.append(name) + weights.append(entity['weight']) + log.debug(names) + log.debug(weights) + db["__chosen__"] = chosen = random.choices(names,weights=weights)[0] + say(f"{chosen} was chosen to be the next kalauer könig, congratulations!") + self.save_db() + + elif command in ["!who","!wer"]: + if chosen: + say(f"{chosen} was chosen to be the next kalauer könig") + else: + say(f"Nobody was chosen to be the the kalauer könig, start the process with !choose") + elif command in [ "!ok", "!approved", "!gut", "!passt", "!reicht" ]: + log.info("Increasing weight of all active persons") + for name,entity in self.active_db(): + db[name]['weight'] = db[name]['weight'] +1 + log.info("The kalauer könig gets his weight set to 0") + db[chosen]['weight'] = 0 + say(f"""{chosen}, your kalauer has been approved, your total number of approved kalauers is {c['total']} +{chosen}, please choose a new potential kalauer könig by typing in `!choose` or `!demand ` to force the choice""") + log.debug("Unsetting current chosen") + db["__chose__"] = None + self.save_db() + elif command [ "!reject", "!zu-gut", "!zu-schlecht", "!französisch", "!french"]: + say(f"{chosen}, your kalauer privilege was revoked, nobody is chosen now. Choose another kalauer könig with !choose") + db["__chose__"] = None + self.save_db() + elif command == "!demand": + name = args.strip() + if name in self.active_db(): + say(f"The previous kalauer könig demands user {name} to be the next kalauer könig. The rules of the Kalauer are divine and shall be respected.") + db["__chose__"] = name + elif name in db: + say(f"{name} is currently not active, cannot be chosen") + else: + say(f"{name} name does not exist in the database, add the user before demanding a kalauer from him") + self.save_db() + pass + elif command == "!list": + txt = "Kalauer list:\n" + for name,entry in db.items(): + txt += "{name} - {entry['weight']} weight - {entry['total']} total{'(active)' if entry['active' else '(inactive)'}\n" + say(txt) + elif command == "!kill": + name = args.strip() + if name in db: + say(f"Ultimately removing {name} from Kalauer König db (weight: {db[name]['weight']},total: {db[name]['total']}), we will miss you!") + del db[name] + else: + say(f"Cannot delete someone who was never in the kalauer db") + self.save_db() + elif command == "!demand": + name = args.strip() + elif command == "!kalauer": + from googletrans import LANGUAGES,Translator + kalauer = "Wie nennt man einen dicken Vegetarier? Biotonne!" + translator = Translator() + ret = translator.translate(kalauer,src='de',dest=random.choice(LANGUAGES)) + say(ret.text) + else: + + log.debug(f"Receive message {msg}") + +bot = Kalauerbot( + host = "ext01.citadel.team", + display_name = "Kalauerbot", + token = "MDAyMGxvY2F0aW9uIGV4dDAxLmNpdGFkZWwudGVhbQowMDEzaWRlbnRpZmllciBrZXkKMDAxMGNpZCBnZW4gPSAxCjAwMzljaWQgdXNlcl9pZCA9IEBydGxtb2d0c2pzYXB0cXRkeWc6ZXh0MDEuY2l0YWRlbC50ZWFtCjAwMTZjaWQgdHlwZSA9IGFjY2VzcwowMDFkY2lkIHRpbWUgPCAxNTk3NDE1NDg3NTIzCjAwMmFjaWQgZGF0ZSA9IDIwMjAtMDgtMTQgMTM6MzE6MjcuNTIzMDU2CjAwMjNjaWQgY2xpZW50X2lwID0gMTkyLjU0LjE0NS4xNDEKMDAyMWNpZCBub25jZSA9ID1TbGoreE5seHcsQS1AXzEKMDAxYmNpZCB0b2tlbl92ZXJzaW9uID0gdjEKMDAyZnNpZ25hdHVyZSChG20FeHgj89auvJic7K7RNIJFvUOq6Tnbg7tBUwEk7go", + user_id = "@rtlmogtsjsaptqtdyg:ext01.citadel.team" +) + + +bot.start() diff --git a/python-matrixbot.nix b/python-matrixbot.nix new file mode 100644 index 0000000..d134e03 --- /dev/null +++ b/python-matrixbot.nix @@ -0,0 +1,30 @@ +{ lib +, buildPythonPackage +, fetchPypi +, markdown +, matrix-client +}: + +buildPythonPackage rec { + pname = "python-matrixbot"; + version = "0.0.7"; + CI_COMMIT_TAG = version; + + src = ./python-matrixbot; + #src = fetchPypi { + # inherit pname version; + # sha256 = "9412981b14ff3ab7ffbb1bfc1691758113ab8d71f731b3093d8808c286b69c71"; + #}; + + propagatedBuildInputs = [ + markdown + matrix-client + ]; + + meta = with lib; { + description = "A basic bot for Matrix"; + homepage = https://gitlab.com/gibberfish/python-matrixbot; + license = licenses.mit; + # maintainers = [ maintainers. ]; + }; +} -- cgit v1.2.3