__version__ = (3, 0, 0)
# ©️ Dan Gazizullin, 2021-2023
# This file is a part of Hikka Userbot
# Code is licensed under CC-BY-NC-ND 4.0 unless otherwise specified.
# 🌐 https://github.com/hikariatama/Hikka
# 🔑 https://creativecommons.org/licenses/by-nc-nd/4.0/
# + attribution
# + non-commercial
# + no-derivatives
# You CANNOT edit this file without direct permission from the author.
# You can redistribute this file without any changes.
# meta pic: https://static.dan.tatar/temp_chat_icon.png
# meta banner: https://mods.hikariatama.ru/badges/temp_chat.jpg
# meta developer: @hikarimods
# scope: hikka_only
# scope: hikka_min 1.6.3
import asyncio
import datetime
import logging
import re
import time
import typing
import requests
from hikkatl.tl.functions.channels import (
CreateChannelRequest,
DeleteChannelRequest,
EditPhotoRequest,
)
from hikkatl.tl.functions.messages import ExportChatInviteRequest
from hikkatl.tl.types import Message
from .. import loader, utils
logger = logging.getLogger(__name__)
class TmpChatInfo(typing.NamedTuple):
until: int
title: str
@loader.tds
class TmpChats(loader.Module):
"""Creates temprorary chats"""
strings = {
"name": "TmpChats",
"chat_is_being_removed": (
"⛔️ This chat is being"
" deleted..."
),
"args": (
"🚫 Args are incorrect"
),
"chat_not_found": (
"🚫 Chat not found"
),
"tmp_cancelled": (
"✅ Chat"
" {} will now live forever!"
),
"delete_error": (
"⛔️ An error occured"
" while deleting this temp chat. Please, do it manually."
),
"temp_chat_header": (
"⏲ This chat will be"
" permanently deleted {}."
),
"chat_created": (
"👍 Chat {} have been created'
),
"delete_error_me": "🚫 Error occured while deleting chat {}",
"creating": (
"🟢 Creating temporary"
" chat..."
),
}
strings_ru = {
"chat_is_being_removed": (
"⛔️ Чат удаляется..."
),
"args": (
"🚫 Неверные"
" аргументы"
),
"chat_not_found": (
"🚫 Чат не найден"
),
"tmp_cancelled": (
"✅ Чат"
" {} будет жить вечно!"
),
"delete_error": (
"⛔️ Произошла ошибка"
" удаления чата. Сделай это вручную."
),
"temp_chat_header": (
"⏲ Этот чат будет удален"
" {}."
),
"chat_created": (
"👍 Чат {} создан'
),
"delete_error_me": "🚫 Произошла ошибка при удалении чата {}",
"creating": (
"🟢 Создание временного"
" чата..."
),
"_cmd_doc_tmpchat": "<время> <название> - Создать новый временный чат",
"_cmd_doc_tmpcurrent": "<время> - Создать новый временный чат",
"_cmd_doc_tmpchats": "Показать временные чаты",
"_cmd_doc_tmpcancel": "[chat-id] - Отменить удаление чата.",
"_cmd_doc_tmpctime": " <новое время> - Изменить время жизни чата",
"_cls_doc": "Создает временные чаты во избежание мусорки в Телеграме.",
}
strings_de = {
"chat_is_being_removed": (
"⛔️ Dieser Chat wird"
" gelöscht..."
),
"args": (
"🚫 Argumente sind"
" falsch"
),
"chat_not_found": (
"🚫 Chat nicht"
" gefunden"
),
"tmp_cancelled": (
"✅ Chat"
" {} wird jetzt für immer leben!"
),
"delete_error": (
"⛔️ Es ist ein Fehler"
" beim Löschen dieses temporären Chats aufgetreten. Bitte tun Sie es"
" manuell."
),
"temp_chat_header": (
"⏲ Dieser Chat wird"
" dauerhaft gelöscht {}."
),
"chat_created": (
"👍 Chat {} wurde erstellt'
),
"delete_error_me": "🚫 Fehler beim Löschen des Chats {}",
"creating": (
"🟢 Erstelle temporären"
" Chat..."
),
"_cmd_doc_tmpchat": " - Erstellt neuen temporären Chat",
"_cmd_doc_tmpcurrent": " - Erstellt neuen temporären Chat",
"_cmd_doc_tmpchats": "Liste temporärer Chats",
"_cmd_doc_tmpcancel": (
"[Chat-ID] - Deaktiviert das Löschen des Chats nach Ablauf der Zeit."
),
"_cmd_doc_tmpctime": " - Ändert die Löschzeit des Chats",
"_cls_doc": "Erstellt temporäre Chats, um den Müll in Telegram zu vermeiden.",
}
strings_tr = {
"chat_is_being_removed": (
"⛔️ Bu sohbet"
" siliniyor..."
),
"args": (
"🚫 Argümanlar yanlış"
),
"chat_not_found": (
"🚫 Sohbet bulunamadı"
),
"tmp_cancelled": (
"✅ Sohbet"
" {} artık sonsuza kadar yaşayacak!"
),
"delete_error": (
"⛔️ Bu geçici sohbeti"
" silerken bir hata oluştu. Lütfen bunu yapın manuel."
),
"temp_chat_header": (
"⏲ Bu sohbet kalıcı"
" olarak silinecek {}."
),
"chat_created": (
"👍 Sohbet {} oluşturuldu'
),
"delete_error_me": "🚫 Sohbeti silerken hata oluştu {}",
"creating": (
"🟢 Geçici sohbet"
" oluşturuluyor..."
),
"_cmd_doc_tmpchat": " - Yeni geçici sohbet oluştur",
"_cmd_doc_tmpcurrent": " - Yeni geçici sohbet oluştur",
"_cmd_doc_tmpchats": "Geçici sohbetleri listele",
"_cmd_doc_tmpcancel": (
"[sohbet-id] - Süre dolduktan sonra sohbeti silmeyi devre dışı bırakın."
),
"_cmd_doc_tmpctime": (
" - Sohbet silme süresini değiştir"
),
"_cls_doc": "Telegram'daki çöpleri önlemek için geçici sohbetler oluşturur.",
}
strings_uz = {
"chat_is_being_removed": (
"⛔️ Ushbu chat"
" o'chirilmoqda..."
),
"args": (
"🚫 Argumetlar"
" noto'g'ri"
),
"chat_not_found": (
"🚫 Chat topilmadi"
),
"tmp_cancelled": (
"✅ Chat"
" {} doimiy yashashga o'tkazildi!"
),
"delete_error": (
"⛔️ Bu vaqtli chatni"
" o'chirishda xatolik yuz berdi. Iltimos, uni bajarib ko'ring"
" qo'llanma."
),
"temp_chat_header": (
"⏲ Bu chat doimiy"
" ravishda o'chiriladi {}."
),
"chat_created": (
"👍 Chat {} yaratildi'
),
"delete_error_me": "🚫 Chatni o'chirishda xatolik yuz berdi {}",
"creating": (
"🟢 Vaqtli chat"
" yaratilmoqda..."
),
"_cmd_doc_tmpchat": " - Yangi vaqtli chat yaratish",
"_cmd_doc_tmpcurrent": " - Yangi vaqtli chat yaratish",
"_cmd_doc_tmpchats": "Vaqtli chatlarni ro'yxatdan o'tkazish",
"_cmd_doc_tmpcancel": (
"[chat-id] - Vaqt tugaganidan so'ng chatni o'chirishni bekor qilish."
),
"_cmd_doc_tmpctime": (
" - Chatni o'chirish vaqti o'zgartirish"
),
"_cls_doc": "Telegramdagi axlatni oldini olish uchun vaqtli chatlar yaratadi.",
}
strings_it = {
"chat_is_being_removed": (
"⛔️ Questa chat sta per"
" essere eliminata..."
),
"args": (
"🚫 Gli argomenti sono"
" sbagliati"
),
"chat_not_found": (
"🚫 Chat non trovata"
),
"tmp_cancelled": (
"✅ La chat"
" {} vivrà per sempre!"
),
"delete_error": (
"⛔️ Si è verificato un"
" errore durante l'eliminazione di questa chat temporanea. Per favore,"
" fallo manuale."
),
"temp_chat_header": (
"⏲ Questa chat verrà"
" eliminata {}."
),
"chat_created": (
"👍 Chat {} è stata creata'
),
"delete_error_me": "🚫 Errore durante l'eliminazione della chat {}",
"creating": (
"🟢 Creazione chat"
" temporanea..."
),
"_cmd_doc_tmpchat": " - Crea nuova chat temporanea",
"_cmd_doc_tmpcurrent": " - Crea nuova chat temporanea",
"_cmd_doc_tmpchats": "Elenco chat temporanee",
"_cmd_doc_tmpcancel": (
"[chat-id] - Disabilita l'eliminazione della chat dopo il tempo"
" specificato."
),
"_cmd_doc_tmpctime": (
" - Modifica il tempo di eliminazione della chat"
),
"_cls_doc": "Crea chat temporanee per evitare la spazzatura in Telegram.",
}
strings_es = {
"chat_is_being_removed": (
"⛔️ Este chat está siendo"
" eliminado..."
),
"args": (
"🚫 Los argumentos son"
" incorrectos"
),
"chat_not_found": (
"🚫 Chat no"
" encontrado"
),
"tmp_cancelled": (
"✅ El chat"
" {} ahora vivirá para siempre!"
),
"delete_error": (
"⛔️ Se ha producido un"
" error al eliminar este chat temporal. Por favor, hágalo manualmente."
),
"temp_chat_header": (
"⏲ Este chat será"
" eliminado {}."
),
"chat_created": (
"👍 Chat {} ha sido creado'
),
"delete_error_me": "🚫 Error al eliminar el chat {}",
"creating": (
"🟢 Creando chat"
" temporal..."
),
"_cmd_doc_tmpchat": " - Crea un nuevo chat temporal",
"_cmd_doc_tmpcurrent": " - Crea un nuevo chat temporal",
"_cmd_doc_tmpchats": "Lista de chats temporales",
"_cmd_doc_tmpcancel": (
"[chat-id] - Desactiva la eliminación del chat después del tiempo"
" especificado."
),
"_cmd_doc_tmpctime": (
" - Cambia el tiempo de eliminación del chat"
),
"_cls_doc": "Crea chats temporales para evitar la basura en Telegram.",
}
strings_fr = {
"chat_is_being_removed": (
"⛔️ Ce chat est en train"
" d'être supprimé..."
),
"args": (
"🚫 Les arguments sont"
" incorrects"
),
"chat_not_found": (
"🚫 Chat introuvable"
),
"tmp_cancelled": (
"✅ Le chat"
" {} vivra maintenant pour toujours!"
),
"delete_error": (
"⛔️ Une erreur s'est"
" produite lors de la suppression de ce chat temporaire. S'il vous plaît,"
" faites-le manuellement."
),
"temp_chat_header": (
"⏲ Ce chat sera"
" définitivement supprimé {}."
),
"chat_created": (
"👍 Chat {} a été créé'
),
"delete_error_me": (
"🚫 Une erreur s'est produite lors de la suppression du chat {}"
),
"creating": (
"🟢 Création du chat"
" temporaire..."
),
"_cmd_doc_tmpchat": " - Crée un nouveau chat temporaire",
"_cmd_doc_tmpcurrent": " - Crée un nouveau chat temporaire",
"_cmd_doc_tmpchats": "Liste des chats temporaires",
"_cmd_doc_tmpcancel": (
"[chat-id] - Désactive la suppression du chat après le délai spécifié."
),
"_cmd_doc_tmpctime": (
" - Modifie le temps de suppression du chat"
),
"_cls_doc": "Crée des chats temporaires pour éviter les déchets dans Telegram.",
}
strings_kk = {
"chat_is_being_removed": (
"⛔️ Бұл сөйлеу"
" өшірілуде..."
),
"args": (
"🚫 Аргументтер дұрыс"
" емес"
),
"chat_not_found": (
"🚫 Сөйлеу табылмады"
),
"tmp_cancelled": (
"✅ Сөйлеу"
" {} қазірдің күніне дейін өмір сүрер!"
),
"delete_error": (
"⛔️ Осы уақыттың сөйлеуін"
" жою кезінде қате пайда болды. Өтінемін, оны қолмен орындаңыз."
),
"temp_chat_header": (
"⏲ Бұл сөйлеу өшіріледі"
" {}."
),
"chat_created": (
"👍 Сөйлеу {} жасалды'
),
"delete_error_me": "🚫 Сөйлеуді жою кезінде қате пайда болды {}",
"creating": (
"🟢 Уақытша сөйлеу"
" жасау..."
),
"_cmd_doc_tmpchat": "<уақыт> <атауы> - Жаңа уақытша сөйлеу жасау",
"_cmd_doc_tmpcurrent": "<уақыт> - Жаңа уақытша сөйлеу жасау",
"_cmd_doc_tmpchats": "Уақытша сөйлеулер тізімі",
"_cmd_doc_tmpcancel": (
"[сөйлеу-ID] - Уақыт аяқталғаннан кейін сөйлеуді жоюды өшіру."
),
"_cmd_doc_tmpctime": "<сөйлеу_ID> <жаңа уақыт> - Сөйлеуді жою уақытын өзгерту",
"_cls_doc": "Telegramдағы тығыздықты алу үшін уақытша сөйлеулер жасайды.",
}
def __init__(self):
self._chats: typing.Dict[str, TmpChatInfo] = None
async def client_ready(self):
self._chats = self.pointer("chats", {}, item_type=TmpChatInfo)
@staticmethod
def extract_time(t: str) -> int:
"""
Tries to export time from text
"""
try:
if not str(t)[:-1].isdigit():
return 0
if "d" in str(t):
t = int(t[:-1]) * 60 * 60 * 24
if "h" in str(t):
t = int(t[:-1]) * 60 * 60
if "m" in str(t):
t = int(t[:-1]) * 60
if "s" in str(t):
t = int(t[:-1])
t = int(re.sub(r"[^0-9]", "", str(t)))
except ValueError:
return 0
return t
@loader.loop(interval=60, autostart=True)
async def chats_handler_async(self):
for chat, info in dict(self._chats).items():
if info.until > time.time():
continue
try:
await self._client.send_message(
int(chat),
self.strings("chat_is_being_removed"),
)
await asyncio.sleep(1)
await self._client(DeleteChannelRequest(int(chat)))
except Exception:
logger.exception("Failed to delete chat")
await self.inline.bot.send_message(
self._tg_id,
self.strings("delete_error_me").format(
utils.escape_html(info.title)
),
parse_mode="HTML",
disable_web_page_preview=True,
)
self._chats.pop(chat)
@loader.command()
async def tmpchat(self, message: Message):
"""