diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/bob.py | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/plugins/bob.py b/plugins/bob.py new file mode 100644 index 00000000..cce02b03 --- /dev/null +++ b/plugins/bob.py @@ -0,0 +1,75 @@ +""" +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 plugin import BasePlugin +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.ConversationTab, 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) + + 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 = 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 the_input.auto_completion(images, quotify=False) |