diff --git a/DaisyX/utils/db_structure_migrator.py b/DaisyX/utils/db_structure_migrator.py new file mode 100644 index 00000000..e22a5dc0 --- /dev/null +++ b/DaisyX/utils/db_structure_migrator.py @@ -0,0 +1,74 @@ +# Copyright (C) 2018 - 2020 MrYacha. All rights reserved. Source code available under the AGPL. +# Copyright (C) 2019 Aiogram +# +# This file is part of AllMightBot. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import asyncio +import time +from importlib import import_module + +from DaisyX import bot, OWNER_ID +from DaisyX.services.mongo import mongodb +from DaisyX.utils.logger import log +from DaisyX.versions import DB_STRUCTURE_VER + + +async def notify_bot_owner(old_ver, new_ver): + await bot.send_message( + OWNER_ID, + f"AllMight database structure was updated from {old_ver} to {new_ver}" + ) + + +# TODO: Logs channel + + +log.debug("Checking on database structure update...") + +if not (data := mongodb.db_structure.find_one({'db_ver': {"$exists": True}})): + log.info("Your database is empty! Creating database structure key...") + mongodb.db_structure.insert_one({'db_ver': DB_STRUCTURE_VER}) + log.info("Database structure version is: " + str(DB_STRUCTURE_VER)) +else: + curr_ver = data['db_ver'] + log.info("Your database structure version is: " + str(curr_ver)) + if DB_STRUCTURE_VER > curr_ver: + log.error("Your database is old! Waiting 20 seconds till update...") + log.info("Press CTRL + C to cancel!") + time.sleep(20) + log.debug("Trying to update database structure...") + log.info("--------------------------------") + log.info("Your current database structure version: " + str(curr_ver)) + log.info("New database structure version: " + str(DB_STRUCTURE_VER)) + log.info("--------------------------------") + old_ver = curr_ver + while curr_ver < DB_STRUCTURE_VER: + new_ver = curr_ver + 1 + log.info(f"Trying update to {str(new_ver)}...") + + log.debug("Importing: DaisyX.db." + str(new_ver)) + import_module("DaisyX.db." + str(new_ver)) + + curr_ver += 1 + mongodb.db_structure.update_one({'db_ver': curr_ver - 1}, {"$set": {'db_ver': curr_ver}}) + + log.warn(f"Database update done to {str(curr_ver)} successfully!") + log.debug("Let's notify the bot owner") + loop = asyncio.get_event_loop() + bot_info = loop.run_until_complete(notify_bot_owner(old_ver, curr_ver)) + log.info("Rescue normal bot startup...") + else: + log.debug("No database structure updates found, skipping!")