Support avatars

Closes https://git.autonomic.zone/decentral1se/xbotlib/issues/17.
This commit is contained in:
Luke Murphy 2021-01-15 11:08:07 +01:00
parent d9e48a5567
commit 78581dcf2f
No known key found for this signature in database
GPG Key ID: 5E2EF5A63E3718CC
4 changed files with 48 additions and 2 deletions

5
.gitignore vendored
View File

@ -1,3 +1,4 @@
*.conf
*.egg-info/
*.pyc
.coverage
@ -6,8 +7,8 @@
.mypy_cache/
.tox/
__pycache__
*.conf
echobot.py
avatar.png
build/
dist/
echobot.py
pip-wheel-metadata/

View File

@ -1,5 +1,9 @@
# xbotlib x.x.x (UNRELEASED)
# xbotlib 0.8.1 (2021-01-15)
- Support avatars ([#17](https://git.autonomic.zone/decentral1se/xbotlib/issues/17))
# xbotlib 0.8.0 (2021-01-14)
- Support not providing response implementation ([#18](https://git.autonomic.zone/decentral1se/xbotlib/issues/18))

View File

@ -109,6 +109,13 @@ The bot will then respond to:
- `!uptime` commands in direct messages
- `<nick>:!uptime` commands in group chats (use your own nick)
## Avatars
By default, `xbotlib` will look for an `avatar.png` file alongside your Python
script which contains your bot implementation. You can also specify another
path using the `--avatar` option on the command-line interface. The images
should ideally have a height of `64` and a width of `64` pixels each.
## Configure your bot
All the ways you can pass configuration details to your bot.

View File

@ -4,6 +4,7 @@ from argparse import ArgumentParser
from configparser import ConfigParser
from datetime import datetime as dt
from getpass import getpass
from imghdr import what
from logging import DEBUG, INFO, basicConfig, getLogger
from os import environ
from os.path import exists
@ -12,6 +13,7 @@ from sys import exit, stdout
from humanize import naturaldelta
from slixmpp import ClientXMPP
from slixmpp.exceptions import XMPPError
class SimpleMessage:
@ -114,6 +116,13 @@ class Bot(ClientXMPP):
dest="nick",
help="Nickname for the bot account",
)
self.parser.add_argument(
"-av",
"--avatar",
dest="avatar",
help="Avatar for the bot account",
default="avatar.png",
)
self.args = self.parser.parse_args()
@ -185,6 +194,8 @@ class Bot(ClientXMPP):
self.password = password
self.nick = nick
self.avatar = self.args.avatar
def register_xmpp_event_handlers(self):
"""Register functions against specific XMPP event handlers."""
self.add_event_handler("session_start", self.session_start)
@ -210,6 +221,27 @@ class Bot(ClientXMPP):
"""Handle session_start event."""
self.send_presence()
self.get_roster()
self.publish_avatar()
def publish_avatar(self):
"""Publish bot avatar."""
try:
abspath = Path(self.avatar).absolute()
with open(abspath, "rb") as handle:
contents = handle.read()
except IOError:
self.log.info(f"No avatar discovered (tried '{abspath}')")
return
id = self.plugin["xep_0084"].generate_id(contents)
info = {
"id": id,
"type": f"image/{what('', contents)}",
"bytes": len(contents),
}
self.plugin["xep_0084"].publish_avatar(contents)
self.plugin["xep_0084"].publish_avatar_metadata(items=[info])
def group_invite(self, message):
"""Accept invites to group chats."""
@ -236,6 +268,8 @@ class Bot(ClientXMPP):
self.register_plugin("xep_0045") # Multi-User Chat
self.register_plugin("xep_0199") # XMPP Ping
self.register_plugin("xep_0084") # User Avatar
def run(self):
"""Run the bot."""
self.connect()