diff --git a/hikka/langpacks/de.yml b/hikka/langpacks/de.yml
index b6cba1b..b514b31 100644
--- a/hikka/langpacks/de.yml
+++ b/hikka/langpacks/de.yml
@@ -348,6 +348,9 @@ updater:
cancel: "🚫 Abbrechen"
_cls_doc: "Aktualisiert den Userbot"
lavhost_update: "✌️ Dein {} wird aktualisiert..."
+ invalid_args: "🚫 Sie müssen die Anzahl der Commits angeben, die zurückgesetzt werden sollen!"
+ rollback_too_far: "🚫 Du rollst zu weit zurück!"
+ rollback_confirm: "❓ Sind Sie sicher, dass Sie {num} Commit(s) zurücksetzen möchten?"
_cmd_doc_restart: "Startet den Userbot neu"
_cmd_doc_source: "Zeigt den Link zum Quellcode des Projekts"
_cmd_doc_update: "Lädt Updates für den Userbot herunter"
diff --git a/hikka/langpacks/en.yml b/hikka/langpacks/en.yml
index cab2546..b0fd102 100644
--- a/hikka/langpacks/en.yml
+++ b/hikka/langpacks/en.yml
@@ -370,6 +370,9 @@ updater:
lavhost_update: "✌️ Your {} is updating..."
full_success: "👍 Userbot is fully loaded! {}\nFull restart took {}s"
secure_boot_complete: "🔐 Secure boot completed! {}\nRestart took {}s"
+ invalid_args: "🚫 You must provide number of commits to rollback!"
+ rollback_too_far: "🚫 You're rolling back too far!"
+ rollback_confirm: "❓ Are you sure you want to rollback {num} commit(-s)?"
_cmd_doc_restart: "Restarts the userbot"
_cmd_doc_source: "Links the source code of this project"
_cmd_doc_update: "Downloads userbot updates"
diff --git a/hikka/langpacks/ru.yml b/hikka/langpacks/ru.yml
index becc0ab..c76dd40 100644
--- a/hikka/langpacks/ru.yml
+++ b/hikka/langpacks/ru.yml
@@ -339,6 +339,9 @@ updater:
cancel: "🚫 Отмена"
_cls_doc: "Обновляет юзербот"
lavhost_update: "✌️ Твой {} обновляется..."
+ invalid_args: "🚫 Вы должны указать количество коммитов для отката!"
+ rollback_too_far: "🚫 Вы откатываетесь слишком далеко!"
+ rollback_confirm: "❓ Вы уверены, что хотите откатить {num} коммит(-а,-ов)?"
_cmd_doc_restart: "Перезагружает юзербот"
_cmd_doc_source: "Показать ссылку на исходный код проекта"
_cmd_doc_update: "Скачивает обновления юзербота"
diff --git a/hikka/langpacks/ua.yml b/hikka/langpacks/ua.yml
index 607c8b2..ac36d68 100644
--- a/hikka/langpacks/ua.yml
+++ b/hikka/langpacks/ua.yml
@@ -348,6 +348,9 @@ updater:
cancel: "🚫 Скасувати"
_cls_doc: "Оновлює юзербот"
lavhost_update: "✌️ Твій {} оновлюється..."
+ invalid_args: "🚫 Вы должны указать количество коммитов для отката!"
+ rollback_too_far: "🚫 Ви відкочуєтесь занадто далеко!"
+ rollback_confirm: "❓ Вы уверены, что хотите откатить {num} коммит(-а,-ов)?"
_cmd_doc_restart: "Перезавантажує юзербот"
_cmd_doc_source: "Показати посилання на вихідний код проекту"
_cmd_doc_update: "Завантажує оновлення юзербота"
diff --git a/hikka/modules/updater.py b/hikka/modules/updater.py
index c137c77..8295b5a 100644
--- a/hikka/modules/updater.py
+++ b/hikka/modules/updater.py
@@ -430,3 +430,37 @@ class UpdaterMod(loader.Module):
inline_message_id=ms,
text=self.inline.sanitise_text(msg),
)
+
+ @loader.command()
+ async def rollback(self, message: Message):
+ if not (args := utils.get_args_raw(message)).isdigit():
+ await utils.answer(message, self.strings('invalid_args'))
+ return
+ if int(args) > 10:
+ await utils.answer(message, self.strings('rollback_too_far'))
+ return
+ form = await self.inline.form(
+ message=message,
+ text=self.strings('rollback_confirm').format(num=args),
+ reply_markup=[
+ [
+ {
+ "text": "✅",
+ "callback": self.rollback_confirm,
+ "args": [args],
+ }
+ ],
+ [
+ {
+ "text": "❌",
+ "action": "close",
+ }
+ ]
+ ]
+ )
+
+ async def rollback_confirm(self, call: InlineCall, number: int):
+ await utils.answer(call, self.strings('rollback_process').format(num=number))
+ await asyncio.create_subprocess_shell(f'git reset --hard HEAD~{number}', stdout=asyncio.subprocess.PIPE)
+ await self.restart_common(call)
+