Added currency and uvloop (#38)

This commit is contained in:
yasirarism 2023-04-11 11:15:50 +07:00 committed by GitHub
parent fca1ff40e1
commit e4d889c36a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 127 additions and 38 deletions

3
.gitignore vendored
View file

@ -1 +1,2 @@
.vscode
.vscode
__pycache__

View file

@ -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",

View file

@ -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 ------------------------")

View file

@ -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."""

View file

@ -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"<code>Oops!!get the API from</code> " "<a href='https://app.exchangerate-api.com/sign-up'>HERE</a> " "<code>& add it to config vars</code> (<code>CURRENCY_API</code>)", 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, "<code>Invalid response from api !</i>")
await kirimPesan(m, "**CURRENCY EXCHANGE RATE RESULT:**\n\n" f"`{amount}` **{target_code}** = `{round(conversion_result)}` **{base_code}**\n" f"<b>Rate Today</b> = `{round(conversion_rate)}`\n" f"<b>Last Update:</b> {last_update}")
except:
await kirimPesan(m, "Failed convert currency, maybe you give wrong currency format or api down.")
else:
await kirimPesan(m, r"<code>This seems to be some alien currency, which I can't convert right now.. (⊙_⊙;)</code>")

View file

@ -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.**
<b>Bot Uptime:</b> `{currentTime}`
<b>Server:</b> <code>{org}</code>
<b>Total Disk Space:</b> `{total}`
<b>Used:</b> `{used}({disk_usage_percent("/").percent}%)`
<b>Free:</b> `{free}`
<b>CPU Usage:</b> `{cpu_percent()}%`
<b>RAM Usage:</b> `{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="<code>cmd[1][: 4096 // 4 - 1]</code>",
caption=f"<code>{cmd[1][: 4096 // 4 - 1]}</code>",
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}<b>INPUT:</b>\n<pre language='python'>{code}</pre>\n<b>OUTPUT:</b>\n<pre language='python'>{out}</pre>\nExecuted Time: {el_str}"
final_output = f"{prefix}<b>INPUT:</b>\n<pre language='python'>{html.escape(code)}</pre>\n<b>OUTPUT:</b>\n<pre language='python'>{html.escape(out)}</pre>\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>code[: 4096 // 4 - 1]</code>",
caption=f"<code>{code[: 4096 // 4 - 1]}</code>",
disable_notification=True,
thumb="assets/thumb.jpg",
reply_markup=InlineKeyboardMarkup(

View file

@ -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

View file

@ -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]))

View file

@ -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"<b>🐈 MissKatyBot online.</b>\n\n<b>Ping:</b> <code>{time_taken_s} detik</code>\n<b>Uptime:</b> <code>{currentTime}</code>")
await rm.edit(f"<b>🐈 MissKatyBot {botVersion} online.</b>\n\n<b>Ping:</b> <code>{time_taken_s} detik</code>\n<b>Uptime:</b> <code>{currentTime}</code>\nHosted by <code>{org}</code>")
except Exception:
pass

View file

@ -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))

View file

@ -84,3 +84,4 @@ BLOCKED_EXTENSIONS = list(
)
)
MINIMUM_FILE_SIZE = environ.get("MINIMUM_FILE_SIZE", None)
CURRENCY_API = environ.get("CURRENCY_API", None)