From e4d889c36a1d6001d6348f02d9efa9b780101153 Mon Sep 17 00:00:00 2001 From: yasirarism <55983182+yasirarism@users.noreply.github.com> Date: Tue, 11 Apr 2023 11:15:50 +0700 Subject: [PATCH] Added currency and uvloop (#38) --- .gitignore | 3 +- misskaty/__init__.py | 21 ++++++++----- misskaty/__main__.py | 2 +- misskaty/helper/eval_helper.py | 10 +++--- misskaty/plugins/currency.py | 48 ++++++++++++++++++++++++++++ misskaty/plugins/dev.py | 52 ++++++++++++++++++++----------- misskaty/plugins/karma.py | 2 ++ misskaty/plugins/mediainfo.py | 2 +- misskaty/plugins/ping.py | 14 ++++++++- misskaty/plugins/sub_extractor.py | 10 ++++-- misskaty/vars.py | 1 + 11 files changed, 127 insertions(+), 38 deletions(-) create mode 100644 misskaty/plugins/currency.py diff --git a/.gitignore b/.gitignore index 600d2d33..4edd7505 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.vscode \ No newline at end of file +.vscode +__pycache__ \ No newline at end of file diff --git a/misskaty/__init__.py b/misskaty/__init__.py index caabbcac..1923d2fd 100644 --- a/misskaty/__init__.py +++ b/misskaty/__init__.py @@ -1,6 +1,7 @@ import os import time -from logging import ERROR, INFO, FileHandler, StreamHandler, basicConfig, getLogger, handlers +import uvloop +from logging import ERROR, INFO, StreamHandler, basicConfig, getLogger, handlers import pyromod.listen from apscheduler.schedulers.asyncio import AsyncIOScheduler @@ -10,13 +11,15 @@ from pyrogram import Client from misskaty.vars import API_HASH, API_ID, BOT_TOKEN, DATABASE_URI, USER_SESSION, TZ -basicConfig(filename="MissKatyLogs.txt", format="%(asctime)s - %(name)s.%(funcName)s - %(levelname)s - %(message)s", level=INFO) - -logger = getLogger() -# handler logging dengan batasan 100 baris -handler = handlers.RotatingFileHandler("MissKatyLogs.txt", maxBytes=1024 * 1024) -handler.setLevel(INFO) -logger.addHandler(handler) +basicConfig( + level=INFO, + format="[%(asctime)s - %(levelname)s] - %(name)s.%(funcName)s - %(message)s", + datefmt="%d-%b-%y %H:%M:%S", + handlers=[ + handlers.RotatingFileHandler("MissKatyLogs.txt", mode="w+", maxBytes=1000000), + StreamHandler(), + ], +) getLogger("pyrogram").setLevel(ERROR) getLogger("openai").setLevel(ERROR) @@ -26,6 +29,8 @@ HELPABLE = {} cleanmode = {} botStartTime = time.time() +uvloop.install() + # Pyrogram Bot Client app = Client( "MissKatyBot", diff --git a/misskaty/__main__.py b/misskaty/__main__.py index fdad6cf0..00b138f7 100644 --- a/misskaty/__main__.py +++ b/misskaty/__main__.py @@ -81,7 +81,7 @@ if __name__ == "__main__": pass except Exception: err = traceback.format_exc() - LOGGER.error(err) + print(err) finally: loop.stop() print("------------------------ Stopped Services ------------------------") diff --git a/misskaty/helper/eval_helper.py b/misskaty/helper/eval_helper.py index f6aae5ca..797ede01 100644 --- a/misskaty/helper/eval_helper.py +++ b/misskaty/helper/eval_helper.py @@ -1,4 +1,7 @@ import ast +import os +import traceback +from typing import List, Optional # We dont modify locals VVVV ; this lets us keep the message available to the user-provided function @@ -7,7 +10,7 @@ async def meval(code, globs, **kwargs): # Note to self: please don't set globals here as they will be lost. # Don't clutter locals locs = {} - # Restore globals later + # Restore globals latertypes globs = globs.copy() # This code saves __name__ and __package into a kwarg passed to the function. # It is set before the users code runs to make sure relative imports work @@ -98,11 +101,6 @@ async def meval(code, globs, **kwargs): return r -import os -import traceback -from typing import List, Optional - - def format_exception(exp: BaseException, tb: Optional[List[traceback.FrameSummary]] = None) -> str: """Formats an exception traceback as a string, similar to the Python interpreter.""" diff --git a/misskaty/plugins/currency.py b/misskaty/plugins/currency.py new file mode 100644 index 00000000..4ebe3004 --- /dev/null +++ b/misskaty/plugins/currency.py @@ -0,0 +1,48 @@ +from pyrogram import filters, Client +from pyrogram.types import Message +from misskaty import app +import logging +from misskaty.helper.http import http +from misskaty.core.message_utils import kirimPesan +from misskaty.vars import COMMAND_HANDLER, CURRENCY_API + + +__MODULE__ = "Currency" +__HELP__ = """ +/currency - Send structure message Telegram in JSON using Pyrogram Style. +""" + +LOGGER = logging.getLogger(__name__) + + +@app.on_message(filters.command(["currency"], COMMAND_HANDLER)) +async def currency(c: Client, m: Message): + if CURRENCY_API is None: + return await kirimPesan(m, f"Oops!!get the API from " "HERE " "& add it to config vars (CURRENCY_API)", disable_web_page_preview=True) + if len(m.text.split()) == 4: + teks = m.text.split() + amount = teks[1] + currency_from = teks[2] + currency_to = teks[3] + else: + return await kirimPesan(m, f"Use format /{m.command[0]} [amount] [currency_from] [currency_to] to convert currency.") + + if amount.isdigit(): + url = f"https://v6.exchangerate-api.com/v6/{CURRENCY_API}/" f"pair/{currency_from}/{currency_to}/{amount}" + try: + res = await http.get(url) + data = res.json() + try: + conversion_rate = data["conversion_rate"] + conversion_result = data["conversion_result"] + target_code = data["target_code"] + base_code = data["base_code"] + last_update = data["time_last_update_utc"] + except KeyError: + return await kirimPesan(m, "Invalid response from api !") + + await kirimPesan(m, "**CURRENCY EXCHANGE RATE RESULT:**\n\n" f"`{amount}` **{target_code}** = `{round(conversion_result)}` **{base_code}**\n" f"Rate Today = `{round(conversion_rate)}`\n" f"Last Update: {last_update}") + except: + await kirimPesan(m, "Failed convert currency, maybe you give wrong currency format or api down.") + else: + await kirimPesan(m, r"This seems to be some alien currency, which I can't convert right now.. (⊙_⊙;)") diff --git a/misskaty/plugins/dev.py b/misskaty/plugins/dev.py index cd962e99..9bab0594 100644 --- a/misskaty/plugins/dev.py +++ b/misskaty/plugins/dev.py @@ -3,6 +3,7 @@ import io import os import re import sys +import html import pickle import json import traceback @@ -90,6 +91,15 @@ async def server_stats(c, m): """ Give system stats of the server. """ + if os.path.exists(".git"): + botVersion = (await shell_exec("git log -1 --date=format:v%y.%m%d.%H%M --pretty=format:%cd"))[0] + else: + botVersion = "v2.49" + try: + serverinfo = await http.get("https://ipinfo.io/json") + org = serverinfo.json()["org"] + except: + org = "N/A" currentTime = get_readable_time(time() - botStartTime) total, used, free = disk_usage(".") total = get_readable_file_size(total) @@ -97,22 +107,23 @@ async def server_stats(c, m): free = get_readable_file_size(free) neofetch = (await shell_exec("neofetch --stdout"))[0] caption = f""" -**{BOT_NAME} is Up and Running successfully.** -Bot Uptime: `{currentTime}` -Total Disk Space: `{total}` -Used: `{used}({disk_usage_percent("/").percent}%)` -Free: `{free}` -CPU Usage: `{cpu_percent()}%` -RAM Usage: `{virtual_memory().percent}%` +**{BOT_NAME} {botVersion} is Up and Running successfully.** +Bot Uptime: `{currentTime}` +Server: {org} +Total Disk Space: `{total}` +Used: `{used}({disk_usage_percent("/").percent}%)` +Free: `{free}` +CPU Usage: `{cpu_percent()}%` +RAM Usage: `{virtual_memory().percent}%` `{neofetch}` """ await kirimPesan(m, caption) -@app.on_message(filters.command(["shell", "sh"], COMMAND_HANDLER) & filters.user(SUDO)) -@app.on_edited_message(filters.command(["shell", "sh"], COMMAND_HANDLER) & filters.user(SUDO)) -@user.on_message(filters.command(["shell", "sh"], ".") & filters.me) +@app.on_message(filters.command(["shell", "sh", "term"], COMMAND_HANDLER) & filters.user(SUDO)) +@app.on_edited_message(filters.command(["shell", "sh", "term"], COMMAND_HANDLER) & filters.user(SUDO)) +@user.on_message(filters.command(["shell", "sh", "term"], ".") & filters.me) @use_chat_lang() async def shell(_, m, strings): cmd = m.text.split(" ", 1) @@ -125,7 +136,7 @@ async def shell(_, m, strings): doc.name = "shell_output.txt" await m.reply_document( document=doc, - caption="cmd[1][: 4096 // 4 - 1]", + caption=f"{cmd[1][: 4096 // 4 - 1]}", file_name=doc.name, reply_markup=InlineKeyboardMarkup( [ @@ -142,7 +153,7 @@ async def shell(_, m, strings): elif len(shell) != 0: await edit_or_reply( m, - text=shell, + text=html.escape(shell), parse_mode=enums.ParseMode.HTML, reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text=strings("cl_btn"), callback_data=f"close#{m.from_user.id}")]]), ) @@ -152,9 +163,9 @@ async def shell(_, m, strings): await m.reply(strings("no_reply")) -@app.on_message((filters.command(["ev", "run"], COMMAND_HANDLER) | filters.regex(r"app.run\(\)$")) & filters.user(SUDO)) -@app.on_edited_message((filters.command(["ev", "run"]) | filters.regex(r"app.run\(\)$")) & filters.user(SUDO)) -@user.on_message(filters.command(["ev", "run"], ".") & filters.me) +@app.on_message((filters.command(["ev", "run", "myeval"], COMMAND_HANDLER) | filters.regex(r"app.run\(\)$")) & filters.user(SUDO)) +@app.on_edited_message((filters.command(["ev", "run", "myeval"]) | filters.regex(r"app.run\(\)$")) & filters.user(SUDO)) +@user.on_message(filters.command(["ev", "run", "myeval"], ".") & filters.me) @use_chat_lang() async def cmd_eval(self, message: types.Message, strings) -> Optional[str]: if (message.command and len(message.command) == 1) or message.text == "app.run()": @@ -217,19 +228,24 @@ async def cmd_eval(self, message: types.Message, strings) -> Optional[str]: if not out_buf.getvalue() or result is not None: print(result, file=out_buf) el_us = after - before - el_str = get_readable_time(el_us) + try: + el_str = get_readable_time(el_us) + except: + el_str = "1s" + if el_str == "" or el_str is None: + el_str = "0.1s" out = out_buf.getvalue() # Strip only ONE final newline to compensate for our message formatting if out.endswith("\n"): out = out[:-1] - final_output = f"{prefix}INPUT:\n
{code}
\nOUTPUT:\n
{out}
\nExecuted Time: {el_str}" + final_output = f"{prefix}INPUT:\n
{html.escape(code)}
\nOUTPUT:\n
{html.escape(out)}
\nExecuted Time: {el_str}" if len(final_output) > 4096: with io.BytesIO(str.encode(out)) as out_file: out_file.name = "MissKatyEval.txt" await message.reply_document( document=out_file, - caption="code[: 4096 // 4 - 1]", + caption=f"{code[: 4096 // 4 - 1]}", disable_notification=True, thumb="assets/thumb.jpg", reply_markup=InlineKeyboardMarkup( diff --git a/misskaty/plugins/karma.py b/misskaty/plugins/karma.py index 08911f6f..f053f3f1 100644 --- a/misskaty/plugins/karma.py +++ b/misskaty/plugins/karma.py @@ -96,6 +96,8 @@ async def downvote(_, message): return if not message.from_user: return + if message.reply_to_message.from_user.is_bot: + return if message.reply_to_message.from_user.id == message.from_user.id: return diff --git a/misskaty/plugins/mediainfo.py b/misskaty/plugins/mediainfo.py index d50b41d1..fece6db2 100644 --- a/misskaty/plugins/mediainfo.py +++ b/misskaty/plugins/mediainfo.py @@ -108,4 +108,4 @@ DETAILS ) await process.delete() except IndexError: - return await kirimPesan(message, strings("mediainfo_help").format(help=message.command[0])) + return await kirimPesan(message, strings("mediainfo_help").format(cmd=message.command[0])) diff --git a/misskaty/plugins/ping.py b/misskaty/plugins/ping.py index 550463e4..ae699826 100644 --- a/misskaty/plugins/ping.py +++ b/misskaty/plugins/ping.py @@ -6,6 +6,7 @@ * Copyright @YasirPedia All rights reserved """ import time +import os from asyncio import Lock from re import MULTILINE, findall from subprocess import run as srun @@ -15,19 +16,30 @@ from pyrogram import filters from misskaty import app, botStartTime from misskaty.core.decorator.ratelimiter import ratelimiter from misskaty.helper.human_read import get_readable_time +from misskaty.helper.http import http +from .dev import shell_exec from misskaty.vars import COMMAND_HANDLER @app.on_message(filters.command(["ping"], COMMAND_HANDLER)) @ratelimiter async def ping(_, message): + if os.path.exists(".git"): + botVersion = (await shell_exec("git log -1 --date=format:v%y.%m%d.%H%M --pretty=format:%cd"))[0] + else: + botVersion = "v2.49" + try: + serverinfo = await http.get("https://ipinfo.io/json") + org = serverinfo.json()["org"] + except: + org = "N/A" currentTime = get_readable_time(time.time() - botStartTime) start_t = time.time() rm = await message.reply_text("🐱 Pong!!...") end_t = time.time() time_taken_s = round(end_t - start_t, 3) try: - await rm.edit(f"🐈 MissKatyBot online.\n\nPing: {time_taken_s} detik\nUptime: {currentTime}") + await rm.edit(f"🐈 MissKatyBot {botVersion} online.\n\nPing: {time_taken_s} detik\nUptime: {currentTime}\nHosted by {org}") except Exception: pass diff --git a/misskaty/plugins/sub_extractor.py b/misskaty/plugins/sub_extractor.py index b63d65dd..3ed0875b 100644 --- a/misskaty/plugins/sub_extractor.py +++ b/misskaty/plugins/sub_extractor.py @@ -177,7 +177,13 @@ async def stream_extract(bot, update, strings): progress_args=(strings("up_str"), update.message, c_time), ) await hapusPesan(update.message) - os.remove(namafile) + try: + os.remove(namafile) + except: + pass except Exception as e: - os.remove(namafile) + try: + os.remove(namafile) + except: + pass await editPesan(update.message, strings("fail_extr_sub").format(link=link, e=e)) diff --git a/misskaty/vars.py b/misskaty/vars.py index d5fe207a..231b73f9 100644 --- a/misskaty/vars.py +++ b/misskaty/vars.py @@ -84,3 +84,4 @@ BLOCKED_EXTENSIONS = list( ) ) MINIMUM_FILE_SIZE = environ.get("MINIMUM_FILE_SIZE", None) +CURRENCY_API = environ.get("CURRENCY_API", None)