| from dotenv import load_dotenv, dotenv_values |
| from http.client import responses |
| from logging import ( |
| basicConfig, |
| getLogger, |
| ERROR, |
| INFO, |
| ) |
| from os import ( |
| environ, |
| path, |
| remove, |
| ) |
| from pymongo.mongo_client import MongoClient |
| from pymongo.server_api import ServerApi |
| from requests import get |
| from subprocess import run |
|
|
|
|
| basicConfig( |
| format="{asctime} - [{levelname[0]}] {name} [{module}:{lineno}] - {message}", |
| datefmt="%Y-%m-%d %H:%M:%S", |
| style="{", |
| level=INFO, |
| ) |
|
|
| LOGGER = getLogger("update") |
| getLogger("pymongo").setLevel(ERROR) |
|
|
| if path.exists("log.txt"): |
| with open("log.txt", "r+") as f: |
| f.truncate(0) |
|
|
| if path.exists("rlog.txt"): |
| remove("rlog.txt") |
|
|
| if not path.exists("config.env"): |
| if CONFIG_URL := environ.get("CONFIG_URL"): |
| LOGGER.info("CONFIG_URL is found! Downloading CONFIG_URL...") |
| |
| req = get( |
| url=CONFIG_URL, |
| timeout=10, |
| allow_redirects=True, |
| ) |
| |
| if req.ok: |
| with open("config.env", "wb+") as file: |
| file.write(req.content) |
| |
| else: |
| LOGGER.error(f"[{req.status_code}] {responses[req.status_code]}") |
| |
| else: |
| LOGGER.warning("CONFIG_URL is not found! Using local config.env instead...") |
| |
| load_dotenv("config.env", override=True) |
|
|
| if bool(environ.get("_____REMOVE_THIS_LINE_____")): |
| LOGGER.error("The README.md file there to be read!") |
| exit() |
|
|
| BOT_TOKEN = environ.get("BOT_TOKEN", "") |
| if len(BOT_TOKEN) == 0: |
| LOGGER.error("BOT_TOKEN is not found!") |
| exit(1) |
|
|
| BOT_ID = BOT_TOKEN.split(":", 1)[0] |
|
|
| DATABASE_URL = environ.get("DATABASE_URL", "") |
| if len(DATABASE_URL) == 0: |
| DATABASE_URL = None |
| LOGGER.warning("DATABASE_URL is not found!") |
|
|
| else: |
| try: |
| conn = MongoClient( |
| DATABASE_URL, |
| server_api=ServerApi("1"), |
| ) |
|
|
| db = conn.mltb |
| old_config = db.settings.deployConfig.find_one({"_id": BOT_ID}) |
| config_dict = db.settings.config.find_one({"_id": BOT_ID}) |
| if old_config is not None: |
| del old_config["_id"] |
| |
| if ( |
| old_config is not None |
| and old_config == dict(dotenv_values("config.env")) |
| or old_config is None |
| ) and config_dict is not None: |
| environ["UPSTREAM_REPO"] = config_dict["UPSTREAM_REPO"] |
| environ["UPSTREAM_BRANCH"] = config_dict["UPSTREAM_BRANCH"] |
| |
| conn.close() |
| |
| except Exception as e: |
| LOGGER.error(f"DATABASE ERROR! ERROR: {e}") |
|
|
| UPSTREAM_REPO = environ.get("UPSTREAM_REPO", "") |
| if len(UPSTREAM_REPO) == 0: |
| UPSTREAM_REPO = None |
|
|
| else: |
| if UPSTREAM_REPO.startswith("#"): |
| UPSTREAM_REPO = None |
|
|
| UPSTREAM_BRANCH = environ.get("UPSTREAM_BRANCH", "") |
| if len(UPSTREAM_BRANCH) == 0: |
| UPSTREAM_BRANCH = None |
|
|
| else: |
| if UPSTREAM_BRANCH.startswith("#"): |
| UPSTREAM_BRANCH = None |
| |
| if ( |
| UPSTREAM_REPO |
| and UPSTREAM_BRANCH |
| ): |
| if path.exists(".git"): |
| run(["rm -rf .git"], shell=True) |
|
|
| process = run([ |
| f"git init -q \ |
| && git config --global user.email kqruumi@gmail.com \ |
| && git config --global user.name KQRM \ |
| && git add . \ |
| && git commit -sm update -q \ |
| && git remote add origin {UPSTREAM_REPO} \ |
| && git fetch origin -q \ |
| && git reset --hard origin/{UPSTREAM_BRANCH} -q" |
| ], shell=True) |
|
|
| if process.returncode == 0: |
| LOGGER.info("Successfully updated with latest commit from UPSTREAM_REPO!") |
| |
| else: |
| LOGGER.error("Something wrong while updating! Check UPSTREAM_REPO if valid or not!") |
|
|
| else: |
| LOGGER.warning("UPSTREAM_REPO is not found!") |
| LOGGER.warning("UPSTREAM_BRANCH is not found!") |