add draft for webhook_avatars usage

This commit is contained in:
Luna 2019-05-01 18:51:57 -03:00
parent acc52a0c61
commit addabb53ef
2 changed files with 27 additions and 8 deletions

View File

@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import secrets import secrets
import base64 import base64
import hashlib
from typing import Dict, Any, Optional from typing import Dict, Any, Optional
from quart import Blueprint, jsonify, current_app as app, request from quart import Blueprint, jsonify, current_app as app, request
@ -42,8 +43,9 @@ from litecord.blueprints.channel.messages import (
msg_create_request, msg_create_check_content, msg_add_attachment, msg_create_request, msg_create_check_content, msg_add_attachment,
msg_guild_text_mentions msg_guild_text_mentions
) )
from litecord.embed.sanitizer import fill_embed, fetch_raw_img from litecord.embed.sanitizer import fill_embed, fetch_raw_img, proxify
from litecord.embed.messages import process_url_embed, is_media_url from litecord.embed.messages import process_url_embed, is_media_url
from litecord.embed.schemas import EmbedURL
from litecord.utils import pg_set_json from litecord.utils import pg_set_json
from litecord.enums import MessageType from litecord.enums import MessageType
from litecord.images import STATIC_IMAGE_MIMES from litecord.images import STATIC_IMAGE_MIMES
@ -347,6 +349,18 @@ async def create_message_webhook(guild_id, channel_id, webhook_id, data):
return message_id return message_id
async def _webhook_avy_redir(webhook_id: int, avatar_url):
eu_avatar_url = EmbedURL.from_parsed(avatar_url)
url_hash = hashlib.sha256(eu_avatar_url.to_md_path).hexdigest()
await app.db.execute("""
INSERT INTO webhook_avatars (webhook_id, hash, md_url_redir)
VALUES ($1, $2, $3)
""", webhook_id, url_hash, proxify(eu_avatar_url))
return url_hash
async def _create_avatar(webhook_id: int, avatar_url) -> str: async def _create_avatar(webhook_id: int, avatar_url) -> str:
"""Create an avatar for a webhook out of an avatar URL, """Create an avatar for a webhook out of an avatar URL,
given when executing the webhook. given when executing the webhook.
@ -364,7 +378,7 @@ async def _create_avatar(webhook_id: int, avatar_url) -> str:
# but in the end, we will store it under the webhook_avatars table, # but in the end, we will store it under the webhook_avatars table,
# not IconManager. # not IconManager.
resp, raw = await fetch_raw_img(avatar_url) resp, raw = await fetch_raw_img(avatar_url)
raw_b64 = base64.b64encode(raw).decode() #raw_b64 = base64.b64encode(raw).decode()
mime = resp.headers['content-type'] mime = resp.headers['content-type']
@ -372,15 +386,15 @@ async def _create_avatar(webhook_id: int, avatar_url) -> str:
if mime not in STATIC_IMAGE_MIMES: if mime not in STATIC_IMAGE_MIMES:
raise BadRequest('invalid mime type for given url') raise BadRequest('invalid mime type for given url')
b64_data = f'data:{mime};base64,{raw_b64}' #b64_data = f'data:{mime};base64,{raw_b64}'
# TODO: replace this by webhook_avatars # TODO: replace this by webhook_avatars
icon = await app.icons.put( #icon = await app.icons.put(
'user', webhook_id, b64_data, # 'user', webhook_id, b64_data,
always_icon=True, size=(128, 128) # always_icon=True, size=(128, 128)
) #)
return icon.icon_hash return await _webhook_avy_redir(webhook_id, avatar_url)
@bp.route('/webhooks/<int:webhook_id>/<webhook_token>', methods=['POST']) @bp.route('/webhooks/<int:webhook_id>/<webhook_token>', methods=['POST'])

View File

@ -35,6 +35,11 @@ class EmbedURL:
self.raw_url = url self.raw_url = url
self.parsed = parsed self.parsed = parsed
@classmethod
def from_parsed(cls, parsed):
"""Make an EmbedURL instance out of an already parsed 6-tuple."""
return cls(parsed.geturl())
@property @property
def url(self) -> str: def url(self) -> str:
"""Return the unparsed URL.""" """Return the unparsed URL."""