summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormakefu <github@syntax-fehler.de>2020-08-14 23:56:25 +0200
committermakefu <github@syntax-fehler.de>2020-08-14 23:56:25 +0200
commit33dd1ac6859d74c1f9734b5c2bd6c5ceb32441c4 (patch)
treea306209ab634a29f4f5a9735c44a7e8d6d3c9ace
emergency initial commit
-rw-r--r--default.nix10
-rw-r--r--kalauerbot.py172
-rw-r--r--python-matrixbot.nix30
3 files changed, 212 insertions, 0 deletions
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 <nixpkgs> {};
+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 <name> - add a new person to the kalauer roster (alias: !activate, !reactivate)
+ !delete <name> - deactivate the person from the roster (alias: !remove, !deactivate, !freeze)
+ !deactivate <name> - deactivate person (e.g. because he is in holiday)
+ !activate <name> - 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 <name> - 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 <name>` 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. ];
+ };
+}