Beta MultiLang Almost Stable (#28)

This commit is contained in:
yasirarism 2023-04-03 09:32:26 +07:00 committed by GitHub
parent 83b04d76b5
commit 218db3f06f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 409 additions and 148 deletions

View file

@ -1,5 +1,6 @@
{ {
"no_question": "Please use command <code>/{cmd} [question]</code> to ask your question.", "no_question": "Please use command <code>/{cmd} [question]</code> to ask your question.",
"find_answers_str": "Wait a moment looking for your answer..", "find_answers_str": "Wait a moment looking for your answer..",
"dont_spam": "Don't spam please, please wait {tm} second or i will ban you from this bot.",
"answers_too_long": "Question for your answer has exceeded TG text limit, check this link to view.\n\n{answerlink}" "answers_too_long": "Question for your answer has exceeded TG text limit, check this link to view.\n\n{answerlink}"
} }

View file

@ -0,0 +1,16 @@
{
"sub_extr_help": "Please use command /{cmd} [link] to check subtitles or audio in video file.",
"conv_sub_help": "Use command /{cmd} by reply to .ass or .vtt file, to convert subtitle from .ass or .vtt to srt.",
"progress_str": "⏳ Processing your request..",
"convert_str": "⏳ Converting...",
"val_sec": " second",
"unauth_cb": "⚠️ Access Denied!",
"cancel_btn": "❌ Cancel",
"invalid_cb": "⚠️ DONT DELETE YOUR MESSAGE!",
"up_str": "Uploading files..",
"press_btn_msg": "Press the button below to extract subtitles/audio. Only support direct link at this time.\nProcessed in {timelog}",
"fail_extr_media": "Failed extract media, make sure your link is not protected by WAF or maybe inaccessible for bot.",
"fail_extr_sub": "Failed extract sub, Maybe unsupported format..\n\nLink: {link}\nERR: {e}",
"capt_extr_sub": "<b>Filename:</b> <code>{nf}</code>\n\nExtracted by @{bot} in {timelog}",
"capt_conv_sub": "<code>{nf}.srt</code>\n\nConverted by @{bot}"
}

View file

@ -1,5 +1,6 @@
{ {
"no_question": "Harap gunakan perintah <code>/{cmd} [question]</code> untuk mengajukan pertanyaan Anda menggunakan OpenAI.", "no_question": "Harap gunakan perintah <code>/{cmd} [question]</code> untuk mengajukan pertanyaan Anda menggunakan OpenAI.",
"find_answers_str": "Sedang mencari jawaban terbaik buat Anda..", "find_answers_str": "Sedang mencari jawaban terbaik buat Anda..",
"dont_spam": "Tolong jangan melakukan spam, harap tunggu {tm} detik atau saya akan membanned Anda dari bot ini.",
"answers_too_long": "Pertanyaan untuk jawaban Anda telah melampaui batas teks TG, periksa tautan ini untuk melihatnya.\n\n{answerlink}" "answers_too_long": "Pertanyaan untuk jawaban Anda telah melampaui batas teks TG, periksa tautan ini untuk melihatnya.\n\n{answerlink}"
} }

View file

@ -0,0 +1,16 @@
{
"sub_extr_help": "Harap gunakan perintah /{cmd} [tautan] untuk memeriksa teks film atau audio dalam berkas video.",
"conv_sub_help": "Gunakan perintah /{cmd} dengan membalas berkas .ass atau .vtt, untuk mengonversi teks film dari .ass atau .vtt ke srt.",
"progress_str": "⏳ Memproses permintaan Anda..",
"convert_str": "⏳ Mengonversi...",
"val_sec": " detik",
"unauth_cb": "⚠️ Akses Ditolak!",
"batal_btn": "❌ Batal",
"invalid_cb": "⚠️ JANGAN HAPUS PESAN ANDA!",
"up_str": "Mengunggah berkas..",
"press_btn_msg": "Tekan tombol di bawah untuk mengekstrak teks/audio. Saat ini hanya mendukung tautan langsung.\nDiproses dalam {timelog}",
"fail_extr_media": "Gagal mengekstrak media, pastikan tautan Anda tidak dilindungi oleh WAF atau mungkin tidak dapat diakses oleh bot.",
"fail_extr_sub": "Sub ekstrak gagal, Mungkin formatnya tidak didukung..\n\nTautan: {link}\nERR: {e}",
"capt_extr_sub": "<b>Nama file:</b> <kode>{nf}</code>\n\nDiekstrak oleh @{bot} dalam {timelog}",
"capt_conv_sub": "<code>{nf}.srt</code>\n\nDikonversi oleh @{bot}"
}

View file

@ -1,5 +1,6 @@
{ {
"no_question": "Tulung gunakake printah <code>/{cmd} [pitakon]</code> kanggo takon nganggo fitur OpenAI.", "no_question": "Tulung gunakake printah <code>/{cmd} [pitakon]</code> kanggo takon nganggo fitur OpenAI.",
"find_answers_str": "Lagi goleki jawaban paling apik kanggo sampeyan..", "find_answers_str": "Lagi goleki jawaban paling apik kanggo sampeyan..",
"dont_spam": "Aja spam, mangga ngenteni {tm} detik utawa aku bakal nglarang sampeyan saka bot iki.",
"answers_too_long": "Pitakonan kanggo jawaban sampeyan wis ngluwihi wates teks TG, priksa pranala iki kanggo ndeleng.\n\n{answerlink}" "answers_too_long": "Pitakonan kanggo jawaban sampeyan wis ngluwihi wates teks TG, priksa pranala iki kanggo ndeleng.\n\n{answerlink}"
} }

View file

@ -0,0 +1,16 @@
{
"sub_extr_help": "Gunakake printah /{cmd} [link] kanggo mriksa subtitle utawa audio ing file video.",
"conv_sub_help": "Gunakake printah /{cmd} kanthi mbales berkas .ass utawa .vtt, kanggo ngowahi subtitle saka .ass utawa .vtt dadi srt.",
"progress_str": "⏳ Ngolah panjalukmu..",
"convert_str": "⏳ Ngonversi...",
"val_sec": "Kapindho",
"unauth_cb": "⚠️ Akses Ditolak!",
"cancel_btn": "❌ Batal",
"invalid_cb": "⚠️ AJA Mbusak PESAN!",
"up_str": "Ngunggahaké berkas..",
"press_btn_msg": "Pencet tombol ing ngisor iki kanggo ngekstrak subtitle/audio. Mung ndhukung link langsung saiki.\nDiproses ing {timelog}",
"fail_extr_media": "Media ekstrak sing gagal, priksa manawa pranala sampeyan ora direksa WAF utawa ora bisa diakses kanggo bot.",
"fail_extr_sub": "Gagal ekstrak sub, Mungkin format ora didhukung..\n\nLink: {link}\nERR: {e}",
"capt_extr_sub": "<b>Jeneng berkas:</b> <kode>{nf}</code>\n\nDiekstrak saka @{bot} ing {timelog}",
"capt_conv_sub": "<kode>{nf}.srt</code>\n\nDiowahi dening @{bot}"
}

View file

@ -18,6 +18,7 @@ handler = handlers.RotatingFileHandler("MissKatyLogs.txt", maxBytes=1024 * 1024)
handler.setLevel(INFO) handler.setLevel(INFO)
logger.addHandler(handler) logger.addHandler(handler)
getLogger("pyrogram").setLevel(ERROR) getLogger("pyrogram").setLevel(ERROR)
getLogger("openai").setLevel(ERROR)
MOD_LOAD = [] MOD_LOAD = []
MOD_NOLOAD = ["subscene_dl"] MOD_NOLOAD = ["subscene_dl"]
@ -47,11 +48,9 @@ scheduler = AsyncIOScheduler(jobstores=jobstores, timezone=TZ)
app.start() app.start()
user.start() user.start()
bot = app.get_me() BOT_ID = app.id
ubot = user.get_me() BOT_NAME = app.first_name
BOT_ID = bot.id BOT_USERNAME = app.username
BOT_NAME = bot.first_name UBOT_ID = user.id
BOT_USERNAME = bot.username UBOT_NAME = user.first_name
UBOT_ID = ubot.id UBOT_USERNAME = user.username
UBOT_NAME = ubot.first_name
UBOT_USERNAME = ubot.username

View file

@ -39,6 +39,7 @@ async def member_permissions(chat_id: int, user_id: int):
perms.append("can_manage_video_chats") perms.append("can_manage_video_chats")
return perms return perms
async def check_perms( async def check_perms(
message: Union[CallbackQuery, Message], message: Union[CallbackQuery, Message],
permissions: Optional[Union[list, str]], permissions: Optional[Union[list, str]],
@ -67,20 +68,52 @@ async def check_perms(
if isinstance(permissions, str): if isinstance(permissions, str):
permissions = [permissions] permissions = [permissions]
missing_perms = [ missing_perms = [permission for permission in permissions if not getattr(user.privileges, permission)]
permission
for permission in permissions
if not getattr(user.privileges, permission)
]
if not missing_perms: if not missing_perms:
return True return True
if complain_missing_perms: if complain_missing_perms:
await sender( await sender(strings("no_permission_error").format(permissions=", ".join(missing_perms)))
strings("no_permission_error").format(permissions=", ".join(missing_perms))
)
return False return False
async def check_perms(
message: Union[CallbackQuery, Message],
permissions: Optional[Union[list, str]],
complain_missing_perms: bool,
strings,
) -> bool:
if isinstance(message, CallbackQuery):
sender = partial(message.answer, show_alert=True)
chat = message.message.chat
else:
sender = message.reply_text
chat = message.chat
# TODO: Cache all admin permissions in db.
user = await chat.get_member(message.from_user.id)
if user.status == enums.ChatMemberStatus.OWNER:
return True
# No permissions specified, accept being an admin.
if not permissions and user.status == enums.ChatMemberStatus.ADMINISTRATOR:
return True
if user.status != enums.ChatMemberStatus.ADMINISTRATOR:
if complain_missing_perms:
await sender(strings("no_admin_error"))
return False
if isinstance(permissions, str):
permissions = [permissions]
missing_perms = [permission for permission in permissions if not getattr(user.privileges, permission)]
if not missing_perms:
return True
if complain_missing_perms:
await sender(strings("no_permission_error").format(permissions=", ".join(missing_perms)))
return False
async def check_perms( async def check_perms(
message: Union[CallbackQuery, Message], message: Union[CallbackQuery, Message],
permissions: Optional[Union[list, str]], permissions: Optional[Union[list, str]],
@ -189,6 +222,7 @@ def adminsOnly(permission):
return subFunc return subFunc
def require_admin( def require_admin(
permissions: Union[list, str] = None, permissions: Union[list, str] = None,
allow_in_private: bool = False, allow_in_private: bool = False,

View file

@ -5,7 +5,7 @@ from time import time
from pyrogram import enums, filters from pyrogram import enums, filters
from pyrogram.errors import ChatAdminRequired, FloodWait from pyrogram.errors import ChatAdminRequired, FloodWait
from pyrogram.types import ChatPermissions, ChatPrivileges from pyrogram.types import ChatPermissions
from database.warn_db import add_warn, get_warn, remove_warns from database.warn_db import add_warn, get_warn, remove_warns
from misskaty import app from misskaty import app

View file

@ -420,4 +420,4 @@ async def chat_watcher_func(client, message, strings):
try: try:
await put_cleanmode(message.chat.id, send.id) await put_cleanmode(message.chat.id, send.id)
except: except:
pass pass

222
misskaty/plugins/anime.py Normal file
View file

@ -0,0 +1,222 @@
import json
from calendar import month_name
import aiohttp
from pyrogram import filters
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from misskaty import app
from misskaty.helper.human_read import get_readable_time
from misskaty.vars import COMMAND_HANDLER
anime_query = """
query ($id: Int, $idMal: Int, $search: String) {
Media(id: $id, idMal: $idMal, type: ANIME, search: $search) {
id
idMal
title {
romaji
english
native
}
type
format
status(version: 2)
description(asHtml: true)
startDate {
year
month
day
}
endDate {
year
month
day
}
season
seasonYear
episodes
duration
chapters
volumes
countryOfOrigin
source
hashtag
trailer {
id
site
thumbnail
}
updatedAt
coverImage {
large
}
bannerImage
genres
synonyms
averageScore
meanScore
popularity
trending
favourites
tags {
name
description
rank
}
relations {
edges {
node {
id
title {
romaji
english
native
}
format
status
source
averageScore
siteUrl
}
relationType
}
}
characters {
edges {
role
node {
name {
full
native
}
siteUrl
}
}
}
studios {
nodes {
name
siteUrl
}
}
isAdult
nextAiringEpisode {
airingAt
timeUntilAiring
episode
}
airingSchedule {
edges {
node {
airingAt
timeUntilAiring
episode
}
}
}
externalLinks {
url
site
}
rankings {
rank
year
context
}
reviews {
nodes {
summary
rating
score
siteUrl
user {
name
}
}
}
siteUrl
}
}
"""
async def get_anime(title):
async with aiohttp.ClientSession() as sesi:
r = await sesi.post("https://graphql.anilist.co", json={"query": anime_query, "variables": title})
return await r.read()
def shorten(description, info="anilist.co"):
ms_g = ""
if len(description) > 700:
description = f"{description[:500]}...."
ms_g += f'\n<strong>Description:</strong> <em>{description}</em><a href="{info}">More info</a>'
else:
ms_g += f"\n<strong>Description:</strong> <em>{description}</em>"
return ms_g.replace("<br>", "").replace("</br>", "").replace("<i>", "").replace("</i>", "")
@app.on_message(filters.command("anime", COMMAND_HANDLER))
async def anime_search(_, mesg):
search = mesg.text.split(" ", 1)
reply = await mesg.reply("⏳ <i>Please wait ...</i>", quote=True)
if len(search) == 1:
return await reply.edit("⚠️ <b>Give Anime name please.</b>")
else:
search = search[1]
variables = {"search": search}
if not (res := json.loads(await get_anime(variables))["data"].get("Media", None)):
return await reply.edit("💢 No Resource Anime found! [404]")
# LOGGER.info(json.dumps(res, indent=3)) # For Debug JSON
durasi = get_readable_time(int(res.get("duration") * 60)) if res.get("duration") is not None else "0"
msg = f"<b>{res['title']['romaji']}</b> (<code>{res['title']['native']}</code>)\n<b>Type</b>: {res['format']}\n<b>Status</b>: {res['status']}\n<b>Episodes</b>: {res.get('episodes', 'N/A')}\n<b>Duration </b>: {durasi} Per Eps.\n<b>Score</b>: {res['averageScore']}%\n<b>Category</b>: <code>"
for x in res["genres"]:
msg += f"{x}, "
msg = msg[:-2] + "</code>\n"
try:
sd = res["startDate"]
startdate = str(f"{month_name[sd['month']]} {sd['day']}, {sd['year']}")
except:
startdate = "-"
msg += f"<b>Start date</b>: <code>{startdate}</code>\n"
try:
ed = res["endDate"]
enddate = str(f"{month_name[ed['month']]} {ed['day']}, {ed['year']}")
except:
enddate = "-"
msg += f"<b>End date</b>: <code>{enddate}</code>\n"
msg += "<b>Studios</b>: <code>"
for x in res["studios"]["nodes"]:
msg += f"{x['name']}, "
msg = msg[:-2] + "</code>\n"
info = res.get("siteUrl")
trailer = res.get("trailer", None)
if trailer:
trailer_id = trailer.get("id", None)
site = trailer.get("site", None)
if site == "youtube":
trailer = f"https://youtu.be/{trailer_id}"
description = res.get("description").replace("<i>", "").replace("</i>", "").replace("<br>", "") if res.get("description") is not None else "N/A"
msg += shorten(description, info)
image = info.replace("anilist.co/anime/", "img.anili.st/media/")
btn = (
[
[
InlineKeyboardButton("More info", url=info),
InlineKeyboardButton("Trailer 🎬", url=trailer),
]
]
if trailer
else [[InlineKeyboardButton("More info", url=info)]]
)
if image:
try:
await mesg.reply_photo(image, caption=msg, reply_markup=InlineKeyboardMarkup(btn))
except:
msg += f" [〽️]({image})"
await reply.edit(msg)
else:
await reply.edit(msg)
await reply.delete()

View file

@ -39,6 +39,7 @@ Credit: <a href='https://github.com/sanjit-sinha/PyBypass'>PyBypass</a>
# Stopped development for this plugin since always changed time by time. # Stopped development for this plugin since always changed time by time.
async def pling_bypass(url): async def pling_bypass(url):
try: try:
id_url = re.search(r"https?://(store.kde.org|www.pling.com)\/p\/(\d+)", url)[2] id_url = re.search(r"https?://(store.kde.org|www.pling.com)\/p\/(\d+)", url)[2]

View file

@ -1,12 +1,16 @@
import openai
from aiohttp import ClientSession
from pyrogram import filters from pyrogram import filters
from pyrogram.errors import MessageTooLong from pyrogram.errors import MessageTooLong
from misskaty import app from misskaty import app
from misskaty.helper.localization import use_chat_lang from misskaty.helper.localization import use_chat_lang
from misskaty.helper import http, post_to_telegraph from misskaty.helper import post_to_telegraph, check_time_gap
from misskaty.core.message_utils import * from misskaty.core.message_utils import *
from misskaty.core.decorator.ratelimiter import ratelimiter from misskaty.core.decorator.ratelimiter import ratelimiter
from misskaty.vars import COMMAND_HANDLER, OPENAI_API from misskaty.vars import COMMAND_HANDLER, OPENAI_API, SUDO
openai.api_key = OPENAI_API
@app.on_message(filters.command("ask", COMMAND_HANDLER)) @app.on_message(filters.command("ask", COMMAND_HANDLER))
@ -15,28 +19,26 @@ from misskaty.vars import COMMAND_HANDLER, OPENAI_API
async def chatbot(c, m, strings): async def chatbot(c, m, strings):
if len(m.command) == 1: if len(m.command) == 1:
return await kirimPesan(m, strings("no_question").format(cmd=m.command[0]), quote=True) return await kirimPesan(m, strings("no_question").format(cmd=m.command[0]), quote=True)
is_in_gap, sleep_time = await check_time_gap(m.from_user.id or m.sender_chat.id)
if is_in_gap and (m.from_user.id or m.sender_chat.id not in SUDO):
return await kirimPesan(m, strings("dont_spam"))
openai.aiosession.set(ClientSession())
pertanyaan = m.text.split(" ", maxsplit=1)[1] pertanyaan = m.text.split(" ", maxsplit=1)[1]
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {OPENAI_API}",
}
json_data = {
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": pertanyaan,
},
],
}
msg = await kirimPesan(m, strings("find_answers_str"), quote=True) msg = await kirimPesan(m, strings("find_answers_str"), quote=True)
num = 0
answer = ""
try: try:
response = (await http.post("https://api.openai.com/v1/chat/completions", headers=headers, json=json_data)).json() response = await openai.ChatCompletion.acreate(model="gpt-3.5-turbo", messages=[{"role": "user", "content": pertanyaan}], temperature=0.2, stream=True)
if err := response.get("error"): async for chunk in response:
return await editPesan(msg, err["message"]) if not chunk.choices[0].delta or chunk.choices[0].delta.get("role"):
answer = response["choices"][0]["message"]["content"] continue
await editPesan(msg, answer) num += 1
answer += chunk.choices[0].delta.content
if num == 30:
await editPesan(msg, answer)
await asyncio.sleep(1.5)
num = 0
await openai.aiosession.get().close()
except MessageTooLong: except MessageTooLong:
answerlink = await post_to_telegraph(False, "MissKaty ChatBot ", answer) answerlink = await post_to_telegraph(False, "MissKaty ChatBot ", answer)
await editPesan(msg, strings("answers_too_long").format(answerlink=answerlink), disable_web_page_preview=True) await editPesan(msg, strings("answers_too_long").format(answerlink=answerlink), disable_web_page_preview=True)

View file

@ -207,7 +207,7 @@ async def evaluation_cmd_t(_, m, strings):
else: else:
evaluation = strings("success") evaluation = strings("success")
final_output = f"**EVAL**:\n`{cmd}`\n\n**OUTPUT**:\n`{evaluation.strip()}`\n" final_output = f"<b>EVAL</b>:\n<pre language='python'>{cmd}</pre>\n\n<b>OUTPUT</b>:\n<pre language='python'>{evaluation.strip()}</pre>\n"
if len(final_output) > 4096: if len(final_output) > 4096:
with open("MissKatyEval.txt", "w+", encoding="utf8") as out_file: with open("MissKatyEval.txt", "w+", encoding="utf8") as out_file:
@ -225,7 +225,7 @@ async def evaluation_cmd_t(_, m, strings):
await edit_or_reply( await edit_or_reply(
m, m,
text=final_output, text=final_output,
parse_mode=enums.ParseMode.MARKDOWN, parse_mode=enums.ParseMode.HTML,
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text=strings("cl_btn"), callback_data=f"close#{m.from_user.id}")]]), reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text=strings("cl_btn"), callback_data=f"close#{m.from_user.id}")]]),
) )
if not m.from_user.is_self: if not m.from_user.is_self:

View file

@ -159,6 +159,7 @@ async def memify(client, message):
else: else:
await message.reply("Gunakan command <b>/mmf <text></b> dengan reply ke sticker, pisahkan dengan ; untuk membuat posisi text dibawah.") await message.reply("Gunakan command <b>/mmf <text></b> dengan reply ke sticker, pisahkan dengan ; untuk membuat posisi text dibawah.")
@app.on_message(filters.command(["dice"], COMMAND_HANDLER)) @app.on_message(filters.command(["dice"], COMMAND_HANDLER))
@use_chat_lang() @use_chat_lang()
async def dice(c, m, strings): async def dice(c, m, strings):

View file

@ -63,7 +63,7 @@ async def genss(c, m, strings):
the_real_download_location = os.path.join("/downloads/", os.path.basename(dl)) the_real_download_location = os.path.join("/downloads/", os.path.basename(dl))
if the_real_download_location is not None: if the_real_download_location is not None:
try: try:
await editPesan(process, strings("success_dl_msg")) await editPesan(process, strings("success_dl_msg").format(path=the_real_download_location))
await sleep(2) await sleep(2)
images = await take_ss(the_real_download_location) images = await take_ss(the_real_download_location)
await editPesan(process, strings("up_progress")) await editPesan(process, strings("up_progress"))

View file

@ -13,7 +13,6 @@ from database.karma_db import (
from misskaty import app from misskaty import app
from misskaty.core.decorator.errors import capture_err from misskaty.core.decorator.errors import capture_err
from misskaty.core.decorator.permissions import adminsOnly from misskaty.core.decorator.permissions import adminsOnly
from misskaty.core.decorator.ratelimiter import ratelimiter
from misskaty.helper.functions import alpha_to_int, int_to_alpha from misskaty.helper.functions import alpha_to_int, int_to_alpha
__MODULE__ = "Karma" __MODULE__ = "Karma"
@ -37,6 +36,7 @@ bold = lambda x: f"**{x}:** "
bold_ul = lambda x: f"**--{x}:**-- " bold_ul = lambda x: f"**--{x}:**-- "
mono = lambda x: f"`{x}`{n}" mono = lambda x: f"`{x}`{n}"
def section( def section(
title: str, title: str,
body: dict, body: dict,
@ -46,32 +46,18 @@ def section(
text = (bold_ul(title) + n) if underline else bold(title) + n text = (bold_ul(title) + n) if underline else bold(title) + n
for key, value in body.items(): for key, value in body.items():
text += ( text += indent * w + bold(key) + ((value[0] + n) if isinstance(value, list) else mono(value))
indent * w
+ bold(key)
+ ((value[0] + n) if isinstance(value, list) else mono(value))
)
return text return text
async def get_user_id_and_usernames(client) -> dict: async def get_user_id_and_usernames(client) -> dict:
with client.storage.lock, client.storage.conn: with client.storage.lock, client.storage.conn:
users = client.storage.conn.execute( users = client.storage.conn.execute('SELECT * FROM peers WHERE type in ("user", "bot") AND username NOT null').fetchall()
'SELECT * FROM peers WHERE type in ("user", "bot") AND username NOT null' return {user[0]: user[3] for user in users}
).fetchall()
users_ = {}
for user in users:
users_[user[0]] = user[3]
return users_
@app.on_message( @app.on_message(
filters.text filters.text & filters.group & filters.incoming & filters.reply & filters.regex(regex_upvote, re.IGNORECASE) & ~filters.via_bot & ~filters.bot,
& filters.group
& filters.incoming
& filters.reply
& filters.regex(regex_upvote, re.IGNORECASE)
& ~filters.via_bot
& ~filters.bot,
group=karma_positive_group, group=karma_positive_group,
) )
@capture_err @capture_err
@ -91,25 +77,15 @@ async def upvote(_, message):
if current_karma: if current_karma:
current_karma = current_karma["karma"] current_karma = current_karma["karma"]
karma = current_karma + 1 karma = current_karma + 1
new_karma = {"karma": karma}
await update_karma(chat_id, await int_to_alpha(user_id), new_karma)
else: else:
karma = 1 karma = 1
new_karma = {"karma": karma} new_karma = {"karma": karma}
await update_karma(chat_id, await int_to_alpha(user_id), new_karma) await update_karma(chat_id, await int_to_alpha(user_id), new_karma)
await message.reply_text( await message.reply_text(f"Incremented Karma of {user_mention} By 1 \nTotal Points: {karma}")
f"Incremented Karma of {user_mention} By 1 \nTotal Points: {karma}"
)
@app.on_message( @app.on_message(
filters.text filters.text & filters.group & filters.incoming & filters.reply & filters.regex(regex_downvote, re.IGNORECASE) & ~filters.via_bot & ~filters.bot,
& filters.group
& filters.incoming
& filters.reply
& filters.regex(regex_downvote, re.IGNORECASE)
& ~filters.via_bot
& ~filters.bot,
group=karma_negative_group, group=karma_negative_group,
) )
@capture_err @capture_err
@ -129,28 +105,21 @@ async def downvote(_, message):
if current_karma: if current_karma:
current_karma = current_karma["karma"] current_karma = current_karma["karma"]
karma = current_karma - 1 karma = current_karma - 1
new_karma = {"karma": karma}
await update_karma(chat_id, await int_to_alpha(user_id), new_karma)
else: else:
karma = 1 karma = 1
new_karma = {"karma": karma} new_karma = {"karma": karma}
await update_karma(chat_id, await int_to_alpha(user_id), new_karma) await update_karma(chat_id, await int_to_alpha(user_id), new_karma)
user_id = message.reply_to_message.from_user.id user_id = message.reply_to_message.from_user.id
user_mention = message.reply_to_message.from_user.mention user_mention = message.reply_to_message.from_user.mention
current_karma = await get_karma(chat_id, await int_to_alpha(user_id)) current_karma = await get_karma(chat_id, await int_to_alpha(user_id))
if current_karma: if current_karma:
current_karma = current_karma["karma"] current_karma = current_karma["karma"]
karma = current_karma - 1 karma = current_karma - 1
new_karma = {"karma": karma}
await update_karma(chat_id, await int_to_alpha(user_id), new_karma)
else: else:
karma = 1 karma = 1
new_karma = {"karma": karma} new_karma = {"karma": karma}
await update_karma(chat_id, await int_to_alpha(user_id), new_karma) await update_karma(chat_id, await int_to_alpha(user_id), new_karma)
await message.reply_text( await message.reply_text(f"Decremented Karma of {user_mention} By 1 \nTotal Points: {karma}")
f"Decremented Karma of {user_mention} By 1 \nTotal Points: {karma}"
)
@app.on_message(filters.command("karma") & filters.group) @app.on_message(filters.command("karma") & filters.group)
@ -186,7 +155,7 @@ async def command_karma(_, message):
if int(user_idd) not in list(userdb.keys()): if int(user_idd) not in list(userdb.keys()):
continue continue
username = userdb[int(user_idd)] username = userdb[int(user_idd)]
karma["@" + username] = ["**" + str(karma_count) + "**"] karma[f"@{username}"] = [f"**{str(karma_count)}**"]
limit += 1 limit += 1
await m.edit(section(msg, karma)) await m.edit(section(msg, karma))
else: else:
@ -195,12 +164,8 @@ async def command_karma(_, message):
user_id = message.reply_to_message.from_user.id user_id = message.reply_to_message.from_user.id
karma = await get_karma(chat_id, await int_to_alpha(user_id)) karma = await get_karma(chat_id, await int_to_alpha(user_id))
if karma: karma = karma["karma"] if karma else 0
karma = karma["karma"] await message.reply_text(f"**Total Points**: __{karma}__")
await message.reply_text(f"**Total Points**: __{karma}__")
else:
karma = 0
await message.reply_text(f"**Total Points**: __{karma}__")
@app.on_message(filters.command("karma_toggle") & ~filters.private) @app.on_message(filters.command("karma_toggle") & ~filters.private)
@ -219,4 +184,4 @@ async def captcha_state(_, message):
await karma_off(chat_id) await karma_off(chat_id)
await message.reply_text("Disabled Karma System for this chat.") await message.reply_text("Disabled Karma System for this chat.")
else: else:
await message.reply_text(usage) await message.reply_text(usage)

View file

@ -42,6 +42,7 @@ __HELP__ = """
/imdb [query] - Find Movie Details From IMDB.com (Available in English and Indonesia version). /imdb [query] - Find Movie Details From IMDB.com (Available in English and Indonesia version).
/readqr [reply to photo] - Read QR Code From Photo. /readqr [reply to photo] - Read QR Code From Photo.
/createqr [text] - Convert Text to QR Code. /createqr [text] - Convert Text to QR Code.
/anime [query] - Search title in myanimelist.
""" """

View file

@ -76,11 +76,7 @@ async def start(_, message, strings):
) )
await db.add_chat(message.chat.id, message.chat.title) await db.add_chat(message.chat.id, message.chat.title)
nama = ( nama = message.from_user.mention if message.from_user else message.sender_chat.title
message.from_user.mention
if message.from_user
else message.sender_chat.title
)
return await message.reply_photo( return await message.reply_photo(
photo="https://telegra.ph/file/90e9a448bc2f8b055b762.jpg", photo="https://telegra.ph/file/90e9a448bc2f8b055b762.jpg",
caption=strings("start_msg").format(kamuh=nama), caption=strings("start_msg").format(kamuh=nama),
@ -97,10 +93,7 @@ async def start(_, message, strings):
name = (message.text.split(None, 1)[1]).lower() name = (message.text.split(None, 1)[1]).lower()
if "_" in name: if "_" in name:
module = name.split("_", 1)[1] module = name.split("_", 1)[1]
text = ( text = strings("help_name").format(mod=HELPABLE[module].__MODULE__) + HELPABLE[module].__HELP__
strings("help_name").format(mod=HELPABLE[module].__MODULE__)
+ HELPABLE[module].__HELP__
)
await kirimPesan(message, text, disable_web_page_preview=True) await kirimPesan(message, text, disable_web_page_preview=True)
elif name == "help": elif name == "help":
text, keyb = await help_parser(message.from_user.first_name) text, keyb = await help_parser(message.from_user.first_name)
@ -140,7 +133,6 @@ async def stats_callbacc(_, CallbackQuery):
@ratelimiter @ratelimiter
@use_chat_lang() @use_chat_lang()
async def help_command(_, message, strings): async def help_command(_, message, strings):
if not message.from_user: return
if message.chat.type.value != "private": if message.chat.type.value != "private":
if not await db.get_chat(message.chat.id): if not await db.get_chat(message.chat.id):
total = await app.get_chat_members_count(message.chat.id) total = await app.get_chat_members_count(message.chat.id)
@ -183,10 +175,7 @@ async def help_command(_, message, strings):
if len(message.command) >= 2: if len(message.command) >= 2:
name = (message.text.split(None, 1)[1]).replace(" ", "_").lower() name = (message.text.split(None, 1)[1]).replace(" ", "_").lower()
if str(name) in HELPABLE: if str(name) in HELPABLE:
text = ( text = strings("help_name").format(mod=HELPABLE[name].__MODULE__) + HELPABLE[name].__HELP__
strings("help_name").format(mod=HELPABLE[name].__MODULE__)
+ HELPABLE[name].__HELP__
)
await kirimPesan(message, text, disable_web_page_preview=True) await kirimPesan(message, text, disable_web_page_preview=True)
else: else:
text, help_keyboard = await help_parser(message.from_user.first_name) text, help_keyboard = await help_parser(message.from_user.first_name)
@ -198,9 +187,7 @@ async def help_command(_, message, strings):
) )
else: else:
text, help_keyboard = await help_parser(message.from_user.first_name) text, help_keyboard = await help_parser(message.from_user.first_name)
await kirimPesan( await kirimPesan(message, text, reply_markup=help_keyboard, disable_web_page_preview=True)
message, text, reply_markup=help_keyboard, disable_web_page_preview=True
)
async def help_parser(name, keyboard=None): async def help_parser(name, keyboard=None):
@ -238,9 +225,7 @@ async def help_button(client, query, strings):
await editPesan( await editPesan(
query.message, query.message,
text=text, text=text,
reply_markup=InlineKeyboardMarkup( reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(strings("back_btn"), callback_data="help_back")]]),
[[InlineKeyboardButton(strings("back_btn"), callback_data="help_back")]]
),
disable_web_page_preview=True, disable_web_page_preview=True,
) )
elif home_match: elif home_match:
@ -255,9 +240,7 @@ async def help_button(client, query, strings):
await editPesan( await editPesan(
query.message, query.message,
text=top_text, text=top_text,
reply_markup=InlineKeyboardMarkup( reply_markup=InlineKeyboardMarkup(paginate_modules(curr_page - 1, HELPABLE, "help")),
paginate_modules(curr_page - 1, HELPABLE, "help")
),
disable_web_page_preview=True, disable_web_page_preview=True,
) )
@ -266,9 +249,7 @@ async def help_button(client, query, strings):
await editPesan( await editPesan(
query.message, query.message,
text=top_text, text=top_text,
reply_markup=InlineKeyboardMarkup( reply_markup=InlineKeyboardMarkup(paginate_modules(next_page + 1, HELPABLE, "help")),
paginate_modules(next_page + 1, HELPABLE, "help")
),
disable_web_page_preview=True, disable_web_page_preview=True,
) )
@ -289,4 +270,4 @@ async def help_button(client, query, strings):
disable_web_page_preview=True, disable_web_page_preview=True,
) )
return await client.answer_callback_query(query.id) return await client.answer_callback_query(query.id)

View file

@ -1,6 +1,6 @@
""" """
* @author yasir <yasiramunandar@gmail.com> * @author yasir <yasiramunandar@gmail.com>
* @created 2022-12-01 09:12:27 * @created 2022-12-01 09:12:27
* @projectName MissKatyPyro * @projectName MissKatyPyro
* Copyright @YasirPedia All rights reserved * Copyright @YasirPedia All rights reserved
""" """
@ -21,6 +21,7 @@ from misskaty.core.decorator.ratelimiter import ratelimiter
from misskaty.core.decorator.errors import capture_err from misskaty.core.decorator.errors import capture_err
from misskaty.helper.pyro_progress import progress_for_pyrogram from misskaty.helper.pyro_progress import progress_for_pyrogram
from misskaty.helper.tools import get_random_string from misskaty.helper.tools import get_random_string
from misskaty.helper.localization import use_chat_lang
from misskaty.plugins.dev import shell_exec from misskaty.plugins.dev import shell_exec
from misskaty.vars import COMMAND_HANDLER from misskaty.vars import COMMAND_HANDLER
@ -63,13 +64,14 @@ def get_subname(lang, url, format):
@app.on_message(filters.command(["ceksub", "extractmedia"], COMMAND_HANDLER)) @app.on_message(filters.command(["ceksub", "extractmedia"], COMMAND_HANDLER))
@ratelimiter @ratelimiter
async def ceksub(_, m): @use_chat_lang()
async def ceksub(_, m, strings):
cmd = m.text.split(" ", 1) cmd = m.text.split(" ", 1)
if len(cmd) == 1: if len(cmd) == 1:
return await kirimPesan(m, f"Please use command /{m.command[0]} [link] to check subtitles or audio in video file.", quote=True) return await kirimPesan(m, strings("sub_extr_help").format(cmd=m.command[0]), quote=True)
link = cmd[1] link = cmd[1]
start_time = perf_counter() start_time = perf_counter()
pesan = await kirimPesan(m, "Processing your request..", quote=True) pesan = await kirimPesan(m, strings("progress_str"), quote=True)
try: try:
res = (await shell_exec(f"ffprobe -loglevel 0 -print_format json -show_format -show_streams {link}"))[0] res = (await shell_exec(f"ffprobe -loglevel 0 -print_format json -show_format -show_streams {link}"))[0]
details = json.loads(res) details = json.loads(res)
@ -96,25 +98,26 @@ async def ceksub(_, m):
] ]
) )
end_time = perf_counter() end_time = perf_counter()
timelog = "{:.2f}".format(end_time - start_time) + " second" timelog = "{:.2f}".format(end_time - start_time) + strings("val_sec")
buttons.append([InlineKeyboardButton("❌ Cancel", f"close#{m.from_user.id}")]) buttons.append([InlineKeyboardButton(strings("cancel_btn"), f"close#{m.from_user.id}")])
await editPesan( await editPesan(
pesan, pesan,
f"Press the button below to extract subtitles/audio. Only support direct link at this time.\nProcessed in {timelog}", strings("press_btn_msg").format(timelog=timelog),
reply_markup=InlineKeyboardMarkup(buttons), reply_markup=InlineKeyboardMarkup(buttons),
) )
except: except:
await editPesan(pesan, "Failed extract media, make sure your link is not protected by WAF or maybe inaccessible for bot.") await editPesan(pesan, strings("fail_extr_media"))
@app.on_message(filters.command(["converttosrt"], COMMAND_HANDLER)) @app.on_message(filters.command(["converttosrt"], COMMAND_HANDLER))
@capture_err @capture_err
@ratelimiter @ratelimiter
async def convertsrt(c, m): @use_chat_lang()
async def convertsrt(c, m, strings):
reply = m.reply_to_message reply = m.reply_to_message
if not reply and reply.document and (reply.document.file_name.endswith(".vtt") or reply.document.file_name.endswith(".ass")): if not reply and reply.document and (reply.document.file_name.endswith(".vtt") or reply.document.file_name.endswith(".ass")):
return await kirimPesan(m, f"Use command /{m.command[0]} by reply to .ass or .vtt file, to convert subtitle from .ass or .vtt to srt.") return await kirimPesan(m, strings("conv_sub_help").format(cmd=m.command[0]))
msg = await kirimPesan(m, "⏳ Converting...", quote=True) msg = await kirimPesan(m, strings("convert_str"), quote=True)
dl = await reply.download() dl = await reply.download()
filename = dl.split("/", 3)[3] filename = dl.split("/", 3)[3]
LOGGER.info(f"ConvertSub: {filename} by {m.from_user.first_name} [{m.from_user.id}]") LOGGER.info(f"ConvertSub: {filename} by {m.from_user.first_name} [{m.from_user.id}]")
@ -122,10 +125,10 @@ async def convertsrt(c, m):
c_time = time() c_time = time()
await m.reply_document( await m.reply_document(
f"{filename}.srt", f"{filename}.srt",
caption=f"<code>{filename}.srt</code>\n\nConverted by @{c.me.username}", caption=strings("capt_conv_sub").format(nf=filename, bot=c.me.username),
thumb="assets/thumb.jpg", thumb="assets/thumb.jpg",
progress=progress_for_pyrogram, progress=progress_for_pyrogram,
progress_args=("Uploading files..", msg, c_time), progress_args=(strings("up_str"), msg, c_time),
) )
await hapusPesan(msg) await hapusPesan(msg)
try: try:
@ -137,17 +140,18 @@ async def convertsrt(c, m):
@app.on_callback_query(filters.regex(r"^streamextract#")) @app.on_callback_query(filters.regex(r"^streamextract#"))
@ratelimiter @ratelimiter
async def stream_extract(bot, update): @use_chat_lang()
async def stream_extract(bot, update, strings):
cb_data = update.data cb_data = update.data
usr = update.message.reply_to_message usr = update.message.reply_to_message
if update.from_user.id != usr.from_user.id: if update.from_user.id != usr.from_user.id:
return await update.answer("⚠️ Access Denied!", True) return await update.answer(strings("unauth_cb"), True)
_, lang, map, codec = cb_data.split("#") _, lang, map, codec = cb_data.split("#")
try: try:
link = update.message.reply_to_message.command[1] link = update.message.reply_to_message.command[1]
except: except:
return await update.answer("⚠️ DONT DELETE YOUR MESSAGE!", True) return await update.answer(strings("invalid_cb"), True)
await editPesan(update.message, "⏳ Processing...") await editPesan(update.message, strings("progress_str"))
if codec == "aac": if codec == "aac":
format = "aac" format = "aac"
elif codec == "mp3": elif codec == "mp3":
@ -162,18 +166,18 @@ async def stream_extract(bot, update):
LOGGER.info(f"ExtractSub: {namafile} by {update.from_user.first_name} [{update.from_user.id}]") LOGGER.info(f"ExtractSub: {namafile} by {update.from_user.first_name} [{update.from_user.id}]")
(await shell_exec(f"mediaextract -i {link} -map {map} '{namafile}'"))[0] (await shell_exec(f"mediaextract -i {link} -map {map} '{namafile}'"))[0]
end_time = perf_counter() end_time = perf_counter()
timelog = "{:.2f}".format(end_time - start_time) + " second" timelog = "{:.2f}".format(end_time - start_time) + strings("val_sec")
c_time = time() c_time = time()
await update.message.reply_document( await update.message.reply_document(
namafile, namafile,
caption=f"<b>Filename:</b> <code>{namafile}</code>\n\nExtracted by @{bot.me.username} in {timelog}", caption=strings("capt_extr_sub").format(nf=namafile, bot=bot.me.username, timelog=timelog),
reply_to_message_id=usr.id, reply_to_message_id=usr.id,
thumb="assets/thumb.jpg", thumb="assets/thumb.jpg",
progress=progress_for_pyrogram, progress=progress_for_pyrogram,
progress_args=("Uploading files..", update.message, c_time), progress_args=(strings("up_str"), update.message, c_time),
) )
await hapusPesan(update.message) await hapusPesan(update.message)
os.remove(namafile) os.remove(namafile)
except Exception as e: except Exception as e:
os.remove(namafile) os.remove(namafile)
await editPesan(update.message, f"Failed extract sub, Maybe unsupported format..\n\nLink: {link}\nERR: {e}") await editPesan(update.message, strings("fail_extr_sub").format(link=link, e=e))

View file

@ -257,7 +257,7 @@ async def getDataLendrive(msg, kueri, CurrentPage, user, strings):
# MelongMovie GetData # MelongMovie GetData
async def getDataMelong(msg, kueri, CurrentPage, user, strings): async def getDataMelong(msg, kueri, CurrentPage, user, strings):
if not SCRAP_DICT.get(msg.id): if not SCRAP_DICT.get(msg.id):
data = await http.get(f"https://melongmovie.info/?s={kueri}", headers=headers, follow_redirects=True) data = await http.get(f"http://146.190.193.128/?s={kueri}", headers=headers, follow_redirects=True)
bs4 = BeautifulSoup(data, "lxml") bs4 = BeautifulSoup(data, "lxml")
melongdata = [] melongdata = []
for res in bs4.select(".box"): for res in bs4.select(".box"):
@ -781,7 +781,7 @@ async def kusonime_scrap(_, callback_query, strings):
await editPesan(callback_query.message, f"ERROR: {err}", reply_markup=keyboard) await editPesan(callback_query.message, f"ERROR: {err}", reply_markup=keyboard)
return return
data_kuso[link] = {"ph_url": tgh["url"]} data_kuso[link] = {"ph_url": tgh["url"]}
await editPesan(callback_query.message, strings("res_scrape").format(link=link, kl=tgh['url']), reply_markup=keyboard, disable_web_page_preview=False) await editPesan(callback_query.message, strings("res_scrape").format(link=link, kl=tgh["url"]), reply_markup=keyboard, disable_web_page_preview=False)
# Savefilm21 DDL # Savefilm21 DDL

View file

@ -40,7 +40,7 @@ async def ytsearch(_, message, strings):
return await message.reply(strings("no_res").format(kweri=query)) return await message.reply(strings("no_res").format(kweri=query))
i = search["result"][0] i = search["result"][0]
out = f"<b><a href={i['link']}>{i['title']}</a></b>\n" out = f"<b><a href={i['link']}>{i['title']}</a></b>\n"
out = strings("yts_msg").format(pub=i['publishedTime'], dur=i['duration'], vi=i['viewCount']['short'], clink=i['channel']['link'], cname=i['channel']['name']) out = strings("yts_msg").format(pub=i["publishedTime"], dur=i["duration"], vi=i["viewCount"]["short"], clink=i["channel"]["link"], cname=i["channel"]["name"])
btn = InlineKeyboardMarkup( btn = InlineKeyboardMarkup(
[ [
[ [
@ -184,7 +184,7 @@ async def ytdl_scroll_callback(_, cq: CallbackQuery, strings):
search = await main.VideosSearch(query).next() search = await main.VideosSearch(query).next()
i = search["result"][page] i = search["result"][page]
out = f"<b><a href={i['link']}>{i['title']}</a></b>" out = f"<b><a href={i['link']}>{i['title']}</a></b>"
out = strings("yts_msg").format(pub=i['publishedTime'], dur=i['duration'], vi=i['viewCount']['short'], clink=i['channel']['link'], cname=i['channel']['name']) out = strings("yts_msg").format(pub=i["publishedTime"], dur=i["duration"], vi=i["viewCount"]["short"], clink=i["channel"]["link"], cname=i["channel"]["name"])
scroll_btn = [ scroll_btn = [
[ [
InlineKeyboardButton(strings("back"), callback_data=f"ytdl_scroll|{search_key}|{page-1}"), InlineKeyboardButton(strings("back"), callback_data=f"ytdl_scroll|{search_key}|{page-1}"),