Add the rest of the xbotlib bots

This commit is contained in:
Luke Murphy 2021-02-03 09:55:26 +01:00
parent 192dbbc2a7
commit 92d4f9f3e7
No known key found for this signature in database
GPG Key ID: 5E2EF5A63E3718CC
13 changed files with 203 additions and 0 deletions

BIN
echobot/avatar.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

4
echobot/echobot.conf Normal file
View File

@ -0,0 +1,4 @@
[echobot]
account = echobot@vvvvvvaria.org
nick = echobot
rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org

26
echobot/echobot.py Normal file
View File

@ -0,0 +1,26 @@
from xbotlib import Bot
class EchoBot(Bot):
"""Responds with whatever you send.
Simply direct message the bot and see if you get back what you sent. It
also works in group chats but in this case you need to summon the bot using
its nickname.
"""
help = "I echo messages back 🖖️"
def direct(self, message):
"""Send back whatever we receive."""
self.reply(message.text, to=message.sender)
def group(self, message):
"""Send back whatever receive in group chats."""
if message.url:
return
self.reply(message.content, room=message.room)
EchoBot()

BIN
glossbot.xbotlib/avatar.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -0,0 +1,4 @@
[glossbot]
account = glossbot@vvvvvvaria.org
nick = glossbot
rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org

View File

@ -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 <entry> - <definition>
glossbot: @rm <entry>
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()

BIN
logsbot/avatar.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

13
logsbot/index.html.j2 Normal file
View File

@ -0,0 +1,13 @@
<html>
<head>
</head>
<body>
<h1>logsbot collective log</h1>
{% for room in payload["rooms"] %}
<h2>{{ room }}</h2>
{% for url in payload[room]["urls"] %}
<img src="{{ url }}" />
{% endfor %}
{% endfor %}
</body>
</html>

4
logsbot/logsbot.conf Normal file
View File

@ -0,0 +1,4 @@
[logsbot]
account = logsbot@vvvvvvaria.org
nick = logsbot
rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org

37
logsbot/logsbot.py Normal file
View File

@ -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()

BIN
whisperbot.xbotlib/avatar.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -0,0 +1,4 @@
[whisperbot]
account = whisperbot@vvvvvvaria.org
nick = whisperbot
rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org, members@muc.vvvvvvaria.org

View File

@ -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()