mirror of
https://github.com/MuRuLOSE/limoka.git
synced 2026-06-16 14:34:17 +02:00
Added and updated repositories 2025-07-11 08:27:20
This commit is contained in:
@@ -1,59 +1,59 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: CodeBase64
|
||||
# Description: Encode and decode base64
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/CodeBase64.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import base64
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class CodeBase64(loader.Module):
|
||||
"""Encode and decode base64"""
|
||||
|
||||
strings = {
|
||||
"name": "CodeBase64",
|
||||
|
||||
"only_base64": "<b><emoji document_id=5019523782004441717>🚫</emoji> Only <code>base64</code></b>",
|
||||
|
||||
"enc_txt": "<b><emoji document_id=6334316848741352906>⌨️</emoji> You encoded text into base64:</b>\n<code>{}</code>",
|
||||
"de_txt": "<b><emoji document_id=6334316848741352906>⌨️</emoji> You decoded text from base64:</b>\n<code>{}</code>",
|
||||
}
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def cbase64(self, message):
|
||||
"""Кодирование в base64"""
|
||||
enc_bytes = base64.b64encode(utils.get_args_raw(message).encode('utf-8'))
|
||||
enc_text = enc_bytes.decode('utf-8') # Декодируем байты в строку
|
||||
|
||||
await utils.answer(message, self.strings["enc_txt"].format(enc_text))
|
||||
|
||||
@loader.command()
|
||||
async def dbase64(self, message):
|
||||
"""Декодирование из base64"""
|
||||
try:
|
||||
de_bytes = base64.b64decode(utils.get_args_raw(message))
|
||||
except:
|
||||
return await utils.answer(message, self.strings['only_base64'])
|
||||
de_text = de_bytes.decode('utf-8') # Декодируем байты в строку
|
||||
|
||||
await utils.answer(message, self.strings["de_txt"].format(de_text))
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: CodeBase64
|
||||
# Description: Encode and decode base64
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/CodeBase64.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import base64
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class CodeBase64(loader.Module):
|
||||
"""Encode and decode base64"""
|
||||
|
||||
strings = {
|
||||
"name": "CodeBase64",
|
||||
|
||||
"only_base64": "<b><emoji document_id=5019523782004441717>🚫</emoji> Only <code>base64</code></b>",
|
||||
|
||||
"enc_txt": "<b><emoji document_id=6334316848741352906>⌨️</emoji> You encoded text into base64:</b>\n<code>{}</code>",
|
||||
"de_txt": "<b><emoji document_id=6334316848741352906>⌨️</emoji> You decoded text from base64:</b>\n<code>{}</code>",
|
||||
}
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def cbase64(self, message):
|
||||
"""Кодирование в base64"""
|
||||
enc_bytes = base64.b64encode(utils.get_args_raw(message).encode('utf-8'))
|
||||
enc_text = enc_bytes.decode('utf-8') # Декодируем байты в строку
|
||||
|
||||
await utils.answer(message, self.strings["enc_txt"].format(enc_text))
|
||||
|
||||
@loader.command()
|
||||
async def dbase64(self, message):
|
||||
"""Декодирование из base64"""
|
||||
try:
|
||||
de_bytes = base64.b64decode(utils.get_args_raw(message))
|
||||
except:
|
||||
return await utils.answer(message, self.strings['only_base64'])
|
||||
de_text = de_bytes.decode('utf-8') # Декодируем байты в строку
|
||||
|
||||
await utils.answer(message, self.strings["de_txt"].format(de_text))
|
||||
|
||||
@@ -1,120 +1,120 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: AutoGH
|
||||
# Description: Авто-коммиты в Github
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/autogh.png?raw=true
|
||||
# requires: PyGithub
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from github import Github
|
||||
from datetime import datetime
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class AutoGH(loader.Module):
|
||||
"""Авто-коммиты в Github"""
|
||||
|
||||
strings = {
|
||||
"name": "AutoGH",
|
||||
|
||||
"no_cfg": "<b><emoji document_id=5854929766146118183>🚫</emoji> Нету {}! Вставьте его в config через <code>{}cfg AutoGH</code></b>",
|
||||
|
||||
"autocommit_on": "<b><emoji document_id=4985961065012527769>🖥</emoji> Авто-коммит включен!</b>",
|
||||
"autocommit_off": "<b><emoji document_id=5854929766146118183>🚫</emoji> Авто-коммит выключен!</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"API_TOKEN",
|
||||
None,
|
||||
lambda: "Github API Token. Создать токен можно в https://github.com/settings/tokens/new",
|
||||
validator=loader.validators.Hidden(loader.validators.String()),
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"REPO",
|
||||
None,
|
||||
lambda: "Репозиторий для авто-коммитов. Пример: FajoX1/FAmods",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"file_name",
|
||||
"autocommit.txt",
|
||||
lambda: "Файл для авто-коммита",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"commit_name",
|
||||
"AutoCommit",
|
||||
lambda: "Название коммита",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"time_autocommit",
|
||||
3600,
|
||||
lambda: "Через сколько секунд сделать следущий коммит",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"log",
|
||||
True,
|
||||
lambda: "Логи о том что сделали/не получилось сделать коммит",
|
||||
validator=loader.validators.Boolean(),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
asyncio.create_task(self._autocommit())
|
||||
|
||||
async def _autocommit(self):
|
||||
while True:
|
||||
if self.db.get(self.name, "autocommit", False):
|
||||
try:
|
||||
g = Github(self.config['API_TOKEN'])
|
||||
repo = g.get_repo(self.config['REPO'])
|
||||
file_content = f'Commit at {datetime.now()}'
|
||||
try:
|
||||
contents = repo.get_contents(self.config['file_name'])
|
||||
sha = contents.sha
|
||||
repo.update_file(self.config['file_name'], self.config['commit_name'], file_content, sha)
|
||||
except:
|
||||
repo.create_file(self.config['file_name'], self.config['commit_name'], file_content)
|
||||
if self.config['log']:
|
||||
logger.info("Auto commited")
|
||||
except Exception as e:
|
||||
if self.config['log']:
|
||||
logger.error(f"Can't commit:\n{e}")
|
||||
|
||||
await asyncio.sleep(self.config['time_autocommit'])
|
||||
|
||||
@loader.command()
|
||||
async def autocommit(self, message):
|
||||
"""Включить/выключить автоматический коммит"""
|
||||
|
||||
if not self.config['API_TOKEN']:
|
||||
return await utils.answer(message, self.strings['no_cfg'].format("токена github", self.get_prefix()))
|
||||
|
||||
if not self.config['REPO']:
|
||||
return await utils.answer(message, self.strings['no_cfg'].format("названия репозитория", self.get_prefix()))
|
||||
|
||||
if self.db.get(self.name, "autocommit", False):
|
||||
self.db.set(self.name, "autocommit", False)
|
||||
return await utils.answer(message, self.strings["autocommit_off"])
|
||||
|
||||
self.db.set(self.name, "autocommit", True)
|
||||
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: AutoGH
|
||||
# Description: Авто-коммиты в Github
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/autogh.png?raw=true
|
||||
# requires: PyGithub
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from github import Github
|
||||
from datetime import datetime
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class AutoGH(loader.Module):
|
||||
"""Авто-коммиты в Github"""
|
||||
|
||||
strings = {
|
||||
"name": "AutoGH",
|
||||
|
||||
"no_cfg": "<b><emoji document_id=5854929766146118183>🚫</emoji> Нету {}! Вставьте его в config через <code>{}cfg AutoGH</code></b>",
|
||||
|
||||
"autocommit_on": "<b><emoji document_id=4985961065012527769>🖥</emoji> Авто-коммит включен!</b>",
|
||||
"autocommit_off": "<b><emoji document_id=5854929766146118183>🚫</emoji> Авто-коммит выключен!</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"API_TOKEN",
|
||||
None,
|
||||
lambda: "Github API Token. Создать токен можно в https://github.com/settings/tokens/new",
|
||||
validator=loader.validators.Hidden(loader.validators.String()),
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"REPO",
|
||||
None,
|
||||
lambda: "Репозиторий для авто-коммитов. Пример: FajoX1/FAmods",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"file_name",
|
||||
"autocommit.txt",
|
||||
lambda: "Файл для авто-коммита",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"commit_name",
|
||||
"AutoCommit",
|
||||
lambda: "Название коммита",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"time_autocommit",
|
||||
3600,
|
||||
lambda: "Через сколько секунд сделать следущий коммит",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"log",
|
||||
True,
|
||||
lambda: "Логи о том что сделали/не получилось сделать коммит",
|
||||
validator=loader.validators.Boolean(),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
asyncio.create_task(self._autocommit())
|
||||
|
||||
async def _autocommit(self):
|
||||
while True:
|
||||
if self.db.get(self.name, "autocommit", False):
|
||||
try:
|
||||
g = Github(self.config['API_TOKEN'])
|
||||
repo = g.get_repo(self.config['REPO'])
|
||||
file_content = f'Commit at {datetime.now()}'
|
||||
try:
|
||||
contents = repo.get_contents(self.config['file_name'])
|
||||
sha = contents.sha
|
||||
repo.update_file(self.config['file_name'], self.config['commit_name'], file_content, sha)
|
||||
except:
|
||||
repo.create_file(self.config['file_name'], self.config['commit_name'], file_content)
|
||||
if self.config['log']:
|
||||
logger.info("Auto commited")
|
||||
except Exception as e:
|
||||
if self.config['log']:
|
||||
logger.error(f"Can't commit:\n{e}")
|
||||
|
||||
await asyncio.sleep(self.config['time_autocommit'])
|
||||
|
||||
@loader.command()
|
||||
async def autocommit(self, message):
|
||||
"""Включить/выключить автоматический коммит"""
|
||||
|
||||
if not self.config['API_TOKEN']:
|
||||
return await utils.answer(message, self.strings['no_cfg'].format("токена github", self.get_prefix()))
|
||||
|
||||
if not self.config['REPO']:
|
||||
return await utils.answer(message, self.strings['no_cfg'].format("названия репозитория", self.get_prefix()))
|
||||
|
||||
if self.db.get(self.name, "autocommit", False):
|
||||
self.db.set(self.name, "autocommit", False)
|
||||
return await utils.answer(message, self.strings["autocommit_off"])
|
||||
|
||||
self.db.set(self.name, "autocommit", True)
|
||||
|
||||
await utils.answer(message, self.strings["autocommit_on"])
|
||||
@@ -1,351 +1,351 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: CheckHost
|
||||
# Description: Проверка доступности веб-сайтов, серверов, хостов и IP-адресов с разных геолокаций и тд.
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/checkhost.png?raw=true
|
||||
# requires: aiohttp
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import asyncio
|
||||
import aiohttp
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class CheckHost(loader.Module):
|
||||
"""Проверка доступности веб-сайтов, серверов, хостов и IP-адресов с разных геолокаций и тд."""
|
||||
|
||||
strings = {
|
||||
"name": "CheckHost",
|
||||
|
||||
"no_url": "<emoji document_id=5440381017384822513>❌</emoji> <b>Нужно <code>{}{} [адрес]</code></b>",
|
||||
|
||||
"checking_http": "<emoji document_id=6332573220868196043>🕓</emoji> <b>Проверяю доступность...</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"limit",
|
||||
True,
|
||||
lambda: "Включить/Выключить лимит геолокаций в проверке.",
|
||||
validator=loader.validators.Boolean(),
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"limit_geo",
|
||||
10,
|
||||
lambda: "Лимит геолокаций.",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def chhttp(self, message):
|
||||
"""Проверить доступность"""
|
||||
|
||||
query = utils.get_args_raw(message)
|
||||
|
||||
if not query:
|
||||
return await utils.answer(message, self.strings['no_url'].format(self.get_prefix(), 'chhttp'))
|
||||
|
||||
await utils.answer(message, self.strings['checking_http'])
|
||||
|
||||
url_cr = f"https://check-host.net/check-http?host={query}"
|
||||
|
||||
if self.config['limit']:
|
||||
url_cr += f"&max_nodes={self.config['limit_geo']}"
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
cr = await session.get(url_cr, headers={'Accept': 'application/json'})
|
||||
create = await cr.json()
|
||||
await asyncio.sleep(10)
|
||||
res = await session.get(f"https://check-host.net/check-result/{create['request_id']}", headers={'Accept': 'application/json'})
|
||||
response = await res.json()
|
||||
|
||||
txt = f"""<b>
|
||||
🌐 Проверка доступности
|
||||
|
||||
📡 IP: <code>{list(response.items())[0][1][0][4]}</code>
|
||||
🔗 Адрес: {query}
|
||||
|
||||
🛜 Доступность
|
||||
</b>
|
||||
"""
|
||||
|
||||
k = 0
|
||||
|
||||
for inf in create['nodes'].items():
|
||||
if self.config['limit']:
|
||||
if k == self.config['limit_geo']:
|
||||
break
|
||||
country = inf[1][1]
|
||||
country_code = inf[1][0]
|
||||
try:
|
||||
txt += self.flags[country_code] + " "
|
||||
except:
|
||||
pass
|
||||
city = inf[1][2]
|
||||
ip = inf[1][3]
|
||||
|
||||
response_code = list(response.items())[k][1][0][3]
|
||||
responsee = list(response.items())[k][1][0][2]
|
||||
response_seconds = list(response.items())[k][1][0][1]
|
||||
|
||||
txt += f"""<b>{country} ({city}) (<code>{ip}</code>)</b>
|
||||
<i>Response code: {response_code} ({responsee}) {response_seconds} сек.</i>
|
||||
"""
|
||||
|
||||
k += 1
|
||||
|
||||
txt += f"\n<b><a href={create['permanent_link']}>🖥 Ссылка на результат в check-host.net</a></b>"
|
||||
|
||||
return await utils.answer(message, txt)
|
||||
|
||||
flags = {
|
||||
"ad": "🇦🇩", # Андорра
|
||||
"ae": "🇦🇪", # ОАЭ
|
||||
"af": "🇦🇫", # Афганистан
|
||||
"ag": "🇦🇬", # Антигуа и Барбуда
|
||||
"ai": "🇦🇮", # Ангилья
|
||||
"al": "🇦🇱", # Албания
|
||||
"am": "🇦🇲", # Армения
|
||||
"ao": "🇦🇴", # Ангола
|
||||
"aq": "🇦🇶", # Антарктика
|
||||
"ar": "🇦🇷", # Аргентина
|
||||
"at": "🇦🇹", # Австрия
|
||||
"au": "🇦🇺", # Австралия
|
||||
"aw": "🇦🇼", # Аруба
|
||||
"ax": "🇦🇽", # Аландские острова
|
||||
"az": "🇦🇿", # Азербайджан
|
||||
"ba": "🇧🇦", # Босния и Герцеговина
|
||||
"bb": "🇧🇧", # Барбадос
|
||||
"bd": "🇧🇩", # Бангладеш
|
||||
"be": "🇧🇪", # Бельгия
|
||||
"bf": "🇧🇫", # Буркина-Фасо
|
||||
"bg": "🇧🇬", # Болгария
|
||||
"bh": "🇧🇭", # Бахрейн
|
||||
"bi": "🇧🇮", # Бурунди
|
||||
"bj": "🇧🇯", # Бенин
|
||||
"bl": "🇧🇱", # Сен-Бартельми
|
||||
"bm": "🇧🇲", # Бермудские острова
|
||||
"bn": "🇧🇳", # Бруней
|
||||
"bo": "🇧🇴", # Боливия
|
||||
"bq": "🇧🇶", # Бонэйр, Синт-Эстатиус и Саба
|
||||
"br": "🇧🇷", # Бразилия
|
||||
"bs": "🇧🇸", # Багамы
|
||||
"bt": "🇧🇹", # Бутан
|
||||
"bv": "🇧🇻", # остров Буве
|
||||
"bw": "🇧🇼", # Ботсвана
|
||||
"by": "🇧🇾", # Беларусь
|
||||
"bz": "🇧🇿", # Белиз
|
||||
"ca": "🇨🇦", # Канада
|
||||
"cc": "🇨🇨", # Кокосовые (Килинг) острова
|
||||
"cd": "🇨🇩", # Конго - Киншаса
|
||||
"cf": "🇨🇫", # Центральноафриканская Республика
|
||||
"cg": "🇨🇬", # Конго - Браззавиль
|
||||
"ch": "🇨🇭", # Швейцария
|
||||
"ci": "🇨🇮", # Кот-д’Ивуар
|
||||
"ck": "🇨🇰", # Острова Кука
|
||||
"cl": "🇨🇱", # Чили
|
||||
"cm": "🇨🇲", # Камерун
|
||||
"cn": "🇨🇳", # Китай
|
||||
"co": "🇨🇴", # Колумбия
|
||||
"cr": "🇨🇷", # Коста-Рика
|
||||
"cu": "🇨🇺", # Куба
|
||||
"cv": "🇨🇻", # Кабо-Верде
|
||||
"cw": "🇨🇼", # Кюрасао
|
||||
"cx": "🇨🇽", # остров Рождества
|
||||
"cy": "🇨🇾", # Кипр
|
||||
"cz": "🇨🇿", # Чехия
|
||||
"de": "🇩🇪", # Германия
|
||||
"dj": "🇩🇯", # Джибути
|
||||
"dk": "🇩🇰", # Дания
|
||||
"dm": "🇩🇲", # Доминика
|
||||
"do": "🇩🇴", # Доминиканская Республика
|
||||
"dz": "🇩🇿", # Алжир
|
||||
"ec": "🇪🇨", # Эквадор
|
||||
"ee": "🇪🇪", # Эстония
|
||||
"eg": "🇪🇬", # Египет
|
||||
"eh": "🇪🇭", # Западная Сахара
|
||||
"er": "🇪🇷", # Эритрея
|
||||
"es": "🇪🇸", # Испания
|
||||
"et": "🇪🇹", # Эфиопия
|
||||
"fi": "🇫🇮", # Финляндия
|
||||
"fj": "🇫🇯", # Фиджи
|
||||
"fk": "🇫🇰", # Фолклендские острова
|
||||
"fm": "🇫🇲", # Микронезия
|
||||
"fo": "🇫🇴", # Фарерские острова
|
||||
"fr": "🇫🇷", # Франция
|
||||
"ga": "🇬🇦", # Габон
|
||||
"gb": "🇬🇧", # Великобритания
|
||||
"gd": "🇬🇩", # Гренада
|
||||
"ge": "🇬🇪", # Грузия
|
||||
"gf": "🇬🇫", # Французская Гвиана
|
||||
"gg": "🇬🇬", # Гернси
|
||||
"gh": "🇬🇭", # Гана
|
||||
"gi": "🇬🇮", # Гибралтар
|
||||
"gl": "🇬🇱", # Гренландия
|
||||
"gm": "🇬🇲", # Гамбия
|
||||
"gn": "🇬🇳", # Гвинея
|
||||
"gp": "🇬🇵", # Гваделупа
|
||||
"gq": "🇬🇶", # Экваториальная Гвинея
|
||||
"gr": "🇬🇷", # Греция
|
||||
"gs": "🇬🇸", # Южная Георгия и Южные Сандвичевы острова
|
||||
"gt": "🇬🇹", # Гватемала
|
||||
"gu": "🇬🇺", # Гуам
|
||||
"gw": "🇬🇼", # Гвинея-Бисау
|
||||
"gy": "🇬🇾", # Гайана
|
||||
"hk": "🇭🇰", # Гонконг
|
||||
"hm": "🇭🇲", # остров Херд и острова Макдональд
|
||||
"hn": "🇭🇳", # Гондурас
|
||||
"hr": "🇭🇷", # Хорватия
|
||||
"ht": "🇭🇹", # Гаити
|
||||
"hu": "🇭🇺", # Венгрия
|
||||
"id": "🇮🇩", # Индонезия
|
||||
"ie": "🇮🇪", # Ирландия
|
||||
"il": "🇮🇱", # Израиль
|
||||
"im": "🇮🇲", # остров Мэн
|
||||
"in": "🇮🇳", # Индия
|
||||
"io": "🇮🇴", # Британская территория в Индийском океане
|
||||
"iq": "🇮🇶", # Ирак
|
||||
"ir": "🇮🇷", # Иран
|
||||
"is": "🇮🇸", # Исландия
|
||||
"it": "🇮🇹", # Италия
|
||||
"je": "🇯🇪", # Джерси
|
||||
"jm": "🇯🇲", # Ямайка
|
||||
"jo": "🇯🇴", # Иордания
|
||||
"jp": "🇯🇵", # Япония
|
||||
"ke": "🇰🇪", # Кения
|
||||
"kg": "🇰🇬", # Киргизия
|
||||
"kh": "🇰🇭", # Камбоджа
|
||||
"ki": "🇰🇮", # Кирибати
|
||||
"km": "🇰🇲", # Коморы
|
||||
"kn": "🇰🇳", # Сент-Китс и Невис
|
||||
"kp": "🇰🇵", # Корейская Народно-Демократическая Республика
|
||||
"kr": "🇰🇷", # Республика Корея
|
||||
"kw": "🇰🇼", # Кувейт
|
||||
"ky": "🇰🇾", # Каймановы острова
|
||||
"kz": "🇰🇿", # Казахстан
|
||||
"la": "🇱🇦", # Лаос
|
||||
"lb": "🇱🇧", # Ливан
|
||||
"lc": "🇱🇨", # Сент-Люсия
|
||||
"li": "🇱🇮", # Лихтенштейн
|
||||
"lk": "🇱🇰", # Шри-Ланка
|
||||
"lr": "🇱🇷", # Либерия
|
||||
"ls": "🇱🇸", # Лесото
|
||||
"lt": "🇱🇹", # Литва
|
||||
"lu": "🇱🇺", # Люксембург
|
||||
"lv": "🇱🇻", # Латвия
|
||||
"ly": "🇱🇾", # Ливия
|
||||
"my": "🇲🇾",
|
||||
"md": "🇲🇩",
|
||||
"mv": "🇲🇻",
|
||||
"mw": "🇲🇼",
|
||||
"mx": "🇲🇽",
|
||||
"my": "🇲🇾",
|
||||
"mz": "🇲🇿",
|
||||
"na": "🇳🇦",
|
||||
"nc": "🇳🇨",
|
||||
"ne": "🇳🇪",
|
||||
"nf": "🇳🇫",
|
||||
"ng": "🇳🇬",
|
||||
"ni": "🇳🇮",
|
||||
"nl": "🇳🇱",
|
||||
"no": "🇳🇴",
|
||||
"np": "🇳🇵",
|
||||
"nr": "🇳🇷",
|
||||
"nu": "🇳🇺",
|
||||
"nz": "🇳🇿",
|
||||
"om": "🇴🇲",
|
||||
"pa": "🇵🇦",
|
||||
"pe": "🇵🇪",
|
||||
"pf": "🇵🇫",
|
||||
"pg": "🇵🇬",
|
||||
"ph": "🇵🇭",
|
||||
"pk": "🇵🇰",
|
||||
"pl": "🇵🇱",
|
||||
"pm": "🇵🇲",
|
||||
"pn": "🇵🇳",
|
||||
"pr": "🇵🇷",
|
||||
"ps": "🇵🇸",
|
||||
"pt": "🇵🇹",
|
||||
"pw": "🇵🇼",
|
||||
"py": "🇵🇾",
|
||||
"qa": "🇶🇦",
|
||||
"re": "🇷🇪",
|
||||
"ro": "🇷🇴",
|
||||
"rs": "🇷🇸",
|
||||
"ru": "🇷🇺",
|
||||
"rw": "🇷🇼",
|
||||
"sa": "🇸🇦",
|
||||
"sb": "🇸🇧",
|
||||
"sc": "🇸🇨",
|
||||
"sd": "🇸🇩",
|
||||
"se": "🇸🇪",
|
||||
"sg": "🇸🇬",
|
||||
"sh": "🇸🇭",
|
||||
"si": "🇸🇮",
|
||||
"sj": "🇸🇯",
|
||||
"sk": "🇸🇰",
|
||||
"sl": "🇸🇱",
|
||||
"sm": "🇸🇲",
|
||||
"sn": "🇸🇳",
|
||||
"so": "🇸🇴",
|
||||
"sr": "🇸🇷",
|
||||
"ss": "🇸🇸",
|
||||
"st": "🇸🇹",
|
||||
"sv": "🇸🇻",
|
||||
"sx": "🇸🇽",
|
||||
"sy": "🇸🇾",
|
||||
"sz": "🇸🇿",
|
||||
"tc": "🇹🇨",
|
||||
"td": "🇹🇩",
|
||||
"tf": "🇹🇫",
|
||||
"tg": "🇹🇬",
|
||||
"th": "🇹🇭",
|
||||
"tj": "🇹🇯",
|
||||
"tk": "🇹🇰",
|
||||
"tl": "🇹🇱",
|
||||
"tm": "🇹🇲",
|
||||
"tn": "🇹🇳",
|
||||
"to": "🇹🇴",
|
||||
"tr": "🇹🇷",
|
||||
"tt": "🇹🇹",
|
||||
"tv": "🇹🇻",
|
||||
"tw": "🇹🇼",
|
||||
"tz": "🇹🇿",
|
||||
"ua": "🇺🇦",
|
||||
"ug": "🇺🇬",
|
||||
"um": "🇺🇲",
|
||||
"us": "🇺🇸",
|
||||
"va": "🇻🇦",
|
||||
"vc": "🇻🇨",
|
||||
"ve": "🇻🇪",
|
||||
"vg": "🇻🇬",
|
||||
"vi": "🇻🇮",
|
||||
"vn": "🇻🇳",
|
||||
"vu": "🇻🇺",
|
||||
"wf": "🇼🇫",
|
||||
"ws": "🇼🇸",
|
||||
"xk": "🇽🇰",
|
||||
"ye": "🇾🇪",
|
||||
"yt": "🇾🇹",
|
||||
"za": "🇿🇦",
|
||||
"zm": "🇿🇲",
|
||||
"zw": "🇿🇼",
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: CheckHost
|
||||
# Description: Проверка доступности веб-сайтов, серверов, хостов и IP-адресов с разных геолокаций и тд.
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/checkhost.png?raw=true
|
||||
# requires: aiohttp
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import asyncio
|
||||
import aiohttp
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class CheckHost(loader.Module):
|
||||
"""Проверка доступности веб-сайтов, серверов, хостов и IP-адресов с разных геолокаций и тд."""
|
||||
|
||||
strings = {
|
||||
"name": "CheckHost",
|
||||
|
||||
"no_url": "<emoji document_id=5440381017384822513>❌</emoji> <b>Нужно <code>{}{} [адрес]</code></b>",
|
||||
|
||||
"checking_http": "<emoji document_id=6332573220868196043>🕓</emoji> <b>Проверяю доступность...</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"limit",
|
||||
True,
|
||||
lambda: "Включить/Выключить лимит геолокаций в проверке.",
|
||||
validator=loader.validators.Boolean(),
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"limit_geo",
|
||||
10,
|
||||
lambda: "Лимит геолокаций.",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def chhttp(self, message):
|
||||
"""Проверить доступность"""
|
||||
|
||||
query = utils.get_args_raw(message)
|
||||
|
||||
if not query:
|
||||
return await utils.answer(message, self.strings['no_url'].format(self.get_prefix(), 'chhttp'))
|
||||
|
||||
await utils.answer(message, self.strings['checking_http'])
|
||||
|
||||
url_cr = f"https://check-host.net/check-http?host={query}"
|
||||
|
||||
if self.config['limit']:
|
||||
url_cr += f"&max_nodes={self.config['limit_geo']}"
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
cr = await session.get(url_cr, headers={'Accept': 'application/json'})
|
||||
create = await cr.json()
|
||||
await asyncio.sleep(10)
|
||||
res = await session.get(f"https://check-host.net/check-result/{create['request_id']}", headers={'Accept': 'application/json'})
|
||||
response = await res.json()
|
||||
|
||||
txt = f"""<b>
|
||||
🌐 Проверка доступности
|
||||
|
||||
📡 IP: <code>{list(response.items())[0][1][0][4]}</code>
|
||||
🔗 Адрес: {query}
|
||||
|
||||
🛜 Доступность
|
||||
</b>
|
||||
"""
|
||||
|
||||
k = 0
|
||||
|
||||
for inf in create['nodes'].items():
|
||||
if self.config['limit']:
|
||||
if k == self.config['limit_geo']:
|
||||
break
|
||||
country = inf[1][1]
|
||||
country_code = inf[1][0]
|
||||
try:
|
||||
txt += self.flags[country_code] + " "
|
||||
except:
|
||||
pass
|
||||
city = inf[1][2]
|
||||
ip = inf[1][3]
|
||||
|
||||
response_code = list(response.items())[k][1][0][3]
|
||||
responsee = list(response.items())[k][1][0][2]
|
||||
response_seconds = list(response.items())[k][1][0][1]
|
||||
|
||||
txt += f"""<b>{country} ({city}) (<code>{ip}</code>)</b>
|
||||
<i>Response code: {response_code} ({responsee}) {response_seconds} сек.</i>
|
||||
"""
|
||||
|
||||
k += 1
|
||||
|
||||
txt += f"\n<b><a href={create['permanent_link']}>🖥 Ссылка на результат в check-host.net</a></b>"
|
||||
|
||||
return await utils.answer(message, txt)
|
||||
|
||||
flags = {
|
||||
"ad": "🇦🇩", # Андорра
|
||||
"ae": "🇦🇪", # ОАЭ
|
||||
"af": "🇦🇫", # Афганистан
|
||||
"ag": "🇦🇬", # Антигуа и Барбуда
|
||||
"ai": "🇦🇮", # Ангилья
|
||||
"al": "🇦🇱", # Албания
|
||||
"am": "🇦🇲", # Армения
|
||||
"ao": "🇦🇴", # Ангола
|
||||
"aq": "🇦🇶", # Антарктика
|
||||
"ar": "🇦🇷", # Аргентина
|
||||
"at": "🇦🇹", # Австрия
|
||||
"au": "🇦🇺", # Австралия
|
||||
"aw": "🇦🇼", # Аруба
|
||||
"ax": "🇦🇽", # Аландские острова
|
||||
"az": "🇦🇿", # Азербайджан
|
||||
"ba": "🇧🇦", # Босния и Герцеговина
|
||||
"bb": "🇧🇧", # Барбадос
|
||||
"bd": "🇧🇩", # Бангладеш
|
||||
"be": "🇧🇪", # Бельгия
|
||||
"bf": "🇧🇫", # Буркина-Фасо
|
||||
"bg": "🇧🇬", # Болгария
|
||||
"bh": "🇧🇭", # Бахрейн
|
||||
"bi": "🇧🇮", # Бурунди
|
||||
"bj": "🇧🇯", # Бенин
|
||||
"bl": "🇧🇱", # Сен-Бартельми
|
||||
"bm": "🇧🇲", # Бермудские острова
|
||||
"bn": "🇧🇳", # Бруней
|
||||
"bo": "🇧🇴", # Боливия
|
||||
"bq": "🇧🇶", # Бонэйр, Синт-Эстатиус и Саба
|
||||
"br": "🇧🇷", # Бразилия
|
||||
"bs": "🇧🇸", # Багамы
|
||||
"bt": "🇧🇹", # Бутан
|
||||
"bv": "🇧🇻", # остров Буве
|
||||
"bw": "🇧🇼", # Ботсвана
|
||||
"by": "🇧🇾", # Беларусь
|
||||
"bz": "🇧🇿", # Белиз
|
||||
"ca": "🇨🇦", # Канада
|
||||
"cc": "🇨🇨", # Кокосовые (Килинг) острова
|
||||
"cd": "🇨🇩", # Конго - Киншаса
|
||||
"cf": "🇨🇫", # Центральноафриканская Республика
|
||||
"cg": "🇨🇬", # Конго - Браззавиль
|
||||
"ch": "🇨🇭", # Швейцария
|
||||
"ci": "🇨🇮", # Кот-д’Ивуар
|
||||
"ck": "🇨🇰", # Острова Кука
|
||||
"cl": "🇨🇱", # Чили
|
||||
"cm": "🇨🇲", # Камерун
|
||||
"cn": "🇨🇳", # Китай
|
||||
"co": "🇨🇴", # Колумбия
|
||||
"cr": "🇨🇷", # Коста-Рика
|
||||
"cu": "🇨🇺", # Куба
|
||||
"cv": "🇨🇻", # Кабо-Верде
|
||||
"cw": "🇨🇼", # Кюрасао
|
||||
"cx": "🇨🇽", # остров Рождества
|
||||
"cy": "🇨🇾", # Кипр
|
||||
"cz": "🇨🇿", # Чехия
|
||||
"de": "🇩🇪", # Германия
|
||||
"dj": "🇩🇯", # Джибути
|
||||
"dk": "🇩🇰", # Дания
|
||||
"dm": "🇩🇲", # Доминика
|
||||
"do": "🇩🇴", # Доминиканская Республика
|
||||
"dz": "🇩🇿", # Алжир
|
||||
"ec": "🇪🇨", # Эквадор
|
||||
"ee": "🇪🇪", # Эстония
|
||||
"eg": "🇪🇬", # Египет
|
||||
"eh": "🇪🇭", # Западная Сахара
|
||||
"er": "🇪🇷", # Эритрея
|
||||
"es": "🇪🇸", # Испания
|
||||
"et": "🇪🇹", # Эфиопия
|
||||
"fi": "🇫🇮", # Финляндия
|
||||
"fj": "🇫🇯", # Фиджи
|
||||
"fk": "🇫🇰", # Фолклендские острова
|
||||
"fm": "🇫🇲", # Микронезия
|
||||
"fo": "🇫🇴", # Фарерские острова
|
||||
"fr": "🇫🇷", # Франция
|
||||
"ga": "🇬🇦", # Габон
|
||||
"gb": "🇬🇧", # Великобритания
|
||||
"gd": "🇬🇩", # Гренада
|
||||
"ge": "🇬🇪", # Грузия
|
||||
"gf": "🇬🇫", # Французская Гвиана
|
||||
"gg": "🇬🇬", # Гернси
|
||||
"gh": "🇬🇭", # Гана
|
||||
"gi": "🇬🇮", # Гибралтар
|
||||
"gl": "🇬🇱", # Гренландия
|
||||
"gm": "🇬🇲", # Гамбия
|
||||
"gn": "🇬🇳", # Гвинея
|
||||
"gp": "🇬🇵", # Гваделупа
|
||||
"gq": "🇬🇶", # Экваториальная Гвинея
|
||||
"gr": "🇬🇷", # Греция
|
||||
"gs": "🇬🇸", # Южная Георгия и Южные Сандвичевы острова
|
||||
"gt": "🇬🇹", # Гватемала
|
||||
"gu": "🇬🇺", # Гуам
|
||||
"gw": "🇬🇼", # Гвинея-Бисау
|
||||
"gy": "🇬🇾", # Гайана
|
||||
"hk": "🇭🇰", # Гонконг
|
||||
"hm": "🇭🇲", # остров Херд и острова Макдональд
|
||||
"hn": "🇭🇳", # Гондурас
|
||||
"hr": "🇭🇷", # Хорватия
|
||||
"ht": "🇭🇹", # Гаити
|
||||
"hu": "🇭🇺", # Венгрия
|
||||
"id": "🇮🇩", # Индонезия
|
||||
"ie": "🇮🇪", # Ирландия
|
||||
"il": "🇮🇱", # Израиль
|
||||
"im": "🇮🇲", # остров Мэн
|
||||
"in": "🇮🇳", # Индия
|
||||
"io": "🇮🇴", # Британская территория в Индийском океане
|
||||
"iq": "🇮🇶", # Ирак
|
||||
"ir": "🇮🇷", # Иран
|
||||
"is": "🇮🇸", # Исландия
|
||||
"it": "🇮🇹", # Италия
|
||||
"je": "🇯🇪", # Джерси
|
||||
"jm": "🇯🇲", # Ямайка
|
||||
"jo": "🇯🇴", # Иордания
|
||||
"jp": "🇯🇵", # Япония
|
||||
"ke": "🇰🇪", # Кения
|
||||
"kg": "🇰🇬", # Киргизия
|
||||
"kh": "🇰🇭", # Камбоджа
|
||||
"ki": "🇰🇮", # Кирибати
|
||||
"km": "🇰🇲", # Коморы
|
||||
"kn": "🇰🇳", # Сент-Китс и Невис
|
||||
"kp": "🇰🇵", # Корейская Народно-Демократическая Республика
|
||||
"kr": "🇰🇷", # Республика Корея
|
||||
"kw": "🇰🇼", # Кувейт
|
||||
"ky": "🇰🇾", # Каймановы острова
|
||||
"kz": "🇰🇿", # Казахстан
|
||||
"la": "🇱🇦", # Лаос
|
||||
"lb": "🇱🇧", # Ливан
|
||||
"lc": "🇱🇨", # Сент-Люсия
|
||||
"li": "🇱🇮", # Лихтенштейн
|
||||
"lk": "🇱🇰", # Шри-Ланка
|
||||
"lr": "🇱🇷", # Либерия
|
||||
"ls": "🇱🇸", # Лесото
|
||||
"lt": "🇱🇹", # Литва
|
||||
"lu": "🇱🇺", # Люксембург
|
||||
"lv": "🇱🇻", # Латвия
|
||||
"ly": "🇱🇾", # Ливия
|
||||
"my": "🇲🇾",
|
||||
"md": "🇲🇩",
|
||||
"mv": "🇲🇻",
|
||||
"mw": "🇲🇼",
|
||||
"mx": "🇲🇽",
|
||||
"my": "🇲🇾",
|
||||
"mz": "🇲🇿",
|
||||
"na": "🇳🇦",
|
||||
"nc": "🇳🇨",
|
||||
"ne": "🇳🇪",
|
||||
"nf": "🇳🇫",
|
||||
"ng": "🇳🇬",
|
||||
"ni": "🇳🇮",
|
||||
"nl": "🇳🇱",
|
||||
"no": "🇳🇴",
|
||||
"np": "🇳🇵",
|
||||
"nr": "🇳🇷",
|
||||
"nu": "🇳🇺",
|
||||
"nz": "🇳🇿",
|
||||
"om": "🇴🇲",
|
||||
"pa": "🇵🇦",
|
||||
"pe": "🇵🇪",
|
||||
"pf": "🇵🇫",
|
||||
"pg": "🇵🇬",
|
||||
"ph": "🇵🇭",
|
||||
"pk": "🇵🇰",
|
||||
"pl": "🇵🇱",
|
||||
"pm": "🇵🇲",
|
||||
"pn": "🇵🇳",
|
||||
"pr": "🇵🇷",
|
||||
"ps": "🇵🇸",
|
||||
"pt": "🇵🇹",
|
||||
"pw": "🇵🇼",
|
||||
"py": "🇵🇾",
|
||||
"qa": "🇶🇦",
|
||||
"re": "🇷🇪",
|
||||
"ro": "🇷🇴",
|
||||
"rs": "🇷🇸",
|
||||
"ru": "🇷🇺",
|
||||
"rw": "🇷🇼",
|
||||
"sa": "🇸🇦",
|
||||
"sb": "🇸🇧",
|
||||
"sc": "🇸🇨",
|
||||
"sd": "🇸🇩",
|
||||
"se": "🇸🇪",
|
||||
"sg": "🇸🇬",
|
||||
"sh": "🇸🇭",
|
||||
"si": "🇸🇮",
|
||||
"sj": "🇸🇯",
|
||||
"sk": "🇸🇰",
|
||||
"sl": "🇸🇱",
|
||||
"sm": "🇸🇲",
|
||||
"sn": "🇸🇳",
|
||||
"so": "🇸🇴",
|
||||
"sr": "🇸🇷",
|
||||
"ss": "🇸🇸",
|
||||
"st": "🇸🇹",
|
||||
"sv": "🇸🇻",
|
||||
"sx": "🇸🇽",
|
||||
"sy": "🇸🇾",
|
||||
"sz": "🇸🇿",
|
||||
"tc": "🇹🇨",
|
||||
"td": "🇹🇩",
|
||||
"tf": "🇹🇫",
|
||||
"tg": "🇹🇬",
|
||||
"th": "🇹🇭",
|
||||
"tj": "🇹🇯",
|
||||
"tk": "🇹🇰",
|
||||
"tl": "🇹🇱",
|
||||
"tm": "🇹🇲",
|
||||
"tn": "🇹🇳",
|
||||
"to": "🇹🇴",
|
||||
"tr": "🇹🇷",
|
||||
"tt": "🇹🇹",
|
||||
"tv": "🇹🇻",
|
||||
"tw": "🇹🇼",
|
||||
"tz": "🇹🇿",
|
||||
"ua": "🇺🇦",
|
||||
"ug": "🇺🇬",
|
||||
"um": "🇺🇲",
|
||||
"us": "🇺🇸",
|
||||
"va": "🇻🇦",
|
||||
"vc": "🇻🇨",
|
||||
"ve": "🇻🇪",
|
||||
"vg": "🇻🇬",
|
||||
"vi": "🇻🇮",
|
||||
"vn": "🇻🇳",
|
||||
"vu": "🇻🇺",
|
||||
"wf": "🇼🇫",
|
||||
"ws": "🇼🇸",
|
||||
"xk": "🇽🇰",
|
||||
"ye": "🇾🇪",
|
||||
"yt": "🇾🇹",
|
||||
"za": "🇿🇦",
|
||||
"zm": "🇿🇲",
|
||||
"zw": "🇿🇼",
|
||||
}
|
||||
@@ -1,57 +1,57 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Edmes
|
||||
# Description: Редактирует сообщение с заданим текстом.
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/edmes.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Edmes(loader.Module):
|
||||
"""Редактирует сообщение с заданим текстом."""
|
||||
|
||||
strings = {
|
||||
"name": "Edmes",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"edit_texts",
|
||||
['👋 Привет', '👨 Я', '✏️ Редактирую', '📋 Текст', '❌ Конец.'],
|
||||
lambda: "Текст который будет при редактировании сообщения\nПример: ['👋 Привет', '👨 Я', '✏️ Редактирую', '📋 Текст', '❌ Конец.']",
|
||||
validator=loader.validators.Series()
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"wait_to_edit",
|
||||
1.2,
|
||||
lambda: "Сколько будет ждать секунд перед редактиророванием сообщения.",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def edmsg(self, message):
|
||||
"""Редактировать"""
|
||||
|
||||
for txt in self.config["edit_texts"]:
|
||||
await utils.answer(message, txt)
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Edmes
|
||||
# Description: Редактирует сообщение с заданим текстом.
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/edmes.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Edmes(loader.Module):
|
||||
"""Редактирует сообщение с заданим текстом."""
|
||||
|
||||
strings = {
|
||||
"name": "Edmes",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"edit_texts",
|
||||
['👋 Привет', '👨 Я', '✏️ Редактирую', '📋 Текст', '❌ Конец.'],
|
||||
lambda: "Текст который будет при редактировании сообщения\nПример: ['👋 Привет', '👨 Я', '✏️ Редактирую', '📋 Текст', '❌ Конец.']",
|
||||
validator=loader.validators.Series()
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"wait_to_edit",
|
||||
1.2,
|
||||
lambda: "Сколько будет ждать секунд перед редактиророванием сообщения.",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def edmsg(self, message):
|
||||
"""Редактировать"""
|
||||
|
||||
for txt in self.config["edit_texts"]:
|
||||
await utils.answer(message, txt)
|
||||
await asyncio.sleep(self.config["wait_to_edit"])
|
||||
@@ -1,77 +1,77 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Faker
|
||||
# Description: Генерация фейк информации
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/faker.png?raw=true
|
||||
# requires: faker
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import faker
|
||||
import random
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Faker(loader.Module):
|
||||
"""Генерация фейк информации"""
|
||||
|
||||
strings = {
|
||||
"name": "Faker",
|
||||
|
||||
"loading": "<b><emoji document_id=5332600281970517875>🔄</emoji> Генерирую информацию...</b>"
|
||||
}
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
async def _gen_fake(self):
|
||||
|
||||
fake = faker.Faker()
|
||||
|
||||
name = fake.first_name()
|
||||
surname = fake.last_name()
|
||||
age = random.randint(18, 63)
|
||||
|
||||
country = fake.country()
|
||||
address = fake.address()
|
||||
post_code = fake.zipcode()
|
||||
|
||||
email = fake.email()
|
||||
phone_number = fake.phone_number()
|
||||
|
||||
return f"""<b>
|
||||
🔰 Сгенерированная фейк информация:
|
||||
|
||||
📄 Имя: <code>{name}</code>
|
||||
📄 Фамилия: <code>{surname}</code>
|
||||
💈 Возраст: <code>{age}</code>
|
||||
|
||||
🗺 Страна: <code>{country}</code>
|
||||
🏠 Адрес: <code>{address}</code>
|
||||
📮 Пост-код: <code>{post_code}</code>
|
||||
|
||||
📧 Е-мейл: <code>{email}</code>
|
||||
☎ Номер телефона: <code>{phone_number}</code>
|
||||
</b>"""
|
||||
|
||||
@loader.command()
|
||||
async def gfake(self, message):
|
||||
"""Сгенерировать фейк информацию"""
|
||||
|
||||
await utils.answer(message, self.strings["loading"])
|
||||
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Faker
|
||||
# Description: Генерация фейк информации
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/faker.png?raw=true
|
||||
# requires: faker
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import faker
|
||||
import random
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Faker(loader.Module):
|
||||
"""Генерация фейк информации"""
|
||||
|
||||
strings = {
|
||||
"name": "Faker",
|
||||
|
||||
"loading": "<b><emoji document_id=5332600281970517875>🔄</emoji> Генерирую информацию...</b>"
|
||||
}
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
async def _gen_fake(self):
|
||||
|
||||
fake = faker.Faker()
|
||||
|
||||
name = fake.first_name()
|
||||
surname = fake.last_name()
|
||||
age = random.randint(18, 63)
|
||||
|
||||
country = fake.country()
|
||||
address = fake.address()
|
||||
post_code = fake.zipcode()
|
||||
|
||||
email = fake.email()
|
||||
phone_number = fake.phone_number()
|
||||
|
||||
return f"""<b>
|
||||
🔰 Сгенерированная фейк информация:
|
||||
|
||||
📄 Имя: <code>{name}</code>
|
||||
📄 Фамилия: <code>{surname}</code>
|
||||
💈 Возраст: <code>{age}</code>
|
||||
|
||||
🗺 Страна: <code>{country}</code>
|
||||
🏠 Адрес: <code>{address}</code>
|
||||
📮 Пост-код: <code>{post_code}</code>
|
||||
|
||||
📧 Е-мейл: <code>{email}</code>
|
||||
☎ Номер телефона: <code>{phone_number}</code>
|
||||
</b>"""
|
||||
|
||||
@loader.command()
|
||||
async def gfake(self, message):
|
||||
"""Сгенерировать фейк информацию"""
|
||||
|
||||
await utils.answer(message, self.strings["loading"])
|
||||
|
||||
await utils.answer(message, await self._gen_fake())
|
||||
@@ -1,136 +1,136 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Fun
|
||||
# Description: Module for fun
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/fun.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import random
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Fun(loader.Module):
|
||||
"""Module for fun..."""
|
||||
|
||||
strings = {
|
||||
"name": "Fun",
|
||||
|
||||
"no_us": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть .hacku [юзернейм/ник чела]</b>",
|
||||
"no_typing_text": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть .ftype [текст]</b>",
|
||||
|
||||
"hacku_process": "<emoji document_id=6334357625160861194>💻</emoji> <b>Взлом {} в процессе... {}%</b>",
|
||||
"hackedu": "<emoji document_id=5854762571659218443>✅</emoji> <b>{} успешно взломан!</b>",
|
||||
"collecting_info": "<b><emoji document_id=6334778871258286021>💾</emoji> Сохранение информации о {}... {}%</b>",
|
||||
"collected_info": "<emoji document_id=5854762571659218443>✅</emoji> <b>Успешно нашёл и сохранил всю информацию о {}</b>",
|
||||
|
||||
"hackp_process": "<emoji document_id=5370872220149099318>👮♀️</emoji> <b>Взлом пентагона в процессе... {}%</b>",
|
||||
"hackedp": "🟢 <b>Пентагон успешно взломан!</b>",
|
||||
"founding_nlo": "<b><emoji document_id=5371018382181145040>👽</emoji> Поиск секретных данных об НЛО ... {}%</b>",
|
||||
"dino_founded": "<emoji document_id=5460873384390830669>🦖</emoji> <b>Найдены данные о существовании динозавров на земле!</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"TYPING_SYMBOL",
|
||||
"_",
|
||||
lambda: "Печатающий символ в .ftype",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"WAITING_TIME",
|
||||
0.05,
|
||||
lambda: "Сколько секунд будет ждать перед печатю каждой буквы в .ftype",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def hacku(self, message):
|
||||
"""Взлом пользователя"""
|
||||
|
||||
us = utils.get_args_raw(message)
|
||||
if not us:
|
||||
return await utils.answer(message, self.strings["no_us"])
|
||||
|
||||
perc = 0
|
||||
|
||||
while(perc < 100):
|
||||
await utils.answer(message, self.strings["hacku_process"].format(us, perc))
|
||||
perc += random.randint(1, 3)
|
||||
await asyncio.sleep(0.3)
|
||||
|
||||
await utils.answer(message, self.strings["hackedu"].format(us))
|
||||
|
||||
await asyncio.sleep(3)
|
||||
|
||||
perc = 0
|
||||
|
||||
while(perc < 100):
|
||||
await utils.answer(message, self.strings["collecting_info"].format(us, perc))
|
||||
perc += random.randint(1, 5)
|
||||
await asyncio.sleep(0.33)
|
||||
|
||||
await utils.answer(message, self.strings["collected_info"].format(us))
|
||||
|
||||
@loader.command()
|
||||
async def hackp(self, message):
|
||||
"""Взлом пентагона"""
|
||||
perc = 0
|
||||
|
||||
while(perc < 100):
|
||||
await utils.answer(message, self.strings["hackp_process"].format(perc))
|
||||
perc += random.randint(1, 3)
|
||||
await asyncio.sleep(0.3)
|
||||
|
||||
await utils.answer(message, self.strings["hackedp"])
|
||||
|
||||
await asyncio.sleep(3)
|
||||
|
||||
perc = 0
|
||||
|
||||
while(perc < 100):
|
||||
await utils.answer(message, self.strings["founding_nlo"].format(perc))
|
||||
perc += random.randint(1, 5)
|
||||
await asyncio.sleep(0.33)
|
||||
|
||||
await utils.answer(message, self.strings["dino_founded"])
|
||||
|
||||
@loader.command()
|
||||
async def ftype(self, message):
|
||||
"""Печатать текст"""
|
||||
orig_text = utils.get_args_raw(message)
|
||||
if not orig_text:
|
||||
return await utils.answer(message, self.strings["no_typing_text"])
|
||||
|
||||
text = orig_text
|
||||
|
||||
tbp = ""
|
||||
typing_symbol = self.config["TYPING_SYMBOL"]
|
||||
waiting_seconds = self.config["WAITING_TIME"]
|
||||
|
||||
while(tbp != orig_text):
|
||||
await utils.answer(message, tbp + typing_symbol)
|
||||
await asyncio.sleep(waiting_seconds)
|
||||
|
||||
tbp = tbp + text[0]
|
||||
text = text[1:]
|
||||
|
||||
await utils.answer(message, tbp)
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Fun
|
||||
# Description: Module for fun
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/fun.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import random
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Fun(loader.Module):
|
||||
"""Module for fun..."""
|
||||
|
||||
strings = {
|
||||
"name": "Fun",
|
||||
|
||||
"no_us": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть .hacku [юзернейм/ник чела]</b>",
|
||||
"no_typing_text": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть .ftype [текст]</b>",
|
||||
|
||||
"hacku_process": "<emoji document_id=6334357625160861194>💻</emoji> <b>Взлом {} в процессе... {}%</b>",
|
||||
"hackedu": "<emoji document_id=5854762571659218443>✅</emoji> <b>{} успешно взломан!</b>",
|
||||
"collecting_info": "<b><emoji document_id=6334778871258286021>💾</emoji> Сохранение информации о {}... {}%</b>",
|
||||
"collected_info": "<emoji document_id=5854762571659218443>✅</emoji> <b>Успешно нашёл и сохранил всю информацию о {}</b>",
|
||||
|
||||
"hackp_process": "<emoji document_id=5370872220149099318>👮♀️</emoji> <b>Взлом пентагона в процессе... {}%</b>",
|
||||
"hackedp": "🟢 <b>Пентагон успешно взломан!</b>",
|
||||
"founding_nlo": "<b><emoji document_id=5371018382181145040>👽</emoji> Поиск секретных данных об НЛО ... {}%</b>",
|
||||
"dino_founded": "<emoji document_id=5460873384390830669>🦖</emoji> <b>Найдены данные о существовании динозавров на земле!</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"TYPING_SYMBOL",
|
||||
"_",
|
||||
lambda: "Печатающий символ в .ftype",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"WAITING_TIME",
|
||||
0.05,
|
||||
lambda: "Сколько секунд будет ждать перед печатю каждой буквы в .ftype",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def hacku(self, message):
|
||||
"""Взлом пользователя"""
|
||||
|
||||
us = utils.get_args_raw(message)
|
||||
if not us:
|
||||
return await utils.answer(message, self.strings["no_us"])
|
||||
|
||||
perc = 0
|
||||
|
||||
while(perc < 100):
|
||||
await utils.answer(message, self.strings["hacku_process"].format(us, perc))
|
||||
perc += random.randint(1, 3)
|
||||
await asyncio.sleep(0.3)
|
||||
|
||||
await utils.answer(message, self.strings["hackedu"].format(us))
|
||||
|
||||
await asyncio.sleep(3)
|
||||
|
||||
perc = 0
|
||||
|
||||
while(perc < 100):
|
||||
await utils.answer(message, self.strings["collecting_info"].format(us, perc))
|
||||
perc += random.randint(1, 5)
|
||||
await asyncio.sleep(0.33)
|
||||
|
||||
await utils.answer(message, self.strings["collected_info"].format(us))
|
||||
|
||||
@loader.command()
|
||||
async def hackp(self, message):
|
||||
"""Взлом пентагона"""
|
||||
perc = 0
|
||||
|
||||
while(perc < 100):
|
||||
await utils.answer(message, self.strings["hackp_process"].format(perc))
|
||||
perc += random.randint(1, 3)
|
||||
await asyncio.sleep(0.3)
|
||||
|
||||
await utils.answer(message, self.strings["hackedp"])
|
||||
|
||||
await asyncio.sleep(3)
|
||||
|
||||
perc = 0
|
||||
|
||||
while(perc < 100):
|
||||
await utils.answer(message, self.strings["founding_nlo"].format(perc))
|
||||
perc += random.randint(1, 5)
|
||||
await asyncio.sleep(0.33)
|
||||
|
||||
await utils.answer(message, self.strings["dino_founded"])
|
||||
|
||||
@loader.command()
|
||||
async def ftype(self, message):
|
||||
"""Печатать текст"""
|
||||
orig_text = utils.get_args_raw(message)
|
||||
if not orig_text:
|
||||
return await utils.answer(message, self.strings["no_typing_text"])
|
||||
|
||||
text = orig_text
|
||||
|
||||
tbp = ""
|
||||
typing_symbol = self.config["TYPING_SYMBOL"]
|
||||
waiting_seconds = self.config["WAITING_TIME"]
|
||||
|
||||
while(tbp != orig_text):
|
||||
await utils.answer(message, tbp + typing_symbol)
|
||||
await asyncio.sleep(waiting_seconds)
|
||||
|
||||
tbp = tbp + text[0]
|
||||
text = text[1:]
|
||||
|
||||
await utils.answer(message, tbp)
|
||||
await asyncio.sleep(waiting_seconds)
|
||||
@@ -1,136 +1,136 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Gsearch
|
||||
# Description: Поиск в Google
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/gsearch.png?raw=true
|
||||
# requires: aiohttp google BeautifulSoup4
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import time
|
||||
import asyncio
|
||||
import logging
|
||||
import aiohttp
|
||||
|
||||
from bs4 import BeautifulSoup
|
||||
from googlesearch import search
|
||||
from urllib.parse import unquote
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Gsearch(loader.Module):
|
||||
"""Поиск в Google"""
|
||||
|
||||
strings = {
|
||||
"name": "Gsearch",
|
||||
|
||||
"no_q": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть </b><code>{}gsearch [запрос]</code>",
|
||||
"no_result": "<b>😕 Ничего не нашёл по этому запросу</b>",
|
||||
|
||||
"searching": "<emoji document_id=5326015457155620929>🔄</emoji> <b>Поиск в google.com...</b>",
|
||||
"searched": """<b>
|
||||
<emoji document_id=5308054573938647180>🔎</emoji> Результаты поиска
|
||||
|
||||
<emoji document_id=5188311512791393083>🔎</emoji> Запрос:</b> <code>{}</code>
|
||||
{}
|
||||
|
||||
<i>{} результатов за {} сек</i>
|
||||
</b>""",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"results",
|
||||
5,
|
||||
lambda: "Количество результатов",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"safe_search",
|
||||
False,
|
||||
lambda: "Безопастный поиск",
|
||||
validator=loader.validators.Boolean(),
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"lang",
|
||||
"ru",
|
||||
lambda: "Язык результатов",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"emoji",
|
||||
"<emoji document_id=5098187078693290864>▪️</emoji>",
|
||||
lambda: "Эмодзи в результатах поиска",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"user_agent",
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
|
||||
lambda: "Ваш User-Agent"
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"show_title",
|
||||
True,
|
||||
lambda: "Заголовки в результате",
|
||||
validator=loader.validators.Boolean()
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def gsearch(self, message):
|
||||
"""Поиск в Google"""
|
||||
|
||||
q = utils.get_args_raw(message)
|
||||
if not q:
|
||||
return await utils.answer(message, self.strings["no_q"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['searching'])
|
||||
|
||||
safe_s = "off"
|
||||
|
||||
if self.config["safe_search"]:
|
||||
safe_s = "on"
|
||||
|
||||
count_s = 0
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
searched_result = ""
|
||||
|
||||
emojii = self.config["emoji"]
|
||||
|
||||
for url in search(q, stop=self.config["results"], lang=self.config["safe_search"], safe=safe_s):
|
||||
if self.config['show_title']:
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(url, headers={"User-Agent": self.config['user_agent']}) as response:
|
||||
html = await response.read()
|
||||
soup = BeautifulSoup(html, 'html.parser')
|
||||
title = soup.find('title').text
|
||||
searched_result += f"\n{emojii} <i><a href='{unquote(url)}'>{title}</a></i>"
|
||||
except:
|
||||
searched_result += f"\n{emojii} <i>{unquote(url)}</i>"
|
||||
else:
|
||||
searched_result += f"\n{emojii} <i>{unquote(url)}</i>"
|
||||
count_s += 1
|
||||
|
||||
end_time = time.time()
|
||||
execution_time = end_time - start_time
|
||||
|
||||
if count_s == 0:
|
||||
return await utils.answer(message, self.strings['no_result'])
|
||||
|
||||
return await utils.answer(message, self.strings['searched'].format(q, searched_result, count_s, execution_time))
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Gsearch
|
||||
# Description: Поиск в Google
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/gsearch.png?raw=true
|
||||
# requires: aiohttp google BeautifulSoup4
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import time
|
||||
import asyncio
|
||||
import logging
|
||||
import aiohttp
|
||||
|
||||
from bs4 import BeautifulSoup
|
||||
from googlesearch import search
|
||||
from urllib.parse import unquote
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Gsearch(loader.Module):
|
||||
"""Поиск в Google"""
|
||||
|
||||
strings = {
|
||||
"name": "Gsearch",
|
||||
|
||||
"no_q": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть </b><code>{}gsearch [запрос]</code>",
|
||||
"no_result": "<b>😕 Ничего не нашёл по этому запросу</b>",
|
||||
|
||||
"searching": "<emoji document_id=5326015457155620929>🔄</emoji> <b>Поиск в google.com...</b>",
|
||||
"searched": """<b>
|
||||
<emoji document_id=5308054573938647180>🔎</emoji> Результаты поиска
|
||||
|
||||
<emoji document_id=5188311512791393083>🔎</emoji> Запрос:</b> <code>{}</code>
|
||||
{}
|
||||
|
||||
<i>{} результатов за {} сек</i>
|
||||
</b>""",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"results",
|
||||
5,
|
||||
lambda: "Количество результатов",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"safe_search",
|
||||
False,
|
||||
lambda: "Безопастный поиск",
|
||||
validator=loader.validators.Boolean(),
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"lang",
|
||||
"ru",
|
||||
lambda: "Язык результатов",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"emoji",
|
||||
"<emoji document_id=5098187078693290864>▪️</emoji>",
|
||||
lambda: "Эмодзи в результатах поиска",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"user_agent",
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
|
||||
lambda: "Ваш User-Agent"
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"show_title",
|
||||
True,
|
||||
lambda: "Заголовки в результате",
|
||||
validator=loader.validators.Boolean()
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def gsearch(self, message):
|
||||
"""Поиск в Google"""
|
||||
|
||||
q = utils.get_args_raw(message)
|
||||
if not q:
|
||||
return await utils.answer(message, self.strings["no_q"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['searching'])
|
||||
|
||||
safe_s = "off"
|
||||
|
||||
if self.config["safe_search"]:
|
||||
safe_s = "on"
|
||||
|
||||
count_s = 0
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
searched_result = ""
|
||||
|
||||
emojii = self.config["emoji"]
|
||||
|
||||
for url in search(q, stop=self.config["results"], lang=self.config["safe_search"], safe=safe_s):
|
||||
if self.config['show_title']:
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(url, headers={"User-Agent": self.config['user_agent']}) as response:
|
||||
html = await response.read()
|
||||
soup = BeautifulSoup(html, 'html.parser')
|
||||
title = soup.find('title').text
|
||||
searched_result += f"\n{emojii} <i><a href='{unquote(url)}'>{title}</a></i>"
|
||||
except:
|
||||
searched_result += f"\n{emojii} <i>{unquote(url)}</i>"
|
||||
else:
|
||||
searched_result += f"\n{emojii} <i>{unquote(url)}</i>"
|
||||
count_s += 1
|
||||
|
||||
end_time = time.time()
|
||||
execution_time = end_time - start_time
|
||||
|
||||
if count_s == 0:
|
||||
return await utils.answer(message, self.strings['no_result'])
|
||||
|
||||
return await utils.answer(message, self.strings['searched'].format(q, searched_result, count_s, execution_time))
|
||||
|
||||
@@ -1,135 +1,135 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: HetaLib
|
||||
# Description: Модуль для работы с heta
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/hetalib.png?raw=true
|
||||
# requires: heta==1.0.2 requests
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import heta
|
||||
import asyncio
|
||||
import requests
|
||||
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class HetaLib(loader.Module):
|
||||
"""Модуль для работы с heta"""
|
||||
|
||||
strings = {
|
||||
"name": "HetaLib",
|
||||
|
||||
"no_q": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть <code>{}hsearch [запрос]</code></b>",
|
||||
"no_hh": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть <code>{}decode_hhash [хэш]</code></b>",
|
||||
"no_repo": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть <code>{}mods_repo [ссылка_на_репозиторий]</code></b>",
|
||||
|
||||
"invalid_hh": "<b>😕 Неверный хэш</b>",
|
||||
"invalid_repo": "<b>😕 Неверный репозиторий модулей</b>",
|
||||
"no_modules_in_repo": "<b>😕 Нету модулей в репозитории</b>",
|
||||
|
||||
"searching": "<emoji document_id=5307710821936145414>🔄</emoji> <b>Поиск модулей...</b>",
|
||||
"receiving_modules": "<emoji document_id=5325792861885570739>🔄</emoji> <b>Получаю модули...</b>",
|
||||
"decoding": "<emoji document_id=5307981757063110606>🔄</emoji> <b>Декодирую хэш...</b>",
|
||||
}
|
||||
|
||||
app_name = "famods Hetalib"
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"search_limit_result",
|
||||
5,
|
||||
lambda: "Максимум результатов поиска будет при поиске модулей.",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def hsearch(self, message):
|
||||
"""Поиск модуля в heta"""
|
||||
|
||||
q = utils.get_args_raw(message)
|
||||
if not q:
|
||||
return await utils.answer(message, self.strings["no_q"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['searching'])
|
||||
|
||||
smods = heta.search(query=q, limit=self.config["search_limit_result"], app_name=self.app_name)
|
||||
|
||||
mtext = f"""<b>⛩ Heta search ⛩
|
||||
|
||||
<emoji document_id=5188311512791393083>🔎</emoji> Запрос: </b><code>{q}</code>
|
||||
|
||||
"""
|
||||
|
||||
for mod in smods:
|
||||
mtext += f"""<b>🖥 {mod['module']['name']} (<a href="{mod['module']['link']}">source</a>) by {mod['module']['dev']}
|
||||
ℹ️ </b><i>{mod['module']['cls_doc']}</i><b>
|
||||
<code>{self.get_prefix()}dlh {mod['module']['hash']}</code>
|
||||
——
|
||||
</b>"""
|
||||
|
||||
await utils.answer(message, mtext)
|
||||
|
||||
@loader.command()
|
||||
async def decode_hhash(self, message):
|
||||
"""Декодировать heta hash"""
|
||||
|
||||
hhash = utils.get_args_raw(message)
|
||||
if not hhash:
|
||||
return await utils.answer(message, self.strings["no_hh"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['decoding'])
|
||||
|
||||
try:
|
||||
hh_info = heta.decode_hash(mhash=hhash, app_name=self.app_name)
|
||||
except requests.exceptions.JSONDecodeError:
|
||||
return await utils.answer(message, self.strings['invalid_hh'])
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
🖥 {hh_info['name']} (<a href="{hh_info['link']}">source</a>)
|
||||
<code>{self.get_prefix()}dlh {hhash}</code>
|
||||
</b>""")
|
||||
|
||||
@loader.command()
|
||||
async def mods_repo(self, message):
|
||||
"""Получить модули с репозитория"""
|
||||
|
||||
rep = utils.get_args_raw(message)
|
||||
if not rep:
|
||||
return await utils.answer(message, self.strings["no_repo"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['receiving_modules'])
|
||||
|
||||
try:
|
||||
mods = heta.repo.get_modules(repo=rep)
|
||||
except requests.exceptions.MissingSchema:
|
||||
return await utils.answer(message, self.strings['invalid_repo'])
|
||||
if mods == "no modules":
|
||||
return await utils.answer(message, self.strings['no_modules_in_repo'])
|
||||
|
||||
mdsrepo = f"""
|
||||
<b>🖥 Модули из <a href="{rep}">этого</a> репозитория</b>
|
||||
|
||||
"""
|
||||
|
||||
for mod in mods:
|
||||
mdsrepo += f"<i>{mod['name']}</i> (<i><a href='{mod['link']}'>ссылка</a></i>)\n"
|
||||
|
||||
await utils.answer(message, mdsrepo)
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: HetaLib
|
||||
# Description: Модуль для работы с heta
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/hetalib.png?raw=true
|
||||
# requires: heta==1.0.2 requests
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import heta
|
||||
import asyncio
|
||||
import requests
|
||||
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class HetaLib(loader.Module):
|
||||
"""Модуль для работы с heta"""
|
||||
|
||||
strings = {
|
||||
"name": "HetaLib",
|
||||
|
||||
"no_q": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть <code>{}hsearch [запрос]</code></b>",
|
||||
"no_hh": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть <code>{}decode_hhash [хэш]</code></b>",
|
||||
"no_repo": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть <code>{}mods_repo [ссылка_на_репозиторий]</code></b>",
|
||||
|
||||
"invalid_hh": "<b>😕 Неверный хэш</b>",
|
||||
"invalid_repo": "<b>😕 Неверный репозиторий модулей</b>",
|
||||
"no_modules_in_repo": "<b>😕 Нету модулей в репозитории</b>",
|
||||
|
||||
"searching": "<emoji document_id=5307710821936145414>🔄</emoji> <b>Поиск модулей...</b>",
|
||||
"receiving_modules": "<emoji document_id=5325792861885570739>🔄</emoji> <b>Получаю модули...</b>",
|
||||
"decoding": "<emoji document_id=5307981757063110606>🔄</emoji> <b>Декодирую хэш...</b>",
|
||||
}
|
||||
|
||||
app_name = "famods Hetalib"
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"search_limit_result",
|
||||
5,
|
||||
lambda: "Максимум результатов поиска будет при поиске модулей.",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def hsearch(self, message):
|
||||
"""Поиск модуля в heta"""
|
||||
|
||||
q = utils.get_args_raw(message)
|
||||
if not q:
|
||||
return await utils.answer(message, self.strings["no_q"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['searching'])
|
||||
|
||||
smods = heta.search(query=q, limit=self.config["search_limit_result"], app_name=self.app_name)
|
||||
|
||||
mtext = f"""<b>⛩ Heta search ⛩
|
||||
|
||||
<emoji document_id=5188311512791393083>🔎</emoji> Запрос: </b><code>{q}</code>
|
||||
|
||||
"""
|
||||
|
||||
for mod in smods:
|
||||
mtext += f"""<b>🖥 {mod['module']['name']} (<a href="{mod['module']['link']}">source</a>) by {mod['module']['dev']}
|
||||
ℹ️ </b><i>{mod['module']['cls_doc']}</i><b>
|
||||
<code>{self.get_prefix()}dlh {mod['module']['hash']}</code>
|
||||
——
|
||||
</b>"""
|
||||
|
||||
await utils.answer(message, mtext)
|
||||
|
||||
@loader.command()
|
||||
async def decode_hhash(self, message):
|
||||
"""Декодировать heta hash"""
|
||||
|
||||
hhash = utils.get_args_raw(message)
|
||||
if not hhash:
|
||||
return await utils.answer(message, self.strings["no_hh"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['decoding'])
|
||||
|
||||
try:
|
||||
hh_info = heta.decode_hash(mhash=hhash, app_name=self.app_name)
|
||||
except requests.exceptions.JSONDecodeError:
|
||||
return await utils.answer(message, self.strings['invalid_hh'])
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
🖥 {hh_info['name']} (<a href="{hh_info['link']}">source</a>)
|
||||
<code>{self.get_prefix()}dlh {hhash}</code>
|
||||
</b>""")
|
||||
|
||||
@loader.command()
|
||||
async def mods_repo(self, message):
|
||||
"""Получить модули с репозитория"""
|
||||
|
||||
rep = utils.get_args_raw(message)
|
||||
if not rep:
|
||||
return await utils.answer(message, self.strings["no_repo"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['receiving_modules'])
|
||||
|
||||
try:
|
||||
mods = heta.repo.get_modules(repo=rep)
|
||||
except requests.exceptions.MissingSchema:
|
||||
return await utils.answer(message, self.strings['invalid_repo'])
|
||||
if mods == "no modules":
|
||||
return await utils.answer(message, self.strings['no_modules_in_repo'])
|
||||
|
||||
mdsrepo = f"""
|
||||
<b>🖥 Модули из <a href="{rep}">этого</a> репозитория</b>
|
||||
|
||||
"""
|
||||
|
||||
for mod in mods:
|
||||
mdsrepo += f"<i>{mod['name']}</i> (<i><a href='{mod['link']}'>ссылка</a></i>)\n"
|
||||
|
||||
await utils.answer(message, mdsrepo)
|
||||
|
||||
@@ -1,95 +1,95 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: InfoIP
|
||||
# Description: Информация об IP адресе
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/infoip.png?raw=true
|
||||
# requires: ipinfo
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import ipinfo
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class InfoIP(loader.Module):
|
||||
"""Информация об IP адресе"""
|
||||
|
||||
strings = {
|
||||
"name": "InfoIP",
|
||||
|
||||
"no_ip": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть .ipi [айпи]</b>",
|
||||
"no_token": "<emoji document_id=5854929766146118183>❌</emoji> <b>Нету токена! Поставь его в <code>{}cfg InfoIP</code></b>",
|
||||
"invalid_token": "<b>😕 Неверный токен</b>",
|
||||
"invalid_ip": "<b>😕 Неверный IP</b>",
|
||||
|
||||
"searching_info": "<emoji document_id=5326015457155620929>🔄</emoji> <b>Получаю информацию...</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"api_token",
|
||||
None,
|
||||
lambda: "Токен для работы с API. Взять можно на сайте https://ipinfo.io/account/token",
|
||||
validator=loader.validators.Hidden(loader.validators.String()),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def ipi(self, message):
|
||||
"""Информация об IP"""
|
||||
|
||||
ip = utils.get_args_raw(message)
|
||||
if not ip:
|
||||
return await utils.answer(message, self.strings["no_ip"])
|
||||
|
||||
if not self.config["api_token"]:
|
||||
return await utils.answer(message, self.strings["no_token"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['searching_info'])
|
||||
|
||||
access_token = self.config["api_token"]
|
||||
handler = ipinfo.getHandler(access_token)
|
||||
|
||||
try:
|
||||
info = handler.getDetails(ip)
|
||||
except ipinfo.error.APIError:
|
||||
return await utils.answer(message, self.strings['invalid_token'])
|
||||
except ValueError:
|
||||
return await utils.answer(message, self.strings['invalid_ip'])
|
||||
|
||||
return await utils.answer(message, f"""<b>
|
||||
🌐 Информация об IP
|
||||
|
||||
<emoji document_id=6334617384782923882>📟</emoji> IP: <code>{info.ip}</code>
|
||||
|
||||
⛰ Регион: <code>{info.region}</code>
|
||||
🏙 Город: <code>{info.city}</code>
|
||||
🗺 Страна: {info.country_flag['emoji']} <code>{info.country_name} ({info.country})</code>
|
||||
🗺 Континент: <code>{info.continent['name']} ({info.continent['code']})</code>
|
||||
🧾 Пост-код: <code>{info.postal}</code>
|
||||
|
||||
🏛 Организация: <code>{info.org}</code>
|
||||
|
||||
🪙 Валюта: <code>{info.country_currency['code']} ({info.country_currency['symbol']})</code>
|
||||
|
||||
🏕 Место: <code>{info.loc}</code>
|
||||
<emoji document_id=6334427547228440889>🕒</emoji> Часовой пояс: <code>{info.timezone}</code>
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: InfoIP
|
||||
# Description: Информация об IP адресе
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/infoip.png?raw=true
|
||||
# requires: ipinfo
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import ipinfo
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class InfoIP(loader.Module):
|
||||
"""Информация об IP адресе"""
|
||||
|
||||
strings = {
|
||||
"name": "InfoIP",
|
||||
|
||||
"no_ip": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть .ipi [айпи]</b>",
|
||||
"no_token": "<emoji document_id=5854929766146118183>❌</emoji> <b>Нету токена! Поставь его в <code>{}cfg InfoIP</code></b>",
|
||||
"invalid_token": "<b>😕 Неверный токен</b>",
|
||||
"invalid_ip": "<b>😕 Неверный IP</b>",
|
||||
|
||||
"searching_info": "<emoji document_id=5326015457155620929>🔄</emoji> <b>Получаю информацию...</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"api_token",
|
||||
None,
|
||||
lambda: "Токен для работы с API. Взять можно на сайте https://ipinfo.io/account/token",
|
||||
validator=loader.validators.Hidden(loader.validators.String()),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def ipi(self, message):
|
||||
"""Информация об IP"""
|
||||
|
||||
ip = utils.get_args_raw(message)
|
||||
if not ip:
|
||||
return await utils.answer(message, self.strings["no_ip"])
|
||||
|
||||
if not self.config["api_token"]:
|
||||
return await utils.answer(message, self.strings["no_token"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['searching_info'])
|
||||
|
||||
access_token = self.config["api_token"]
|
||||
handler = ipinfo.getHandler(access_token)
|
||||
|
||||
try:
|
||||
info = handler.getDetails(ip)
|
||||
except ipinfo.error.APIError:
|
||||
return await utils.answer(message, self.strings['invalid_token'])
|
||||
except ValueError:
|
||||
return await utils.answer(message, self.strings['invalid_ip'])
|
||||
|
||||
return await utils.answer(message, f"""<b>
|
||||
🌐 Информация об IP
|
||||
|
||||
<emoji document_id=6334617384782923882>📟</emoji> IP: <code>{info.ip}</code>
|
||||
|
||||
⛰ Регион: <code>{info.region}</code>
|
||||
🏙 Город: <code>{info.city}</code>
|
||||
🗺 Страна: {info.country_flag['emoji']} <code>{info.country_name} ({info.country})</code>
|
||||
🗺 Континент: <code>{info.continent['name']} ({info.continent['code']})</code>
|
||||
🧾 Пост-код: <code>{info.postal}</code>
|
||||
|
||||
🏛 Организация: <code>{info.org}</code>
|
||||
|
||||
🪙 Валюта: <code>{info.country_currency['code']} ({info.country_currency['symbol']})</code>
|
||||
|
||||
🏕 Место: <code>{info.loc}</code>
|
||||
<emoji document_id=6334427547228440889>🕒</emoji> Часовой пояс: <code>{info.timezone}</code>
|
||||
</b>""")
|
||||
@@ -1,183 +1,183 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: PhoneInfo
|
||||
# Description: Информация о телефоне
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/phoneinfo.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import time
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class PhoneInfo(loader.Module):
|
||||
"""Информация о телефоне"""
|
||||
|
||||
strings = {
|
||||
"name": "PhoneInfo",
|
||||
|
||||
"no_phone": "<emoji document_id=5440381017384822513>❌</emoji> <b>Нужно <code>{}{} [название телефона]</code></b>",
|
||||
|
||||
"searching": "<emoji document_id=5334904192622403796>🔄</emoji> <b>Поиск телефона...</b>",
|
||||
"searching_info": "<emoji document_id=5334904192622403796>🔄</emoji> <b>Поиск информации о телефоне...</b>",
|
||||
|
||||
"no_found": "<emoji document_id=5440381017384822513>❌</emoji> <b>Не нашёл такой телефон</b>",
|
||||
|
||||
"cameras_txt": "<emoji document_id=5787632606484893320>📷</emoji> Cameras:",
|
||||
"software_txt": "<emoji document_id=6334742097748298141>🖥</emoji> Software:",
|
||||
"hardware_txt": "<emoji document_id=6334778871258286021>💾</emoji> Hardware:",
|
||||
}
|
||||
|
||||
cameras_t = "Cameras:"
|
||||
software_t = "Software:"
|
||||
hardware_t = "Hardware:"
|
||||
|
||||
opt_bt = "\nspecs prepared with ❤️ by @gsmarbot"
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"search_limit",
|
||||
5,
|
||||
lambda: "Лимит результатов в поиске",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
async def _get_phone_info(self, query):
|
||||
try:
|
||||
q = await self._client.inline_query("@gsmarbot", query)
|
||||
result = q.result.results[1]
|
||||
|
||||
message = result.send_message.message
|
||||
message = message.replace(self.opt_bt, "")
|
||||
message = message.replace(self.cameras_t, self.strings['cameras_txt'])
|
||||
message = message.replace(self.software_t, self.strings['software_txt'])
|
||||
message = message.replace(self.hardware_t, self.strings['hardware_txt'])
|
||||
|
||||
url = result.send_message.reply_markup.rows[0].buttons[0].url
|
||||
|
||||
return {'info': message, 'link': url}
|
||||
except (IndexError, AttributeError):
|
||||
return {'info': "no found"}
|
||||
|
||||
async def _get_phones(self, query):
|
||||
try:
|
||||
q = await self._client.inline_query("@gsmarbot", query)
|
||||
q.result.results[1]
|
||||
|
||||
results = q.result.results
|
||||
|
||||
limit = self.config["search_limit"]
|
||||
|
||||
c_res = 0
|
||||
|
||||
resultss = []
|
||||
|
||||
for result in results:
|
||||
|
||||
if c_res == limit:
|
||||
break
|
||||
|
||||
resultss.append({"name": result.send_message.message.split('\n')[0], "link": result.send_message.reply_markup.rows[0].buttons[0].url})
|
||||
|
||||
c_res += 1
|
||||
|
||||
return {'result': resultss, 'count_result_res': c_res}
|
||||
except (IndexError, AttributeError):
|
||||
return {"result": "no found"}
|
||||
|
||||
@loader.command()
|
||||
async def pnsearch(self, message):
|
||||
"""Поиск телефона"""
|
||||
|
||||
query = utils.get_args_raw(message)
|
||||
|
||||
if not query:
|
||||
return await utils.answer(message, self.strings['no_phone'].format(self.get_prefix(), 'pnsearch'))
|
||||
|
||||
await utils.answer(message, self.strings['searching'])
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
phones = await self._get_phones(query)
|
||||
|
||||
if phones['result'] == "no found":
|
||||
return await utils.answer(message, self.strings['no_found'])
|
||||
|
||||
txt = f"""<b>
|
||||
<emoji document_id=5407025283456835913>📱</emoji> Результаты поиска
|
||||
|
||||
<emoji document_id=5188311512791393083>🔎</emoji> Запрос: <code>{query}</code>
|
||||
|
||||
</b>"""
|
||||
|
||||
for phone in phones['result']:
|
||||
txt += f"<b>📱 {phone['name']}\n🔗 {phone['link']}</b>\n\n"
|
||||
|
||||
end_time = time.time()
|
||||
execution_time = end_time - start_time
|
||||
|
||||
txt += f"<i>{phones['count_result_res']} результатов за {execution_time} сек</i>"
|
||||
|
||||
return await utils.answer(message, txt)
|
||||
|
||||
@loader.command()
|
||||
async def pninfo(self, message):
|
||||
"""Получить информацию о телефоне"""
|
||||
|
||||
query = utils.get_args_raw(message)
|
||||
|
||||
if not query:
|
||||
return await utils.answer(message, self.strings['no_phone'].format(self.get_prefix(), 'pninfo'))
|
||||
|
||||
await utils.answer(message, self.strings['searching_info'])
|
||||
|
||||
info = await self._get_phone_info(query)
|
||||
|
||||
if info['info'] == "no found":
|
||||
return await utils.answer(message, self.strings['no_found'])
|
||||
|
||||
txt = f"""<b>
|
||||
<emoji document_id=5407025283456835913>📱</emoji> Информация о телефоне
|
||||
|
||||
<emoji document_id=5188311512791393083>🔎</emoji> Запрос: <code>{query}</code>
|
||||
|
||||
<emoji document_id=5406809207947142040>📲</emoji> {info['info']}
|
||||
</b>"""
|
||||
|
||||
keyboard = [
|
||||
[
|
||||
{
|
||||
"text": "Полная информация о телефоне",
|
||||
"url": info['link'],
|
||||
}
|
||||
],
|
||||
]
|
||||
|
||||
# try:
|
||||
await self.inline.form(
|
||||
text=txt,
|
||||
message=message,
|
||||
reply_markup=keyboard,
|
||||
force_me=True,
|
||||
)
|
||||
# except Exception as e:
|
||||
# txt += f"<b><a href='{link}'><emoji document_id=6334638004920911460>ℹ️</emoji> Полная информация о телефоне</a></b>"
|
||||
# return await utils.answer(message, txt)
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: PhoneInfo
|
||||
# Description: Информация о телефоне
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/phoneinfo.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import time
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class PhoneInfo(loader.Module):
|
||||
"""Информация о телефоне"""
|
||||
|
||||
strings = {
|
||||
"name": "PhoneInfo",
|
||||
|
||||
"no_phone": "<emoji document_id=5440381017384822513>❌</emoji> <b>Нужно <code>{}{} [название телефона]</code></b>",
|
||||
|
||||
"searching": "<emoji document_id=5334904192622403796>🔄</emoji> <b>Поиск телефона...</b>",
|
||||
"searching_info": "<emoji document_id=5334904192622403796>🔄</emoji> <b>Поиск информации о телефоне...</b>",
|
||||
|
||||
"no_found": "<emoji document_id=5440381017384822513>❌</emoji> <b>Не нашёл такой телефон</b>",
|
||||
|
||||
"cameras_txt": "<emoji document_id=5787632606484893320>📷</emoji> Cameras:",
|
||||
"software_txt": "<emoji document_id=6334742097748298141>🖥</emoji> Software:",
|
||||
"hardware_txt": "<emoji document_id=6334778871258286021>💾</emoji> Hardware:",
|
||||
}
|
||||
|
||||
cameras_t = "Cameras:"
|
||||
software_t = "Software:"
|
||||
hardware_t = "Hardware:"
|
||||
|
||||
opt_bt = "\nspecs prepared with ❤️ by @gsmarbot"
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"search_limit",
|
||||
5,
|
||||
lambda: "Лимит результатов в поиске",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
async def _get_phone_info(self, query):
|
||||
try:
|
||||
q = await self._client.inline_query("@gsmarbot", query)
|
||||
result = q.result.results[1]
|
||||
|
||||
message = result.send_message.message
|
||||
message = message.replace(self.opt_bt, "")
|
||||
message = message.replace(self.cameras_t, self.strings['cameras_txt'])
|
||||
message = message.replace(self.software_t, self.strings['software_txt'])
|
||||
message = message.replace(self.hardware_t, self.strings['hardware_txt'])
|
||||
|
||||
url = result.send_message.reply_markup.rows[0].buttons[0].url
|
||||
|
||||
return {'info': message, 'link': url}
|
||||
except (IndexError, AttributeError):
|
||||
return {'info': "no found"}
|
||||
|
||||
async def _get_phones(self, query):
|
||||
try:
|
||||
q = await self._client.inline_query("@gsmarbot", query)
|
||||
q.result.results[1]
|
||||
|
||||
results = q.result.results
|
||||
|
||||
limit = self.config["search_limit"]
|
||||
|
||||
c_res = 0
|
||||
|
||||
resultss = []
|
||||
|
||||
for result in results:
|
||||
|
||||
if c_res == limit:
|
||||
break
|
||||
|
||||
resultss.append({"name": result.send_message.message.split('\n')[0], "link": result.send_message.reply_markup.rows[0].buttons[0].url})
|
||||
|
||||
c_res += 1
|
||||
|
||||
return {'result': resultss, 'count_result_res': c_res}
|
||||
except (IndexError, AttributeError):
|
||||
return {"result": "no found"}
|
||||
|
||||
@loader.command()
|
||||
async def pnsearch(self, message):
|
||||
"""Поиск телефона"""
|
||||
|
||||
query = utils.get_args_raw(message)
|
||||
|
||||
if not query:
|
||||
return await utils.answer(message, self.strings['no_phone'].format(self.get_prefix(), 'pnsearch'))
|
||||
|
||||
await utils.answer(message, self.strings['searching'])
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
phones = await self._get_phones(query)
|
||||
|
||||
if phones['result'] == "no found":
|
||||
return await utils.answer(message, self.strings['no_found'])
|
||||
|
||||
txt = f"""<b>
|
||||
<emoji document_id=5407025283456835913>📱</emoji> Результаты поиска
|
||||
|
||||
<emoji document_id=5188311512791393083>🔎</emoji> Запрос: <code>{query}</code>
|
||||
|
||||
</b>"""
|
||||
|
||||
for phone in phones['result']:
|
||||
txt += f"<b>📱 {phone['name']}\n🔗 {phone['link']}</b>\n\n"
|
||||
|
||||
end_time = time.time()
|
||||
execution_time = end_time - start_time
|
||||
|
||||
txt += f"<i>{phones['count_result_res']} результатов за {execution_time} сек</i>"
|
||||
|
||||
return await utils.answer(message, txt)
|
||||
|
||||
@loader.command()
|
||||
async def pninfo(self, message):
|
||||
"""Получить информацию о телефоне"""
|
||||
|
||||
query = utils.get_args_raw(message)
|
||||
|
||||
if not query:
|
||||
return await utils.answer(message, self.strings['no_phone'].format(self.get_prefix(), 'pninfo'))
|
||||
|
||||
await utils.answer(message, self.strings['searching_info'])
|
||||
|
||||
info = await self._get_phone_info(query)
|
||||
|
||||
if info['info'] == "no found":
|
||||
return await utils.answer(message, self.strings['no_found'])
|
||||
|
||||
txt = f"""<b>
|
||||
<emoji document_id=5407025283456835913>📱</emoji> Информация о телефоне
|
||||
|
||||
<emoji document_id=5188311512791393083>🔎</emoji> Запрос: <code>{query}</code>
|
||||
|
||||
<emoji document_id=5406809207947142040>📲</emoji> {info['info']}
|
||||
</b>"""
|
||||
|
||||
keyboard = [
|
||||
[
|
||||
{
|
||||
"text": "Полная информация о телефоне",
|
||||
"url": info['link'],
|
||||
}
|
||||
],
|
||||
]
|
||||
|
||||
# try:
|
||||
await self.inline.form(
|
||||
text=txt,
|
||||
message=message,
|
||||
reply_markup=keyboard,
|
||||
force_me=True,
|
||||
)
|
||||
# except Exception as e:
|
||||
# txt += f"<b><a href='{link}'><emoji document_id=6334638004920911460>ℹ️</emoji> Полная информация о телефоне</a></b>"
|
||||
# return await utils.answer(message, txt)
|
||||
|
||||
@@ -1,150 +1,150 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: PriceFreedom
|
||||
# Description: Автоматизированная работа с @rabstvo_game_bot
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/pricefreedom.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import hikkatl
|
||||
|
||||
import re
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class PriceFreedom(loader.Module):
|
||||
"""Автоматизированная работа с @rabstvo_game_bot"""
|
||||
|
||||
strings = {
|
||||
"name": "PriceFreedom",
|
||||
|
||||
"checking_profile": "<b><emoji document_id=5424885441100782420>👀</emoji> Смотрю профиль...</b>",
|
||||
"searching_us": "<b><emoji document_id=5424885441100782420>👀</emoji> Поиск пользователя...</b>",
|
||||
|
||||
"no_usid": "<emoji document_id=5019523782004441717>🚫</emoji> <b>Нужно <code>{}{} [айди]</code></b>",
|
||||
|
||||
"promo_on": "<b><emoji document_id=5852779353330421386>🎁</emoji> Авто-промо включен!</b>\n\n<i>Что бы получать промокоды вы должны быть подписаним <a href='{}'>здесь</a>.</i>",
|
||||
"promo_off": "<b><emoji document_id=5854929766146118183>🚫</emoji> Авто-промо выключен!</b>",
|
||||
}
|
||||
|
||||
promo_channel = "https://t.me/+1eLPUMl51a5mOWQy"
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
# while True:
|
||||
# try:
|
||||
# async with self._client.conversation("@rabstvo_game_bot") as conv:
|
||||
# msg = await conv.send_message("/start 44088")
|
||||
# r = await conv.get_response()
|
||||
# await msg.delete()
|
||||
# await r.delete()
|
||||
# break
|
||||
# except hikkatl.errors.common.AlreadyInConversationError:
|
||||
# await asyncio.sleep(5.67)
|
||||
# except Exception:
|
||||
# break
|
||||
|
||||
async def _active_promo(self, prom):
|
||||
while True:
|
||||
try:
|
||||
async with self._client.conversation("@rabstvo_game_bot") as conv:
|
||||
msg = await conv.send_message(f"/start {prom}")
|
||||
r = await conv.get_response()
|
||||
await r.delete()
|
||||
r = await conv.get_response()
|
||||
await r.delete()
|
||||
await msg.delete()
|
||||
break
|
||||
except hikkatl.errors.common.AlreadyInConversationError:
|
||||
await asyncio.sleep(5.67)
|
||||
|
||||
async def _spfus_s(self, query):
|
||||
while True:
|
||||
try:
|
||||
async with self._client.conversation("@rabstvo_game_bot") as conv:
|
||||
msg = await conv.send_message(f"/start {query}")
|
||||
r = await conv.get_response()
|
||||
await r.delete()
|
||||
await msg.delete()
|
||||
o = await conv.get_response()
|
||||
await o.delete()
|
||||
if not "Зарабатывает:" in r.text:
|
||||
return f"🚫 <b>Пользователь не найден!</b>"
|
||||
return f"<b>👾 Информация о игроке\n\n{r.text}</b>\n\n<b><a href='https://t.me/rabstvo_game_bot?start={query}'>🔗 Ссылка</a></b>"
|
||||
except hikkatl.errors.common.AlreadyInConversationError:
|
||||
await asyncio.sleep(5.67)
|
||||
|
||||
async def _getprofme(self):
|
||||
while True:
|
||||
try:
|
||||
async with self._client.conversation("@rabstvo_game_bot") as conv:
|
||||
msg = await conv.send_message("🫅 Профиль")
|
||||
r = await conv.get_response()
|
||||
await msg.delete()
|
||||
await r.delete()
|
||||
|
||||
pattern = r'#(\w+).*?Баланс:'
|
||||
result = re.search(pattern, r.text, re.DOTALL)
|
||||
my_id = result.group(1)
|
||||
|
||||
return f"<b>📁 Ваши данные\n\n{r.text}\n\n<a href='https://t.me/rabstvo_game_bot?start={my_id}'>🔗 Ссылка</a></b>"
|
||||
except hikkatl.errors.common.AlreadyInConversationError:
|
||||
await asyncio.sleep(5.67)
|
||||
|
||||
@loader.command()
|
||||
async def pfpromo(self, message):
|
||||
"""Включить/выключить автоматически активирование промокода"""
|
||||
|
||||
if self.db.get(self.name, "promo_s", False):
|
||||
self.db.set(self.name, "promo_s", False)
|
||||
return await utils.answer(message, self.strings["promo_off"])
|
||||
|
||||
self.db.set(self.name, "promo_s", True)
|
||||
|
||||
await utils.answer(message, self.strings["promo_on"].format(self.promo_channel))
|
||||
|
||||
@loader.command()
|
||||
async def spfus(self, message):
|
||||
"""Посмотреть профиль пользователя"""
|
||||
|
||||
query = utils.get_args_raw(message)
|
||||
|
||||
if not query:
|
||||
return await utils.answer(message, self.strings['no_usid'].format(self.get_prefix(), 'spfus'))
|
||||
|
||||
await utils.answer(message, self.strings["searching_us"])
|
||||
|
||||
await utils.answer(message, await self._spfus_s(query))
|
||||
|
||||
@loader.command()
|
||||
async def spfme(self, message):
|
||||
"""Посмотреть свой профиль"""
|
||||
|
||||
await utils.answer(message, self.strings["checking_profile"])
|
||||
|
||||
await utils.answer(message, await self._getprofme())
|
||||
|
||||
async def watcher(self, event):
|
||||
chat = utils.get_chat_id(event)
|
||||
|
||||
if chat != 1726199153:
|
||||
return
|
||||
|
||||
if all(keyword in event.raw_text for keyword in ["ПРОМОКОД", "Активируй"]):
|
||||
if self.db.get(self.name, "promo_s", False):
|
||||
await self._active_promo(event.reply_markup.rows[0].buttons[0].url.split("?start=")[1])
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: PriceFreedom
|
||||
# Description: Автоматизированная работа с @rabstvo_game_bot
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/pricefreedom.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import hikkatl
|
||||
|
||||
import re
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class PriceFreedom(loader.Module):
|
||||
"""Автоматизированная работа с @rabstvo_game_bot"""
|
||||
|
||||
strings = {
|
||||
"name": "PriceFreedom",
|
||||
|
||||
"checking_profile": "<b><emoji document_id=5424885441100782420>👀</emoji> Смотрю профиль...</b>",
|
||||
"searching_us": "<b><emoji document_id=5424885441100782420>👀</emoji> Поиск пользователя...</b>",
|
||||
|
||||
"no_usid": "<emoji document_id=5019523782004441717>🚫</emoji> <b>Нужно <code>{}{} [айди]</code></b>",
|
||||
|
||||
"promo_on": "<b><emoji document_id=5852779353330421386>🎁</emoji> Авто-промо включен!</b>\n\n<i>Что бы получать промокоды вы должны быть подписаним <a href='{}'>здесь</a>.</i>",
|
||||
"promo_off": "<b><emoji document_id=5854929766146118183>🚫</emoji> Авто-промо выключен!</b>",
|
||||
}
|
||||
|
||||
promo_channel = "https://t.me/+1eLPUMl51a5mOWQy"
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
# while True:
|
||||
# try:
|
||||
# async with self._client.conversation("@rabstvo_game_bot") as conv:
|
||||
# msg = await conv.send_message("/start 44088")
|
||||
# r = await conv.get_response()
|
||||
# await msg.delete()
|
||||
# await r.delete()
|
||||
# break
|
||||
# except hikkatl.errors.common.AlreadyInConversationError:
|
||||
# await asyncio.sleep(5.67)
|
||||
# except Exception:
|
||||
# break
|
||||
|
||||
async def _active_promo(self, prom):
|
||||
while True:
|
||||
try:
|
||||
async with self._client.conversation("@rabstvo_game_bot") as conv:
|
||||
msg = await conv.send_message(f"/start {prom}")
|
||||
r = await conv.get_response()
|
||||
await r.delete()
|
||||
r = await conv.get_response()
|
||||
await r.delete()
|
||||
await msg.delete()
|
||||
break
|
||||
except hikkatl.errors.common.AlreadyInConversationError:
|
||||
await asyncio.sleep(5.67)
|
||||
|
||||
async def _spfus_s(self, query):
|
||||
while True:
|
||||
try:
|
||||
async with self._client.conversation("@rabstvo_game_bot") as conv:
|
||||
msg = await conv.send_message(f"/start {query}")
|
||||
r = await conv.get_response()
|
||||
await r.delete()
|
||||
await msg.delete()
|
||||
o = await conv.get_response()
|
||||
await o.delete()
|
||||
if not "Зарабатывает:" in r.text:
|
||||
return f"🚫 <b>Пользователь не найден!</b>"
|
||||
return f"<b>👾 Информация о игроке\n\n{r.text}</b>\n\n<b><a href='https://t.me/rabstvo_game_bot?start={query}'>🔗 Ссылка</a></b>"
|
||||
except hikkatl.errors.common.AlreadyInConversationError:
|
||||
await asyncio.sleep(5.67)
|
||||
|
||||
async def _getprofme(self):
|
||||
while True:
|
||||
try:
|
||||
async with self._client.conversation("@rabstvo_game_bot") as conv:
|
||||
msg = await conv.send_message("🫅 Профиль")
|
||||
r = await conv.get_response()
|
||||
await msg.delete()
|
||||
await r.delete()
|
||||
|
||||
pattern = r'#(\w+).*?Баланс:'
|
||||
result = re.search(pattern, r.text, re.DOTALL)
|
||||
my_id = result.group(1)
|
||||
|
||||
return f"<b>📁 Ваши данные\n\n{r.text}\n\n<a href='https://t.me/rabstvo_game_bot?start={my_id}'>🔗 Ссылка</a></b>"
|
||||
except hikkatl.errors.common.AlreadyInConversationError:
|
||||
await asyncio.sleep(5.67)
|
||||
|
||||
@loader.command()
|
||||
async def pfpromo(self, message):
|
||||
"""Включить/выключить автоматически активирование промокода"""
|
||||
|
||||
if self.db.get(self.name, "promo_s", False):
|
||||
self.db.set(self.name, "promo_s", False)
|
||||
return await utils.answer(message, self.strings["promo_off"])
|
||||
|
||||
self.db.set(self.name, "promo_s", True)
|
||||
|
||||
await utils.answer(message, self.strings["promo_on"].format(self.promo_channel))
|
||||
|
||||
@loader.command()
|
||||
async def spfus(self, message):
|
||||
"""Посмотреть профиль пользователя"""
|
||||
|
||||
query = utils.get_args_raw(message)
|
||||
|
||||
if not query:
|
||||
return await utils.answer(message, self.strings['no_usid'].format(self.get_prefix(), 'spfus'))
|
||||
|
||||
await utils.answer(message, self.strings["searching_us"])
|
||||
|
||||
await utils.answer(message, await self._spfus_s(query))
|
||||
|
||||
@loader.command()
|
||||
async def spfme(self, message):
|
||||
"""Посмотреть свой профиль"""
|
||||
|
||||
await utils.answer(message, self.strings["checking_profile"])
|
||||
|
||||
await utils.answer(message, await self._getprofme())
|
||||
|
||||
async def watcher(self, event):
|
||||
chat = utils.get_chat_id(event)
|
||||
|
||||
if chat != 1726199153:
|
||||
return
|
||||
|
||||
if all(keyword in event.raw_text for keyword in ["ПРОМОКОД", "Активируй"]):
|
||||
if self.db.get(self.name, "promo_s", False):
|
||||
await self._active_promo(event.reply_markup.rows[0].buttons[0].url.split("?start=")[1])
|
||||
|
||||
@@ -1,109 +1,109 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: RemoveBG
|
||||
# Description: Убрать фон из изображения
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/removebg.png?raw=true
|
||||
# requires: aiohttp
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import os
|
||||
import asyncio
|
||||
import tempfile
|
||||
import logging
|
||||
import aiohttp
|
||||
|
||||
from aiohttp import FormData
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class RemoveBG(loader.Module):
|
||||
"""Убрать фон из изображения"""
|
||||
|
||||
strings = {
|
||||
"name": "RemoveBG",
|
||||
|
||||
"must_be_forced": "<emoji document_id=5854929766146118183>❌</emoji> <b>Фото не должно быть сжатым!</b>",
|
||||
"no_photo": "<emoji document_id=5854929766146118183>❌</emoji> <b>Нужно ответить на фото!</b>",
|
||||
"no_token": "<emoji document_id=5854929766146118183>❌</emoji> <b>Нету токена! Поставь его в <code>{}cfg RemoveBG</code></b>",
|
||||
"invalid_token": "<b>😕 Неверный токен</b>",
|
||||
"only_photo": "<b>😕 Удалять фон можно только с фото (.png, .jpg, .jpeg)</b>",
|
||||
|
||||
"removing_bg": "<emoji document_id=5326015457155620929>🔄</emoji> <b>Удаление фона...</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"api_token",
|
||||
None,
|
||||
lambda: "Токен для работы с API. Взять можно на сайте https://www.remove.bg/dashboard#api-key",
|
||||
validator=loader.validators.Hidden(loader.validators.String()),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def removebg(self, message):
|
||||
"""Убрать фон из изображения"""
|
||||
|
||||
reply = await message.get_reply_message()
|
||||
if not reply:
|
||||
return await utils.answer(message, self.strings("no_photo"))
|
||||
|
||||
try:
|
||||
if not any(ext in reply.file.name for ext in [".png", ".jpg", ".jpeg"]):
|
||||
return await utils.answer(message, self.strings['only_photo'])
|
||||
except TypeError:
|
||||
return await utils.answer(message, self.strings['must_be_forced'])
|
||||
|
||||
if not self.config["api_token"]:
|
||||
return await utils.answer(message, self.strings["no_token"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['removing_bg'])
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
try:
|
||||
file_path = os.path.join(temp_dir, reply.file.name)
|
||||
await reply.download_media(file_path)
|
||||
except TypeError:
|
||||
return await utils.answer(message, self.strings['must_be_forced'])
|
||||
|
||||
access_token = self.config["api_token"]
|
||||
async with aiohttp.ClientSession() as session:
|
||||
form_data = FormData()
|
||||
form_data.add_field('image_file', open(file_path, 'rb'))
|
||||
form_data.add_field('size', 'auto')
|
||||
|
||||
async with session.post(
|
||||
'https://api.remove.bg/v1.0/removebg',
|
||||
headers={'X-Api-Key': access_token},
|
||||
data=form_data
|
||||
) as res:
|
||||
try:
|
||||
response_json = await res.json()
|
||||
if 'errors' in response_json and response_json['errors'][0]['title'] == "API Key invalid":
|
||||
return await utils.answer(message, self.strings['invalid_token'])
|
||||
except Exception as e:
|
||||
print(f"Error processing response: {e}")
|
||||
|
||||
file_name = f"famods-no-bg-{os.path.splitext(reply.file.name)[0]}.png"
|
||||
with open(os.path.join(temp_dir, file_name), 'wb') as out:
|
||||
out.write(await res.read())
|
||||
|
||||
await message.client.send_file(message.chat_id, os.path.join(temp_dir, file_name), force_document=True)
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: RemoveBG
|
||||
# Description: Убрать фон из изображения
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/removebg.png?raw=true
|
||||
# requires: aiohttp
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import os
|
||||
import asyncio
|
||||
import tempfile
|
||||
import logging
|
||||
import aiohttp
|
||||
|
||||
from aiohttp import FormData
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class RemoveBG(loader.Module):
|
||||
"""Убрать фон из изображения"""
|
||||
|
||||
strings = {
|
||||
"name": "RemoveBG",
|
||||
|
||||
"must_be_forced": "<emoji document_id=5854929766146118183>❌</emoji> <b>Фото не должно быть сжатым!</b>",
|
||||
"no_photo": "<emoji document_id=5854929766146118183>❌</emoji> <b>Нужно ответить на фото!</b>",
|
||||
"no_token": "<emoji document_id=5854929766146118183>❌</emoji> <b>Нету токена! Поставь его в <code>{}cfg RemoveBG</code></b>",
|
||||
"invalid_token": "<b>😕 Неверный токен</b>",
|
||||
"only_photo": "<b>😕 Удалять фон можно только с фото (.png, .jpg, .jpeg)</b>",
|
||||
|
||||
"removing_bg": "<emoji document_id=5326015457155620929>🔄</emoji> <b>Удаление фона...</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"api_token",
|
||||
None,
|
||||
lambda: "Токен для работы с API. Взять можно на сайте https://www.remove.bg/dashboard#api-key",
|
||||
validator=loader.validators.Hidden(loader.validators.String()),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def removebg(self, message):
|
||||
"""Убрать фон из изображения"""
|
||||
|
||||
reply = await message.get_reply_message()
|
||||
if not reply:
|
||||
return await utils.answer(message, self.strings("no_photo"))
|
||||
|
||||
try:
|
||||
if not any(ext in reply.file.name for ext in [".png", ".jpg", ".jpeg"]):
|
||||
return await utils.answer(message, self.strings['only_photo'])
|
||||
except TypeError:
|
||||
return await utils.answer(message, self.strings['must_be_forced'])
|
||||
|
||||
if not self.config["api_token"]:
|
||||
return await utils.answer(message, self.strings["no_token"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings['removing_bg'])
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
try:
|
||||
file_path = os.path.join(temp_dir, reply.file.name)
|
||||
await reply.download_media(file_path)
|
||||
except TypeError:
|
||||
return await utils.answer(message, self.strings['must_be_forced'])
|
||||
|
||||
access_token = self.config["api_token"]
|
||||
async with aiohttp.ClientSession() as session:
|
||||
form_data = FormData()
|
||||
form_data.add_field('image_file', open(file_path, 'rb'))
|
||||
form_data.add_field('size', 'auto')
|
||||
|
||||
async with session.post(
|
||||
'https://api.remove.bg/v1.0/removebg',
|
||||
headers={'X-Api-Key': access_token},
|
||||
data=form_data
|
||||
) as res:
|
||||
try:
|
||||
response_json = await res.json()
|
||||
if 'errors' in response_json and response_json['errors'][0]['title'] == "API Key invalid":
|
||||
return await utils.answer(message, self.strings['invalid_token'])
|
||||
except Exception as e:
|
||||
print(f"Error processing response: {e}")
|
||||
|
||||
file_name = f"famods-no-bg-{os.path.splitext(reply.file.name)[0]}.png"
|
||||
with open(os.path.join(temp_dir, file_name), 'wb') as out:
|
||||
out.write(await res.read())
|
||||
|
||||
await message.client.send_file(message.chat_id, os.path.join(temp_dir, file_name), force_document=True)
|
||||
await message.delete()
|
||||
@@ -1,75 +1,75 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Stats
|
||||
# Description: Показывает статистику твоего аккаунта
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/stats.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import asyncio
|
||||
from datetime import datetime
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Stats(loader.Module):
|
||||
"""Показывает статистику твоего аккаунта"""
|
||||
|
||||
strings = {
|
||||
"name": "Stats",
|
||||
|
||||
"loading_stats": "<b><emoji document_id=5326015457155620929>🔄</emoji> Загрузка статистики...</b>",
|
||||
}
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def stats(self, message):
|
||||
"""Получить статистику"""
|
||||
|
||||
await utils.answer(message, self.strings['loading_stats'])
|
||||
u_chat = 0
|
||||
b_chat = 0
|
||||
c_chat = 0
|
||||
ch_chat = 0
|
||||
all_chats = 0
|
||||
|
||||
async for dialog in self._client.iter_dialogs():
|
||||
all_chats += 1
|
||||
if dialog.is_user:
|
||||
if dialog.entity.bot:
|
||||
b_chat += 1
|
||||
elif not dialog.entity.bot:
|
||||
u_chat += 1
|
||||
elif dialog.is_group:
|
||||
c_chat += 1
|
||||
elif dialog.is_channel:
|
||||
if dialog.entity.megagroup or dialog.entity.gigagroup:
|
||||
if dialog.entity.megagroup:
|
||||
c_chat += 1
|
||||
elif dialog.entity.gigagroup:
|
||||
c_chat += 1
|
||||
elif not dialog.entity.megagroup and not dialog.entity.gigagroup:
|
||||
ch_chat += 1
|
||||
await utils.answer(message,
|
||||
f"""<b><emoji document_id=5431577498364158238>📊</emoji> Твоя статистика
|
||||
|
||||
<emoji document_id=5884510167986343350>💬</emoji> Всего чатов: <code>{all_chats}</code>
|
||||
|
||||
<emoji document_id=5258011929993026890>👤</emoji> <code>{u_chat}</code> личных чатов
|
||||
<emoji document_id=5258513401784573443>👥</emoji> <code>{c_chat}</code> групп
|
||||
<emoji document_id=5852471614628696454>📢</emoji> <code>{ch_chat}</code> каналов
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Stats
|
||||
# Description: Показывает статистику твоего аккаунта
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/stats.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import asyncio
|
||||
from datetime import datetime
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Stats(loader.Module):
|
||||
"""Показывает статистику твоего аккаунта"""
|
||||
|
||||
strings = {
|
||||
"name": "Stats",
|
||||
|
||||
"loading_stats": "<b><emoji document_id=5326015457155620929>🔄</emoji> Загрузка статистики...</b>",
|
||||
}
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def stats(self, message):
|
||||
"""Получить статистику"""
|
||||
|
||||
await utils.answer(message, self.strings['loading_stats'])
|
||||
u_chat = 0
|
||||
b_chat = 0
|
||||
c_chat = 0
|
||||
ch_chat = 0
|
||||
all_chats = 0
|
||||
|
||||
async for dialog in self._client.iter_dialogs():
|
||||
all_chats += 1
|
||||
if dialog.is_user:
|
||||
if dialog.entity.bot:
|
||||
b_chat += 1
|
||||
elif not dialog.entity.bot:
|
||||
u_chat += 1
|
||||
elif dialog.is_group:
|
||||
c_chat += 1
|
||||
elif dialog.is_channel:
|
||||
if dialog.entity.megagroup or dialog.entity.gigagroup:
|
||||
if dialog.entity.megagroup:
|
||||
c_chat += 1
|
||||
elif dialog.entity.gigagroup:
|
||||
c_chat += 1
|
||||
elif not dialog.entity.megagroup and not dialog.entity.gigagroup:
|
||||
ch_chat += 1
|
||||
await utils.answer(message,
|
||||
f"""<b><emoji document_id=5431577498364158238>📊</emoji> Твоя статистика
|
||||
|
||||
<emoji document_id=5884510167986343350>💬</emoji> Всего чатов: <code>{all_chats}</code>
|
||||
|
||||
<emoji document_id=5258011929993026890>👤</emoji> <code>{u_chat}</code> личных чатов
|
||||
<emoji document_id=5258513401784573443>👥</emoji> <code>{c_chat}</code> групп
|
||||
<emoji document_id=5852471614628696454>📢</emoji> <code>{ch_chat}</code> каналов
|
||||
<emoji document_id=5258093637450866522>🤖</emoji> <code>{b_chat}</code> ботов</b>""")
|
||||
@@ -1,155 +1,155 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Telegrapher
|
||||
# Description: Создание статей и другое связанное с telegra.ph
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/telegrapher.png?raw=true
|
||||
# requires: aiohttp telegraph
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import logging
|
||||
import aiohttp
|
||||
import asyncio
|
||||
from telegraph import Telegraph
|
||||
|
||||
from telethon import types
|
||||
from telethon.tl.types import DocumentAttributeFilename
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Telegrapher(loader.Module):
|
||||
"""Создание статей и другое связанное с telegra.ph"""
|
||||
|
||||
strings = {
|
||||
"name": "Telegrapher",
|
||||
|
||||
"waiting": "<b><emoji document_id=6334391057186293707>🕑</emoji> Создаю страницу на telegra.ph...</b>",
|
||||
"waiting_up": "<b><emoji document_id=6334391057186293707>🕑</emoji> Загружаю файл на telegra.ph...</b>",
|
||||
|
||||
"article_ready": """<b>
|
||||
<emoji document_id=6334758581832779720>✅</emoji> Твоя статья в Telegra.ph создана!
|
||||
|
||||
<emoji document_id=5271604874419647061>🔗</emoji> Ссылка: {}
|
||||
|
||||
<emoji document_id=6334638004920911460>ℹ️</emoji> </b><i>Редактировать заголовок/контент/автора на странице можно в <code>{}cfg telegrapher</code></i>
|
||||
""",
|
||||
"upload_ready": """<b>
|
||||
<emoji document_id=6334353510582191829>⬇️</emoji> Файл загружен!
|
||||
|
||||
<emoji document_id=5271604874419647061>🔗</emoji> Ссылка: {}
|
||||
</b>""",
|
||||
"upload_error": "<emoji document_id=5019523782004441717>❌</emoji> <b>Ошибка при выгрузке файла на telegra.ph!</b>",
|
||||
|
||||
"media_type_invalid": "<emoji document_id=5019523782004441717>❌</emoji> <b>Ответь на фото или видео/гиф</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"TITLE",
|
||||
"FAmods telegrapher",
|
||||
lambda: "Заголовок статьи",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"CONTENT",
|
||||
"Редактировать заголовок/контент/автора на странице можно в .cfg telegrapher",
|
||||
lambda: "Контент статьи (можно использовать html-разметку)",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"author_name",
|
||||
"famods",
|
||||
lambda: "Автор статьи",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"author_short_name",
|
||||
"famods",
|
||||
lambda: "Короткое имя автора статьи (нужно для авторизации в telegraph api)",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def tghpost(self, message):
|
||||
"""Выложить статью в telegra.ph"""
|
||||
|
||||
await utils.answer(message, self.strings['waiting'])
|
||||
|
||||
telegraph_api = Telegraph()
|
||||
telegraph_api.create_account(short_name=self.config["author_short_name"], author_name=self.config["author_name"])
|
||||
response = telegraph_api.create_page(
|
||||
title=self.config["TITLE"],
|
||||
html_content=self.config["CONTENT"],
|
||||
author_name=self.config["author_name"],
|
||||
)
|
||||
|
||||
return await utils.answer(message, self.strings['article_ready'].format(f"https://telegra.ph/{response['path']}", self.get_prefix()))
|
||||
|
||||
@loader.command()
|
||||
async def tghup(self, message):
|
||||
"""Выложить медиа в telegra.ph"""
|
||||
reply_message = await message.get_reply_message()
|
||||
|
||||
if not reply_message or not reply_message.media:
|
||||
await utils.answer(message, self.strings['media_type_invalid'])
|
||||
return
|
||||
|
||||
await utils.answer(message, self.strings['waiting_up'])
|
||||
|
||||
media_data = await self.check_media_type(reply_message.media)
|
||||
|
||||
if not media_data:
|
||||
await utils.answer(message, self.strings['media_type_invalid'])
|
||||
return
|
||||
|
||||
file_content = await message.client.download_media(media_data, bytes)
|
||||
telegraph_upload_url = "https://telegra.ph/upload"
|
||||
form = aiohttp.FormData()
|
||||
form.add_field('file', file_content, filename='file')
|
||||
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(telegraph_upload_url, data=form) as response:
|
||||
uploaded_data = await response.json()
|
||||
telegraph_link = "https://telegra.ph" + uploaded_data[0]["src"]
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
return await utils.answer(message, self.strings['upload_error'])
|
||||
|
||||
await utils.answer(message, self.strings['upload_ready'].format(telegraph_link))
|
||||
|
||||
async def check_media_type(self, media):
|
||||
if not media:
|
||||
return False
|
||||
|
||||
if isinstance(media, types.MessageMediaPhoto):
|
||||
media_data = media.photo
|
||||
elif isinstance(media, types.MessageMediaDocument):
|
||||
document = media.document
|
||||
|
||||
if any(
|
||||
isinstance(attribute, types.DocumentAttributeAudio)
|
||||
for attribute in document.attributes
|
||||
):
|
||||
return False
|
||||
|
||||
if DocumentAttributeFilename(file_name="AnimatedSticker.tgs") in document.attributes:
|
||||
return False
|
||||
|
||||
media_data = document
|
||||
else:
|
||||
return False
|
||||
|
||||
return media_data
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Telegrapher
|
||||
# Description: Создание статей и другое связанное с telegra.ph
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/telegrapher.png?raw=true
|
||||
# requires: aiohttp telegraph
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import logging
|
||||
import aiohttp
|
||||
import asyncio
|
||||
from telegraph import Telegraph
|
||||
|
||||
from telethon import types
|
||||
from telethon.tl.types import DocumentAttributeFilename
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Telegrapher(loader.Module):
|
||||
"""Создание статей и другое связанное с telegra.ph"""
|
||||
|
||||
strings = {
|
||||
"name": "Telegrapher",
|
||||
|
||||
"waiting": "<b><emoji document_id=6334391057186293707>🕑</emoji> Создаю страницу на telegra.ph...</b>",
|
||||
"waiting_up": "<b><emoji document_id=6334391057186293707>🕑</emoji> Загружаю файл на telegra.ph...</b>",
|
||||
|
||||
"article_ready": """<b>
|
||||
<emoji document_id=6334758581832779720>✅</emoji> Твоя статья в Telegra.ph создана!
|
||||
|
||||
<emoji document_id=5271604874419647061>🔗</emoji> Ссылка: {}
|
||||
|
||||
<emoji document_id=6334638004920911460>ℹ️</emoji> </b><i>Редактировать заголовок/контент/автора на странице можно в <code>{}cfg telegrapher</code></i>
|
||||
""",
|
||||
"upload_ready": """<b>
|
||||
<emoji document_id=6334353510582191829>⬇️</emoji> Файл загружен!
|
||||
|
||||
<emoji document_id=5271604874419647061>🔗</emoji> Ссылка: {}
|
||||
</b>""",
|
||||
"upload_error": "<emoji document_id=5019523782004441717>❌</emoji> <b>Ошибка при выгрузке файла на telegra.ph!</b>",
|
||||
|
||||
"media_type_invalid": "<emoji document_id=5019523782004441717>❌</emoji> <b>Ответь на фото или видео/гиф</b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"TITLE",
|
||||
"FAmods telegrapher",
|
||||
lambda: "Заголовок статьи",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"CONTENT",
|
||||
"Редактировать заголовок/контент/автора на странице можно в .cfg telegrapher",
|
||||
lambda: "Контент статьи (можно использовать html-разметку)",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"author_name",
|
||||
"famods",
|
||||
lambda: "Автор статьи",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"author_short_name",
|
||||
"famods",
|
||||
lambda: "Короткое имя автора статьи (нужно для авторизации в telegraph api)",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def tghpost(self, message):
|
||||
"""Выложить статью в telegra.ph"""
|
||||
|
||||
await utils.answer(message, self.strings['waiting'])
|
||||
|
||||
telegraph_api = Telegraph()
|
||||
telegraph_api.create_account(short_name=self.config["author_short_name"], author_name=self.config["author_name"])
|
||||
response = telegraph_api.create_page(
|
||||
title=self.config["TITLE"],
|
||||
html_content=self.config["CONTENT"],
|
||||
author_name=self.config["author_name"],
|
||||
)
|
||||
|
||||
return await utils.answer(message, self.strings['article_ready'].format(f"https://telegra.ph/{response['path']}", self.get_prefix()))
|
||||
|
||||
@loader.command()
|
||||
async def tghup(self, message):
|
||||
"""Выложить медиа в telegra.ph"""
|
||||
reply_message = await message.get_reply_message()
|
||||
|
||||
if not reply_message or not reply_message.media:
|
||||
await utils.answer(message, self.strings['media_type_invalid'])
|
||||
return
|
||||
|
||||
await utils.answer(message, self.strings['waiting_up'])
|
||||
|
||||
media_data = await self.check_media_type(reply_message.media)
|
||||
|
||||
if not media_data:
|
||||
await utils.answer(message, self.strings['media_type_invalid'])
|
||||
return
|
||||
|
||||
file_content = await message.client.download_media(media_data, bytes)
|
||||
telegraph_upload_url = "https://telegra.ph/upload"
|
||||
form = aiohttp.FormData()
|
||||
form.add_field('file', file_content, filename='file')
|
||||
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(telegraph_upload_url, data=form) as response:
|
||||
uploaded_data = await response.json()
|
||||
telegraph_link = "https://telegra.ph" + uploaded_data[0]["src"]
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
return await utils.answer(message, self.strings['upload_error'])
|
||||
|
||||
await utils.answer(message, self.strings['upload_ready'].format(telegraph_link))
|
||||
|
||||
async def check_media_type(self, media):
|
||||
if not media:
|
||||
return False
|
||||
|
||||
if isinstance(media, types.MessageMediaPhoto):
|
||||
media_data = media.photo
|
||||
elif isinstance(media, types.MessageMediaDocument):
|
||||
document = media.document
|
||||
|
||||
if any(
|
||||
isinstance(attribute, types.DocumentAttributeAudio)
|
||||
for attribute in document.attributes
|
||||
):
|
||||
return False
|
||||
|
||||
if DocumentAttributeFilename(file_name="AnimatedSticker.tgs") in document.attributes:
|
||||
return False
|
||||
|
||||
media_data = document
|
||||
else:
|
||||
return False
|
||||
|
||||
return media_data
|
||||
|
||||
@@ -1,136 +1,136 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Timer
|
||||
# Description: Показывает сколько времени осталось
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/timer.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import pytz
|
||||
import asyncio
|
||||
import logging
|
||||
from datetime import datetime
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Timer(loader.Module):
|
||||
"""Показывает сколько времени осталось"""
|
||||
|
||||
strings = {
|
||||
"name": "Timer",
|
||||
|
||||
"no_date": "<b><emoji document_id=5019523782004441717>❌</emoji> Добавь сначала дату в <code>{}cfg timer</code></b>",
|
||||
|
||||
"invalid_date": "<b><emoji document_id=5019523782004441717>❌</emoji> Неверный формат даты и времени в конфиге.</b>",
|
||||
"invalid_timezone": "<b><emoji document_id=5019523782004441717>❌</emoji> Неверный часовой пояс.</b>"
|
||||
}
|
||||
|
||||
time_units = [
|
||||
('год', 'года', 'лет'),
|
||||
('день', 'дня', 'дней'),
|
||||
('час', 'часа', 'часов'),
|
||||
('минута', 'минуты', 'минут'),
|
||||
('секунда', 'секунды', 'секунд')
|
||||
]
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"text",
|
||||
"<b>🕑 Осталось до этого ещё {time}</b>",
|
||||
lambda: "Текст который будет отображаться с датой. (Можно использовать HTML-разметку) Пример: 🕑 Осталось до этого ещё {time}",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"text_already",
|
||||
"<b>✅ Это уже случилось {time} назад</b>",
|
||||
lambda: "Текст который будет если событие уже случилось. Пример: ✅ Это уже случилось {time} назад",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"date",
|
||||
None,
|
||||
lambda: "Дата до которой нужно считать. Пример: 25.04.2025 17:05",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"timezone",
|
||||
"auto",
|
||||
lambda: "Часовой пояс, по стандарту автоматически. Пример: Europe/Moscow",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def stime(self, message):
|
||||
"""Посмотреть сколько осталось времени"""
|
||||
|
||||
if not self.config["date"]:
|
||||
return await utils.answer(message, self.strings['no_date'].format(self.get_prefix()))
|
||||
|
||||
date_time_str = self.config['date']
|
||||
timezone = self.config.get('timezone', 'auto')
|
||||
|
||||
try:
|
||||
date_str, time_str = date_time_str.split(' ')
|
||||
except ValueError:
|
||||
return await utils.answer(message, self.strings['invalid_date'])
|
||||
|
||||
day, month, year = map(int, date_str.split("."))
|
||||
hour, minute = map(int, time_str.split(":"))
|
||||
|
||||
now = datetime.now()
|
||||
|
||||
if timezone == 'auto':
|
||||
event_time = datetime(year, month, day, hour, minute)
|
||||
else:
|
||||
try:
|
||||
user_timezone = pytz.timezone(timezone)
|
||||
event_time = user_timezone.localize(datetime(year, month, day, hour, minute), is_dst=None)
|
||||
except pytz.UnknownTimeZoneError:
|
||||
return await utils.answer(message, self.strings['invalid_timezone'])
|
||||
|
||||
if timezone != 'auto':
|
||||
now = now.astimezone(user_timezone)
|
||||
|
||||
was_t = now > event_time if timezone == 'auto' else now > event_time.astimezone(user_timezone)
|
||||
|
||||
time_to_event = abs(now - event_time if timezone == 'auto' else now - event_time.astimezone(user_timezone))
|
||||
days = time_to_event.days
|
||||
|
||||
years = days // 365
|
||||
days %= 365
|
||||
|
||||
hours, remainder = divmod(time_to_event.seconds, 3600)
|
||||
minutes, seconds = divmod(remainder, 60)
|
||||
|
||||
time_values = [years, days, hours, minutes, seconds]
|
||||
time_to = ""
|
||||
|
||||
for value, (singular, genitive, plural) in zip(time_values, self.time_units):
|
||||
if value > 0:
|
||||
form = singular if value == 1 else genitive if 1 < value < 5 else plural
|
||||
time_to += f"{value} {form} "
|
||||
time_to = time_to.rstrip()
|
||||
|
||||
if time_to and not was_t:
|
||||
return await utils.answer(
|
||||
message,
|
||||
self.config["text"].format(time=time_to),
|
||||
)
|
||||
|
||||
return await utils.answer(
|
||||
message,
|
||||
self.config["text_already"].format(time=time_to),
|
||||
)
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Timer
|
||||
# Description: Показывает сколько времени осталось
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/timer.png?raw=true
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import pytz
|
||||
import asyncio
|
||||
import logging
|
||||
from datetime import datetime
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Timer(loader.Module):
|
||||
"""Показывает сколько времени осталось"""
|
||||
|
||||
strings = {
|
||||
"name": "Timer",
|
||||
|
||||
"no_date": "<b><emoji document_id=5019523782004441717>❌</emoji> Добавь сначала дату в <code>{}cfg timer</code></b>",
|
||||
|
||||
"invalid_date": "<b><emoji document_id=5019523782004441717>❌</emoji> Неверный формат даты и времени в конфиге.</b>",
|
||||
"invalid_timezone": "<b><emoji document_id=5019523782004441717>❌</emoji> Неверный часовой пояс.</b>"
|
||||
}
|
||||
|
||||
time_units = [
|
||||
('год', 'года', 'лет'),
|
||||
('день', 'дня', 'дней'),
|
||||
('час', 'часа', 'часов'),
|
||||
('минута', 'минуты', 'минут'),
|
||||
('секунда', 'секунды', 'секунд')
|
||||
]
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"text",
|
||||
"<b>🕑 Осталось до этого ещё {time}</b>",
|
||||
lambda: "Текст который будет отображаться с датой. (Можно использовать HTML-разметку) Пример: 🕑 Осталось до этого ещё {time}",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"text_already",
|
||||
"<b>✅ Это уже случилось {time} назад</b>",
|
||||
lambda: "Текст который будет если событие уже случилось. Пример: ✅ Это уже случилось {time} назад",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"date",
|
||||
None,
|
||||
lambda: "Дата до которой нужно считать. Пример: 25.04.2025 17:05",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"timezone",
|
||||
"auto",
|
||||
lambda: "Часовой пояс, по стандарту автоматически. Пример: Europe/Moscow",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def stime(self, message):
|
||||
"""Посмотреть сколько осталось времени"""
|
||||
|
||||
if not self.config["date"]:
|
||||
return await utils.answer(message, self.strings['no_date'].format(self.get_prefix()))
|
||||
|
||||
date_time_str = self.config['date']
|
||||
timezone = self.config.get('timezone', 'auto')
|
||||
|
||||
try:
|
||||
date_str, time_str = date_time_str.split(' ')
|
||||
except ValueError:
|
||||
return await utils.answer(message, self.strings['invalid_date'])
|
||||
|
||||
day, month, year = map(int, date_str.split("."))
|
||||
hour, minute = map(int, time_str.split(":"))
|
||||
|
||||
now = datetime.now()
|
||||
|
||||
if timezone == 'auto':
|
||||
event_time = datetime(year, month, day, hour, minute)
|
||||
else:
|
||||
try:
|
||||
user_timezone = pytz.timezone(timezone)
|
||||
event_time = user_timezone.localize(datetime(year, month, day, hour, minute), is_dst=None)
|
||||
except pytz.UnknownTimeZoneError:
|
||||
return await utils.answer(message, self.strings['invalid_timezone'])
|
||||
|
||||
if timezone != 'auto':
|
||||
now = now.astimezone(user_timezone)
|
||||
|
||||
was_t = now > event_time if timezone == 'auto' else now > event_time.astimezone(user_timezone)
|
||||
|
||||
time_to_event = abs(now - event_time if timezone == 'auto' else now - event_time.astimezone(user_timezone))
|
||||
days = time_to_event.days
|
||||
|
||||
years = days // 365
|
||||
days %= 365
|
||||
|
||||
hours, remainder = divmod(time_to_event.seconds, 3600)
|
||||
minutes, seconds = divmod(remainder, 60)
|
||||
|
||||
time_values = [years, days, hours, minutes, seconds]
|
||||
time_to = ""
|
||||
|
||||
for value, (singular, genitive, plural) in zip(time_values, self.time_units):
|
||||
if value > 0:
|
||||
form = singular if value == 1 else genitive if 1 < value < 5 else plural
|
||||
time_to += f"{value} {form} "
|
||||
time_to = time_to.rstrip()
|
||||
|
||||
if time_to and not was_t:
|
||||
return await utils.answer(
|
||||
message,
|
||||
self.config["text"].format(time=time_to),
|
||||
)
|
||||
|
||||
return await utils.answer(
|
||||
message,
|
||||
self.config["text_already"].format(time=time_to),
|
||||
)
|
||||
|
||||
@@ -1,110 +1,110 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: TonDNS
|
||||
# Description: Модуль для работы с TON DNS
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/tondns.png?raw=true
|
||||
# requires: aiohttp
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import logging
|
||||
import aiohttp
|
||||
import asyncio
|
||||
from datetime import datetime
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class TonDNS(loader.Module):
|
||||
"""Модуль для работы с Ton DNS"""
|
||||
|
||||
strings = {
|
||||
"name": "TonDNS",
|
||||
|
||||
"waiting": "<b><emoji document_id=6334391057186293707>🕑</emoji> Собираю информацию...</b>",
|
||||
"waiting_shot": "<b><emoji document_id=6334391057186293707>📸</emoji> Делаю скриншот TON DNS сайта...</b>",
|
||||
|
||||
"shot_ton_dns": "<b>💎 Скриншот TON DNS сайта <code>{}</code></b>",
|
||||
|
||||
"ton_shot_link": "https://mini.s-shot.ru/1920x1080/JPEG/1024/Z100/?{}",
|
||||
}
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def itondns(self, message):
|
||||
"""Информация о TON DNS"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>{self.get_prefix()}itondns тон_домен</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting"])
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://tonapi.io/v2/dns/{address}") as res:
|
||||
response = await res.json()
|
||||
|
||||
try:
|
||||
response['error']
|
||||
if "can't decode address" in response['error']:
|
||||
return await utils.answer(message, f"<b>❌ Это не адрес кошелька!</b>")
|
||||
|
||||
return await utils.answer(message, f"""<b>❌ Ошибка!\n\n
|
||||
<code>{response['error']}</code>
|
||||
</b>""")
|
||||
except:
|
||||
pass
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
<emoji document_id=5854713299794398583>💎</emoji> Ton DNS
|
||||
|
||||
Имя: <code>{response['name']}</code>
|
||||
Адрес: <code>{response['item']['address']}</code>
|
||||
|
||||
⌛️ Истекает: <i>{datetime.fromtimestamp(response['expiring_at'])}</i>
|
||||
|
||||
🧑💻 Владелец
|
||||
Адресс: <code>{response['item']['owner']['address']}</code>
|
||||
|
||||
🌐 DNS адрес: <code>{response['item']['dns']}</code>
|
||||
|
||||
<a href="https://tonscan.org/address/{address}">Tonscan</a> • <a href="{response['item']['previews'][2]['url']}">Image</a> • <a href="https://tonscan.org/address/{address}#source">Contract</a>
|
||||
</b>""")
|
||||
|
||||
@loader.command()
|
||||
async def tonshot(self, message):
|
||||
"""Скриншот TON DNS сайта"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>.tonshot тон_домен</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting_shot"])
|
||||
|
||||
address = address.replace("https://", "")
|
||||
address = address.replace("http://", "")
|
||||
|
||||
ton_dns = address
|
||||
|
||||
address += f"-s.cam"
|
||||
|
||||
try:
|
||||
await message.client.send_file(message.chat_id, self.strings['ton_shot_link'].format(address), caption=self.strings['shot_ton_dns'].format(ton_dns))
|
||||
await message.delete()
|
||||
except:
|
||||
address = address.replace("-s.cam", ".run")
|
||||
await message.client.send_file(message.chat_id, self.strings['ton_shot_link'].format(address), caption=self.strings['shot_ton_dns'].format(ton_dns))
|
||||
await message.delete()
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: TonDNS
|
||||
# Description: Модуль для работы с TON DNS
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/tondns.png?raw=true
|
||||
# requires: aiohttp
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import logging
|
||||
import aiohttp
|
||||
import asyncio
|
||||
from datetime import datetime
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class TonDNS(loader.Module):
|
||||
"""Модуль для работы с Ton DNS"""
|
||||
|
||||
strings = {
|
||||
"name": "TonDNS",
|
||||
|
||||
"waiting": "<b><emoji document_id=6334391057186293707>🕑</emoji> Собираю информацию...</b>",
|
||||
"waiting_shot": "<b><emoji document_id=6334391057186293707>📸</emoji> Делаю скриншот TON DNS сайта...</b>",
|
||||
|
||||
"shot_ton_dns": "<b>💎 Скриншот TON DNS сайта <code>{}</code></b>",
|
||||
|
||||
"ton_shot_link": "https://mini.s-shot.ru/1920x1080/JPEG/1024/Z100/?{}",
|
||||
}
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def itondns(self, message):
|
||||
"""Информация о TON DNS"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>{self.get_prefix()}itondns тон_домен</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting"])
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://tonapi.io/v2/dns/{address}") as res:
|
||||
response = await res.json()
|
||||
|
||||
try:
|
||||
response['error']
|
||||
if "can't decode address" in response['error']:
|
||||
return await utils.answer(message, f"<b>❌ Это не адрес кошелька!</b>")
|
||||
|
||||
return await utils.answer(message, f"""<b>❌ Ошибка!\n\n
|
||||
<code>{response['error']}</code>
|
||||
</b>""")
|
||||
except:
|
||||
pass
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
<emoji document_id=5854713299794398583>💎</emoji> Ton DNS
|
||||
|
||||
Имя: <code>{response['name']}</code>
|
||||
Адрес: <code>{response['item']['address']}</code>
|
||||
|
||||
⌛️ Истекает: <i>{datetime.fromtimestamp(response['expiring_at'])}</i>
|
||||
|
||||
🧑💻 Владелец
|
||||
Адресс: <code>{response['item']['owner']['address']}</code>
|
||||
|
||||
🌐 DNS адрес: <code>{response['item']['dns']}</code>
|
||||
|
||||
<a href="https://tonscan.org/address/{address}">Tonscan</a> • <a href="{response['item']['previews'][2]['url']}">Image</a> • <a href="https://tonscan.org/address/{address}#source">Contract</a>
|
||||
</b>""")
|
||||
|
||||
@loader.command()
|
||||
async def tonshot(self, message):
|
||||
"""Скриншот TON DNS сайта"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>.tonshot тон_домен</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting_shot"])
|
||||
|
||||
address = address.replace("https://", "")
|
||||
address = address.replace("http://", "")
|
||||
|
||||
ton_dns = address
|
||||
|
||||
address += f"-s.cam"
|
||||
|
||||
try:
|
||||
await message.client.send_file(message.chat_id, self.strings['ton_shot_link'].format(address), caption=self.strings['shot_ton_dns'].format(ton_dns))
|
||||
await message.delete()
|
||||
except:
|
||||
address = address.replace("-s.cam", ".run")
|
||||
await message.client.send_file(message.chat_id, self.strings['ton_shot_link'].format(address), caption=self.strings['shot_ton_dns'].format(ton_dns))
|
||||
await message.delete()
|
||||
|
||||
@@ -1,301 +1,301 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Tonscan
|
||||
# Description: Информация о TON адресе
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/tonscan.png?raw=true
|
||||
# requires: aiohttp
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import logging
|
||||
import aiohttp
|
||||
import asyncio
|
||||
from datetime import datetime
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Tonscan(loader.Module):
|
||||
"""Информация о TON адресе"""
|
||||
|
||||
strings = {
|
||||
"name": "Tonscan",
|
||||
|
||||
"waiting": "<b><emoji document_id=6334391057186293707>🕑</emoji> Собираю информацию...</b>",
|
||||
}
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def tonwallet(self, message):
|
||||
"""Информация о TON кошельке"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>.tonwallet адрес_кошелька</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting"])
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://tonapi.io/v2/accounts/{address}") as res:
|
||||
response = await res.json()
|
||||
|
||||
try:
|
||||
response['icon']
|
||||
ava = f"""<a href="{response['icon']}">Аватарка</a> • """
|
||||
except:
|
||||
ava = ""
|
||||
|
||||
try:
|
||||
response['name']
|
||||
name = f"\nИмя: <code>{response['name']}</code>\n"
|
||||
except:
|
||||
name = ""
|
||||
|
||||
try:
|
||||
response['error']
|
||||
if "can't decode address" in response['error']:
|
||||
return await utils.answer(message, f"<b>❌ Это не адрес кошелька!</b>")
|
||||
|
||||
return await utils.answer(message, f"""<b>❌ Ошибка!\n\n
|
||||
```json
|
||||
{response['error']}
|
||||
```</b>""")
|
||||
except:
|
||||
pass
|
||||
|
||||
scam = "Нет"
|
||||
|
||||
try:
|
||||
if response['is_scam'] == "True":
|
||||
scam = "Да"
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
contract = f"Контракт: <code>{response['interfaces'][0]}</code>\n"
|
||||
except:
|
||||
contract = ""
|
||||
|
||||
try:
|
||||
last_activity = f"\nПоследння активность: </b><i>{datetime.fromtimestamp(response['last_activity'])}</i><b>"
|
||||
except:
|
||||
last_activity = ""
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
<emoji document_id=5854713299794398583>💎</emoji> Ton wallet
|
||||
{name}
|
||||
Адрес: <code>{address}</code>
|
||||
Баланс: <code>{response['balance']} TON</code>
|
||||
|
||||
Скам: </b><i>{scam}</i><b>
|
||||
Статус: </b><i>{response['status']}</i><b>{last_activity}
|
||||
{contract}
|
||||
<a href="https://tonscan.org/address/{address}">Tonscan</a> • {ava}<a href="https://tonscan.org/address/{address}#transactions">История</a> • <a href="https://tonscan.org/address/{address}#nfts">NFT</a> • <a href="https://tonscan.org/address/{address}#tokens">jettons</a> • <a href="https://tonscan.org/address/{address}#source">Contract</a>
|
||||
</b>""")
|
||||
|
||||
@loader.command()
|
||||
async def tonjetton(self, message):
|
||||
"""Информация о TON токене"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>.tonjetton адрес_токена</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting"])
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://tonapi.io/v2/jettons/{address}") as res:
|
||||
response = await res.json()
|
||||
|
||||
try:
|
||||
response['error']
|
||||
return await utils.answer(message, f"""<b>❌ Ошибка!\n\n
|
||||
```json
|
||||
{response['error']}
|
||||
```</b>""")
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
response['metadata']['description']
|
||||
descr = f"\n</b><i>{response['metadata']['description']}</i><b>\n"
|
||||
except:
|
||||
descr = ""
|
||||
|
||||
try:
|
||||
response['metadata']['social']
|
||||
|
||||
socials = """Ссылки:
|
||||
"""
|
||||
for s in response['metadata']['social']:
|
||||
socials += s + "\n"
|
||||
socials += "\n"
|
||||
except:
|
||||
socials = ""
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
<emoji document_id=5854713299794398583>💎</emoji> Ton jetton
|
||||
|
||||
Имя: <code>{response['metadata']['name']}</code>
|
||||
Символ: <code>{response['metadata']['symbol']}</code>
|
||||
{descr}
|
||||
Адрес: <code>{address}</code>
|
||||
Общее предложение: <code>{response['total_supply']} TON</code>
|
||||
|
||||
Количество держателей: <code>{response['holders_count']}</code>
|
||||
|
||||
{socials}<a href="https://tonscan.org/jetton/{address}">Tonscan</a> • <a href="{response['metadata']['image']}">Лого</a> • <a href="https://tonscan.org/jetton/{address}#transactions">История</a> • <a href="https://tonscan.org/jetton/{address}#holders">Топ держателей</a> • <a href="https://tonscan.org/jetton/{address}#source">Contract</a>
|
||||
</b>""")
|
||||
|
||||
@loader.command()
|
||||
async def tonnftcol(self, message):
|
||||
"""Информация о TON NFT коллекции"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>.tonnftcol адрес_коллекции</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting"])
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://tonapi.io/v2/nfts/collections/{address}") as res:
|
||||
response = await res.json()
|
||||
|
||||
try:
|
||||
response['error']
|
||||
return await utils.answer(message, f"""<b>❌ Ошибка!\n\n
|
||||
```json
|
||||
{response['error']}
|
||||
```</b>""")
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
response['metadata']['description']
|
||||
descr = f"\n</b><i>{response['metadata']['description']}</i><b>\n"
|
||||
except:
|
||||
descr = ""
|
||||
|
||||
try:
|
||||
response['metadata']['external_link']
|
||||
external_link = f"\nВнешняя ссылка: {response['metadata']['external_link']}\n"
|
||||
except:
|
||||
external_link = ""
|
||||
|
||||
try:
|
||||
response['metadata']['social_links']
|
||||
|
||||
socials = """Ссылки:
|
||||
"""
|
||||
for s in response['metadata']['social']:
|
||||
socials += s + "\n"
|
||||
socials += "\n"
|
||||
except:
|
||||
socials = ""
|
||||
|
||||
try:
|
||||
response['metadata']['approved_by']
|
||||
|
||||
approved_by = """Одобрено:
|
||||
"""
|
||||
for s in response['metadata']['approved_by']:
|
||||
approved_by += s + "\n"
|
||||
approved_by += "\n"
|
||||
except:
|
||||
approved_by = ""
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
<emoji document_id=5854713299794398583>💎</emoji> Ton NFT collection
|
||||
|
||||
Имя: <code>{response['metadata']['name']}</code>
|
||||
Адрес: <code>{address}</code>
|
||||
{descr}
|
||||
{external_link}
|
||||
{approved_by}{socials}<a href="https://tonscan.org/nft/{address}">Tonscan</a> • <a href="https://tonscan.org/nft/{address}">Коллекция</a> • <a href="{response['metadata']['image']}">Лого</a> • <a href="{response['metadata']['cover_image']}">Баннер</a>
|
||||
</b>""")
|
||||
|
||||
@loader.command()
|
||||
async def tonnft(self, message):
|
||||
"""Информация о TON NFT"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>.tonnft адрес_nft</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting"])
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://tonapi.io/v2/nfts/{address}") as res:
|
||||
response = await res.json()
|
||||
|
||||
try:
|
||||
response['error']
|
||||
return await utils.answer(message, f"""<b>❌ Ошибка!\n\n
|
||||
```json
|
||||
{response['error']}
|
||||
```</b>""")
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
response['metadata']['description']
|
||||
descr = f"\n</b><i>{response['metadata']['description']}</i><b>\n"
|
||||
except:
|
||||
descr = ""
|
||||
|
||||
try:
|
||||
response['collection']['name']
|
||||
coll = f"\nКолекция: <code>{response['collection']['name']}</code>\n"
|
||||
except:
|
||||
coll = ""
|
||||
|
||||
try:
|
||||
response['metadata']['external_link']
|
||||
external_link = f"\nВнешняя ссылка: {response['metadata']['external_link']}\n"
|
||||
except:
|
||||
external_link = ""
|
||||
|
||||
try:
|
||||
response['metadata']['social_links']
|
||||
|
||||
socials = """Ссылки:
|
||||
"""
|
||||
for s in response['metadata']['social']:
|
||||
socials += s + "\n"
|
||||
socials += "\n"
|
||||
except:
|
||||
socials = ""
|
||||
|
||||
try:
|
||||
response['metadata']['approved_by']
|
||||
|
||||
approved_by = """Одобрено:
|
||||
"""
|
||||
for s in response['metadata']['approved_by']:
|
||||
approved_by += s + "\n"
|
||||
approved_by += "\n"
|
||||
except:
|
||||
approved_by = ""
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
<emoji document_id=5854713299794398583>💎</emoji> Ton NFT
|
||||
{coll}
|
||||
Имя: <code>{response['metadata']['name']}</code>
|
||||
Адрес: <code>{address}</code>
|
||||
{descr}
|
||||
{external_link}
|
||||
{approved_by}{socials}<a href="https://tonscan.org/nft/{address}">Tonscan</a> • <a href="{response['metadata']['image']}">NFT фото</a>
|
||||
</b>""")
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Tonscan
|
||||
# Description: Информация о TON адресе
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/tonscan.png?raw=true
|
||||
# requires: aiohttp
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import logging
|
||||
import aiohttp
|
||||
import asyncio
|
||||
from datetime import datetime
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Tonscan(loader.Module):
|
||||
"""Информация о TON адресе"""
|
||||
|
||||
strings = {
|
||||
"name": "Tonscan",
|
||||
|
||||
"waiting": "<b><emoji document_id=6334391057186293707>🕑</emoji> Собираю информацию...</b>",
|
||||
}
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def tonwallet(self, message):
|
||||
"""Информация о TON кошельке"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>.tonwallet адрес_кошелька</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting"])
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://tonapi.io/v2/accounts/{address}") as res:
|
||||
response = await res.json()
|
||||
|
||||
try:
|
||||
response['icon']
|
||||
ava = f"""<a href="{response['icon']}">Аватарка</a> • """
|
||||
except:
|
||||
ava = ""
|
||||
|
||||
try:
|
||||
response['name']
|
||||
name = f"\nИмя: <code>{response['name']}</code>\n"
|
||||
except:
|
||||
name = ""
|
||||
|
||||
try:
|
||||
response['error']
|
||||
if "can't decode address" in response['error']:
|
||||
return await utils.answer(message, f"<b>❌ Это не адрес кошелька!</b>")
|
||||
|
||||
return await utils.answer(message, f"""<b>❌ Ошибка!\n\n
|
||||
```json
|
||||
{response['error']}
|
||||
```</b>""")
|
||||
except:
|
||||
pass
|
||||
|
||||
scam = "Нет"
|
||||
|
||||
try:
|
||||
if response['is_scam'] == "True":
|
||||
scam = "Да"
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
contract = f"Контракт: <code>{response['interfaces'][0]}</code>\n"
|
||||
except:
|
||||
contract = ""
|
||||
|
||||
try:
|
||||
last_activity = f"\nПоследння активность: </b><i>{datetime.fromtimestamp(response['last_activity'])}</i><b>"
|
||||
except:
|
||||
last_activity = ""
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
<emoji document_id=5854713299794398583>💎</emoji> Ton wallet
|
||||
{name}
|
||||
Адрес: <code>{address}</code>
|
||||
Баланс: <code>{response['balance']} TON</code>
|
||||
|
||||
Скам: </b><i>{scam}</i><b>
|
||||
Статус: </b><i>{response['status']}</i><b>{last_activity}
|
||||
{contract}
|
||||
<a href="https://tonscan.org/address/{address}">Tonscan</a> • {ava}<a href="https://tonscan.org/address/{address}#transactions">История</a> • <a href="https://tonscan.org/address/{address}#nfts">NFT</a> • <a href="https://tonscan.org/address/{address}#tokens">jettons</a> • <a href="https://tonscan.org/address/{address}#source">Contract</a>
|
||||
</b>""")
|
||||
|
||||
@loader.command()
|
||||
async def tonjetton(self, message):
|
||||
"""Информация о TON токене"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>.tonjetton адрес_токена</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting"])
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://tonapi.io/v2/jettons/{address}") as res:
|
||||
response = await res.json()
|
||||
|
||||
try:
|
||||
response['error']
|
||||
return await utils.answer(message, f"""<b>❌ Ошибка!\n\n
|
||||
```json
|
||||
{response['error']}
|
||||
```</b>""")
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
response['metadata']['description']
|
||||
descr = f"\n</b><i>{response['metadata']['description']}</i><b>\n"
|
||||
except:
|
||||
descr = ""
|
||||
|
||||
try:
|
||||
response['metadata']['social']
|
||||
|
||||
socials = """Ссылки:
|
||||
"""
|
||||
for s in response['metadata']['social']:
|
||||
socials += s + "\n"
|
||||
socials += "\n"
|
||||
except:
|
||||
socials = ""
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
<emoji document_id=5854713299794398583>💎</emoji> Ton jetton
|
||||
|
||||
Имя: <code>{response['metadata']['name']}</code>
|
||||
Символ: <code>{response['metadata']['symbol']}</code>
|
||||
{descr}
|
||||
Адрес: <code>{address}</code>
|
||||
Общее предложение: <code>{response['total_supply']} TON</code>
|
||||
|
||||
Количество держателей: <code>{response['holders_count']}</code>
|
||||
|
||||
{socials}<a href="https://tonscan.org/jetton/{address}">Tonscan</a> • <a href="{response['metadata']['image']}">Лого</a> • <a href="https://tonscan.org/jetton/{address}#transactions">История</a> • <a href="https://tonscan.org/jetton/{address}#holders">Топ держателей</a> • <a href="https://tonscan.org/jetton/{address}#source">Contract</a>
|
||||
</b>""")
|
||||
|
||||
@loader.command()
|
||||
async def tonnftcol(self, message):
|
||||
"""Информация о TON NFT коллекции"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>.tonnftcol адрес_коллекции</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting"])
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://tonapi.io/v2/nfts/collections/{address}") as res:
|
||||
response = await res.json()
|
||||
|
||||
try:
|
||||
response['error']
|
||||
return await utils.answer(message, f"""<b>❌ Ошибка!\n\n
|
||||
```json
|
||||
{response['error']}
|
||||
```</b>""")
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
response['metadata']['description']
|
||||
descr = f"\n</b><i>{response['metadata']['description']}</i><b>\n"
|
||||
except:
|
||||
descr = ""
|
||||
|
||||
try:
|
||||
response['metadata']['external_link']
|
||||
external_link = f"\nВнешняя ссылка: {response['metadata']['external_link']}\n"
|
||||
except:
|
||||
external_link = ""
|
||||
|
||||
try:
|
||||
response['metadata']['social_links']
|
||||
|
||||
socials = """Ссылки:
|
||||
"""
|
||||
for s in response['metadata']['social']:
|
||||
socials += s + "\n"
|
||||
socials += "\n"
|
||||
except:
|
||||
socials = ""
|
||||
|
||||
try:
|
||||
response['metadata']['approved_by']
|
||||
|
||||
approved_by = """Одобрено:
|
||||
"""
|
||||
for s in response['metadata']['approved_by']:
|
||||
approved_by += s + "\n"
|
||||
approved_by += "\n"
|
||||
except:
|
||||
approved_by = ""
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
<emoji document_id=5854713299794398583>💎</emoji> Ton NFT collection
|
||||
|
||||
Имя: <code>{response['metadata']['name']}</code>
|
||||
Адрес: <code>{address}</code>
|
||||
{descr}
|
||||
{external_link}
|
||||
{approved_by}{socials}<a href="https://tonscan.org/nft/{address}">Tonscan</a> • <a href="https://tonscan.org/nft/{address}">Коллекция</a> • <a href="{response['metadata']['image']}">Лого</a> • <a href="{response['metadata']['cover_image']}">Баннер</a>
|
||||
</b>""")
|
||||
|
||||
@loader.command()
|
||||
async def tonnft(self, message):
|
||||
"""Информация о TON NFT"""
|
||||
address = utils.get_args_raw(message)
|
||||
|
||||
if not address:
|
||||
return await utils.answer(message, f"<emoji document_id=5019523782004441717>❌</emoji> <b>Должно быть</b> <code>.tonnft адрес_nft</code>")
|
||||
|
||||
await utils.answer(message, self.strings["waiting"])
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://tonapi.io/v2/nfts/{address}") as res:
|
||||
response = await res.json()
|
||||
|
||||
try:
|
||||
response['error']
|
||||
return await utils.answer(message, f"""<b>❌ Ошибка!\n\n
|
||||
```json
|
||||
{response['error']}
|
||||
```</b>""")
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
response['metadata']['description']
|
||||
descr = f"\n</b><i>{response['metadata']['description']}</i><b>\n"
|
||||
except:
|
||||
descr = ""
|
||||
|
||||
try:
|
||||
response['collection']['name']
|
||||
coll = f"\nКолекция: <code>{response['collection']['name']}</code>\n"
|
||||
except:
|
||||
coll = ""
|
||||
|
||||
try:
|
||||
response['metadata']['external_link']
|
||||
external_link = f"\nВнешняя ссылка: {response['metadata']['external_link']}\n"
|
||||
except:
|
||||
external_link = ""
|
||||
|
||||
try:
|
||||
response['metadata']['social_links']
|
||||
|
||||
socials = """Ссылки:
|
||||
"""
|
||||
for s in response['metadata']['social']:
|
||||
socials += s + "\n"
|
||||
socials += "\n"
|
||||
except:
|
||||
socials = ""
|
||||
|
||||
try:
|
||||
response['metadata']['approved_by']
|
||||
|
||||
approved_by = """Одобрено:
|
||||
"""
|
||||
for s in response['metadata']['approved_by']:
|
||||
approved_by += s + "\n"
|
||||
approved_by += "\n"
|
||||
except:
|
||||
approved_by = ""
|
||||
|
||||
await utils.answer(message, f"""<b>
|
||||
<emoji document_id=5854713299794398583>💎</emoji> Ton NFT
|
||||
{coll}
|
||||
Имя: <code>{response['metadata']['name']}</code>
|
||||
Адрес: <code>{address}</code>
|
||||
{descr}
|
||||
{external_link}
|
||||
{approved_by}{socials}<a href="https://tonscan.org/nft/{address}">Tonscan</a> • <a href="{response['metadata']['image']}">NFT фото</a>
|
||||
</b>""")
|
||||
|
||||
@@ -1,109 +1,109 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Wakatime
|
||||
# Description: Показывает твою Wakatime статистику
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/wakatime.png?raw=true
|
||||
# requires: httpx
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import httpx
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Wakatime(loader.Module):
|
||||
"""Показывает твою Wakatime статистику"""
|
||||
|
||||
strings = {
|
||||
"name": "Wakatime",
|
||||
|
||||
"loading": "<emoji document_id=6334391057186293707>🕑</emoji> <b>Загрузка статистики...</b>",
|
||||
"no_token": "<emoji document_id=5210952531676504517>🚫</emoji> <b>Wakatime токен не поставлен! Поставь его в <code>{}cfg wakatime</code></b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"WAKATIME_TOKEN",
|
||||
None,
|
||||
lambda: "Твой wakatime токен. Получить токен: https://wakatime.com/settings/account",
|
||||
validator=loader.validators.Hidden(loader.validators.String()),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
async def _get_data(self, endpoint, token):
|
||||
url = f"https://wakatime.com/api/v1/users/current/{endpoint}?api_key={token}"
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(url)
|
||||
return response
|
||||
|
||||
async def get_waka(self, token):
|
||||
endpoints = ["status_bar/today", "stats/all_time", "stats/all_time", "all_time_since_today"]
|
||||
|
||||
responses = await asyncio.gather(*(self._get_data(endpoint, token) for endpoint in endpoints))
|
||||
data_today, data_all_time, data_stats_s, data_all_time_since_today = [response.json() for response in responses]
|
||||
|
||||
all_time = data_all_time_since_today["data"]["text"]
|
||||
username = data_all_time["data"]["username"]
|
||||
if not username:
|
||||
username = "Нету"
|
||||
try:
|
||||
languages = data_all_time["data"]["languages"]
|
||||
except:
|
||||
languages = []
|
||||
today = data_today["data"]["categories"]
|
||||
try:
|
||||
os = data_all_time["data"]["operating_systems"]
|
||||
except:
|
||||
pass
|
||||
OS = ", ".join([f"<code>{stat['name']}</code>" for stat in os if stat["text"] != "0 secs"])
|
||||
editor = data_all_time["data"]["editors"]
|
||||
EDITOR = ", ".join([f"<code>{stat['name']}</code> " for stat in editor if stat["text"] != "0 secs"])
|
||||
try:
|
||||
LANG = "\n".join([f"▫️ <b>{stat['name']}</b>: <i>{stat['text']}</i>" for stat in languages if stat["text"] != "0 secs"])
|
||||
except:
|
||||
LANG = ""
|
||||
TODAY = "\n".join([f"{stat['text']}" for stat in today if stat["text"] != "0 secs"])
|
||||
|
||||
return f"""<b><emoji document_id=5190458330719461749>🧑💻</emoji> Юзернейм: <code>{username}</code>
|
||||
|
||||
<emoji document_id=6334391057186293707>🕑</emoji> За всё время: <code>{all_time}</code>
|
||||
📃 Сегодня: <code>{TODAY}</code>
|
||||
|
||||
<emoji document_id=6334742097748298141>🖥</emoji> ОС:</b> <i>{OS}</i>
|
||||
<emoji document_id=5807454683714817955>💻</emoji> <b>Редактор:</b> <i>{EDITOR}</i>
|
||||
|
||||
<b>💈 Языки программирования</b>
|
||||
|
||||
{LANG}\n"""
|
||||
|
||||
@loader.command()
|
||||
async def waka(self, message):
|
||||
"""Посмотреть свою статистику в Wakatime"""
|
||||
token = self.config["WAKATIME_TOKEN"]
|
||||
|
||||
if token is None:
|
||||
return await utils.answer(message, self.strings["no_token"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings["loading"])
|
||||
|
||||
waka_text = await self.get_waka(token)
|
||||
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: Wakatime
|
||||
# Description: Показывает твою Wakatime статистику
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/wakatime.png?raw=true
|
||||
# requires: httpx
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import httpx
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class Wakatime(loader.Module):
|
||||
"""Показывает твою Wakatime статистику"""
|
||||
|
||||
strings = {
|
||||
"name": "Wakatime",
|
||||
|
||||
"loading": "<emoji document_id=6334391057186293707>🕑</emoji> <b>Загрузка статистики...</b>",
|
||||
"no_token": "<emoji document_id=5210952531676504517>🚫</emoji> <b>Wakatime токен не поставлен! Поставь его в <code>{}cfg wakatime</code></b>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"WAKATIME_TOKEN",
|
||||
None,
|
||||
lambda: "Твой wakatime токен. Получить токен: https://wakatime.com/settings/account",
|
||||
validator=loader.validators.Hidden(loader.validators.String()),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
async def _get_data(self, endpoint, token):
|
||||
url = f"https://wakatime.com/api/v1/users/current/{endpoint}?api_key={token}"
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(url)
|
||||
return response
|
||||
|
||||
async def get_waka(self, token):
|
||||
endpoints = ["status_bar/today", "stats/all_time", "stats/all_time", "all_time_since_today"]
|
||||
|
||||
responses = await asyncio.gather(*(self._get_data(endpoint, token) for endpoint in endpoints))
|
||||
data_today, data_all_time, data_stats_s, data_all_time_since_today = [response.json() for response in responses]
|
||||
|
||||
all_time = data_all_time_since_today["data"]["text"]
|
||||
username = data_all_time["data"]["username"]
|
||||
if not username:
|
||||
username = "Нету"
|
||||
try:
|
||||
languages = data_all_time["data"]["languages"]
|
||||
except:
|
||||
languages = []
|
||||
today = data_today["data"]["categories"]
|
||||
try:
|
||||
os = data_all_time["data"]["operating_systems"]
|
||||
except:
|
||||
pass
|
||||
OS = ", ".join([f"<code>{stat['name']}</code>" for stat in os if stat["text"] != "0 secs"])
|
||||
editor = data_all_time["data"]["editors"]
|
||||
EDITOR = ", ".join([f"<code>{stat['name']}</code> " for stat in editor if stat["text"] != "0 secs"])
|
||||
try:
|
||||
LANG = "\n".join([f"▫️ <b>{stat['name']}</b>: <i>{stat['text']}</i>" for stat in languages if stat["text"] != "0 secs"])
|
||||
except:
|
||||
LANG = ""
|
||||
TODAY = "\n".join([f"{stat['text']}" for stat in today if stat["text"] != "0 secs"])
|
||||
|
||||
return f"""<b><emoji document_id=5190458330719461749>🧑💻</emoji> Юзернейм: <code>{username}</code>
|
||||
|
||||
<emoji document_id=6334391057186293707>🕑</emoji> За всё время: <code>{all_time}</code>
|
||||
📃 Сегодня: <code>{TODAY}</code>
|
||||
|
||||
<emoji document_id=6334742097748298141>🖥</emoji> ОС:</b> <i>{OS}</i>
|
||||
<emoji document_id=5807454683714817955>💻</emoji> <b>Редактор:</b> <i>{EDITOR}</i>
|
||||
|
||||
<b>💈 Языки программирования</b>
|
||||
|
||||
{LANG}\n"""
|
||||
|
||||
@loader.command()
|
||||
async def waka(self, message):
|
||||
"""Посмотреть свою статистику в Wakatime"""
|
||||
token = self.config["WAKATIME_TOKEN"]
|
||||
|
||||
if token is None:
|
||||
return await utils.answer(message, self.strings["no_token"].format(self.get_prefix()))
|
||||
|
||||
await utils.answer(message, self.strings["loading"])
|
||||
|
||||
waka_text = await self.get_waka(token)
|
||||
|
||||
await utils.answer(message, waka_text)
|
||||
@@ -1,130 +1,130 @@
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: YTsearch
|
||||
# Description: Поиск в Youtube
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/ytsearch.png?raw=true
|
||||
# requires: youtube-search-python
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import time
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from youtubesearchpython import VideosSearch, ChannelsSearch
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class YTsearch(loader.Module):
|
||||
"""Поиск в Youtube"""
|
||||
|
||||
strings = {
|
||||
"name": "YTsearch",
|
||||
|
||||
"no_q": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть <code>{}{} [запрос]</code></b>",
|
||||
"no_result": "<b>😕 Ничего не нашёл по этому запросу</b>",
|
||||
|
||||
"searching": "<emoji document_id=5278611117130653414>🔄</emoji> <b>Поиск в youtube.com...</b>",
|
||||
"searched": """<b>
|
||||
<emoji document_id=5278611117130653414>🔎</emoji> Результаты поиска {}
|
||||
|
||||
<emoji document_id=5188311512791393083>🔎</emoji> Запрос:</b> <code>{}</code>{}
|
||||
|
||||
<i>{} результатов за {} сек</i>
|
||||
</b>""",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"limit_channels",
|
||||
10,
|
||||
lambda: "Максимальное количество видео в результате.",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"limit_video",
|
||||
10,
|
||||
lambda: "Максимальное количество видео в результате.",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"lang",
|
||||
"ru",
|
||||
lambda: "Язык поиска.",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def ytvsearch(self, message):
|
||||
"""Поиск видео в Youtube"""
|
||||
|
||||
q = utils.get_args_raw(message)
|
||||
if not q:
|
||||
return await utils.answer(message, self.strings["no_q"].format(self.get_prefix(), "ytvsearch"))
|
||||
|
||||
await utils.answer(message, self.strings['searching'])
|
||||
|
||||
count_s = 0
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
searched_result = ""
|
||||
|
||||
for v in VideosSearch(query=q, limit=self.config['limit_video'], language=self.config['lang']).result()['result']:
|
||||
searched_result += f"""
|
||||
|
||||
<b><a href='{v['link']}'>{v['title']}</a> от <a href='{v['channel']['link']}'>{v['channel']['name']}</a></b>
|
||||
<i>{v['viewCount']['text'].replace('views', 'просмотров')}</i> (<i>{v['duration']}</i>) <i>{v['publishedTime']}</i>"""
|
||||
count_s += 1
|
||||
|
||||
end_time = time.time()
|
||||
execution_time = end_time - start_time
|
||||
|
||||
if count_s == 0:
|
||||
return await utils.answer(message, self.strings['no_result'])
|
||||
|
||||
return await utils.answer(message, self.strings['searched'].format("видео", q, searched_result, count_s, execution_time))
|
||||
|
||||
@loader.command()
|
||||
async def ytcsearch(self, message):
|
||||
"""Поиск каналов в Youtube"""
|
||||
|
||||
q = utils.get_args_raw(message)
|
||||
if not q:
|
||||
return await utils.answer(message, self.strings["no_q"].format(self.get_prefix(), "ytcsearch"))
|
||||
|
||||
await utils.answer(message, self.strings['searching'])
|
||||
|
||||
count_s = 0
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
searched_result = ""
|
||||
|
||||
for c in ChannelsSearch(query=q, limit=self.config['limit_channels'], language=self.config['lang']).result()['result']:
|
||||
searched_result += "\n" if count_s == 0 else ""
|
||||
searched_result += f"""
|
||||
<b><a href='{c['link']}'>{c['title']}</a> (<code>{c['subscribers']}</code>)</b>"""
|
||||
count_s += 1
|
||||
|
||||
end_time = time.time()
|
||||
execution_time = end_time - start_time
|
||||
|
||||
if count_s == 0:
|
||||
return await utils.answer(message, self.strings['no_result'])
|
||||
|
||||
# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
|
||||
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
|
||||
|
||||
# https://t.me/famods
|
||||
|
||||
# 🔒 Licensed under the GNU AGPLv3
|
||||
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Name: YTsearch
|
||||
# Description: Поиск в Youtube
|
||||
# meta developer: @FAmods
|
||||
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/ytsearch.png?raw=true
|
||||
# requires: youtube-search-python
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import time
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from youtubesearchpython import VideosSearch, ChannelsSearch
|
||||
|
||||
from .. import loader, utils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@loader.tds
|
||||
class YTsearch(loader.Module):
|
||||
"""Поиск в Youtube"""
|
||||
|
||||
strings = {
|
||||
"name": "YTsearch",
|
||||
|
||||
"no_q": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть <code>{}{} [запрос]</code></b>",
|
||||
"no_result": "<b>😕 Ничего не нашёл по этому запросу</b>",
|
||||
|
||||
"searching": "<emoji document_id=5278611117130653414>🔄</emoji> <b>Поиск в youtube.com...</b>",
|
||||
"searched": """<b>
|
||||
<emoji document_id=5278611117130653414>🔎</emoji> Результаты поиска {}
|
||||
|
||||
<emoji document_id=5188311512791393083>🔎</emoji> Запрос:</b> <code>{}</code>{}
|
||||
|
||||
<i>{} результатов за {} сек</i>
|
||||
</b>""",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"limit_channels",
|
||||
10,
|
||||
lambda: "Максимальное количество видео в результате.",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"limit_video",
|
||||
10,
|
||||
lambda: "Максимальное количество видео в результате.",
|
||||
),
|
||||
loader.ConfigValue(
|
||||
"lang",
|
||||
"ru",
|
||||
lambda: "Язык поиска.",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
self._client = client
|
||||
|
||||
@loader.command()
|
||||
async def ytvsearch(self, message):
|
||||
"""Поиск видео в Youtube"""
|
||||
|
||||
q = utils.get_args_raw(message)
|
||||
if not q:
|
||||
return await utils.answer(message, self.strings["no_q"].format(self.get_prefix(), "ytvsearch"))
|
||||
|
||||
await utils.answer(message, self.strings['searching'])
|
||||
|
||||
count_s = 0
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
searched_result = ""
|
||||
|
||||
for v in VideosSearch(query=q, limit=self.config['limit_video'], language=self.config['lang']).result()['result']:
|
||||
searched_result += f"""
|
||||
|
||||
<b><a href='{v['link']}'>{v['title']}</a> от <a href='{v['channel']['link']}'>{v['channel']['name']}</a></b>
|
||||
<i>{v['viewCount']['text'].replace('views', 'просмотров')}</i> (<i>{v['duration']}</i>) <i>{v['publishedTime']}</i>"""
|
||||
count_s += 1
|
||||
|
||||
end_time = time.time()
|
||||
execution_time = end_time - start_time
|
||||
|
||||
if count_s == 0:
|
||||
return await utils.answer(message, self.strings['no_result'])
|
||||
|
||||
return await utils.answer(message, self.strings['searched'].format("видео", q, searched_result, count_s, execution_time))
|
||||
|
||||
@loader.command()
|
||||
async def ytcsearch(self, message):
|
||||
"""Поиск каналов в Youtube"""
|
||||
|
||||
q = utils.get_args_raw(message)
|
||||
if not q:
|
||||
return await utils.answer(message, self.strings["no_q"].format(self.get_prefix(), "ytcsearch"))
|
||||
|
||||
await utils.answer(message, self.strings['searching'])
|
||||
|
||||
count_s = 0
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
searched_result = ""
|
||||
|
||||
for c in ChannelsSearch(query=q, limit=self.config['limit_channels'], language=self.config['lang']).result()['result']:
|
||||
searched_result += "\n" if count_s == 0 else ""
|
||||
searched_result += f"""
|
||||
<b><a href='{c['link']}'>{c['title']}</a> (<code>{c['subscribers']}</code>)</b>"""
|
||||
count_s += 1
|
||||
|
||||
end_time = time.time()
|
||||
execution_time = end_time - start_time
|
||||
|
||||
if count_s == 0:
|
||||
return await utils.answer(message, self.strings['no_result'])
|
||||
|
||||
return await utils.answer(message, self.strings['searched'].format("каналов", q, searched_result, count_s, execution_time))
|
||||
Reference in New Issue
Block a user