mirror of
https://github.com/yasirarism/MissKatyPyro.git
synced 2025-12-29 17:44:50 +00:00
Tes add chatbot and filters from wbb
This commit is contained in:
parent
662a300b11
commit
80790ed4f6
5 changed files with 260 additions and 1 deletions
50
database/filters_db.py
Normal file
50
database/filters_db.py
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
from database import dbname
|
||||
|
||||
filtersdb = dbname.filters
|
||||
|
||||
|
||||
async def _get_filters(chat_id: int) -> Dict[str, int]:
|
||||
_filters = await filtersdb.find_one({"chat_id": chat_id})
|
||||
if not _filters:
|
||||
return {}
|
||||
return _filters["filters"]
|
||||
|
||||
|
||||
async def delete_filter(chat_id: int, name: str) -> bool:
|
||||
filtersd = await _get_filters(chat_id)
|
||||
name = name.lower().strip()
|
||||
if name in filtersd:
|
||||
del filtersd[name]
|
||||
await filtersdb.update_one(
|
||||
{"chat_id": chat_id},
|
||||
{"$set": {"filters": filtersd}},
|
||||
upsert=True,
|
||||
)
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
async def get_filter(chat_id: int, name: str) -> Union[bool, dict]:
|
||||
name = name.lower().strip()
|
||||
_filters = await _get_filters(chat_id)
|
||||
if name in _filters:
|
||||
return _filters[name]
|
||||
return False
|
||||
|
||||
|
||||
async def get_filters_names(chat_id: int) -> List[str]:
|
||||
_filters = []
|
||||
for _filter in await _get_filters(chat_id):
|
||||
_filters.append(_filter)
|
||||
return _filters
|
||||
|
||||
|
||||
async def save_filter(chat_id: int, name: str, _filter: dict):
|
||||
name = name.lower().strip()
|
||||
_filters = await _get_filters(chat_id)
|
||||
_filters[name] = _filter
|
||||
await filtersdb.update_one(
|
||||
{"chat_id": chat_id},
|
||||
{"$set": {"filters": _filters}},
|
||||
upsert=True,
|
||||
)
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
from pyrogram import enums
|
||||
from datetime import datetime, timedelta
|
||||
from string import ascii_lowercase
|
||||
from re import findall
|
||||
from re import findall, sub as re_sub
|
||||
|
||||
|
||||
def get_urls_from_text(text: str) -> bool:
|
||||
|
|
@ -107,3 +107,29 @@ async def time_converter(message, time_value: str) -> int:
|
|||
else:
|
||||
return await message.reply_text("Incorrect time specified.")
|
||||
return int(datetime.timestamp(temp_time))
|
||||
|
||||
|
||||
def extract_text_and_keyb(ikb, text: str, row_width: int = 2):
|
||||
keyboard = {}
|
||||
try:
|
||||
text = text.strip()
|
||||
if text.startswith("`"):
|
||||
text = text[1:]
|
||||
if text.endswith("`"):
|
||||
text = text[:-1]
|
||||
|
||||
text, keyb = text.split("~")
|
||||
|
||||
keyb = findall(r"\[.+\,.+\]", keyb)
|
||||
for btn_str in keyb:
|
||||
btn_str = re_sub(r"[\[\]]", "", btn_str)
|
||||
btn_str = btn_str.split(",")
|
||||
btn_txt, btn_url = btn_str[0], btn_str[1].strip()
|
||||
|
||||
if not get_urls_from_text(btn_url):
|
||||
continue
|
||||
keyboard[btn_txt] = btn_url
|
||||
keyboard = ikb(keyboard, row_width)
|
||||
except Exception:
|
||||
return
|
||||
return text, keyboard
|
||||
|
|
|
|||
34
misskaty/plugins/chatbot.py
Normal file
34
misskaty/plugins/chatbot.py
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
from misskaty import app
|
||||
from misskaty.vars import COMMAND_HANDLER, OPENAI_API
|
||||
from pyrogram import filters
|
||||
from misskaty.helper.http import http
|
||||
|
||||
|
||||
@app.on_message(filters.command("ask", COMMAND_HANDLER))
|
||||
async def chatbot(c, m):
|
||||
if len(m.command) == 1:
|
||||
return await m.reply(
|
||||
f"Gunakan perintah <code>/{m.command[0]} [pertanyaan]</code> untuk menanyakan pertanyaan menggunakan AI."
|
||||
)
|
||||
pertanyaan = m.text.split(" ", maxsplit=1)[1]
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": f"Bearer {OPENAI_API}",
|
||||
}
|
||||
|
||||
json_data = {
|
||||
"model": "text-davinci-003",
|
||||
"prompt": pertanyaan,
|
||||
"max_tokens": 200,
|
||||
"temperature": 0,
|
||||
}
|
||||
msg = await m.reply("Wait a moment looking for your answer..")
|
||||
try:
|
||||
response = (
|
||||
await http.post(
|
||||
"https://api.openai.com/v1/completions", headers=headers, json=json_data
|
||||
)
|
||||
).json()
|
||||
await msg.edit(response["choices"][0]["text"])
|
||||
except:
|
||||
await msg.edit("Yahh, sorry i can't get your answer.")
|
||||
148
misskaty/plugins/filters.py
Normal file
148
misskaty/plugins/filters.py
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
"""
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 TheHamkerCat
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
import re
|
||||
from pyrogram import filters
|
||||
from misskaty import app
|
||||
from misskaty.core.decorator.errors import capture_err
|
||||
from misskaty.core.decorator.permissions import adminsOnly
|
||||
from misskaty.core.keyboard import ikb
|
||||
from database.filters_db import (
|
||||
delete_filter,
|
||||
get_filter,
|
||||
get_filters_names,
|
||||
save_filter,
|
||||
)
|
||||
from misskaty.helper.functions import extract_text_and_keyb
|
||||
|
||||
__MODULE__ = "Filters"
|
||||
__HELP__ = """/filters To Get All The Filters In The Chat.
|
||||
/addfilter [FILTER_NAME] To Save A Filter (Can be a sticker or text).
|
||||
/stopfilter [FILTER_NAME] To Stop A Filter.
|
||||
|
||||
You can use markdown or html to save text too.
|
||||
"""
|
||||
|
||||
|
||||
@app.on_message(filters.command("addfilter") & ~filters.private)
|
||||
@adminsOnly("can_change_info")
|
||||
async def save_filters(_, message):
|
||||
if len(message.command) == 1 or not message.reply_to_message:
|
||||
return await message.reply_text(
|
||||
"**Usage:**\nReply to a text or sticker with /filter [FILTER_NAME] to save it."
|
||||
)
|
||||
if not message.reply_to_message.text and not message.reply_to_message.sticker:
|
||||
return await message.reply_text(
|
||||
"__**You can only save text or stickers in filters for now.**__"
|
||||
)
|
||||
name = message.text.split(None, 1)[1].strip()
|
||||
if not name:
|
||||
return await message.reply_text("**Usage:**\n__/filter [FILTER_NAME]__")
|
||||
chat_id = message.chat.id
|
||||
_type = "text" if message.reply_to_message.text else "sticker"
|
||||
_filter = {
|
||||
"type": _type,
|
||||
"data": message.reply_to_message.text.markdown
|
||||
if _type == "text"
|
||||
else message.reply_to_message.sticker.file_id,
|
||||
}
|
||||
await save_filter(chat_id, name, _filter)
|
||||
await message.reply(f"__**Saved filter {name}.**__")
|
||||
|
||||
|
||||
@app.on_message(filters.command("filters") & ~filters.private)
|
||||
@capture_err
|
||||
async def get_filterss(_, message):
|
||||
_filters = await get_filters_names(message.chat.id)
|
||||
if not _filters:
|
||||
return await message.reply_text("**No filters in this chat.**")
|
||||
_filters.sort()
|
||||
msg = f"List of filters in {message.chat.title}\n"
|
||||
for _filter in _filters:
|
||||
msg += f"**-** `{_filter}`\n"
|
||||
await message.reply_text(msg)
|
||||
|
||||
|
||||
@app.on_message(filters.command("stop") & ~filters.private)
|
||||
@adminsOnly("can_change_info")
|
||||
async def del_filter(_, message):
|
||||
if len(message.command) < 2:
|
||||
return await message.reply_text("**Usage:**\n__/stop [FILTER_NAME]__")
|
||||
name = message.text.split(None, 1)[1].strip()
|
||||
if not name:
|
||||
return await message.reply_text("**Usage:**\n__/stop [FILTER_NAME]__")
|
||||
chat_id = message.chat.id
|
||||
deleted = await delete_filter(chat_id, name)
|
||||
if deleted:
|
||||
await message.reply_text(f"**Deleted filter {name}.**")
|
||||
else:
|
||||
await message.reply_text("**No such filter.**")
|
||||
|
||||
|
||||
@app.on_message(
|
||||
filters.text & ~filters.private & ~filters.via_bot & ~filters.forwarded,
|
||||
group=2,
|
||||
)
|
||||
@capture_err
|
||||
async def filters_re(_, message):
|
||||
text = message.text.lower().strip()
|
||||
if not text:
|
||||
return
|
||||
chat_id = message.chat.id
|
||||
list_of_filters = await get_filters_names(chat_id)
|
||||
for word in list_of_filters:
|
||||
pattern = r"( |^|[^\w])" + re.escape(word) + r"( |$|[^\w])"
|
||||
if re.search(pattern, text, flags=re.IGNORECASE):
|
||||
_filter = await get_filter(chat_id, word)
|
||||
data_type = _filter["type"]
|
||||
data = _filter["data"]
|
||||
if data_type == "text":
|
||||
keyb = None
|
||||
if re.findall(r"\[.+\,.+\]", data):
|
||||
keyboard = extract_text_and_keyb(ikb, data)
|
||||
if keyboard:
|
||||
data, keyb = keyboard
|
||||
|
||||
if message.reply_to_message:
|
||||
await message.reply_to_message.reply_text(
|
||||
data,
|
||||
reply_markup=keyb,
|
||||
disable_web_page_preview=True,
|
||||
)
|
||||
|
||||
if text.startswith("~"):
|
||||
await message.delete()
|
||||
return
|
||||
|
||||
return await message.reply_text(
|
||||
data,
|
||||
reply_markup=keyb,
|
||||
disable_web_page_preview=True,
|
||||
)
|
||||
if message.reply_to_message:
|
||||
await message.reply_to_message.reply_sticker(data)
|
||||
|
||||
if text.startswith("~"):
|
||||
await message.delete()
|
||||
return
|
||||
return await message.reply_sticker(data)
|
||||
|
|
@ -38,6 +38,7 @@ SUDO = list(
|
|||
)
|
||||
SUPPORT_CHAT = environ.get("SUPPORT_CHAT", "YasirPediaChannel")
|
||||
NIGHTMODE = environ.get("NIGHTMODE", False)
|
||||
OPENAI_API = getConfig("OPENAI_API")
|
||||
|
||||
## Config For AUtoForwarder
|
||||
# Forward From Chat ID
|
||||
|
|
|
|||
Loading…
Reference in a new issue