webhooks: fixes from table changes

- webhooks: fix create avatar base64
 - webhooks: fix info.name
 - embed.messages: handle EmbedURL on is_media_url
 - storage: add fallback info for when wb_info is none
 - storage: fix pop of non-existing webhook_id
This commit is contained in:
Luna 2019-03-19 00:29:49 -03:00
parent 13720904bd
commit bc13e06eee
3 changed files with 34 additions and 11 deletions

View File

@ -318,14 +318,13 @@ async def create_message_webhook(guild_id, channel_id, webhook_id, data):
await conn.execute( await conn.execute(
""" """
INSERT INTO messages (id, channel_id, guild_id, webhook_id, INSERT INTO messages (id, channel_id, guild_id,
content, tts, mention_everyone, message_type, embeds) content, tts, mention_everyone, message_type, embeds)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
""", """,
message_id, message_id,
channel_id, channel_id,
guild_id, guild_id,
webhook_id,
data['content'], data['content'],
data['tts'], data['tts'],
@ -335,6 +334,15 @@ async def create_message_webhook(guild_id, channel_id, webhook_id, data):
data.get('embeds', []) data.get('embeds', [])
) )
info = data['info']
await conn.execute("""
INSERT INTO message_webhook_info
(message_id, webhook_id, name, avatar)
VALUES
($1, $2, $3, $4)
""", message_id, webhook_id, info['name'], info['avatar'])
return message_id return message_id
@ -352,7 +360,7 @@ async def _create_avatar(webhook_id: int, avatar_url):
raise BadRequest('url is not media url') raise BadRequest('url is not media url')
resp, raw = await fetch_raw_img(avatar_url) resp, raw = await fetch_raw_img(avatar_url)
raw_b64 = base64.b64encode(raw) raw_b64 = base64.b64encode(raw).decode()
mime = resp.headers['content-type'] mime = resp.headers['content-type']
b64_data = f'data:{mime};base64,{raw_b64}' b64_data = f'data:{mime};base64,{raw_b64}'
@ -405,8 +413,7 @@ async def execute_webhook(webhook_id: int, webhook_token):
'embeds': await async_map(fill_embed, given_embeds), 'embeds': await async_map(fill_embed, given_embeds),
'info': { 'info': {
'id': webhook_id, 'name': j.get('username', webhook['name']),
'name': j.get('name', webhook['name']),
'avatar': avatar 'avatar': avatar
} }
} }

View File

@ -25,6 +25,7 @@ from pathlib import Path
from logbook import Logger from logbook import Logger
from litecord.embed.sanitizer import proxify, fetch_metadata, fetch_embed from litecord.embed.sanitizer import proxify, fetch_metadata, fetch_embed
from litecord.embed.schemas import EmbedURL
log = Logger(__name__) log = Logger(__name__)
@ -85,9 +86,14 @@ async def _update_and_dispatch(payload, new_embeds, storage, dispatcher):
'channel', channel_id, 'MESSAGE_UPDATE', update_payload) 'channel', channel_id, 'MESSAGE_UPDATE', update_payload)
def is_media_url(url: str) -> bool: def is_media_url(url) -> bool:
"""Return if the given URL is a media url.""" """Return if the given URL is a media url."""
if isinstance(url, EmbedURL):
parsed = url.parsed
else:
parsed = urllib.parse.urlparse(url) parsed = urllib.parse.urlparse(url)
path = Path(parsed.path) path = Path(parsed.path)
extension = path.suffix.lstrip('.') extension = path.suffix.lstrip('.')

View File

@ -813,16 +813,26 @@ class Storage:
WHERE message_id = $1 WHERE message_id = $1
""", int(res['id'])) """, int(res['id']))
res['author'] = { if not wb_info:
'id': str(wb_info['id']), log.warning('webhook info not found for msg {}',
res['id'])
wb_info = wb_info or {
'id': res['id'],
'bot': True, 'bot': True,
'avatar': None,
'username': '<unknown webhook info>',
'discriminator': '0000', 'discriminator': '0000',
}
res['author'] = {
'id': str(wb_info['webhook_id']),
'bot': True,
'username': wb_info['name'], 'username': wb_info['name'],
'avatar': wb_info['avatar'] 'avatar': wb_info['avatar']
} }
else: else:
res['author'] = await self.get_user(res['author_id']) res['author'] = await self.get_user(res['author_id'])
res.pop('webhook_id')
res.pop('author_id') res.pop('author_id')