From 92d4f9f3e7c3e056b4f8d900563bd81ce644d7fc Mon Sep 17 00:00:00 2001 From: Luke Murphy Date: Wed, 3 Feb 2021 09:55:26 +0100 Subject: [PATCH] Add the rest of the xbotlib bots --- echobot/avatar.png | Bin 0 -> 3355 bytes echobot/echobot.conf | 4 ++ echobot/echobot.py | 26 +++++++++ glossbot.xbotlib/avatar.png | Bin 0 -> 5558 bytes glossbot.xbotlib/glossbot.conf | 4 ++ glossbot.xbotlib/glossbot.py | 90 +++++++++++++++++++++++++++++ logsbot/avatar.png | Bin 0 -> 10816 bytes logsbot/index.html.j2 | 13 +++++ logsbot/logsbot.conf | 4 ++ logsbot/logsbot.py | 37 ++++++++++++ whisperbot.xbotlib/avatar.png | Bin 0 -> 6574 bytes whisperbot.xbotlib/whisperbot.conf | 4 ++ whisperbot.xbotlib/whisperbot.py | 21 +++++++ 13 files changed, 203 insertions(+) create mode 100755 echobot/avatar.png create mode 100644 echobot/echobot.conf create mode 100644 echobot/echobot.py create mode 100755 glossbot.xbotlib/avatar.png create mode 100644 glossbot.xbotlib/glossbot.conf create mode 100644 glossbot.xbotlib/glossbot.py create mode 100755 logsbot/avatar.png create mode 100644 logsbot/index.html.j2 create mode 100644 logsbot/logsbot.conf create mode 100644 logsbot/logsbot.py create mode 100755 whisperbot.xbotlib/avatar.png create mode 100644 whisperbot.xbotlib/whisperbot.conf create mode 100644 whisperbot.xbotlib/whisperbot.py diff --git a/echobot/avatar.png b/echobot/avatar.png new file mode 100755 index 0000000000000000000000000000000000000000..f267ed68ed85da8f6166e7712df4dec689e0ef07 GIT binary patch literal 3355 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 lD_O}(R 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 Eg2UgYxc~qF literal 0 HcmV?d00001 diff --git a/glossbot.xbotlib/glossbot.conf b/glossbot.xbotlib/glossbot.conf new file mode 100644 index 0000000..8257454 --- /dev/null +++ b/glossbot.xbotlib/glossbot.conf @@ -0,0 +1,4 @@ +[glossbot] +account = glossbot@vvvvvvaria.org +nick = glossbot +rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org diff --git a/glossbot.xbotlib/glossbot.py b/glossbot.xbotlib/glossbot.py new file mode 100644 index 0000000..31129e6 --- /dev/null +++ b/glossbot.xbotlib/glossbot.py @@ -0,0 +1,90 @@ +from random import choice + +from xbotlib import Bot + + +class GlossBot(Bot): + """Building a shared glossary together. + + A glossary is "an alphabetical list of terms in a particular domain of + knowledge with the definitions for those terms." + + This bot reacts to commands which insert, list or delete items from a + shared glossary when summoned in a group chat. This bot makes use of + persistent storage so the glossary is always there even if the bot goes + away. + """ + + help = """ + I help build a shared glossary + glossbot: @add - + glossbot: @rm + glossbot: @rand + glossbot: @ls + """ + + def group(self, message): + """Handle glossary commands.""" + if "@add" in message.content: + try: + parsed = self.parse_add(message) + self.add(*parsed, room=message.room) + except Exception: + response = f"Couldn't understand '{message.content}'?" + self.reply(response, room=message.sender) + elif "@rm" in message.content: + try: + parsed = message.content.split("@rm")[-1].strip() + self.rm(parsed, room=message.room) + except Exception: + response = f"Couldn't understand '{message.content}'?" + self.reply(response, room=message.sender) + elif "@rand" in message.content: + self.rand(room=message.room) + elif "@ls" in message.content: + self.ls(room=message.room) + else: + self.log.info(f"{message.text} not recognised as glossbot command") + + def parse_add(self, message): + """Parse the add command syntax.""" + try: + replaced = message.content.replace("@add", "") + return [s.strip() for s in replaced.split("-", 1)] + except ValueError: + self.log.error(f"Failed to parse {message.content}") + + def add(self, entry, definition, **kwargs): + """Add a new entry.""" + self.db[entry] = definition + self.reply("Added ✌ī¸", **kwargs) + + def rand(self, **kwargs): + """List a random entry.""" + if not self.db.keys(): + self.reply("Glossary is empty 🙃ī¸", **kwargs) + return + + entry = choice(list(self.db.keys())) + self.reply(f"{entry} - {self.db[entry]}", **kwargs) + + def ls(self, **kwargs): + """List all entries.""" + if not self.db.keys(): + self.reply("Glossary is empty 🙃ī¸", **kwargs) + return + + for entry in sorted(self.db.keys()): + self.reply(f"{entry} - {self.db[entry]}", **kwargs) + + def rm(self, entry, **kwargs): + """Remove an entry.""" + if entry not in self.db.keys(): + self.reply(f"{entry} doesn't exist?", **kwargs) + return + + self.db.pop(entry) + self.reply("Removed ✌ī¸", **kwargs) + + +GlossBot() diff --git a/logsbot/avatar.png b/logsbot/avatar.png new file mode 100755 index 0000000000000000000000000000000000000000..84b2f234da2c506ec73dfd5fc9ff2f6523056b42 GIT binary patch literal 10816 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 + + + +

logsbot collective log

+{% for room in payload["rooms"] %} +

{{ room }}

+ {% for url in payload[room]["urls"] %} + + {% endfor %} +{% endfor %} + + diff --git a/logsbot/logsbot.conf b/logsbot/logsbot.conf new file mode 100644 index 0000000..8d62492 --- /dev/null +++ b/logsbot/logsbot.conf @@ -0,0 +1,4 @@ +[logsbot] +account = logsbot@vvvvvvaria.org +nick = logsbot +rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org diff --git a/logsbot/logsbot.py b/logsbot/logsbot.py new file mode 100644 index 0000000..9ab0891 --- /dev/null +++ b/logsbot/logsbot.py @@ -0,0 +1,37 @@ +from os.path import basename +from urllib.parse import urlparse + +from xbotlib import Bot + + +class LogsBot(Bot): + """Collaborative log writing.""" + + help = """Logging to https://logsbot.bots.varia.zone""" + + def group(self, message): + """Move group messages into the log.""" + if not message.url: + return + + if message.room not in self.db.keys(): + self.db[message.room] = [] + + self.db[message.room].append(message.url) + + filename = basename(urlparse(message.url).path) + return self.reply(f"Added {filename} 🤩ī¸", room=message.room) + + def serve(self, request): + """Serve the log.""" + payload = {"rooms": []} + + for room in self.db.keys(): + payload["rooms"].append(room) + payload[room] = {"urls": self.db[room]} + + rendered = self.template.render(payload=payload) + return self.respond(rendered) + + +LogsBot() diff --git a/whisperbot.xbotlib/avatar.png b/whisperbot.xbotlib/avatar.png new file mode 100755 index 0000000000000000000000000000000000000000..7fe8dbfb2d041ec87722f828d8e48500e05c8071 GIT binary patch literal 6574 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%0Dirm98f+>0bXpSpKK(qAF? zYn4Fx7Oe6TL%L34u>Tp0(cN2<4C_1qUl@nrz|+5``hTO{pH$1`&jTs;YbU=dF+Gcy~l zSu=RJVRFvRXU3_isia&UD%9(dFDXcs+wPo;0gN|M;BI5MF$nz20hLLvEfj+9Ij3t{ zC>*8P{mTszwPk#KYAwlwM*tp@E(9==f`5B;i))I(wN6|6vaM(jur}!kUUk= z+J*(_0Pt|J7!1|x(KLXbHW%U;&+|4~YaarzzO!>N$62q}!_4jH=&`w0*<^0NZr$3H zM4UV`2YyKfip8KPX&^V>vjljMd>p{pEq0Wx^?I}wz`i5!g6{``w+F!UX})S;h-zV} zRGM#<^E`nW8yiou_!u3nbml6x<%D*GVJrY2ZBq8OYG!szde;&=%DYIu-fjp0c)C^# zKSFXnfISNtqH5UDv4G=T$O^AsJx~CE*I$1l0`T_$-o4UoNYe4fm{qA&A0erwT4hOZ z0NA+10w0%Fk!|e)lAbrlTq@~&=iDoKjXZx|aCvslM+$*JcR( zQxwHl09XZJSFu=79LHftN6BjfzTQZZ_zjuyX6JO8r0p$){ttkE^?h%LwYK0K9wd26 z)&&AMD$fggo_ChDb~AwYlbi{|xB{TC1ejB;b$ipQZhNa-k{iETEC#pN>(M>wdpnaP zX^Vd}c?NaWs@__fb)%khr@Leoee4-WQ+B=1by;DqFuq&ol% zk^HKpn*dZu{;i~20ela@bc;pkCHZMdUnF^`tET4!^fa^{R1@?h9`k+g z+$6CFNnTYf2KNGZH0@tj#BR?wOy%-WQ~G#pY_hXh40@f@sI^wk=`SR`31EjY<_yVg zli(X;UN(mRl_d5O05<~owI)gKJA;G$p9N4G9j)A-QtGX|;8p;eNghYy_ngzlbP?C3 z4bu)|%*#n)Zzp*_fDcOYJ z=}rLOOizzm-Y1CT*s@$6YMLBIM=K?g*Gak(z-eu8gOYSJiT?ojsH8Cf$L4;2moes9 z=iEI_ykHi<6_S3kLJICRlFvx`QF@q?|5jDfKLhy2;9&n-i|-S}HVA^EX$Jn#p$U?_ zPtsS~1P@6B@FmimBI)`D@F4j~5qzby9j!bt zI$HUSj3=0$uG*|sHq8zWj4^*D>5?NjoXAtucL4YW$)7bSw%S@ZMDnR7A@C;2o;LW$ z>^H|Pkyi|Wj{x|^*jVMND2kGvp6>Z>(KLden3%dy(v6EhhDQMGYeTUvl3xdO1Aw^U zo%1BU)#SIuJO#dzrp)uqe@oi3f`%!O@OLva^)vI`qRD5*dOhm1)_t?_hzdaLdET`- zZ&@ilcCmy3l0RseucS3XV}+-5t6iy#Dd+TfTBBeE9cjT@_l5oY56pLqCZ8Fr)!E-k zY2`+@e>9GhqX3-TCSwbdw*dIdw5ZDF$4Cw~t8ska`xgLHE0l4!r0oqyaLb)7Uewjq zc}zxUIKD;v?Iii@M*uz>e*wT>r~5G^yq$J$jgnBS zg`Xk0+ZbLeX}ZOC9|3R?$-j~G?j_jiq{Wf?>BVBv2jKhJ!2!vuTV;D=c)(h><_N(< z(gl)?G3G~-E|GMwS)r3|p*;Y8>YT1KhNnpQgrqZ5s%@X79RS`Tc~9E7wUT`w$>FpX zXnan}T4g^BBO8X%21ysS%D&b*G|A-cjEynoW&pPX_^9WZ*jm@w%suCL3H1W_wuILt z-3Q=7V+@>gYXJNy$q#3&^%8C$rhm;aZOpnwzgR33NsdNQa&a0CZtjqTK1o{ZV&C`P z25?=H*dCI`7!z1)L(ctEaL$F2=y_f-9n14f(K$ugSVHKWd(0T~p&;z; zB_uu1GY748lO!KAhJm#%1VGO-g>+o?JaezL?jHfj7*k3wU&t6!loZd^F)Wb$m9_32 zl9!T{b1ot0FgfSOvTl*(@=&nw`s!@h+1dI3dVTfa!9&s7wQJhFAB@(Ao_^Ddk{PDl zEx1Lk@`8(!`MbL-ydt~c2B&jw{sw2gUY|dl$SYQ@R-^9j?nMjSRuA7$&o|1bR3@YT g{=P*E+)T#*0;SSKt5jgj=l}o!07*qoM6N<$f@4m?>;M1& literal 0 HcmV?d00001 diff --git a/whisperbot.xbotlib/whisperbot.conf b/whisperbot.xbotlib/whisperbot.conf new file mode 100644 index 0000000..a2f4743 --- /dev/null +++ b/whisperbot.xbotlib/whisperbot.conf @@ -0,0 +1,4 @@ +[whisperbot] +account = whisperbot@vvvvvvaria.org +nick = whisperbot +rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org, members@muc.vvvvvvaria.org diff --git a/whisperbot.xbotlib/whisperbot.py b/whisperbot.xbotlib/whisperbot.py new file mode 100644 index 0000000..f496b79 --- /dev/null +++ b/whisperbot.xbotlib/whisperbot.py @@ -0,0 +1,21 @@ +from xbotlib import Bot + + +class WhisperBot(Bot): + """Anonymous whispering in group chats. + + In order to activate this bot you can invite it to your group chat. Once + invited, you can start a private chat with the bot and tell it you want it + to whisper your message into the group chat. The bot will then do this on + your behalf and not reveal your identity. This is nice when you want to + communicate with the group anonymously. + """ + + help = "I whisper private messages into group chats 😌ī¸" + + def direct(self, message): + """Receive private messages and whisper them into group chats.""" + self.reply(f"*pssttt...* {message.content}", room=message.room) + + +WhisperBot()