summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2015-09-05 17:25:10 +0100
committerEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2015-09-06 13:47:50 +0100
commit0fb0078df849cd9a4205ddf7c848f5124b6ba27f (patch)
treed5f6c22f9244c8441fea8720e4c2af335f247cdd
parent275affbed7f2619c0a851c0679dd3ff872e4bcd0 (diff)
downloadpoezio-0fb0078df849cd9a4205ddf7c848f5124b6ba27f.tar.gz
poezio-0fb0078df849cd9a4205ddf7c848f5124b6ba27f.tar.bz2
poezio-0fb0078df849cd9a4205ddf7c848f5124b6ba27f.tar.xz
poezio-0fb0078df849cd9a4205ddf7c848f5124b6ba27f.zip
Add a plugin sending Bits of Binary (XEP-0231) images.
-rw-r--r--plugins/bob.py75
-rw-r--r--src/connection.py1
2 files changed, 76 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)
diff --git a/src/connection.py b/src/connection.py
index bfa9603e..23c07d59 100644
--- a/src/connection.py
+++ b/src/connection.py
@@ -149,6 +149,7 @@ class Connection(slixmpp.ClientXMPP):
if config.get('send_time'):
self.register_plugin('xep_0202')
self.register_plugin('xep_0224')
+ self.register_plugin('xep_0231')
self.register_plugin('xep_0249')
self.register_plugin('xep_0257')
self.register_plugin('xep_0280')