From 80790ed4f62f4ffe03ccb547fd6240ec91c38b9c Mon Sep 17 00:00:00 2001 From: yasir Date: Thu, 8 Dec 2022 11:01:18 +0700 Subject: [PATCH] Tes add chatbot and filters from wbb --- database/filters_db.py | 50 ++++++++++++ misskaty/helper/functions.py | 28 ++++++- misskaty/plugins/chatbot.py | 34 ++++++++ misskaty/plugins/filters.py | 148 +++++++++++++++++++++++++++++++++++ misskaty/vars.py | 1 + 5 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 database/filters_db.py create mode 100644 misskaty/plugins/chatbot.py create mode 100644 misskaty/plugins/filters.py diff --git a/database/filters_db.py b/database/filters_db.py new file mode 100644 index 00000000..f7275a0f --- /dev/null +++ b/database/filters_db.py @@ -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, + ) diff --git a/misskaty/helper/functions.py b/misskaty/helper/functions.py index 7220a746..389c8de3 100644 --- a/misskaty/helper/functions.py +++ b/misskaty/helper/functions.py @@ -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 diff --git a/misskaty/plugins/chatbot.py b/misskaty/plugins/chatbot.py new file mode 100644 index 00000000..fff8e301 --- /dev/null +++ b/misskaty/plugins/chatbot.py @@ -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 /{m.command[0]} [pertanyaan] 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.") diff --git a/misskaty/plugins/filters.py b/misskaty/plugins/filters.py new file mode 100644 index 00000000..eb58a2d2 --- /dev/null +++ b/misskaty/plugins/filters.py @@ -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) diff --git a/misskaty/vars.py b/misskaty/vars.py index 28269398..ab30118c 100644 --- a/misskaty/vars.py +++ b/misskaty/vars.py @@ -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