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)