homes/desktop/.local/share/poezio/plugins/bob.py
kujiu (@uberwald) 8ca6287fb1
Update all tools
-> Passwords in KeePassXC (access by keyring)
-> Neomutt + Aerc (mail)
-> vdirsyncer + khal + khard (calendar and contacts)
zsh -> fish
-> poezio (XMPP)
-> newsboat (RSS with FreshRSS)
-> toot (Mastodon client)
vim -> neovim (with lunarvim)
-> nvimpager (pager based on neovim)
-> konsole

With Nightfox theme.
2023-09-02 00:40:34 +02:00

83 lines
2.6 KiB
Python

"""
This plugin sends a small image to the recipient of your choice, using XHTML-IM and Bits of Binary.
Usage
-----
/bob some/image.png
Configuration options
---------------------
.. glossary::
max_size
**Default:** ``2048``
The maximum acceptable size of a file, over which you will get an error instead.
max_age
**Default:** ``86400``
The time during which the file should stay in cache on the receiving side.
"""
from poezio.core.structs import Completion
from poezio.plugin import BasePlugin
from poezio import tabs
from pathlib import Path
from glob import glob
from os.path import expanduser
from mimetypes import guess_type
class Plugin(BasePlugin):
default_config = {'bob': {'max_size': 2048, 'max_age': 86400}}
def init(self):
for tab in tabs.DynamicConversationTab, tabs.StaticConversationTab, tabs.PrivateTab, tabs.MucTab:
self.api.add_tab_command(
tab,
'bob',
self.command_bob,
usage='<image>',
help='Send image <image> to the current discussion',
short='Send a short image',
completion=self.completion_bob)
async def command_bob(self, filename):
path = Path(expanduser(filename))
try:
size = path.stat().st_size
except OSError as exc:
self.api.information('Error sending “%s”: %s' % (path.name, exc),
'Error')
return
mime_type = guess_type(path.as_posix())[0]
if mime_type is None or not mime_type.startswith('image/'):
self.api.information(
'Error sending “%s”, not an image file.' % path.name, 'Error')
return
if size > self.config.get('max_size'):
self.api.information(
'Error sending “%s”, file too big.' % path.name, 'Error')
return
with open(path.as_posix(), 'rb') as file:
data = file.read()
max_age = self.config.get('max_age')
cid = await self.core.xmpp.plugin['xep_0231'].set_bob(
data, mime_type, max_age=max_age)
self.api.run_command(
'/xhtml <img src="cid:%s" alt="%s"/>' % (cid, path.name))
@staticmethod
def completion_bob(the_input):
txt = expanduser(the_input.get_text()[5:])
images = []
for filename in glob(txt + '*'):
mime_type = guess_type(filename)[0]
if mime_type is not None and mime_type.startswith('image/'):
images.append(filename)
return Completion(the_input.auto_completion, images, quotify=False)