__version__ = (2, 0, 0)
#
# @@@@@@ @@@@@@ @@@@@@@ @@@@@@@ @@@@@@ @@@@@@@@@@ @@@@@@ @@@@@@@ @@@ @@@ @@@ @@@@@@@@ @@@@@@
# @@@@@@@@ @@@@@@@ @@@@@@@ @@@@@@@@ @@@@@@@@ @@@@@@@@@@@ @@@@@@@@ @@@@@@@@ @@@ @@@ @@@ @@@@@@@@ @@@@@@@
# @@! @@@ !@@ @@! @@! @@@ @@! @@@ @@! @@! @@! @@! @@@ @@! @@@ @@! @@@ @@! @@! !@@
# !@! @!@ !@! !@! !@! @!@ !@! @!@ !@! !@! !@! !@! @!@ !@! @!@ !@! @!@ !@! !@! !@!
# @!@!@!@! !!@@!! @!! @!@!!@! @!@ !@! @!! !!@ @!@ @!@ !@! @!@ !@! @!@ !@! @!! @!!!:! !!@@!!
# !!!@!!!! !!@!!! !!! !!@!@! !@! !!! !@! ! !@! !@! !!! !@! !!! !@! !!! !!! !!!!!: !!@!!!
# !!: !!! !:! !!: !!: :!! !!: !!! !!: !!: !!: !!! !!: !!! !!: !!! !!: !!: !:!
# :!: !:! !:! :!: :!: !:! :!: !:! :!: :!: :!: !:! :!: !:! :!: !:! :!: :!: !:!
# :: ::: :::: :: :: :: ::: ::::: :: ::: :: ::::: :: :::: :: ::::: :: :: :::: :: :::: :::: ::
# : : : :: : : : : : : : : : : : : : : :: : : : : : : :: : : : :: :: :: : :
#
# © Copyright 2024
#
# https://t.me/Den4ikSuperOstryyPer4ik
# and
# https://t.me/ToXicUse
#
# 🔒 Licensed under the GNU AGPLv3
# https://www.gnu.org/licenses/agpl-3.0.html
#
# meta developer: @AstroModules
# meta banner: https://raw.githubusercontent.com/Den4ikSuperOstryyPer4ik/Astro-modules/main/Banners/PasswordGenerator.jpg
import logging
import random
from telethon.tl.types import Message
from .. import loader, utils
from ..inline.types import InlineCall
logger = logging.getLogger(__name__)
@loader.tds
class PasswordGeneratorMod(loader.Module):
'''Random password/pincode generator'''
strings = {
"name": "RandomPasswordGenerator",
"_cfg_doc_pass_length": "set password length (in number of characters)",
"_cfg_doc_pin_code_length": "set pincode length (in number of characters)",
"_cfg_doc_simbols_in_pass": (
"Will there be additional characters in the generated password"
" (+-*!&$#?=@<>)?"
),
"what_to_generate": "🆗What should be generated?",
"new_random_pass": "🔣 new random password 🆕",
"new_random_pincode": "🔢 new random PIN-code 🆕",
"pass": "🆕 Your new password in {} characters:\n{}",
"pincode": "🆕 Your new pincode in {} characters:\n{}",
"menu": "💻 Menu",
"close": "🚫 Close",
}
strings_ru = {
"_cls_doc": (
"Генератор рандомного пароля/пин-кода\nНастроить генератор можно через"
" конфиг"
),
"_cfg_doc_pass_length": "выставьте длину пароля(в кол-ве символов)",
"_cfg_doc_pin_code_length": "выставьте длину Пин-Кода(в кол-ве символов)",
"_cfg_doc_simbols_in_pass": (
"Какие символы должны быть в сгенерированном пароле?"
),
"what_to_generate": "🆗 Что надо сгенерировать?",
"new_random_pass": "🔣 Новый рандомный пароль 🆕",
"new_random_pincode": "🔢 Новый рандомный PIN-код 🆕",
"pass": "🆕 Ваш новый пароль в {} символов:\n{}",
"pincode": "🆕 Ваш новый пин-код в {} символов:\n{}",
"menu": "💻 Меню",
"close": "🚫 Закрыть",
}
@loader.command(ru_doc="—>конфиг этого модуля")
async def generatorcfgcmd(self, message: Message):
"""—>config for this module"""
name = self.strings("name")
await self.allmodules.commands["config"](
await utils.answer(message, f"{self.get_prefix()}config {name}")
)
def __init__(self):
self._ratelimit = []
self.config = loader.ModuleConfig(
loader.ConfigValue(
"password_length",
10,
doc=lambda: self.strings("_cfg_doc_pass_length"),
validator=loader.validators.Integer(minimum=6),
),
loader.ConfigValue(
"pincode_length",
4,
doc=lambda: self.strings("_cfg_doc_pin_code_length"),
validator=loader.validators.Integer(minimum=4),
),
loader.ConfigValue(
"symbols",
"+-*!&$?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
doc=lambda: self.strings("_cfg_doc_simbols_in_pass"),
),
)
@loader.command(ru_doc="—>сгенерировать случайный пароль/пин-код")
async def igeneratorcmd(self, message: Message):
"""—>generate random password/pin"""
await self.inline.form(
self.strings("what_to_generate"),
reply_markup=[
[
{
"text": self.strings("new_random_pass"),
"callback": self.new_random_pass,
}
],
[
{
"text": self.strings("new_random_pincode"),
"callback": self.new_random_pincode,
}
],
[{"text": self.strings("close"), "action": "close"}],
],
message=message,
)
async def igenerator(self, call: InlineCall):
await call.edit(
self.strings("what_to_generate"),
reply_markup=[
[
{
"text": self.strings("new_random_pass"),
"callback": self.new_random_pass,
}
],
[
{
"text": self.strings("new_random_pincode"),
"callback": self.new_random_pincode,
}
],
[{"text": self.strings("close"), "action": "close"}],
],
)
async def new_random_pass(self, call: InlineCall):
symbols = self.config["symbols"]
password_length = self.config["password_length"]
length = int(password_length)
password = ""
for _ in range(length):
password += random.choice(symbols)
await call.edit(
self.strings["pass"].format(password_length, password),
reply_markup=[
[
{
"text": self.strings("menu"),
"callback": self.igenerator
}
],
[
{
"text": self.strings("close"),
"action": "close"
}
],
],
)
async def new_random_pincode(self, call: InlineCall):
pincode_length = self.config["pincode_length"]
chars = "1234567890"
length = int(self.config["pincode_length"])
pincode = ""
for _ in range(length):
pincode += random.choice(chars)
await call.edit(
self.strings["pincode"].format(pincode_length, pincode),
reply_markup=[
[
{
"text": self.strings("menu"),
"callback": self.igenerator
}
],
[
{
"text": self.strings("close"),
"action": "close"
}
],
],
)