mrDoctorWho/vk4xmpp

View on GitHub
extensions/sticker.py

Summary

Maintainability
B
4 hrs
Test Coverage
# coding: utf-8
# This file is a part of VK4XMPP transport
# © simpleApps, 2015.

import base64
from tempfile import mktemp
from cStringIO import StringIO

sticker_url = re.compile(r"^Sticker\:\s(http[s]?\:\/\/[a-zA-Z0-9\._\/]+)$")

try:
    from PIL import Image
except ImportError:
    logger.warning("sticker: not enabling RGB conversion because PIL is not installed")
    ENABLE_RGB_CONVERSION = False

if not isdef("STICKER_SIZE"):
    STICKER_SIZE = "128"

GLOBAL_USER_SETTINGS["send_stickers"] = {"label": "Send stickers with XHTML-IM", 
    "desc": "If set, transport would send images for stickers instead of URLs (requires client-side support)", "value": 0}


def convertImage(data):
    outfile = mktemp()
    io = StringIO(data)
    image = Image.open(io)
    image.convert("RGB").save(outfile, "JPEG", quality=RGB_CONVERSION_QUALITY)
    data = rFile(outfile)
    try:
        os.remove(outfile)
    except Exception:
        crashLog("convertImage")
    return data


def sendSticker(msg, destination, source):
    body = msg.getBody()
    if body:
        if msg.getType() == "groupchat":
            user = Chat.getUserObject(destination)
        else:
            user = Users.get(destination)
        if user and user.settings.send_stickers:
            url = sticker_url.search(body)
            if url:
                url = url.group(1).replace("256b", STICKER_SIZE)
                data = urllib.urlopen(url).read()
                if data:
                    mime = "png"
                    if isdef("ENABLE_RGB_CONVERSION") and ENABLE_RGB_CONVERSION:
                        data = convertImage(data)
                        mime = "jpeg"
                    data = base64.b64encode(data)
                    xhtml = msg.setTag("html", namespace=xmpp.NS_XHTML_IM)
                    xbody = xhtml.setTag("body", namespace="http://www.w3.org/1999/xhtml")
                    xbody.setTag("br")
                    xbody.setTag("img", {"src": "data:image/%s;base64,%s" % (mime, data), "alt": "img"})


def initStickerSender():
    if xmpp.NS_GROUPCHAT in TransportFeatures:
        registerHandler("msg03g", sendSticker)


registerHandler("evt01", initStickerSender)
registerHandler("msg03", sendSticker)