import sys 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.filters import command from driver.decorators import bot_creator 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 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): msg = await message.reply("ā– Restarting bot...") args = [sys.executable, "main.py"] await msg.edit("āœ… Bot restarted !\n\nā€¢ wait until 1 minutes after bot Rebooted.") execle(sys.executable, *args, environ) return