Compare commits

..

6 Commits

Author SHA1 Message Date
d48c269916 cooking update... 2026-01-27 19:15:25 +03:00
Macsim
8f52e0c18c Merge pull request #166 from MuRuLOSE:update-submodules_7cb3c70695a897525680a149b0a9e66c751ded33
Update of repositories 2026-01-27 01:19:05
2026-01-27 13:15:07 +03:00
github-actions[bot]
ae00dc0199 Updated modules.json after parse 2026-01-27 01:18:43 2026-01-27 01:18:43 +00:00
github-actions[bot]
c670c44a7a Added and updated repositories 2026-01-27 01:17:35 2026-01-27 01:17:36 +00:00
7cb3c70695 not needed anymore 2026-01-11 19:49:49 +03:00
8a98c79856 Added parsing repositories links from JSON file and removed static list from script 2026-01-11 13:29:58 +03:00
36 changed files with 1754 additions and 251 deletions

View File

@@ -3,58 +3,18 @@ import shutil
import subprocess import subprocess
import re import re
import requests import requests
import json
repos = [ def parse_repos(file_path: str) -> list:
"https://github.com/DziruModules/hikkamods", """Parse repository URLs from a given json file."""
"https://github.com/kamolgks/Hikkamods", repos = []
"https://github.com/thomasmod/hikkamods", with open(file_path, "r", encoding="utf-8") as f:
"https://github.com/SkillsAngels/Modules", data = json.load(f)
"https://github.com/Sad0ff/modules-ftg", for repo in data.get("repositories", []):
"https://github.com/Yahikoro/Modules-for-FTG", repos.append(repo["url"])
"https://github.com/KeyZenD/modules", return repos
"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."""

1067
coddrago/modules/YaMusic.py Normal file

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -1,4 +1,5 @@
# 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
@@ -113,15 +114,8 @@ class TagWatcher(loader.Module):
validator=loader.validators.Boolean(), validator=loader.validators.Boolean(),
), ),
) )
async def client_ready(self): async def client_ready(self):
await self.request_join("@xdesai_modules", self.strings["request_join_reason"]) self.asset_channel = self._db.get("heroku.forums", "channel_id", 0)
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,
@@ -130,6 +124,10 @@ 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"]:
@@ -174,7 +172,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(

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -11,6 +11,7 @@
# 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,6 +11,7 @@
# 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,6 +2,7 @@
# 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,6 +11,7 @@
# 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,7 +1,8 @@
# На модуль распространяется лицензия "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,3 +1,4 @@
# 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,6 +11,7 @@
# 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,6 +11,7 @@
# 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,6 +11,7 @@
# 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,6 +3,7 @@
# 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,6 +2,7 @@
# 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,183 +11,459 @@
# 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 json import asyncio
import re
import urllib.request import urllib.request
import json
from datetime import datetime, timedelta from datetime import datetime, timedelta
@loader.tds @loader.tds
class GitHubInfoMod(loader.Module): class GitHubInfoMod(loader.Module):
"""GitHub user info, recent activity and contribution graph""" """GitHub user information"""
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>",
"profile": "Profile", "api_error": "⚠ GitHub API error: <b>{msg}</b>",
"no_activity": "🕸 No recent activity from <b>{}</b>", "no_activity": "🕸 No recent activity from <b>{}</b>",
"no_contrib": "📭 No contribution data for <b>{}</b>", "no_contrib": "📭 No contribution data.",
"info_text": ( "no_repos": "📭 No public repositories.",
"👤 <b>{name}</b> | <a href=\"{url}\">{profile}</a>\n" "no_orgs": "📭 Not a member of any organizations.",
"🏢 {company} | 📍 {location}\n" "no_title": "No title",
"📝 {bio}\n\n" "no_desc": "No description",
"📦 Repos: <b>{repos}</b> | " "not_specified": "Not specified",
"👥 Followers: <b>{followers}</b> | " "more_commits": " ... and {} more\n",
"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>" "🕐 Created: <code>{created}</code>\n"
"🕐 Updated: <code>{updated}</code>"
), ),
"activity_header": "<b>Recent activity:</b>\n",
"activity_commit": "🔨 {count} commit(s) → <code>{branch}</code> in {repo}", "activity_header": "<b>Recent activity</b> <a href=\"https://github.com/{username}\">{username}</a>\n\n",
"activity_create": "✨ Created {ref_type} in {repo}",
"activity_pr": "🔄 {action} PR: {title}", "push_header": "🔨 Pushed to <code>{branch}</code> → <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"activity_issue": "{action} issue: {title}", "push_no_commits": "🔨 Pushed (no details) to <code>{branch}</code> → <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"activity_star": "⭐ Starred {repo}", "commit_line": "• <a href=\"{url}\"><code>{sha}</code></a>: {message}\n",
"activity_fork": "⑂ Forked to {fork}",
"activity_other": "{event} in {repo}", "create_branch": "✨ Created branch <code>{ref}</code> in <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"contrib_header": "<b>Contribution graph</b> for <a href=\"https://github.com/{username}\">{username}</a>:\n", "create_tag": "✨ Created tag <code>{ref}</code> in <a href=\"https://github.com/{repo}/releases/tag/{ref}\">{repo}</a>\n",
"contrib_footer": "⬛ = 0, 🟩 = 1+ contributions", "create_repo": "✨ Created repository <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"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 = {
"no_username": "❗ Укажи имя пользователя GitHub.", "_cls_doc": "Информация о GitHub-пользователе",
"no_username": "❗ Укажи GitHub username.",
"user_not_found": "🚫 Пользователь не найден: <b>{}</b>", "user_not_found": "🚫 Пользователь не найден: <b>{}</b>",
"profile": "Профиль", "api_error": "⚠ Ошибка GitHub API: <b>{msg}</b>",
"no_activity": "🕸 Нет активности у <b>{}</b>", "no_activity": "🕸 Нет недавней активности у <b>{}</b>",
"no_contrib": "📭 Нет данных о вкладах <b>{}</b>", "no_contrib": "📭 Нет данных о контрибуциях.",
"info_text": ( "no_repos": "📭 Нет публичных репозиториев.",
"👤 <b>{name}</b> | <a href=\"{url}\">{profile}</a>\n" "no_orgs": "📭 Не состоит в организациях.",
"🏢 {company} | 📍 {location}\n" "no_title": "Без названия",
"📝 {bio}\n\n" "no_desc": "Без описания",
"📦 Репозитории: <b>{repos}</b> | " "not_specified": "Не указано",
"👥 Подписчики: <b>{followers}</b> | " "more_commits": " ... и ещё {}\n",
"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>" "🕐 Создан: <code>{created}</code>\n"
"🕐 Обновлён: <code>{updated}</code>"
), ),
"activity_header": "<b>Последняя активность:</b>\n",
"activity_commit": "🔨 {count} коммит(ов) → <code>{branch}</code> в {repo}", "activity_header": "<b>Последняя активность</b> <a href=\"https://github.com/{username}\">{username}</a>\n\n",
"activity_create": "✨ Создан {ref_type} в {repo}",
"activity_pr": "🔄 {action} PR: {title}", "push_header": "🔨 Запушил в <code>{branch}</code> → <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"activity_issue": "{action} issue: {title}", "push_no_commits": "🔨 Запушил (без деталей) в <code>{branch}</code> → <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"activity_star": "В избранное {repo}", "commit_line": "• <a href=\"{url}\"><code>{sha}</code></a>: {message}\n",
"activity_fork": "⑂ Форк в {fork}",
"activity_other": "{event} в {repo}", "create_branch": "✨ Создал ветку <code>{ref}</code> в <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"contrib_header": "<b>График активности</b> <a href=\"https://github.com/{username}\">{username}</a>:\n", "create_tag": "✨ Создал тег <code>{ref}</code> в <a href=\"https://github.com/{repo}/releases/tag/{ref}\">{repo}</a>\n",
"contrib_footer": "⬛ = 0, 🟩 = 1+ контрибуций", "create_repo": "✨ Создал репозиторий <a href=\"https://github.com/{repo}\">{repo}</a>\n",
"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__)
def github_api(self, url): async def github_fetch(self, url, github_api=True):
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(url) as resp: with urllib.request.urlopen(req, timeout=15) as resp:
return json.loads(resp.read().decode()) raw = resp.read().decode("utf-8")
return json.loads(raw) if raw else {}
except Exception as e: except Exception as e:
self.logger.warning(f"[GitHub API] {e}") self.logger.error(f"[GitHub] {e}")
return None return {"message": str(e)}
def get_username(self, message): @loader.command(ru_doc="{username без @} — Информация о GitHub пользователе")
args = message.text.split(maxsplit=1) async def github(self, message):
return args[1] if len(args) > 1 else None """{username without @} — GitHub user information"""
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:
return await message.edit(self.strings("no_username")) await utils.answer(message, self.strings("no_username"))
return
data = self.github_api(f"https://api.github.com/users/{username}") user_data = await self.github_fetch(f"https://api.github.com/users/{username}")
if not data: if "message" in user_data:
return await message.edit(self.strings("user_not_found").format(username)) await utils.answer(message, self.strings("user_not_found").format(username))
return
await message.edit(self.strings("info_text").format( hireable = self.strings("hireable_yes") if user_data.get("hireable") else self.strings("hireable_no")
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]
))
@loader.command(doc="Show recent GitHub activity", ru_doc="Последняя активность GitHub") profile_text = (
async def gha(self, message): self.strings("profile_header").format(url=user_data["html_url"], username=username)
"""Show recent GitHub activity""" + self.strings("profile_text").format(
username = self.get_username(message) name=user_data.get("name") or self.strings("not_specified"),
if not username: login=username,
return await message.edit(self.strings("no_username")) bio=user_data.get("bio") or self.strings("no_desc"),
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")
)
events = self.github_api(f"https://api.github.com/users/{username}/events?per_page=5") await self.inline.form(
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:
return await message.edit(self.strings("no_activity").format(username)) await call.edit(self.strings("no_activity").format(username=username), reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]])
return
lines = [] lines = [self.strings("activity_header").format(username=username)]
for event in events: seen_repos = set()
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 = re.sub(r"refs/heads/", "", payload.get("ref", "main")) branch = payload.get("ref", "refs/heads/main").replace("refs/heads/", "")
count = len(payload.get("commits", [])) commits = 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":
lines.append(self.strings("activity_create").format(ref_type=payload.get("ref_type"), repo=repo)) ref_type = payload.get("ref_type")
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", {})
lines.append(self.strings("activity_pr").format(action=payload.get("action"), title=pr.get("title"))) number = pr.get("number", "?")
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", {})
lines.append(self.strings("activity_issue").format(action=payload.get("action"), title=issue.get("title"))) number = issue.get("number", "?")
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("activity_star").format(repo=repo)) lines.append(self.strings("star").format(repo=repo))
elif etype == "ForkEvent": elif etype == "ForkEvent":
lines.append(self.strings("activity_fork").format(fork=payload.get("forkee", {}).get("full_name"))) fork = payload.get("forkee", {}).get("full_name", "unknown")
lines.append(self.strings("fork").format(fork=fork))
else: else:
lines.append(self.strings("activity_other").format(event=etype, repo=repo)) event_name = etype.replace("Event", "")
lines.append(self.strings("other").format(event=event_name, repo=repo))
await message.edit(self.strings("activity_header") + "\n".join(lines)) await call.edit(
text="".join(lines),
reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]]
)
@loader.command(doc="Show GitHub contribution graph", ru_doc="Показать график контрибов GitHub") async def _repos(self, call: InlineCall, username: str):
async def ghc(self, message): repos = await self.github_fetch(f"https://api.github.com/users/{username}/repos?sort=stars&per_page=10")
"""Show GitHub contribution graph""" if "message" in repos:
username = self.get_username(message) await call.edit(self.strings("api_error").format(msg=repos["message"]), reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]])
if not username: return
return await message.edit(self.strings("no_username")) if not repos:
await call.edit(self.strings("no_repos"), reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]])
return
data = self.github_api(f"https://github-contributions-api.deno.dev/{username}.json") lines = [self.strings("repos_header").format(username=username)]
contribs = data.get("contributions") if data else None for repo in repos[:10]:
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),
))
if not isinstance(contribs, list): await call.edit(
return await message.edit(self.strings("no_contrib").format(username)) text="".join(lines),
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()
start = today - timedelta(days=90) weeks_count = 53
matrix = [["" for _ in range(13)] for _ in range(7)] days_back = weeks_count * 7 + 7
start = today - timedelta(days=days_back)
for entry in contribs: matrix = [["" for _ in range(weeks_count)] for _ in range(7)]
for entry in raw_days:
date_str = entry.get("date")
if not date_str:
continue
try: try:
date = datetime.strptime(entry["date"], "%Y-%m-%d").date() date = datetime.strptime(date_str, "%Y-%m-%d").date()
if not (start <= date <= today): if date < start or date > today:
continue continue
day = (date.weekday() + 1) % 7 # Sunday=0 count = entry.get("contributionCount") or entry.get("count", 0) or 0
week = (date - start).days // 7 if count > 0:
if entry.get("contributionCount", 0) > 0: day_idx = (date.weekday() + 1) % 7
matrix[day][week] = "🟩" week_idx = (date - start).days // 7
except: if week_idx < weeks_count:
matrix[day_idx][week_idx] = "🟩"
except Exception:
continue continue
days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] days_labels = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
graph = "\n".join(f"{days[i]} {''.join(matrix[i])}" for i in range(7)) graph = "\n".join(f"{days_labels[i]} {''.join(matrix[i])}" for i in range(7))
await message.edit( await call.edit(
self.strings("contrib_header").format(username=username) text=self.strings("contrib_header").format(username=username)
+ f"<pre>{graph}</pre>\n" + f"<pre>{graph}</pre>"
+ self.strings("contrib_footer") + self.strings("contrib_footer"),
reply_markup=[[{"text": self.strings("btn_back"), "callback": self._profile, "args": (username,)}]]
) )

View File

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

192
repositories.json Normal file
View File

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

View File

@@ -1,20 +0,0 @@
{
"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"
]
}