Added and updated repositories 2025-07-11 08:27:20

This commit is contained in:
github-actions[bot]
2025-07-11 08:27:20 +00:00
parent 35e8befc45
commit e328cd957a
320 changed files with 37419 additions and 33510 deletions

View File

@@ -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))

View File

@@ -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"])

View File

@@ -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": "🇿🇼",
}

View File

@@ -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"])

View File

@@ -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())

View File

@@ -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)

View File

@@ -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))

View File

@@ -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)

View File

@@ -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>""")

View File

@@ -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)

View File

@@ -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])

View File

@@ -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()

View File

@@ -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>""")

View File

@@ -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

View File

@@ -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),
)

View File

@@ -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()

View File

@@ -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>""")

View File

@@ -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)

View File

@@ -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))