Compare commits

..

2 Commits

Author SHA1 Message Date
github-actions[bot]
086ad660ba Updated modules.json after parse 2026-01-11 01:19:41 2026-01-11 01:19:41 +00:00
github-actions[bot]
e6f45bd09e Added and updated repositories 2026-01-11 01:18:34 2026-01-11 01:18:34 +00:00
36 changed files with 251 additions and 1754 deletions

View File

@@ -3,18 +3,58 @@ import shutil
import subprocess import subprocess
import re import re
import requests import requests
import json
def parse_repos(file_path: str) -> list: repos = [
"""Parse repository URLs from a given json file.""" "https://github.com/DziruModules/hikkamods",
repos = [] "https://github.com/kamolgks/Hikkamods",
with open(file_path, "r", encoding="utf-8") as f: "https://github.com/thomasmod/hikkamods",
data = json.load(f) "https://github.com/SkillsAngels/Modules",
for repo in data.get("repositories", []): "https://github.com/Sad0ff/modules-ftg",
repos.append(repo["url"]) "https://github.com/Yahikoro/Modules-for-FTG",
return repos "https://github.com/KeyZenD/modules",
"https://github.com/AlpacaGang/ftg-modules",
"https://github.com/trololo65/Modules",
"https://github.com/Ijidishurka/modules",
"https://github.com/Fl1yd/FTG-Modules",
"https://github.com/D4n13l3k00/FTG-Modules",
"https://github.com/iamnalinor/FTG-modules",
"https://github.com/SekaiYoneya/modules",
"https://github.com/GeekTG/FTG-Modules",
"https://github.com/Den4ikSuperOstryyPer4ik/Astro-modules",
"https://github.com/vsecoder/hikka_modules",
"https://github.com/sqlmerr/hikka_mods",
"https://github.com/N3rcy/modules",
"https://github.com/KorenbZla/HikkaModules",
"https://github.com/MuRuLOSE/HikkaModulesRepo",
"https://github.com/coddrago/modules",
"https://github.com/1jpshiro/hikka-modules",
"https://github.com/MoriSummerz/ftg-mods",
"https://github.com/anon97945/hikka-mods",
"https://github.com/dorotorothequickend/DorotoroModules",
"https://github.com/AmoreForever/amoremods",
"https://github.com/idiotcoders/idiotmodules",
"https://github.com/CakesTwix/Hikka-Modules",
"https://github.com/archquise/H.Modules",
"https://github.com/GD-alt/mm-hikka-mods",
"https://github.com/HitaloSama/FTG-modules-repo",
"https://github.com/SekaiYoneya/Friendly-telegram",
"https://github.com/blazedzn/ftg-modules",
"https://github.com/hikariatama/ftg",
"https://github.com/m4xx1m/FTG",
"https://github.com/skillzmeow/skillzmods_hikka",
"https://github.com/fajox1/famods",
"https://github.com/unneyon/hikka-mods",
"https://github.com/TheKsenon/MyHikkaModules",
"https://github.com/cryptexctl/modules-mirror",
"https://github.com/Ruslan-Isaev/modules",
"https://github.com/shadowhikka/sh.modules",
"https://github.com/fiksofficial/python-modules",
"https://github.com/mead0wsss/mead0wsMods",
"https://github.com/SenkoGuardian/SenModules",
"https://github.com/ZetGoHack/nullmod",
"https://github.com/yummy1gay/limoka"
repos = parse_repos("repositories.json") ]
def configure_git(): def configure_git():
"""Configure Git to ignore file mode changes.""" """Configure Git to ignore file mode changes."""

File diff suppressed because it is too large Load Diff

View File

@@ -23,4 +23,3 @@ chatmodule
stats stats
tagwatcher tagwatcher
hardspam hardspam
YaMusic

View File

@@ -1,5 +1,4 @@
# meta developer: @codrago_m # meta developer: @codrago_m
# scope: heroku_min 2.0.0
import logging import logging
from .. import utils, loader, main from .. import utils, loader, main
@@ -114,8 +113,15 @@ class TagWatcher(loader.Module):
validator=loader.validators.Boolean(), validator=loader.validators.Boolean(),
), ),
) )
async def client_ready(self): async def client_ready(self):
self.asset_channel = self._db.get("heroku.forums", "channel_id", 0) await self.request_join("@xdesai_modules", self.strings["request_join_reason"])
self.xdlib = await self.import_lib(
"https://raw.githubusercontent.com/xdesai96/modules/refs/heads/main/libs/xdlib.py",
suspend_on_error=True,
)
self.asset_channel = self._db.get("legacy.forums", "channel_id", 0)
self._notif_topic = await utils.asset_forum_topic( self._notif_topic = await utils.asset_forum_topic(
self._client, self._client,
self._db, self._db,
@@ -124,10 +130,6 @@ class TagWatcher(loader.Module):
description="Here will be notifications about mentions in chats.", description="Here will be notifications about mentions in chats.",
icon_emoji_id=5409025823388741707, icon_emoji_id=5409025823388741707,
) )
self.xdlib = await self.import_lib(
"https://raw.githubusercontent.com/coddrago/modules/refs/heads/main/libs/xdlib.py",
suspend_on_error=True,
)
async def render_text(self, m): async def render_text(self, m):
if self.config["custom_notif_text"]: if self.config["custom_notif_text"]:
@@ -172,7 +174,7 @@ class TagWatcher(loader.Module):
user_id=id, user_id=id,
msg_content=msg_content, msg_content=msg_content,
reply_content=reply_content, reply_content=reply_content,
link=await m.link(), link=await m.link,
) )
@loader.command( @loader.command(

BIN
fajox1/famods/.DS_Store vendored Normal file

Binary file not shown.

BIN
fajox1/famods/assets/.DS_Store vendored Normal file

Binary file not shown.

BIN
fajox1/famods/assets/banners/.DS_Store vendored Normal file

Binary file not shown.

BIN
fajox1/famods/assets/birds/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, ai, assistant
from .. import loader, utils from .. import loader, utils
import aiohttp import aiohttp

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, ai, username
# requires: aiohttp # requires: aiohttp
import asyncio import asyncio

View File

@@ -2,7 +2,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, user, profile
from hikkatl.types import Message from hikkatl.types import Message
from telethon.tl.functions.account import UpdateProfileRequest from telethon.tl.functions.account import UpdateProfileRequest

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, calculator, calc
from .. import loader, utils from .. import loader, utils
import math import math

View File

@@ -1,8 +1,7 @@
# На модуль распространяется лицензия "GNU General Public License v3.0 # На модуль распространяется лицензия "GNU General Public License v3.0"
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @PyModule # meta developer: @PyModule
# meta fhsdesc: tool, tools, channel, admintools, admin, admintool
from telethon.tl.types import Message from telethon.tl.types import Message
from .. import loader from .. import loader

View File

@@ -1,4 +1,3 @@
# meta fhsdesc: tool, tools, server, admin
from .. import loader, utils from .. import loader, utils
import aiohttp import aiohttp
import asyncio import asyncio

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, fun, packs
# requires: opencv-python pillow # requires: opencv-python pillow
import os import os

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: fun, cute, message, love
import random import random
import re import re

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, phone, info
# requires: aiohttp cachetools # requires: aiohttp cachetools
import asyncio import asyncio

View File

@@ -3,7 +3,6 @@
# scope: hikka_only # scope: hikka_only
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, scanner, domain
# requires: python-whois dnspython requests # requires: python-whois dnspython requests
import socket import socket

View File

@@ -2,7 +2,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @PyModule # meta developer: @PyModule
# meta fhsdesc: tool, tools, user, id
from .. import loader, utils from .. import loader, utils
@loader.tds @loader.tds

View File

@@ -11,459 +11,183 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, github, info, inline
from .. import loader, utils from .. import loader, utils
from ..inline import InlineCall
import logging import logging
import asyncio
import urllib.request
import json import json
import re
import urllib.request
from datetime import datetime, timedelta from datetime import datetime, timedelta
@loader.tds @loader.tds
class GitHubInfoMod(loader.Module): class GitHubInfoMod(loader.Module):
"""GitHub user information""" """GitHub user info, recent activity and contribution graph"""
strings = { strings = {
"name": "GitHubInfo", "name": "GitHubInfo",
"no_username": "❗ Provide a GitHub username.", "no_username": "❗ Provide a GitHub username.",
"user_not_found": "🚫 User not found: <b>{}</b>", "user_not_found": "🚫 User not found: <b>{}</b>",
"api_error": "⚠ GitHub API error: <b>{msg}</b>", "profile": "Profile",
"no_activity": "🕸 No recent activity from <b>{}</b>", "no_activity": "🕸 No recent activity from <b>{}</b>",
"no_contrib": "📭 No contribution data.", "no_contrib": "📭 No contribution data for <b>{}</b>",
"no_repos": "📭 No public repositories.", "info_text": (
"no_orgs": "📭 Not a member of any organizations.", "👤 <b>{name}</b> | <a href=\"{url}\">{profile}</a>\n"
"no_title": "No title", "🏢 {company} | 📍 {location}\n"
"no_desc": "No description", "📝 {bio}\n\n"
"not_specified": "Not specified", "📦 Repos: <b>{repos}</b> | "
"more_commits": " ... and {} more\n", "👥 Followers: <b>{followers}</b> | "
"hireable_yes": "Yes",
"hireable_no": "No",
"menu_text": "Choose a section:",
"btn_activity": "🔥 Activity",
"btn_contrib": "📊 Contributions",
"btn_repos": "📦 Repositories",
"btn_orgs": "🏛 Organizations",
"btn_back": "← Back to profile",
"profile_header": "<b>Profile</b> <a href=\"{url}\">{username}</a>\n\n",
"profile_text": (
"👤 Name: <b>{name}</b>\n"
"🏷 Login: <code>{login}</code>\n"
"📝 Bio: {bio}\n"
"🏢 Company: {company}\n"
"📍 Location: {location}\n"
"📧 Email: {email}\n"
"🔗 Website: {blog}\n"
"🐦 Twitter: {twitter}\n"
"💼 Hireable: {hireable}\n"
"📊 Type: {type}\n"
"📦 Public repos: <b>{repos}</b>\n"
"⭐ Public gists: <b>{gists}</b>\n"
"👥 Followers: <b>{followers}</b>\n"
"👣 Following: <b>{following}</b>\n" "👣 Following: <b>{following}</b>\n"
"🕐 Created: <code>{created}</code>\n" "🕒 Created: <code>{created}</code>"
"🕐 Updated: <code>{updated}</code>"
), ),
"activity_header": "<b>Recent activity:</b>\n",
"activity_header": "<b>Recent activity</b> <a href=\"https://github.com/{username}\">{username}</a>\n\n", "activity_commit": "🔨 {count} commit(s) → <code>{branch}</code> in {repo}",
"activity_create": "✨ Created {ref_type} in {repo}",
"push_header": "🔨 Pushed to <code>{branch}</code> → <a href=\"https://github.com/{repo}\">{repo}</a>\n", "activity_pr": "🔄 {action} PR: {title}",
"push_no_commits": "🔨 Pushed (no details) to <code>{branch}</code> → <a href=\"https://github.com/{repo}\">{repo}</a>\n", "activity_issue": "{action} issue: {title}",
"commit_line": "• <a href=\"{url}\"><code>{sha}</code></a>: {message}\n", "activity_star": "⭐ Starred {repo}",
"activity_fork": "⑂ Forked to {fork}",
"create_branch": "✨ Created branch <code>{ref}</code> in <a href=\"https://github.com/{repo}\">{repo}</a>\n", "activity_other": "{event} in {repo}",
"create_tag": "✨ Created tag <code>{ref}</code> in <a href=\"https://github.com/{repo}/releases/tag/{ref}\">{repo}</a>\n", "contrib_header": "<b>Contribution graph</b> for <a href=\"https://github.com/{username}\">{username}</a>:\n",
"create_repo": "✨ Created repository <a href=\"https://github.com/{repo}\">{repo}</a>\n", "contrib_footer": "⬛ = 0, 🟩 = 1+ contributions",
"pr_opened": "🔄 Opened PR <a href=\"{url}\">#{} {title}</a>\n",
"pr_closed": "🔄 Closed PR <a href=\"{url}\">#{} {title}</a>\n",
"pr_merged": "🔄 Merged PR <a href=\"{url}\">#{} {title}</a>\n",
"issue_opened": "❗ Opened issue <a href=\"{url}\">#{} {title}</a>\n",
"issue_closed": "❗ Closed issue <a href=\"{url}\">#{} {title}</a>\n",
"star": "⭐ Starred <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"fork": "⑂ Forked <a href=\"https://github.com/{fork}\">{fork}</a>\n",
"other": "{event} in <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"repos_header": "<b>Top repositories by stars</b> <a href=\"https://github.com/{username}\">{username}</a>\n\n",
"repo_line": "⭐ <b>{stars}</b> | <a href=\"{url}\">{name}</a> — {desc}\nLanguage: {lang} | Forks: {forks}\n\n",
"orgs_header": "<b>Organizations</b> <a href=\"https://github.com/{username}\">{username}</a>\n\n",
"org_line": "• <a href=\"{url}\">{login}</a> — {desc}\n",
"contrib_header": "<b>Contribution graph (last year)</b> <a href=\"https://github.com/{username}\">{username}</a>\n",
"contrib_footer": "\n⬛ = 0, 🟩 = 1+ contributions",
} }
strings_ru = { strings_ru = {
"_cls_doc": "Информация о GitHub-пользователе", "no_username": "❗ Укажи имя пользователя GitHub.",
"no_username": "❗ Укажи GitHub username.",
"user_not_found": "🚫 Пользователь не найден: <b>{}</b>", "user_not_found": "🚫 Пользователь не найден: <b>{}</b>",
"api_error": "⚠ Ошибка GitHub API: <b>{msg}</b>", "profile": "Профиль",
"no_activity": "🕸 Нет недавней активности у <b>{}</b>", "no_activity": "🕸 Нет активности у <b>{}</b>",
"no_contrib": "📭 Нет данных о контрибуциях.", "no_contrib": "📭 Нет данных о вкладах <b>{}</b>",
"no_repos": "📭 Нет публичных репозиториев.", "info_text": (
"no_orgs": "📭 Не состоит в организациях.", "👤 <b>{name}</b> | <a href=\"{url}\">{profile}</a>\n"
"no_title": "Без названия", "🏢 {company} | 📍 {location}\n"
"no_desc": "Без описания", "📝 {bio}\n\n"
"not_specified": "Не указано", "📦 Репозитории: <b>{repos}</b> | "
"more_commits": " ... и ещё {}\n", "👥 Подписчики: <b>{followers}</b> | "
"hireable_yes": "Да",
"hireable_no": "Нет",
"menu_text": "Выбери раздел:",
"btn_activity": "🔥 Активность",
"btn_contrib": "📊 Контрибы",
"btn_repos": "📦 Репозитории",
"btn_orgs": "🏛 Организации",
"btn_back": "← Назад к профилю",
"profile_header": "<b>Профиль</b> <a href=\"{url}\">{username}</a>\n\n",
"profile_text": (
"👤 Имя: <b>{name}</b>\n"
"🏷 Логин: <code>{login}</code>\n"
"📝 Био: {bio}\n"
"🏢 Компания: {company}\n"
"📍 Локация: {location}\n"
"📧 Email: {email}\n"
"🔗 Сайт: {blog}\n"
"🐦 Twitter: {twitter}\n"
"💼 Доступен для найма: {hireable}\n"
"📊 Тип аккаунта: {type}\n"
"📦 Публичные репозитории: <b>{repos}</b>\n"
"⭐ Публичные гисты: <b>{gists}</b>\n"
"👥 Подписчики: <b>{followers}</b>\n"
"👣 Подписки: <b>{following}</b>\n" "👣 Подписки: <b>{following}</b>\n"
"🕐 Создан: <code>{created}</code>\n" "🕒 Создан: <code>{created}</code>"
"🕐 Обновлён: <code>{updated}</code>"
), ),
"activity_header": "<b>Последняя активность:</b>\n",
"activity_header": "<b>Последняя активность</b> <a href=\"https://github.com/{username}\">{username}</a>\n\n", "activity_commit": "🔨 {count} коммит(ов) → <code>{branch}</code> в {repo}",
"activity_create": "✨ Создан {ref_type} в {repo}",
"push_header": "🔨 Запушил в <code>{branch}</code> → <a href=\"https://github.com/{repo}\">{repo}</a>\n", "activity_pr": "🔄 {action} PR: {title}",
"push_no_commits": "🔨 Запушил (без деталей) в <code>{branch}</code> → <a href=\"https://github.com/{repo}\">{repo}</a>\n", "activity_issue": "{action} issue: {title}",
"commit_line": "• <a href=\"{url}\"><code>{sha}</code></a>: {message}\n", "activity_star": "В избранное {repo}",
"activity_fork": "⑂ Форк в {fork}",
"create_branch": "✨ Создал ветку <code>{ref}</code> в <a href=\"https://github.com/{repo}\">{repo}</a>\n", "activity_other": "{event} в {repo}",
"create_tag": "✨ Создал тег <code>{ref}</code> в <a href=\"https://github.com/{repo}/releases/tag/{ref}\">{repo}</a>\n", "contrib_header": "<b>График активности</b> <a href=\"https://github.com/{username}\">{username}</a>:\n",
"create_repo": "✨ Создал репозиторий <a href=\"https://github.com/{repo}\">{repo}</a>\n", "contrib_footer": "⬛ = 0, 🟩 = 1+ контрибуций",
"pr_opened": "🔄 Открыл PR <a href=\"{url}\">#{} {title}</a>\n",
"pr_closed": "🔄 Закрыл PR <a href=\"{url}\">#{} {title}</a>\n",
"pr_merged": "🔄 Замержил PR <a href=\"{url}\">#{} {title}</a>\n",
"issue_opened": "❗ Открыл issue <a href=\"{url}\">#{} {title}</a>\n",
"issue_closed": "❗ Закрыл issue <a href=\"{url}\">#{} {title}</a>\n",
"star": "⭐ Добавил в избранное <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"fork": "⑂ Форкнул <a href=\"https://github.com/{fork}\">{fork}</a>\n",
"other": "{event} в <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"repos_header": "<b>Топ репозитории по звёздам</b> <a href=\"https://github.com/{username}\">{username}</a>\n\n",
"repo_line": "⭐ <b>{stars}</b> | <a href=\"{url}\">{name}</a> — {desc}\nЯзык: {lang} | Форков: {forks}\n\n",
"orgs_header": "<b>Организации</b> <a href=\"https://github.com/{username}\">{username}</a>\n\n",
"org_line": "• <a href=\"{url}\">{login}</a> — {desc}\n",
"contrib_header": "<b>График контрибуций (последний год)</b> <a href=\"https://github.com/{username}\">{username}</a>\n",
"contrib_footer": "\n⬛ = 0, 🟩 = 1+ контрибуций",
} }
def __init__(self): def __init__(self):
self.logger = logging.getLogger(__name__) self.logger = logging.getLogger(__name__)
async def github_fetch(self, url, github_api=True): def github_api(self, url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"Accept": "application/vnd.github+json" if github_api else "application/json",
"X-GitHub-Api-Version": "2022-11-28",
}
req = urllib.request.Request(url, headers=headers)
try: try:
with urllib.request.urlopen(req, timeout=15) as resp: with urllib.request.urlopen(url) as resp:
raw = resp.read().decode("utf-8") return json.loads(resp.read().decode())
return json.loads(raw) if raw else {}
except Exception as e: except Exception as e:
self.logger.error(f"[GitHub] {e}") self.logger.warning(f"[GitHub API] {e}")
return {"message": str(e)} return None
@loader.command(ru_doc="{username без @} — Информация о GitHub пользователе") def get_username(self, message):
async def github(self, message): args = message.text.split(maxsplit=1)
"""{username without @} — GitHub user information""" return args[1] if len(args) > 1 else None
username = utils.get_args_raw(message)
@loader.command(doc="Show GitHub user info", ru_doc="Информация о пользователе GitHub")
async def gh(self, message):
"""Show GitHub user info"""
username = self.get_username(message)
if not username: if not username:
await utils.answer(message, self.strings("no_username")) return await message.edit(self.strings("no_username"))
return
user_data = await self.github_fetch(f"https://api.github.com/users/{username}") data = self.github_api(f"https://api.github.com/users/{username}")
if "message" in user_data: if not data:
await utils.answer(message, self.strings("user_not_found").format(username)) return await message.edit(self.strings("user_not_found").format(username))
return
hireable = self.strings("hireable_yes") if user_data.get("hireable") else self.strings("hireable_no") await message.edit(self.strings("info_text").format(
name=data.get("name") or username,
url=data["html_url"],
profile=self.strings("profile"),
company=data.get("company", "N/A"),
location=data.get("location", "N/A"),
bio=data.get("bio", "No bio"),
repos=data.get("public_repos", 0),
followers=data.get("followers", 0),
following=data.get("following", 0),
created=data.get("created_at", "")[:10]
))
profile_text = ( @loader.command(doc="Show recent GitHub activity", ru_doc="Последняя активность GitHub")
self.strings("profile_header").format(url=user_data["html_url"], username=username) async def gha(self, message):
+ self.strings("profile_text").format( """Show recent GitHub activity"""
name=user_data.get("name") or self.strings("not_specified"), username = self.get_username(message)
login=username, if not username:
bio=user_data.get("bio") or self.strings("no_desc"), return await message.edit(self.strings("no_username"))
company=user_data.get("company") or self.strings("not_specified"),
location=user_data.get("location") or self.strings("not_specified"),
email=user_data.get("email") or self.strings("not_specified"),
blog=user_data.get("blog") or self.strings("not_specified"),
twitter=user_data.get("twitter_username") or self.strings("not_specified"),
hireable=hireable,
type=user_data.get("type", "User"),
repos=user_data.get("public_repos", 0),
gists=user_data.get("public_gists", 0),
followers=user_data.get("followers", 0),
following=user_data.get("following", 0),
created=user_data.get("created_at", "")[:10],
updated=user_data.get("updated_at", "")[:10],
)
+ "\n" + self.strings("menu_text")
)
await self.inline.form( events = self.github_api(f"https://api.github.com/users/{username}/events?per_page=5")
message=message,
text=profile_text,
reply_markup=[
[{"text": self.strings("btn_activity"), "callback": self._activity, "args": (username,)}],
[{"text": self.strings("btn_contrib"), "callback": self._contrib, "args": (username,)}, {"text": self.strings("btn_repos"), "callback": self._repos, "args": (username,)}],
[{"text": self.strings("btn_orgs"), "callback": self._orgs, "args": (username,)}],
],
ttl=10 * 60,
)
async def _profile(self, call: InlineCall, username: str):
# Этот метод теперь используется только для возврата к профилю
data = await self.github_fetch(f"https://api.github.com/users/{username}")
if "message" in data:
await call.edit(self.strings("api_error").format(msg=data["message"]))
return
hireable = self.strings("hireable_yes") if data.get("hireable") else self.strings("hireable_no")
profile_text = (
self.strings("profile_header").format(url=data["html_url"], username=username)
+ self.strings("profile_text").format(
name=data.get("name") or self.strings("not_specified"),
login=username,
bio=data.get("bio") or self.strings("no_desc"),
company=data.get("company") or self.strings("not_specified"),
location=data.get("location") or self.strings("not_specified"),
email=data.get("email") or self.strings("not_specified"),
blog=data.get("blog") or self.strings("not_specified"),
twitter=data.get("twitter_username") or self.strings("not_specified"),
hireable=hireable,
type=data.get("type", "User"),
repos=data.get("public_repos", 0),
gists=data.get("public_gists", 0),
followers=data.get("followers", 0),
following=data.get("following", 0),
created=data.get("created_at", "")[:10],
updated=data.get("updated_at", "")[:10],
)
+ "\n" + self.strings("menu_text")
)
await call.edit(
text=profile_text,
reply_markup=[
[{"text": self.strings("btn_activity"), "callback": self._activity, "args": (username,)}],
[{"text": self.strings("btn_contrib"), "callback": self._contrib, "args": (username,)}, {"text": self.strings("btn_repos"), "callback": self._repos, "args": (username,)}],
[{"text": self.strings("btn_orgs"), "callback": self._orgs, "args": (username,)}],
]
)
async def _activity(self, call: InlineCall, username: str):
events = await self.github_fetch(f"https://api.github.com/users/{username}/events?per_page=40")
if "message" in events:
await call.edit(self.strings("api_error").format(msg=events["message"]), reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]])
return
if not events: if not events:
await call.edit(self.strings("no_activity").format(username=username), reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]]) return await message.edit(self.strings("no_activity").format(username))
return
lines = [self.strings("activity_header").format(username=username)] lines = []
seen_repos = set() for event in events:
for event in events[:25]:
etype = event["type"] etype = event["type"]
repo = event["repo"]["name"] repo = event["repo"]["name"]
if repo in seen_repos and len(lines) > 20:
continue
payload = event.get("payload", {}) payload = event.get("payload", {})
if etype == "PushEvent": if etype == "PushEvent":
branch = payload.get("ref", "refs/heads/main").replace("refs/heads/", "") branch = re.sub(r"refs/heads/", "", payload.get("ref", "main"))
commits = payload.get("commits", []) count = len(payload.get("commits", []))
lines.append(self.strings("activity_commit").format(count=count, branch=branch, repo=repo))
if commits:
lines.append(self.strings("push_header").format(branch=branch, repo=repo))
for commit in commits[:5]:
sha = commit["sha"][:7]
message = commit["message"].split("\n")[0][:100]
if len(commit["message"].split("\n")[0]) > 100:
message += "..."
url = f"https://github.com/{repo}/commit/{commit['sha']}"
lines.append(self.strings("commit_line").format(url=url, sha=sha, message=message))
if len(commits) > 5:
lines.append(self.strings("more_commits").format(len(commits)-5))
else:
lines.append(self.strings("push_no_commits").format(branch=branch, repo=repo))
seen_repos.add(repo)
elif etype == "CreateEvent": elif etype == "CreateEvent":
ref_type = payload.get("ref_type") lines.append(self.strings("activity_create").format(ref_type=payload.get("ref_type"), repo=repo))
ref = payload.get("ref") or ""
if ref_type == "branch":
lines.append(self.strings("create_branch").format(ref=ref, repo=repo))
elif ref_type == "tag":
lines.append(self.strings("create_tag").format(ref=ref, repo=repo))
elif ref_type == "repository":
lines.append(self.strings("create_repo").format(repo=repo))
elif etype == "PullRequestEvent": elif etype == "PullRequestEvent":
pr = payload.get("pull_request", {}) pr = payload.get("pull_request", {})
number = pr.get("number", "?") lines.append(self.strings("activity_pr").format(action=payload.get("action"), title=pr.get("title")))
title = pr.get("title") or self.strings("no_title")
url = pr.get("html_url") or f"https://github.com/{repo}"
action = payload.get("action")
if action == "closed" and pr.get("merged"):
lines.append(self.strings("pr_merged").format(url=url, number=number, title=title))
elif action == "opened":
lines.append(self.strings("pr_opened").format(url=url, number=number, title=title))
elif action == "closed":
lines.append(self.strings("pr_closed").format(url=url, number=number, title=title))
elif etype == "IssuesEvent": elif etype == "IssuesEvent":
issue = payload.get("issue", {}) issue = payload.get("issue", {})
number = issue.get("number", "?") lines.append(self.strings("activity_issue").format(action=payload.get("action"), title=issue.get("title")))
title = issue.get("title") or self.strings("no_title")
url = issue.get("html_url") or f"https://github.com/{repo}"
action = payload.get("action")
if action == "opened":
lines.append(self.strings("issue_opened").format(url=url, number=number, title=title))
elif action == "closed":
lines.append(self.strings("issue_closed").format(url=url, number=number, title=title))
elif etype == "WatchEvent": elif etype == "WatchEvent":
lines.append(self.strings("star").format(repo=repo)) lines.append(self.strings("activity_star").format(repo=repo))
elif etype == "ForkEvent": elif etype == "ForkEvent":
fork = payload.get("forkee", {}).get("full_name", "unknown") lines.append(self.strings("activity_fork").format(fork=payload.get("forkee", {}).get("full_name")))
lines.append(self.strings("fork").format(fork=fork))
else: else:
event_name = etype.replace("Event", "") lines.append(self.strings("activity_other").format(event=etype, repo=repo))
lines.append(self.strings("other").format(event=event_name, repo=repo))
await call.edit( await message.edit(self.strings("activity_header") + "\n".join(lines))
text="".join(lines),
reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]]
)
async def _repos(self, call: InlineCall, username: str): @loader.command(doc="Show GitHub contribution graph", ru_doc="Показать график контрибов GitHub")
repos = await self.github_fetch(f"https://api.github.com/users/{username}/repos?sort=stars&per_page=10") async def ghc(self, message):
if "message" in repos: """Show GitHub contribution graph"""
await call.edit(self.strings("api_error").format(msg=repos["message"]), reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]]) username = self.get_username(message)
return if not username:
if not repos: return await message.edit(self.strings("no_username"))
await call.edit(self.strings("no_repos"), reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]])
return
lines = [self.strings("repos_header").format(username=username)] data = self.github_api(f"https://github-contributions-api.deno.dev/{username}.json")
for repo in repos[:10]: contribs = data.get("contributions") if data else None
lines.append(self.strings("repo_line").format(
stars=repo.get("stargazers_count", 0),
url=repo["html_url"],
name=repo["name"],
desc=repo.get("description") or self.strings("no_desc"),
lang=repo.get("language") or self.strings("not_specified"),
forks=repo.get("forks_count", 0),
))
await call.edit( if not isinstance(contribs, list):
text="".join(lines), return await message.edit(self.strings("no_contrib").format(username))
reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]]
)
async def _orgs(self, call: InlineCall, username: str):
orgs = await self.github_fetch(f"https://api.github.com/users/{username}/orgs")
if "message" in orgs:
await call.edit(self.strings("api_error").format(msg=orgs["message"]), reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]])
return
if not orgs:
await call.edit(self.strings("no_orgs"), reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]])
return
lines = [self.strings("orgs_header").format(username=username)]
for org in orgs:
lines.append(self.strings("org_line").format(
url=f"https://github.com/{org['login']}",
login=org["login"],
desc=org.get("description") or self.strings("no_desc"),
))
await call.edit(
text="".join(lines),
reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]]
)
async def _contrib(self, call: InlineCall, username: str):
data = await self.github_fetch(f"https://github-contributions-api.deno.dev/{username}.json", github_api=False)
if not data or not data.get("contributions"):
await call.edit(self.strings("no_contrib"), reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]])
return
raw_days = []
for week in data.get("contributions", []):
if isinstance(week, list):
raw_days.extend([day for day in week if isinstance(day, dict)])
today = datetime.utcnow().date() today = datetime.utcnow().date()
weeks_count = 53 start = today - timedelta(days=90)
days_back = weeks_count * 7 + 7 matrix = [["" for _ in range(13)] for _ in range(7)]
start = today - timedelta(days=days_back)
matrix = [["" for _ in range(weeks_count)] for _ in range(7)] for entry in contribs:
for entry in raw_days:
date_str = entry.get("date")
if not date_str:
continue
try: try:
date = datetime.strptime(date_str, "%Y-%m-%d").date() date = datetime.strptime(entry["date"], "%Y-%m-%d").date()
if date < start or date > today: if not (start <= date <= today):
continue continue
count = entry.get("contributionCount") or entry.get("count", 0) or 0 day = (date.weekday() + 1) % 7 # Sunday=0
if count > 0: week = (date - start).days // 7
day_idx = (date.weekday() + 1) % 7 if entry.get("contributionCount", 0) > 0:
week_idx = (date - start).days // 7 matrix[day][week] = "🟩"
if week_idx < weeks_count: except:
matrix[day_idx][week_idx] = "🟩"
except Exception:
continue continue
days_labels = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
graph = "\n".join(f"{days_labels[i]} {''.join(matrix[i])}" for i in range(7)) graph = "\n".join(f"{days[i]} {''.join(matrix[i])}" for i in range(7))
await call.edit( await message.edit(
text=self.strings("contrib_header").format(username=username) self.strings("contrib_header").format(username=username)
+ f"<pre>{graph}</pre>" + f"<pre>{graph}</pre>\n"
+ self.strings("contrib_footer"), + self.strings("contrib_footer")
reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]]
) )

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, auto, restart, heroku, hikka
from hikkatl.types import Message from hikkatl.types import Message
from .. import loader, utils from .. import loader, utils

View File

@@ -2,7 +2,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @PyModule # meta developer: @PyModule
# meta fhsdesc: fun, rp, rpgame
# requires: toml # requires: toml
import os import os
from hikka import loader, utils from hikka import loader, utils

View File

@@ -2,7 +2,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @PyModule # meta developer: @PyModule
# meta fhsdesc: tool, tools, lyrics, music
import requests import requests
from bs4 import BeautifulSoup, Tag, NavigableString from bs4 import BeautifulSoup, Tag, NavigableString
import re import re

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, minecraft, game
import aiohttp import aiohttp
import base64 import base64

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, in heroku
# requires: asyncio # requires: asyncio
from .. import loader, utils from .. import loader, utils

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, point, auto
from .. import loader, utils from .. import loader, utils

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, qr
from .. import loader, utils from .. import loader, utils
import requests import requests

View File

@@ -3,7 +3,6 @@
# scope: hikka_only # scope: hikka_only
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, random
from .. import loader, utils from .. import loader, utils
import random import random

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, test, speedtest
# requires: speedtest-cli # requires: speedtest-cli
import speedtest import speedtest

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, info, sysinfo, system
# requires: psutil # requires: psutil
from .. import loader, utils from .. import loader, utils

View File

@@ -11,7 +11,6 @@
# https://github.com/all-licenses/GNU-General-Public-License-v3.0 # https://github.com/all-licenses/GNU-General-Public-License-v3.0
# meta developer: @pymodule # meta developer: @pymodule
# meta fhsdesc: tool, tools, admin, tag, alltag, tagall
from .. import loader, utils from .. import loader, utils
from telethon.tl.types import ChannelParticipantsAdmins, UserStatusRecently, UserStatusOnline, Message from telethon.tl.types import ChannelParticipantsAdmins, UserStatusRecently, UserStatusOnline, Message

View File

@@ -5,7 +5,6 @@
# Name: UserParser # Name: UserParser
# Description: Данный модуль позволяет копировать ID, Username и Name участников чата при помощи команды .userpars # Description: Данный модуль позволяет копировать ID, Username и Name участников чата при помощи команды .userpars
# meta developer: @PyModule # meta developer: @PyModule
# meta fhsdesc: tool, tools, id, parser, userparser
from .. import loader, utils from .. import loader, utils
import json import json

View File

@@ -12,7 +12,6 @@
# meta developer: @pymodule # meta developer: @pymodule
# requires: aiohttp # requires: aiohttp
# meta fhsdesc: tool, tools, wiki, wikipedia, info, wikiinfo
from .. import loader, utils from .. import loader, utils
from ..inline.types import InlineQuery from ..inline.types import InlineQuery

View File

@@ -16173,8 +16173,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@PyModule", "developer": "@PyModule"
"fhsdesc": "tool, tools, lyrics, music"
}, },
"commands": [ "commands": [
{ {
@@ -16201,8 +16200,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, ai, username"
}, },
"commands": [ "commands": [
{ {
@@ -16229,8 +16227,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, random"
}, },
"commands": [ "commands": [
{ {
@@ -16257,8 +16254,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, ai, assistant"
}, },
"commands": [ "commands": [
{ {
@@ -16325,8 +16321,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, qr"
}, },
"commands": [ "commands": [
{ {
@@ -16353,8 +16348,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, minecraft, game"
}, },
"commands": [ "commands": [
{ {
@@ -16381,8 +16375,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, admin, tag, alltag, tagall"
}, },
"commands": [ "commands": [
{ {
@@ -16409,8 +16402,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, in heroku"
}, },
"commands": [ "commands": [
{ {
@@ -16437,8 +16429,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, user, profile"
}, },
"commands": [ "commands": [
{ {
@@ -16505,8 +16496,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@PyModule", "developer": "@PyModule"
"fhsdesc": "tool, tools, id, parser, userparser"
}, },
"commands": [ "commands": [
{ {
@@ -16543,8 +16533,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, point, auto"
}, },
"commands": [ "commands": [
{ {
@@ -16581,8 +16570,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, calculator, calc"
}, },
"commands": [ "commands": [
{ {
@@ -16609,8 +16597,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@PyModule", "developer": "@PyModule"
"fhsdesc": "tool, tools, channel, admintools, admin, admintool"
}, },
"commands": [ "commands": [
{ {
@@ -16667,8 +16654,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, phone, info"
}, },
"commands": [ "commands": [
{ {
@@ -16695,8 +16681,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@PyModule", "developer": "@PyModule"
"fhsdesc": "fun, rp, rpgame"
}, },
"commands": [ "commands": [
{ {
@@ -16773,8 +16758,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, auto, restart, heroku, hikka"
}, },
"commands": [ "commands": [
{ {
@@ -16811,8 +16795,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, wiki, wikipedia, info, wikiinfo"
}, },
"commands": [ "commands": [
{ {
@@ -16839,8 +16822,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "fun, cute, message, love"
}, },
"commands": [ "commands": [
{ {
@@ -16877,8 +16859,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, info, sysinfo, system"
}, },
"commands": [ "commands": [
{ {
@@ -16905,8 +16886,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, fun, packs"
}, },
"commands": [ "commands": [
{ {
@@ -16942,8 +16922,7 @@
"description": "Check host via check-host.net", "description": "Check host via check-host.net",
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null
"fhsdesc": "tool, tools, server, admin"
}, },
"commands": [ "commands": [
{ {
@@ -16970,8 +16949,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, scanner, domain"
}, },
"commands": [ "commands": [
{ {
@@ -16994,24 +16972,43 @@
}, },
"fiksofficial/python-modules/githubinfo.py": { "fiksofficial/python-modules/githubinfo.py": {
"name": "GitHubInfoMod", "name": "GitHubInfoMod",
"description": "GitHub user information", "description": "GitHub user info, recent activity and contribution graph",
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, github, info, inline"
}, },
"commands": [ "commands": [
{ {
"github": "{username without @} — GitHub user information {username без @} — Информация о GitHub пользователе" "gh": "Show GitHub user info Информация о пользователе GitHub"
},
{
"gha": "Show recent GitHub activity Последняя активность GitHub"
},
{
"ghc": "Show GitHub contribution graph Показать график контрибов GitHub"
} }
], ],
"new_commands": [ "new_commands": [
{ {
"github": { "gh": {
"ru_doc": "{username без @} — Информация о GitHub пользователе", "ru_doc": "Информация о пользователе GitHub",
"en_doc": null, "en_doc": null,
"doc": "{username without @} — GitHub user information" "doc": "Show GitHub user info"
}
},
{
"gha": {
"ru_doc": "Последняя активность GitHub",
"en_doc": null,
"doc": "Show recent GitHub activity"
}
},
{
"ghc": {
"ru_doc": "Показать график контрибов GitHub",
"en_doc": null,
"doc": "Show GitHub contribution graph"
} }
} }
], ],
@@ -17026,8 +17023,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@PyModule", "developer": "@PyModule"
"fhsdesc": "tool, tools, user, id"
}, },
"commands": [ "commands": [
{ {
@@ -17054,8 +17050,7 @@
"meta": { "meta": {
"pic": null, "pic": null,
"banner": null, "banner": null,
"developer": "@pymodule", "developer": "@pymodule"
"fhsdesc": "tool, tools, test, speedtest"
}, },
"commands": [ "commands": [
{ {

View File

@@ -1,192 +0,0 @@
{
"repositories": [
{
"url": "https://github.com/DziruModules/hikkamods",
"tags": []
},
{
"url": "https://github.com/kamolgks/Hikkamods",
"tags": []
},
{
"url": "https://github.com/thomasmod/hikkamods",
"tags": []
},
{
"url": "https://github.com/SkillsAngels/Modules",
"tags": []
},
{
"url": "https://github.com/Sad0ff/modules-ftg",
"tags": []
},
{
"url": "https://github.com/Yahikoro/Modules-for-FTG",
"tags": []
},
{
"url": "https://github.com/KeyZenD/modules",
"tags": []
},
{
"url": "https://github.com/AlpacaGang/ftg-modules",
"tags": []
},
{
"url": "https://github.com/trololo65/Modules",
"tags": []
},
{
"url": "https://github.com/Ijidishurka/modules",
"tags": []
},
{
"url": "https://github.com/Fl1yd/FTG-Modules",
"tags": []
},
{
"url": "https://github.com/D4n13l3k00/FTG-Modules",
"tags": []
},
{
"url": "https://github.com/iamnalinor/FTG-modules",
"tags": ["hikkatrusted", "nonactive"]
},
{
"url": "https://github.com/SekaiYoneya/modules",
"tags": []
},
{
"url": "https://github.com/GeekTG/FTG-Modules",
"tags": []
},
{
"url": "https://github.com/Den4ikSuperOstryyPer4ik/Astro-modules",
"tags": ["hikkatrusted", "herokutrusted"]
},
{
"url": "https://github.com/vsecoder/hikka_modules",
"tags": ["hikkatrusted", "herokutrusted"]
},
{
"url": "https://github.com/sqlmerr/hikka_mods",
"tags": ["hikkatrusted", "herokutrusted"]
},
{
"url": "https://github.com/N3rcy/modules",
"tags": ["hikkatrusted", "herokutrusted"]
},
{
"url": "https://github.com/KorenbZla/HikkaModules",
"tags": ["hikkatrusted", "herokutrusted"]
},
{
"url": "https://github.com/MuRuLOSE/HikkaModulesRepo",
"tags": []
},
{
"url": "https://github.com/coddrago/modules",
"tags": ["herokutrusted", "hikkatrusted"]
},
{
"url": "https://github.com/1jpshiro/hikka-modules",
"tags": []
},
{
"url": "https://github.com/MoriSummerz/ftg-mods",
"tags": ["hikkatrusted", "nonactive"]
},
{
"url": "https://github.com/anon97945/hikka-mods",
"tags": ["hikkatrusted", "nonactive"]
},
{
"url": "https://github.com/dorotorothequickend/DorotoroModules",
"tags": ["hikkatrusted", "nonlongermaintained"]
},
{
"url": "https://github.com/AmoreForever/amoremods",
"tags": []
},
{
"url": "https://github.com/idiotcoders/idiotmodules",
"tags": ["hikkatrusted", "herokutrusted", "nonactive"]
},
{
"url": "https://github.com/CakesTwix/Hikka-Modules",
"tags": ["hikkatrusted", "nonactive"]
},
{
"url": "https://github.com/archquise/H.Modules",
"tags": ["hikkatrusted", "nonactive"]
},
{
"url": "https://github.com/GD-alt/mm-hikka-mods",
"tags": ["hikkatrusted", "herokutrusted", "nonactive"]
},
{
"url": "https://github.com/HitaloSama/FTG-modules-repo",
"tags": []
},
{
"url": "https://github.com/SekaiYoneya/Friendly-telegram",
"tags": []
},
{
"url": "https://github.com/blazedzn/ftg-modules",
"tags": []
},
{
"url": "https://github.com/hikariatama/ftg",
"tags": ["hikkatrusted", "nonactive"]
},
{
"url": "https://github.com/m4xx1m/FTG",
"tags": []
},
{
"url": "https://github.com/skillzmeow/skillzmods_hikka",
"tags": []
},
{
"url": "https://github.com/fajox1/famods",
"tags": ["hikkatrusted", "herokutrusted"]
},
{
"url": "https://github.com/TheKsenon/MyHikkaModules",
"tags": ["hikkatrusted", "herokutrusted"]
},
{
"url": "https://github.com/cryptexctl/modules-mirror",
"tags": []
},
{
"url": "https://github.com/Ruslan-Isaev/modules",
"tags": ["herokutrusted"]
},
{
"url": "https://github.com/shadowhikka/sh.modules",
"tags": []
},
{
"url": "https://github.com/fiksofficial/python-modules",
"tags": ["herokutrusted"]
},
{
"url": "https://github.com/mead0wsss/mead0wsMods",
"tags": ["herokutrusted"]
},
{
"url": "https://github.com/SenkoGuardian/SenModules",
"tags": ["herokutrusted"]
},
{
"url": "https://github.com/ZetGoHack/nullmod",
"tags": ["herokutrusted"]
},
{
"url": "https://github.com/yummy1gay/limoka",
"tags": []
}
]
}

20
trusted.json Normal file
View File

@@ -0,0 +1,20 @@
{
"trusted": [
"iamnalinor/FTG-modules",
"vsecoder/hikka_modules",
"sqlmerr/hikka_mods",
"N3rcy/modules",
"KorenbZla/HikkaModules",
"coddrago/modules",
"MoriSummerz/ftg-mods",
"anon97945/hikka-mods",
"dorotorothequickend/DorotoroModules",
"idiotcoders/idiotmodules",
"C0dwiz/H.Modules",
"GD-alt/mm-hikka-mods",
"hikariatama/ftg",
"fajox1/famods",
"TheKsenon/MyHikkaModules",
"Den4ikSuperOstryyPer4ik/Astro-modules"
]
}