Luke Murphy
3 years ago
13 changed files with 203 additions and 0 deletions
After Width: | Height: | Size: 3.3 KiB |
@ -0,0 +1,4 @@ |
|||||
|
[echobot] |
||||
|
account = echobot@vvvvvvaria.org |
||||
|
nick = echobot |
||||
|
rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org |
@ -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() |
After Width: | Height: | Size: 5.4 KiB |
@ -0,0 +1,4 @@ |
|||||
|
[glossbot] |
||||
|
account = glossbot@vvvvvvaria.org |
||||
|
nick = glossbot |
||||
|
rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org |
@ -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() |
After Width: | Height: | Size: 11 KiB |
@ -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> |
@ -0,0 +1,4 @@ |
|||||
|
[logsbot] |
||||
|
account = logsbot@vvvvvvaria.org |
||||
|
nick = logsbot |
||||
|
rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org |
@ -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() |
After Width: | Height: | Size: 6.4 KiB |
@ -0,0 +1,4 @@ |
|||||
|
[whisperbot] |
||||
|
account = whisperbot@vvvvvvaria.org |
||||
|
nick = whisperbot |
||||
|
rooms = ibugev@muc.vvvvvvaria.org, xbotlibtest@muc.vvvvvvaria.org, members@muc.vvvvvvaria.org |
@ -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() |
Loading…
Reference in new issue