Add rudimentary sticker support (#25)
* Add initial sticker support * Add Pillow to requirements.txt
This commit is contained in:
parent
7cfac1504c
commit
b67d0733d9
@ -2,3 +2,4 @@ aiohttp==1.0.5
|
|||||||
aiotg==0.7.11
|
aiotg==0.7.11
|
||||||
beautifulsoup4==4.5.1
|
beautifulsoup4==4.5.1
|
||||||
sqlalchemy==1.1.3
|
sqlalchemy==1.1.3
|
||||||
|
Pillow==4.0.0
|
||||||
|
@ -11,7 +11,9 @@ import mimetypes
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from time import time
|
from time import time
|
||||||
from urllib.parse import unquote, quote, urlparse, parse_qs
|
from urllib.parse import unquote, quote, urlparse, parse_qs
|
||||||
|
from io import BytesIO
|
||||||
|
|
||||||
|
from PIL import Image
|
||||||
from aiohttp import web, ClientSession
|
from aiohttp import web, ClientSession
|
||||||
from aiotg import Bot
|
from aiotg import Bot
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
@ -391,15 +393,24 @@ def send_matrix_message(room_id, user_id, txn_id, **kwargs):
|
|||||||
return matrix_put('client', url, user_id, kwargs)
|
return matrix_put('client', url, user_id, kwargs)
|
||||||
|
|
||||||
|
|
||||||
async def upload_tgfile_to_matrix(file_id, user_id):
|
async def upload_tgfile_to_matrix(file_id, user_id, mime='image/jpeg', convert_to=None):
|
||||||
file_path = (await TG_BOT.get_file(file_id))['file_path']
|
file_path = (await TG_BOT.get_file(file_id))['file_path']
|
||||||
request = await TG_BOT.download_file(file_path)
|
request = await TG_BOT.download_file(file_path)
|
||||||
|
|
||||||
data = await request.read()
|
data = await request.read()
|
||||||
j = await matrix_post('media', 'upload', user_id, data, 'image/jpeg')
|
|
||||||
|
if convert_to:
|
||||||
|
image = Image.open(BytesIO(data))
|
||||||
|
png_image = BytesIO(None)
|
||||||
|
image.save(png_image, convert_to)
|
||||||
|
|
||||||
|
j = await matrix_post('media', 'upload', user_id, png_image.getvalue(), mime)
|
||||||
|
length = len(png_image.getvalue())
|
||||||
|
else:
|
||||||
|
j = await matrix_post('media', 'upload', user_id, data, mime)
|
||||||
|
length = len(data)
|
||||||
|
|
||||||
if 'content_uri' in j:
|
if 'content_uri' in j:
|
||||||
return j['content_uri'], len(data)
|
return j['content_uri'], length
|
||||||
else:
|
else:
|
||||||
return None, 0
|
return None, 0
|
||||||
|
|
||||||
@ -427,6 +438,38 @@ async def register_join_matrix(chat, room_id, user_id):
|
|||||||
user_id, {'displayname': name})
|
user_id, {'displayname': name})
|
||||||
await matrix_post('client', 'join/{}'.format(room_id), user_id, {})
|
await matrix_post('client', 'join/{}'.format(room_id), user_id, {})
|
||||||
|
|
||||||
|
@TG_BOT.handle('sticker')
|
||||||
|
async def aiotg_sticker(chat, sticker):
|
||||||
|
link = db.session.query(db.ChatLink).filter_by(tg_room=chat.id).first()
|
||||||
|
if not link:
|
||||||
|
print('Unknown telegram chat {}: {}'.format(chat, chat.id))
|
||||||
|
return
|
||||||
|
|
||||||
|
room_id = link.matrix_room
|
||||||
|
user_id = USER_ID_FORMAT.format(chat.sender['id'])
|
||||||
|
txn_id = quote('{}{}'.format(chat.message['message_id'], chat.id))
|
||||||
|
|
||||||
|
file_id = sticker['file_id']
|
||||||
|
uri, length = await upload_tgfile_to_matrix(file_id, user_id, 'image/png', 'PNG')
|
||||||
|
|
||||||
|
info = {'mimetype': 'image/png', 'size': length, 'h': sticker['height'],
|
||||||
|
'w': sticker['width']}
|
||||||
|
body = 'Sticker_{}.png'.format(int(time() * 1000))
|
||||||
|
|
||||||
|
if uri:
|
||||||
|
j = await send_matrix_message(room_id, user_id, txn_id, body=body,
|
||||||
|
url=uri, info=info, msgtype='m.image')
|
||||||
|
|
||||||
|
if 'errcode' in j and j['errcode'] == 'M_FORBIDDEN':
|
||||||
|
await register_join_matrix(chat, room_id, user_id)
|
||||||
|
await send_matrix_message(room_id, user_id, txn_id + 'join',
|
||||||
|
body=body, url=uri, info=info,
|
||||||
|
msgtype='m.image')
|
||||||
|
|
||||||
|
if 'caption' in chat.message:
|
||||||
|
await send_matrix_message(room_id, user_id, txn_id + 'caption',
|
||||||
|
body=chat.message['caption'],
|
||||||
|
msgtype='m.text')
|
||||||
|
|
||||||
@TG_BOT.handle('photo')
|
@TG_BOT.handle('photo')
|
||||||
async def aiotg_photo(chat, photo):
|
async def aiotg_photo(chat, photo):
|
||||||
|
Loading…
Reference in New Issue
Block a user