import os import re import sys import asyncio import subprocess from asyncio import sleep from git import Repo from os import system, execle, environ from git.exc import InvalidGitRepositoryError from pyrogram.types import Message from pyrogram import Client, filters from config import UPSTREAM_REPO, BOT_USERNAME from driver.core import bot from driver.filters import command from driver.decorators import bot_creator from driver.database.dbqueue import get_active_chats, remove_active_chat def gen_chlog(repo, diff): upstream_repo_url = Repo().remotes[0].config_reader.get("url").replace(".git", "") ac_br = repo.active_branch.name ch_log = "" tldr_log = "" ch = f"updates for [{ac_br}]:" ch_tl = f"updates for {ac_br}:" d_form = "%d/%m/%y || %H:%M" for c in repo.iter_commits(diff): ch_log += ( f"\n\nšŸ’¬ {c.count()} šŸ—“ [{c.committed_datetime.strftime(d_form)}]\n" f"[{c.summary}] šŸ‘Øā€šŸ’» {c.author}" ) tldr_log += f"\n\nšŸ’¬ {c.count()} šŸ—“ [{c.committed_datetime.strftime(d_form)}]\n[{c.summary}] šŸ‘Øā€šŸ’» {c.author}" if ch_log: return str(ch + ch_log), str(ch_tl + tldr_log) return ch_log, tldr_log def updater(): try: repo = Repo() except InvalidGitRepositoryError: repo = Repo.init() origin = repo.create_remote("upstream", UPSTREAM_REPO) origin.fetch() repo.create_head("main", origin.refs.main) repo.heads.main.set_tracking_branch(origin.refs.main) repo.heads.main.checkout(True) ac_br = repo.active_branch.name if "upstream" in repo.remotes: ups_rem = repo.remote("upstream") else: ups_rem = repo.create_remote("upstream", UPSTREAM_REPO) ups_rem.fetch(ac_br) changelog, tl_chnglog = gen_chlog(repo, f"HEAD..upstream/{ac_br}") return bool(changelog) @Client.on_message(command(["update", f"update@{BOT_USERNAME}"]) & ~filters.edited) @bot_creator async def update_bot(_, message: Message): chat_id = message.chat.id msg = await message.reply("ā– Checking updates...") update_avail = updater() if update_avail: await msg.edit("āœ… Update finished !\n\nā€¢ Bot restarting, back active again in 1-2 minutes.") system("git pull -f && pip3 install --no-cache-dir -r requirements.txt") execle(sys.executable, sys.executable, "main.py", environ) return await msg.edit(f"ā– bot is **up-to-date** with [main]({UPSTREAM_REPO}/tree/main) ā–", disable_web_page_preview=True) @Client.on_message(command(["restart", f"restart@{BOT_USERNAME}"]) & ~filters.edited) @bot_creator async def restart_bot(_, message: Message): served_chats = [] try: chats = await get_active_chats() for chat in chats: served_chats.append(int(chat["chat_id"])) except BaseException as e: print(e) for x in served_chats: try: await bot.send_message( x, f"šŸ’” Bot server has just restarted !\n\nā€¢ Sorry for the inconveniences due to bot maintenance.", ) await remove_active_chat(x) except BaseException as e: print(e) msg = await message.reply("ā– Restarting bot...") args = [sys.executable, "main.py"] await msg.edit("āœ… Bot restarted\n\nā€¢ now bot is working again.") execle(sys.executable, *args, environ) return