156 lines
4.8 KiB
Python
Executable File
156 lines
4.8 KiB
Python
Executable File
print(f'import bale madule ...')
|
|
import asyncio
|
|
import json
|
|
from fastapi import FastAPI, Request
|
|
from pydantic import BaseModel
|
|
import requests
|
|
import logging
|
|
import uvicorn
|
|
import chatbot_handler as ch
|
|
|
|
# ===========================
|
|
# پیکربندی اولیه
|
|
# ===========================
|
|
TOKEN = '2052165365:Tt7u2qXB9oRTPISeZ0wmoAGpPsIgjq-vAxM'
|
|
API_URL = f"https://tapi.bale.ai/bot{TOKEN}/"
|
|
|
|
# راهاندازی لاگر
|
|
logging.basicConfig(
|
|
filename="./baleqabot/bot.log",
|
|
level=logging.INFO,
|
|
format="%(asctime)s - %(levelname)s - %(message)s"
|
|
)
|
|
|
|
# ===========================
|
|
# define import model class
|
|
# ===========================
|
|
class Message(BaseModel):
|
|
chat: dict
|
|
text: str | None = None
|
|
|
|
class Update(BaseModel):
|
|
message: Message | None = None
|
|
|
|
# ===========================
|
|
# کلاس اصلی ربات بله
|
|
# ===========================
|
|
class BaleBot:
|
|
def __init__(self, token: str):
|
|
# self.api_url = f"https://api.bale.ai/bot{token}/"
|
|
self.api_url = API_URL
|
|
|
|
async def get_updates(self, offset = None):
|
|
params = {"timeout": 20}
|
|
if offset:
|
|
params["offset"] = offset
|
|
resp = requests.get(f"{self.api_url}getUpdates", params=params)
|
|
return resp.json().get("result", [])
|
|
|
|
async def send_message(self, chat_id: int, text: str, keyboard=None):
|
|
payload = {
|
|
"chat_id": chat_id,
|
|
"text": text,
|
|
"parse_mode": "HTML"
|
|
}
|
|
if keyboard:
|
|
payload["reply_markup"] = keyboard
|
|
try:
|
|
response = requests.post(self.api_url + "sendMessage", json=payload)
|
|
return response.json()
|
|
except Exception as e:
|
|
logging.error(f"Error sending message: {e}")
|
|
return None
|
|
|
|
async def get_latest_req_id(self):
|
|
latest_req_id = 0
|
|
with open('./baleqabot/requests.json', 'r', encoding='utf-8') as file:
|
|
prev_reqs = json.load(file)
|
|
|
|
if prev_reqs:
|
|
latest_req_id = prev_reqs[-1]['update_id']
|
|
|
|
return latest_req_id + 1
|
|
|
|
async def save_entery(self, update):
|
|
all_reqs = []
|
|
with open('./baleqabot/requests.json', 'r', encoding='utf-8') as file:
|
|
prev_reqs = json.load(file)
|
|
all_reqs.extend(prev_reqs)
|
|
all_reqs.extend(update)
|
|
|
|
with open('./baleqabot/requests.json', 'w', encoding='utf-8') as file:
|
|
data = json.dumps(all_reqs, ensure_ascii=False, indent=2)
|
|
file.write(data)
|
|
|
|
return True
|
|
|
|
async def handle_update(self, update_reqs: dict):
|
|
data = update_reqs[0]
|
|
if "message" not in data:
|
|
return
|
|
message = data["message"]
|
|
chat_id = message["chat"]["id"]
|
|
text = message.get("text", "").strip()
|
|
|
|
logging.info(f"Received message from {chat_id}: {text}")
|
|
|
|
if text == "/start":
|
|
reply = "سلام، من دستیار هوشمند قوانین هستم. لطفا پرسش خود را وارد نمائید ..."
|
|
# keyboard = {
|
|
# "keyboard": [["/help", "/status"]],
|
|
# "resize_keyboard": True,
|
|
# "one_time_keyboard": True
|
|
# }
|
|
self.send_message(chat_id, reply)
|
|
|
|
elif text == "/chat":
|
|
reply = "لطفا متن پرسش از قوانین را وارد نمائید ..."
|
|
self.send_message(chat_id, reply)
|
|
|
|
# elif text == "/help":
|
|
# reply = (
|
|
# "دستورهای موجود:\n"
|
|
# "/start - شروع ربات\n"
|
|
# "/chat - گفتگو با دستیار هوشمند قانون\n"
|
|
# "/status - وضعیت ربات"
|
|
# )
|
|
# self.send_message(chat_id, reply)
|
|
|
|
elif text == "/status":
|
|
reply = "ربات فعال است ✅"
|
|
self.send_message(chat_id, reply)
|
|
|
|
else:
|
|
answer = await chat.run_chatbot(text, chat.create_chat_id())
|
|
if answer:
|
|
reply = answer
|
|
else:
|
|
reply = 'خطا در تولید پاسخ!'
|
|
|
|
self.send_message(chat_id, reply)
|
|
|
|
|
|
async def bale_main():
|
|
print(f'bale-qabot is Readey!!!')
|
|
while True:
|
|
last_req_id = bale_bot.get_latest_req_id()
|
|
update = bale_bot.get_updates(last_req_id)
|
|
if update:
|
|
bale_bot.save_entery(update)
|
|
bale_bot.handle_update(update)
|
|
print('ok')
|
|
|
|
|
|
# ===========================
|
|
# ساخت اپلیکیشن FastAPI
|
|
# ===========================
|
|
# app = FastAPI()
|
|
bale_bot = BaleBot(TOKEN)
|
|
result = asyncio.run(bale_main())
|
|
# ===========================
|
|
# (local execution)
|
|
# ===========================
|
|
if __name__ == "__main__":
|
|
# uvicorn.run("chatbot:app", host="https://bale.tavasi.ir/", port=5000)
|
|
bale_main()
|