Tes add chatbot and filters from wbb

This commit is contained in:
yasir 2022-12-08 11:01:18 +07:00
parent 662a300b11
commit 80790ed4f6
5 changed files with 260 additions and 1 deletions

50
database/filters_db.py Normal file
View 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,
)

View file

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

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

View file

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