# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀ ▄▀█ ▀█▀ ▄▀█ █▀▄▀█ ▄▀█ # █▀█ █ █ █ █▀█ █▀▄ █ ▄ █▀█ █ █▀█ █ ▀ █ █▀█ # # © Copyright 2022 # # https://t.me/hikariatama # # 🔒 Licensed under the GNU GPLv3 # 🌐 https://www.gnu.org/licenses/agpl-3.0.html # scope: inline import asyncio import datetime import io import json import logging import time from telethon.tl.types import Message from .. import loader, utils from ..inline.types import InlineCall logger = logging.getLogger(__name__) @loader.tds class HikkaBackupMod(loader.Module): """Automatic database backup""" strings = { "name": "HikkaBackup", "period": "⌚️ Hewwo! I'm Asuna - your personal backup manager. Please, select the periodicity of automatic database backups", "saved": "✅ Backup period saved. You can re-configure it later with .set_backup_period", "never": "✅ I will not make automatic backups. You can re-configure it later with .set_backup_period", "invalid_args": "🚫 Specify correct backup period in hours, or `0` to disable", } strings_ru = { "period": "⌚️ Приветики! Я Асуна - твой менеджер резервного копирования. Пожалуйста, выбери периодичность резервных копий базы данных Hikka", "saved": "✅ Периодичность сохранена! Ее можно изменить с помощью .set_backup_period", "never": "✅ Я не буду делать автоматические резервные копии. Можно отменить используя .set_backup_period", "invalid_args": "🚫 Укажи правильную периодичность в часах, или `0` для отключения", } async def on_unload(self): self._task.cancel() async def client_ready(self, client, db): self._db = db self._client = client if not self.get("period"): await self.inline.bot.send_photo( self._tg_id, photo="https://i.pinimg.com/originals/94/e5/9c/94e59c1fbecd7b842d7feeecb58f8fd6.jpg", caption=self.strings("period"), reply_markup=self.inline.generate_markup( utils.chunks( [ {"text": f"🕰 {i} h", "data": f"backup_period/{i}"} for i in {1, 2, 4, 6, 8, 12, 24, 48, 168} ], 3, ) + [[{"text": "🚫 Never", "data": "backup_period/never"}]] ), ) self._backup_channel, is_new = await utils.asset_channel( self._client, "hikka-backups", "📼 Your database backups will appear there", silent=True, archive=True, avatar="https://github.com/hikariatama/assets/raw/master/hikka-backups.png", _folder="hikka", ) self._task = asyncio.ensure_future(self.handler()) if not is_new and self.get("nomigrate", False): return await utils.set_avatar( client, self._backup_channel, "https://github.com/hikariatama/assets/raw/master/hikka-backups.png", ) self.set("nomigrate", True) async def backup_period_callback_handler(self, call: InlineCall): if not call.data.startswith("backup_period"): return if call.data == "backup_period/never": self.set("period", "disabled") await call.answer(self.strings("never"), show_alert=True) await self.inline.bot.delete_message( call.message.chat.id, call.message.message_id, ) return period = int(call.data.split("/")[1]) * 60 * 60 self.set("period", period) self.set("last_backup", round(time.time())) await call.answer(self.strings("saved"), show_alert=True) await self.inline.bot.delete_message( call.message.chat.id, call.message.message_id, ) async def set_backup_periodcmd(self, message: Message): """