bot / app.py
attendantelectro's picture
Update app.py
c02e6c2 verified
Raw
History Blame Contribute Delete
5.15 kB
import os
import json
import asyncio
from datetime import datetime
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
from dotenv import load_dotenv
# بارگذاری متغیرهای محیطی
load_dotenv()
BOT_TOKEN = os.getenv("TELEGRAM_TOKEN")
# مسیر پوشه اصلی برای ذخیره فایل‌های کاربران
USER_DATA_DIR = "user_data"
os.makedirs(USER_DATA_DIR, exist_ok=True)
# خواندن پرامپت ثابت از فایل
def read_prompt():
with open("prapt.txt", "r", encoding="utf-8") as f:
return f.read()
# ذخیره یا به‌روزرسانی فایل PROFILE_UPDATE.json داخل پوشه کاربر
def save_profile_update(user_id: str, content: str):
user_dir = os.path.join(USER_DATA_DIR, user_id)
os.makedirs(user_dir, exist_ok=True)
file_path = os.path.join(user_dir, "PROFILE_UPDATE.json")
with open(file_path, "w", encoding="utf-8") as f:
f.write(content)
# ذخیره تاریخچه چت در فایل history.json داخل پوشه کاربر
def save_chat_history(user_id: str, user_message: str, bot_response: str):
user_dir = os.path.join(USER_DATA_DIR, user_id)
os.makedirs(user_dir, exist_ok=True)
file_path = os.path.join(user_dir, "history.json")
history = []
if os.path.exists(file_path):
with open(file_path, "r", encoding="utf-8") as f:
history = json.load(f)
history.append({"user": user_message, "bot": bot_response, "time": str(datetime.now())})
with open(file_path, "w", encoding="utf-8") as f:
json.dump(history, f, ensure_ascii=False, indent=4)
# استخراج بخش [PROFILE_UPDATE]
def extract_profile_update(response: str) -> str:
start_tag = "[PROFILE_UPDATE]"
end_tag = "[/PROFILE_UPDATE]"
start_idx = response.find(start_tag)
end_idx = response.find(end_tag)
if start_idx != -1 and end_idx != -1:
return response[start_idx + len(start_tag):end_idx].strip()
return ""
# پاک کردن بخش [PROFILE_UPDATE] از پاسخ
def clean_response(response: str) -> str:
start_tag = "[PROFILE_UPDATE]"
end_tag = "[/PROFILE_UPDATE]"
start_idx = response.find(start_tag)
end_idx = response.find(end_tag)
if start_idx != -1 and end_idx != -1:
return response[:start_idx] + response[end_idx + len(end_tag):]
return response
# ارسال درخواست به API میسترال
async def call_mistral_api(prompt: str, user_message: str, user_id: str):
system_prompt = read_prompt()
# خواندن محتویات فایل PROFILE_UPDATE.json (اگر وجود داشته باشد)
user_profile = ""
user_dir = os.path.join(USER_DATA_DIR, user_id)
profile_file_path = os.path.join(user_dir, "PROFILE_UPDATE.json")
if os.path.exists(profile_file_path):
with open(profile_file_path, "r", encoding="utf-8") as f:
user_profile = f.read()
# ساخت context
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
context = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"تاریخ و ساعت فعلی: {current_time}"},
{"role": "user", "content": user_profile},
{"role": "user", "content": user_message}
]
# در اینجا باید درخواست به API میسترال ارسال شود
# برای مثال، با استفاده از کتابخانه requests:
# response = requests.post(MISTRAL_API_URL, json={"messages": context})
# return response.json()["choices"][0]["message"]["content"]
# برای تست، یک پاسخ نمونه برمی‌گردونیم
return "این یک پاسخ نمونه است. [PROFILE_UPDATE] اطلاعات جدید کاربر [/PROFILE_UPDATE]"
# هندلر دستور /start
async def start_handler(message: types.Message):
await message.answer(
"سلام! به ربات تلگرام من خوش آمدید.\n"
"شما می‌توانید با ارسال متن، با من چت کنید."
)
# هندلر پیام‌های متنی
async def message_handler(message: types.Message):
user_id = str(message.from_user.id)
user_message = message.text
# فراخوانی API میسترال
bot_response = await call_mistral_api(read_prompt(), user_message, user_id)
# استخراج و ذخیره‌سازی [PROFILE_UPDATE]
profile_update = extract_profile_update(bot_response)
if profile_update:
save_profile_update(user_id, profile_update)
# پاک کردن بخش [PROFILE_UPDATE] از پاسخ
cleaned_response = clean_response(bot_response)
# ذخیره تاریخچه چت
save_chat_history(user_id, user_message, cleaned_response)
# نمایش پاسخ پاک شده به کاربر
await message.answer(cleaned_response)
# راه‌اندازی ربات
async def main():
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
dp.message.register(start_handler, Command("start"))
dp.message.register(message_handler)
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())