from datetime import datetime from os import getpid, path from sys import exit from time import time from traceback import format_exc from modules.api_client import authorize from modules.cli import * from modules.http_client import http_session from modules.logger import logWrite from modules.scheduler import scheduler from modules.utils import configGet, jsonLoad, jsonSave, locale # Import =================================================================================================================================== try: from dateutil.relativedelta import relativedelta from pyrogram.errors import bad_request_400 from pyrogram.sync import idle from modules.app import app except ModuleNotFoundError: print(locale("deps_missing", "console", locale=configGet("locale")), flush=True) exit() # =========================================================================================================================================== pid = getpid() version = 0.1 # Work in progress # def check_forwards(app): # try: # index = jsonLoad(configGet("index", "locations")) # channel = app.get_chat(configGet("channel", "posting")) # peer = app.resolve_peer(configGet("channel", "posting")) # print(peer, flush=True) # posts_list = [i for i in range(index["last_id"]-100,index["last_id"])] # last_posts = app.get_messages(configGet("channel", "posting"), message_ids=posts_list) # for post in last_posts: # post_forwards = GetMessagePublicForwards(channel=peer, msg_id=post.id, offset_peer=peer, offset_rate=0, offset_id=0, limit=100) # print(post_forwards, flush=True) # for forward in post_forwards: # print(forward, flush=True) # except Exception as exp: # logWrite("Could not get last posts forwards due to {0} with traceback {1}".format(str(exp), traceback.format_exc()), debug=True) # if configGet("error", "reports"): # app.send_message(configGet("admin"), traceback.format_exc()) # pass # Work in progress # @app.on_message(~ filters.scheduled & filters.command(["forwards"], prefixes="/")) # def cmd_forwards(app, msg): # check_forwards(app) from plugins.callbacks.shutdown import * # Imports ================================================================================================================================== from plugins.commands.general import * if configGet("submit", "mode"): from plugins.callbacks.nothing import * from plugins.callbacks.submission import * from plugins.commands.mode_submit import * from plugins.handlers.submission import * if configGet("post", "mode"): from plugins.commands.photos import * # if configGet("api_based", "mode"): # from modules.api_client import authorize # =========================================================================================================================================== # Work in progress # Handle new forwards # @app.on_raw_update() # def fwd_got(app, update, users, chats): # if isinstance(update, UpdateChannelMessageForwards): # logWrite(f'Forward count increased to {update["forwards"]} on post {update["id"]} in channel {update["channel_id"]}') # logWrite(str(users), debug=True) # logWrite(str(chats), debug=True) # # else: # # logWrite(f"Got raw update of type {type(update)} with contents {update}", debug=True) # async def main(): # await app.start() # logWrite(locale("startup", "console", locale=configGet("locale")).format(str(pid))) # if configGet("startup", "reports"): # await app.send_message(configGet("admin"), locale("startup", "message", locale=configGet("locale")).format(str(pid))) # if configGet("post", "mode"): # scheduler.start() # if configGet("api_based", "mode"): # token = authorize() # if len(get(f'{configGet("address", "posting", "api")}/albums?q={configGet("queue", "posting", "api", "albums")}', headers={"Authorization": f"Bearer {token}"}).json()["results"]) == 0: # post(f'{configGet("address", "posting", "api")}/albums?name={configGet("queue", "posting", "api", "albums")}&title={configGet("queue", "posting", "api", "albums")}', headers={"Authorization": f"Bearer {token}"}) # await idle() # await app.send_message(configGet("admin"), locale("shutdown", "message", locale=configGet("locale")).format(str(pid))) # logWrite(locale("shutdown", "console", locale=configGet("locale")).format(str(pid))) # killProc(pid) # if __name__ == "__main__": # if find_spec("uvloop") is not None: # uvloop.install() # asyncio.run(main()) async def main(): logWrite(locale("startup", "console").format(str(pid))) await app.start() if configGet("startup", "reports"): try: if path.exists(path.join(configGet("cache", "locations"), "shutdown_time")): downtime = relativedelta( datetime.now(), datetime.fromtimestamp( jsonLoad( path.join(configGet("cache", "locations"), "shutdown_time") )["timestamp"] ), ) if downtime.days >= 1: await app.send_message( configGet("owner"), locale( "startup_downtime_days", "message", ).format(pid, downtime.days), ) elif downtime.hours >= 1: await app.send_message( configGet("owner"), locale( "startup_downtime_hours", "message", ).format(pid, downtime.hours), ) else: await app.send_message( configGet("owner"), locale( "startup_downtime_minutes", "message", locale=configGet("locale"), ).format(pid, downtime.minutes), ) else: await app.send_message( configGet("owner"), locale("startup", "message").format(pid), ) except bad_request_400.PeerIdInvalid: logWrite( f"Could not send startup message to bot owner. Perhaps user has not started the bot yet." ) if configGet("update", "reports"): try: check_update = await http_session.get( "https://git.end-play.xyz/api/v1/repos/profitroll/TelegramPoster/releases?page=1&limit=1" ) response = await check_update.json() if len(response) == 0: raise ValueError("No bot releases on git found.") if float(response[0]["tag_name"].replace("v.", "")) > version: logWrite( f'New version {response[0]["tag_name"].replace("v.", "")} found (current {version})' ) await app.send_message( configGet("owner"), locale( "update_available", "message", ).format( response[0]["tag_name"], response[0]["html_url"], response[0]["body"], ), ) else: logWrite(f"No updates found, bot is up to date.") except bad_request_400.PeerIdInvalid: logWrite( f"Could not send startup message to bot owner. Perhaps user has not started the bot yet." ) except Exception as exp: logWrite(f"Update check failed due to {exp}: {format_exc()}") if configGet("post", "mode"): scheduler.start() try: token = await authorize() if ( len( ( await ( await http_session.get( f'{configGet("address", "posting", "api")}/albums?q={configGet("album", "posting", "api")}', headers={"Authorization": f"Bearer {token}"}, ) ).json() )["results"] ) == 0 ): logWrite("Media album does not exist on API server. Trying to create it...") try: await http_session.post( f'{configGet("address", "posting", "api")}/albums?name={configGet("album", "posting", "api")}&title={configGet("album", "posting", "api")}', headers={"Authorization": f"Bearer {token}"}, ) logWrite("Created media album on API server.") except Exception as exp: logWrite( f"Could not create media album on API server due to {exp}: {format_exc()}" ) except Exception as exp: logWrite(f"Could not check if API album exists due to {exp}: {format_exc()}") await idle() try: await app.send_message( configGet("owner"), locale("shutdown", "message").format(pid), ) except bad_request_400.PeerIdInvalid: logWrite( f"Could not send shutdown message to bot owner. Perhaps user has not started the bot yet." ) makedirs(configGet("cache", "locations"), exist_ok=True) jsonSave( {"timestamp": time()}, path.join(configGet("cache", "locations"), "shutdown_time"), ) logWrite(locale("shutdown", "console").format(str(pid))) scheduler.shutdown() if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main())