from datetime import datetime from os import makedirs, path from shutil import rmtree from traceback import format_exc from uuid import uuid4 from PIL import Image import aiofiles from classes.poster_client import PosterClient from modules.api_client import authorize, move_pic, random_pic, http_session from modules.database import col_sent, col_submitted from modules.logger import logWrite from modules.utils import configGet, locale async def send_content(app: PosterClient) -> None: try: try: token = await authorize() except ValueError: await app.send_message( app.owner, locale("api_creds_invalid", "message", locale=configGet("locale")), ) return try: pic = await random_pic() except KeyError: logWrite(locale("post_empty", "console", locale=configGet("locale"))) if configGet("error", "reports"): await app.send_message( app.owner, locale("api_queue_empty", "message", locale=configGet("locale")), ) return except ValueError: if configGet("error", "reports"): await app.send_message( app.owner, locale("api_queue_error", "message", locale=configGet("locale")), ) return response = await http_session.get( f'{configGet("address", "posting", "api")}/photos/{pic[0]}', headers={"Authorization": f"Bearer {token}"}, ) if response.status != 200: logWrite( locale( "post_invalid_pic", "console", locale=configGet("locale") ).format(response.status, str(response.json())) ) if configGet("error", "reports"): await app.send_message( app.owner, locale( "post_invalid_pic", "message", locale=configGet("locale") ).format(response.status, response.json()), ) tmp_dir = str(uuid4()) makedirs(path.join(configGet("tmp", "locations"), tmp_dir), exist_ok=True) tmp_path = path.join(tmp_dir, pic[1]) async with aiofiles.open( path.join(configGet("tmp", "locations"), tmp_path), "wb" ) as out_file: await out_file.write(await response.read()) logWrite( f'Candidate {pic[1]} ({pic[0]}) is {path.getsize(path.join(configGet("tmp", "locations"), tmp_path))} bytes big', debug=True, ) if path.getsize(path.join(configGet("tmp", "locations"), tmp_path)) > 5242880: image = Image.open(path.join(configGet("tmp", "locations"), tmp_path)) width, height = image.size image = image.resize((int(width / 2), int(height / 2)), Image.ANTIALIAS) if tmp_path.lower().endswith(".jpeg") or tmp_path.lower().endswith(".jpg"): image.save( path.join(configGet("tmp", "locations"), tmp_path), "JPEG", optimize=True, quality=50, ) elif tmp_path.lower().endswith(".png"): image.save( path.join(configGet("tmp", "locations"), tmp_path), "PNG", optimize=True, compress_level=8, ) image.close() if path.getsize(path.join(configGet("tmp", "locations"), tmp_path)) > 5242880: rmtree( path.join(configGet("tmp", "locations"), tmp_dir), ignore_errors=True ) raise BytesWarning del response submitted = col_submitted.find_one({"temp.file": pic[1]}) if submitted is not None and submitted["caption"] is not None: caption = submitted["caption"].strip() else: caption = "" if ( submitted is not None and configGet("enabled", "posting", "submitted_caption") and ( (submitted["user"] not in app.admins) or (configGet("ignore_admins", "posting", "submitted_caption") is False) ) ): caption = ( f"{caption}\n\n{configGet('text', 'posting', 'submitted_caption')}\n" ) else: caption = f"{caption}\n\n" if configGet("enabled", "caption"): if configGet("link", "caption") != None: caption = f"{caption}[{configGet('text', 'caption')}]({configGet('link', 'caption')})" else: caption = f"{caption}{configGet('text', 'caption')}" else: caption = caption try: sent = await app.send_photo( configGet("channel", "posting"), path.join(configGet("tmp", "locations"), tmp_path), caption=caption, disable_notification=configGet("silent", "posting"), ) except Exception as exp: logWrite(f"Could not send image {pic[1]} ({pic[0]}) due to {exp}") if configGet("error", "reports"): await app.send_message( app.owner, locale( "post_exception", "message", locale=configGet("locale") ).format(exp, format_exc()), ) # rmtree(path.join(configGet("tmp", "locations"), tmp_dir), ignore_errors=True) return col_sent.insert_one( { "date": datetime.now(), "image": pic[0], "filename": pic[1], "channel": configGet("channel", "posting"), "caption": None if (submitted is None or submitted["caption"] is None) else submitted["caption"].strip(), } ) await move_pic(pic[0]) rmtree(path.join(configGet("tmp", "locations"), tmp_dir), ignore_errors=True) logWrite( locale("post_sent", "console", locale=configGet("locale")).format( pic[0], str(configGet("channel", "posting")), caption.replace("\n", "%n"), str(configGet("silent", "posting")), ) ) except Exception as exp: logWrite( locale("post_exception", "console", locale=configGet("locale")).format( str(exp), format_exc() ) ) if configGet("error", "reports"): await app.send_message( app.owner, locale("post_exception", "message", locale=configGet("locale")).format( exp, format_exc() ), ) try: rmtree( path.join(configGet("tmp", "locations"), tmp_dir), ignore_errors=True ) except: pass