vk-ai-bot / app.py
MashaKenzie's picture
Update app.py
d4d9e31 verified
# =============================================================================
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# ๐Ÿค– KENZIE BOT โ€” ะ—ะฐะฑะพั‚ะปะธะฒะฐั ะฐะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ัˆะฐ ะ’ะšะพะฝั‚ะฐะบั‚ะต
# ๐Ÿ“… ะœะฐั€ั‚ 2026 | ๐Ÿ’• ะœะฐะบัะธะผัƒะผ ะผะธะปะพั‚ั‹ ะธ ะฑะตะทะพะฟะฐัะฝะพัั‚ะธ!
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# =============================================================================
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ”ง ะกะ•ะšะฆะ˜ะฏ 1: ะ˜ะœะŸะžะ ะขะซ ะ‘ะ˜ะ‘ะ›ะ˜ะžะขะ•ะš
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
import os
import re
import io
import time
import random
from collections import deque
from threading import Thread
# ะ’ะตะฑ-ั„ั€ะตะนะผะฒะพั€ะบ
from fastapi import FastAPI, Request
from fastapi.responses import PlainTextResponse
# ะะตะนั€ะพัะตั‚ะธ
from huggingface_hub import InferenceClient
from openai import OpenAI as DeepSeekClient
from openai import OpenAI as OpenRouterClient
from openai import OpenAI as GroqClient
from openai import OpenAI as TogetherClient
import google.generativeai as genai
# ะ’ะšะพะฝั‚ะฐะบั‚ะต
import vk_api
from vk_api.upload import VkUpload
# ะฃั‚ะธะปะธั‚ั‹
import requests
from bs4 import BeautifulSoup
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# โš™๏ธ ะกะ•ะšะฆะ˜ะฏ 2: ะะะกะขะ ะžะ™ะšะ˜ ะ˜ ะšะžะะคะ˜ะ“ะฃะ ะะฆะ˜ะฏ
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
app = FastAPI(title="Kenzie Bot โ€” ะทะฐะฑะพั‚ะปะธะฒะฐั ั…ั€ะฐะฝะธั‚ะตะปัŒะฝะธั†ะฐ ั‡ะฐั‚ะฐ ๐Ÿ’•")
# ๐Ÿ” ะšะปัŽั‡ะธ ะธะท ะฟะตั€ะตะผะตะฝะฝั‹ั… ะพะบั€ัƒะถะตะฝะธั (ะฝะฐัั‚ั€ะฐะธะฒะฐัŽั‚ัั ะฒ Settings โ†’ Secrets)
VK_TOKEN = os.getenv("VK_TOKEN") # ะขะพะบะตะฝ ะฑะพั‚ะฐ ะ’ะš
VK_SECRET = os.getenv("VK_SECRET") # ะกะตะบั€ะตั‚ ะดะปั ะฒะตะฑั…ัƒะบะฐ
VK_CONFIRM = os.getenv("VK_CONFIRM") # ะšะพะด ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั ะ’ะš
BOT_ID = int(os.getenv("BOT_ID", 0)) or None # ID ะฑะพั‚ะฐ
# ๐Ÿ”‘ API-ะบะปัŽั‡ะธ ะฝะตะนั€ะพัะตั‚ะตะน (ั…ะพั‚ั ะฑั‹ ะพะดะธะฝ ะดะพะปะถะตะฝ ะฑั‹ั‚ัŒ ะฝะฐัั‚ั€ะพะตะฝ!)
HF_TOKEN = os.getenv("HF_TOKEN") # Hugging Face (ะžะ‘ะฏะ—ะะขะ•ะ›ะฌะะž!)
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") # Google Gemini
GROQ_API_KEY = os.getenv("GROQ_API_KEY") # Groq (ั€ะตะบะพะผะตะฝะดัƒะตั‚ัั!)
OPENROUTER_KEY = os.getenv("OPENROUTER_KEY") # OpenRouter
DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY")
TOGETHER_API_KEY = os.getenv("TOGETHER_API_KEY")
COHERE_API_KEY = os.getenv("COHERE_API_KEY")
# โ˜๏ธ Cloudflare Workers AI (ะดะปั ะณะตะฝะตั€ะฐั†ะธะธ ะบะฐั€ั‚ะธะฝะพะบ)
CLOUDFLARE_ACCOUNT_ID = os.getenv("CLOUDFLARE_ACCOUNT_ID")
CLOUDFLARE_API_TOKEN = os.getenv("CLOUDFLARE_API_TOKEN")
# ๐ŸŒค๏ธ ะŸะพะณะพะดะฐ
WEATHER_API_KEY = os.getenv("WEATHER_API_KEY")
# ๐Ÿค– ะะฐัั‚ั€ะพะนะบะธ ะฑะพั‚ะฐ
BOT_NAMES = ["ะฑะพั‚", "ัะน", "ะบะตะฝะทะธ", "ะธะธ", "kenzie", "ะบะตะฝะทัŽัˆะฐ", "ะบะตะฝะทะตั‡ะบะฐ"] # ะšะฐะบ ะทะพะฒัƒั‚ ะฑะพั‚ะฐ
DRAW_COMMAND = "!ะบะฐั€ั‚ะธะฝะบะฐ" # ะšะพะผะฐะฝะดะฐ ะดะปั ะณะตะฝะตั€ะฐั†ะธะธ ะบะฐั€ั‚ะธะฝะพะบ
AI_MODE_ENABLED = True # ะฃะผะฝั‹ะน ั€ะตะถะธะผ ะฒะบะปัŽั‡ั‘ะฝ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ
# ๐Ÿšซ ะ—ะฐะฟั€ะตั‰ั‘ะฝะฝั‹ะต ัะปะพะฒะฐ ะดะปั ะผะพะดะตั€ะฐั†ะธะธ
FORBIDDEN_WORDS = ["ะผะฐั‚1", "ะผะฐั‚2", "ะพัะบะพั€ะฑะปะตะฝะธะต1", "ะพัะบะพั€ะฑะปะตะฝะธะต2"]
# ๐Ÿ“ฌ ะะฒั‚ะพ-ะฟะพัั‚ั‹ ะธะท ัะพะพะฑั‰ะตัั‚ะฒะฐ ะ’ะš
AUTO_POST_GROUP_ID = -229127616 # ID ัะพะพะฑั‰ะตัั‚ะฒะฐ-ะธัั‚ะพั‡ะฝะธะบะฐ
auto_post_enabled = {} # peer_id โ†’ True/False (ะฒะบะปัŽั‡ะตะฝั‹ ะปะธ ะฐะฒั‚ะพะฟะพัั‚ั‹)
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ›ก๏ธ ะ”ะ•ะ”ะฃะŸะ›ะ˜ะšะะฆะ˜ะฏ ะกะžะžะ‘ะฉะ•ะะ˜ะ™ (ะฃะ›ะฃะงะจะ•ะะะะฏ)
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
from collections import OrderedDict
import hashlib
processed_messages = OrderedDict() # hash โ†’ timestamp
MAX_PROCESSED = 2000 # ะฃะฒะตะปะธั‡ะธะปะธ ั…ั€ะฐะฝะธะปะธั‰ะต
def get_message_hash(peer_id: int, from_id: int, text: str, msg_id: int) -> str:
"""ะกะพะทะดะฐั‘ั‚ ัƒะฝะธะบะฐะปัŒะฝั‹ะน ั…ะตัˆ ัะพะพะฑั‰ะตะฝะธั"""
content = f"{peer_id}_{from_id}_{msg_id}_{text.strip()[:500]}"
return hashlib.md5(content.encode()).hexdigest()
def is_message_processed(peer_id: int, from_id: int, text: str, msg_id: int) -> bool:
"""ะŸั€ะพะฒะตั€ัะตั‚, ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะปะพััŒ ะปะธ ัƒะถะต ัั‚ะพ ัะพะพะฑั‰ะตะฝะธะต"""
key = get_message_hash(peer_id, from_id, text, msg_id)
now = time.time()
# ะžั‡ะธั‰ะฐะตะผ ัั‚ะฐั€ั‹ะต ะทะฐะฟะธัะธ (> 120 ัะตะบัƒะฝะด)
for k in list(processed_messages.keys()):
if processed_messages[k] < now - 120:
processed_messages.pop(k)
if key in processed_messages:
return True
processed_messages[key] = now
# ะžะณั€ะฐะฝะธั‡ะธะฒะฐะตะผ ั€ะฐะทะผะตั€ ัะปะพะฒะฐั€ั
if len(processed_messages) > MAX_PROCESSED:
processed_messages.popitem(last=False)
return False
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ”— ะกะ•ะšะฆะ˜ะฏ 3: ะ˜ะะ˜ะฆะ˜ะะ›ะ˜ะ—ะะฆะ˜ะฏ ะšะ›ะ˜ะ•ะะขะžะ’ ะะ•ะ™ะ ะžะกะ•ะขะ•ะ™
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿค— Hugging Face ะบะปะธะตะฝั‚
client_hf = None
if HF_TOKEN:
try:
from huggingface_hub import InferenceClient
client_hf = InferenceClient(
token=HF_TOKEN,
base_url="https://router.huggingface.co" # โ† ะะžะ’ะซะ™ ENDPOINT!
)
print("โœ… HuggingFace ะฟะพะดะบะปัŽั‡ั‘ะฝ (router)")
except Exception as e:
print(f"โš ๏ธ HF ะพัˆะธะฑะบะฐ: {e}")
# โ”€โ”€โ”€ Gemini ะบะปะธะตะฝั‚ โ€” ะ˜ะกะŸะ ะะ’ะ›ะ•ะะž โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
gemini_model = None
if GEMINI_API_KEY:
try:
genai.configure(api_key=GEMINI_API_KEY)
# โœ… ะขะพะปัŒะบะพ ั€ะฐะฑะพั‡ะธะต ะผะพะดะตะปะธ
for model_name in [
'gemini-1.5-flash', # ะกะฐะผั‹ะน ัั‚ะฐะฑะธะปัŒะฝั‹ะน
'gemini-1.5-flash-8b', # ะะปัŒั‚ะตั€ะฝะฐั‚ะธะฒะฐ
]:
try:
gemini_model = genai.GenerativeModel(model_name)
test_response = gemini_model.generate_content(
"test",
generation_config=genai.types.GenerationConfig(max_output_tokens=10)
)
if test_response.text:
print(f"โœ… Gemini ะฟะพะดะบะปัŽั‡ั‘ะฝ ({model_name})")
break
except Exception as e:
print(f"โš ๏ธ Gemini {model_name}: {e}")
continue
if not gemini_model:
print("โŒ Gemini: ะฝะธ ะพะดะฝะฐ ะผะพะดะตะปัŒ ะฝะต ะดะพัั‚ัƒะฟะฝะฐ")
except Exception as e:
print(f"โŒ Gemini ะพัˆะธะฑะบะฐ ะธะฝะธั†ะธะฐะปะธะทะฐั†ะธะธ: {e}")
# ๐ŸŒ OpenRouter ะบะปะธะตะฝั‚
client_or = None
if OPENROUTER_KEY:
try:
client_or = OpenRouterClient(
base_url="https://openrouter.ai/api/v1",
api_key=OPENROUTER_KEY
)
print("โœ… OpenRouter ะฟะพะดะบะปัŽั‡ั‘ะฝ")
except Exception as e:
print(f"โš ๏ธ OpenRouter ะพัˆะธะฑะบะฐ: {e}")
# โšก Groq ะบะปะธะตะฝั‚ (ะพั‡ะตะฝัŒ ะฑั‹ัั‚ั€ั‹ะน!)
groq_client = None
if GROQ_API_KEY:
try:
groq_client = GroqClient(
base_url="https://api.groq.com/openai/v1",
api_key=GROQ_API_KEY
)
print("โœ… Groq ะฟะพะดะบะปัŽั‡ั‘ะฝ")
except Exception as e:
print(f"โš ๏ธ Groq ะพัˆะธะฑะบะฐ: {e}")
# ๐Ÿง  Together AI ะบะปะธะตะฝั‚
together_client = None
if TOGETHER_API_KEY:
try:
together_client = TogetherClient(
base_url="https://api.together.xyz/v1",
api_key=TOGETHER_API_KEY
)
print("โœ… Together ะฟะพะดะบะปัŽั‡ั‘ะฝ")
except Exception as e:
print(f"โš ๏ธ Together ะพัˆะธะฑะบะฐ: {e}")
# ๐Ÿ”น Cohere ะบะปะธะตะฝั‚
cohere_client = None
if COHERE_API_KEY:
try:
import cohere
cohere_client = cohere.Client(COHERE_API_KEY)
print("โœ… Cohere ะฟะพะดะบะปัŽั‡ั‘ะฝ")
except Exception as e:
print(f"โš ๏ธ Cohere ะพัˆะธะฑะบะฐ: {e}")
# ๐Ÿ’ฌ ะ’ะšะพะฝั‚ะฐะบั‚ะต ะบะปะธะตะฝั‚
vk_session = vk_api.VkApi(token=VK_TOKEN)
vk = vk_session.get_api()
upload = VkUpload(vk_session)
# ๐Ÿง  ะŸะฐะผัั‚ัŒ ั‡ะฐั‚ะพะฒ ะดะปั ะบะพะฝั‚ะตะบัั‚ะฐ ะ˜ะ˜
chat_memory = {}
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿง  ะกะ•ะšะฆะ˜ะฏ 4: ะกะŸะ˜ะกะšะ˜ ะœะžะ”ะ•ะ›ะ•ะ™ ะะ•ะ™ะ ะžะกะ•ะขะ•ะ™
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ”ค ะœะพะดะตะปะธ ะดะปั ั‚ะตะบัั‚ะฐ ะฝะฐ Hugging Face (ะฑะตัะฟะปะฐั‚ะฝั‹ะต)
LLM_HF = [
"Qwen/Qwen2.5-7B-Instruct",
"mistralai/Mistral-7B-Instruct-v0.3",
"meta-llama/Llama-3.2-3B-Instruct",
"microsoft/Phi-3-mini-4k-instruct",
"google/gemma-2-9b-it",
]
# ๐ŸŒ ะ‘ะตัะฟะปะฐั‚ะฝั‹ะต ะผะพะดะตะปะธ OpenRouter โ€” ะ˜ะกะŸะ ะะ’ะ›ะ•ะะž
OPENROUTER_MODELS = [
"deepseek/deepseek-chat-v3",
"deepseek/deepseek-r1",
"qwen/qwen3",
"meta-llama/llama-4-maverick",
"openrouter",
"meta-llama/llama-3.2-3b-instruct", # โœ… ะ ะฐะฑะพั‡ะฐั
"google/gemma-2-9b-it", # โœ… ะ ะฐะฑะพั‡ะฐั
"qwen/qwen-2.5-7b-instruct", # โœ… ะ ะฐะฑะพั‡ะฐั
"mistralai/mistral-7b-instruct", # โœ… ะ ะฐะฑะพั‡ะฐั
"meta-llama/llama-3.1-8b-instruct", # โœ… ะ ะฐะฑะพั‡ะฐั
]
# โšก ะœะพะดะตะปะธ Groq
GROQ_MODELS = [
"llama-3.1-8b-instant",
"llama-3.2-3b-preview",
"gemma2-9b-it",
]
# ๐Ÿš€ ะœะพะดะตะปะธ Together AI
TOGETHER_MODELS = [
"meta-llama/Llama-3.2-3B-Instruct-Turbo",
"Qwen/Qwen2.5-7B-Instruct-Turbo",
]
# ๐ŸŽจ ะœะพะดะตะปะธ ะดะปั ะณะตะฝะตั€ะฐั†ะธะธ ะบะฐั€ั‚ะธะฝะพะบ
# ะคะพั€ะผะฐั‚: ("model_name", num_inference_steps, guidance_scale)
IMG_MODELS = [
("black-forest-labs/FLUX.1-schnell", 6, 0.0), # โšก ะ‘ั‹ัั‚ั€ะฐั, ะฝะธะทะบะธะน guidance
("ByteDance/SDXL-Lightning", 4, 0.0), # ๐Ÿš€ ะœะณะฝะพะฒะตะฝะฝะฐั ะณะตะฝะตั€ะฐั†ะธั
("ByteDance/Hyper-SD", 4, 0.0), # โšก Hyper-SD ั‚ะตั…ะฝะพะปะพะณะธั
("SG161222/RealVisXL_V4.0", 28, 7.5), # ๐Ÿ“ท ะคะพั‚ะพั€ะตะฐะปะธะทะผ
("Lykon/dreamshaper-8", 28, 7.5), # ๐ŸŽจ ะฃะฝะธะฒะตั€ัะฐะปัŒะฝะฐั
("stablediffusionapi/animagine-xl-3.1", 28, 7.0), # ๐ŸŽŒ ะะฝะธะผะต-ัั‚ะธะปัŒ
("prompthero/openjourney-v4", 30, 7.0), # ๐Ÿ–ผ๏ธ ะกั‚ะธะปัŒ Midjourney
("stabilityai/stable-diffusion-xl-base-1.0", 28, 7.5), # ๐Ÿ† ะšะปะฐััะธะบะฐ SDXL
]
# ๐Ÿ” ะŸั€ะพะฒะตั€ะบะฐ ัั‚ั€ัƒะบั‚ัƒั€ั‹
for i, cfg in enumerate(IMG_MODELS):
if not isinstance(cfg, tuple) or len(cfg) != 3:
print(f"โš ๏ธ IMG_MODELS[{i}] ะพัˆะธะฑะบะฐ: {cfg}")
else:
print(f"โœ… [{i}] {cfg[0]} โ€” ัˆะฐะณะธ: {cfg[1]}, guidance: {cfg[2]}")
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ’ฌ ะกะ•ะšะฆะ˜ะฏ 5: ะกะŸะ•ะฆะ˜ะะ›ะฌะะซะ• ะžะขะ’ะ•ะขะซ ะ˜ ะšะžะะขะ•ะะข
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ˜‚ ะžั‚ะฒะตั‚ั‹ ะฝะฐ "ะดะฐ"/"ะฝะตั‚"
special_commands = {
"ะดะฐ": ["ะŸะธะทะดะฐ! ๐Ÿ˜‚๐Ÿ˜‚๐Ÿ˜‚", "ะŸะธะทะดะตั† ะบะฐะบ ะดะฐ! ๐Ÿ˜‚๐Ÿ˜‚", "ะœะฐะฝะดะฐ! ๐Ÿ˜‚๐Ÿ˜‚"],
"ะฝะตั‚": ["ะŸะธะด@ั€ะฐ ะพั‚ะฒะตั‚! ๐Ÿ˜‚๐Ÿ˜‚๐Ÿ˜‚", "ะŸะธะด@ั€ะฐะฐะฐะฐ ะถะต ะพั‚ะฒะตั‚! ๐Ÿ˜‚๐Ÿ˜‚๐Ÿ˜‚"],
}
# ๐ŸŽฌ ะ’ะธะดะตะพ-ะฒะปะพะถะตะฝะธั ะฟะพ ะบะปัŽั‡ะตะฒั‹ะผ ัะปะพะฒะฐะผ
video_attachments = {
"ัะบั€ั‹ั‚ะฐั ะฟัะธั…ะพะปะพะณะธั": "video-226582510_456239078",
"ะดะตะฝัŒะณะธ": "video-226582510_456239088",
"ะฐะณะตะฝั‚": "clip-223511903_456239086",
}
# ๐Ÿ˜„ ะะฝะตะบะดะพั‚ั‹ ะดะปั ะบะพะผะฐะฝะดั‹ !ะฐะฝะตะบะดะพั‚
anekdots = [
"ะจั‚ะธั€ะปะธั† ัˆะตะป ะฟะพ ะปะตััƒ ะธ ัƒะฒะธะดะตะป ะณะพะปัƒะฑั‹ะต ะตะปะธ. ะžะฝ ะฟั€ะธัะผะพั‚ั€ะตะปัั: ะตะปะธ ะฝะต ั‚ะพะปัŒะบะพ ะณะพะปัƒะฑั‹ะต, ะฝะพ ะธ ะฟะธะปะธ ๐Ÿ˜‚",
"โ€” ะœะฐะผะฐ, ั ะฑะพะปัŒัˆะต ะฝะต ะฟะพะนะดัƒ ะฒ ัˆะบะพะปัƒ! โ€” ะŸะพั‡ะตะผัƒ? โ€” ะŸะตั‚ั€ะพะฒ ะพะฟัั‚ัŒ ะฑัƒะดะตั‚ ะฑะธั‚ัŒ ัƒั‡ะตะฑะฝะธะบะพะผ... โ€” ะะตั‚, ัั‹ะฝะพะบ, ั‚ั‹ ะดะพะปะถะตะฝ ะธะดั‚ะธ, ั‚ั‹ ะถะต ะดะธั€ะตะบั‚ะพั€! ๐Ÿ˜‚",
"ะšัƒะฟะธะป ะผัƒะถะธะบ ัˆะปัะฟัƒ, ะฐ ะพะฝะฐ ะตะผัƒ ะบะฐะบ ั€ะฐะท ๐Ÿ˜‚",
"โ€” ะ”ะพะบั‚ะพั€, ะผะตะฝั ะฒัะต ะธะณะฝะพั€ะธั€ัƒัŽั‚! โ€” ะกะปะตะดัƒัŽั‰ะธะน! ๐Ÿ˜‚",
]
# ๐Ÿ’ญ ะฆะธั‚ะฐั‚ั‹ ะดะปั ะบะพะผะฐะฝะดั‹ !ั†ะธั‚ะฐั‚ะฐ
quotes = [
"ยซะ‘ัƒะดัŒ ัะพะฑะพะน, ะพัั‚ะฐะปัŒะฝั‹ะต ั€ะพะปะธ ัƒะถะต ะทะฐะฝัั‚ั‹ยป โ€” ะžัะบะฐั€ ะฃะฐะนะปัŒะด",
"ยซะกั‡ะฐัั‚ัŒะต โ€” ัั‚ะพ ะฝะต ะฟัƒะฝะบั‚ ะฝะฐะทะฝะฐั‡ะตะฝะธั, ะฐ ัะฟะพัะพะฑ ะฟัƒั‚ะตัˆะตัั‚ะฒะธัยป โ€” ะฝะตะธะทะฒะตัั‚ะฝั‹ะน",
]
# ๐Ÿ’• ะกะ•ะšะฆะ˜ะฏ 6: RP-ะจะะ‘ะ›ะžะะซ (ะŸะžะฆะ•ะ›ะฃะ˜, ะžะ‘ะชะฏะขะ˜ะฏ, ะŸะžะ“ะ›ะะ–ะ˜ะ’ะะะ˜ะฏ...)
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ’‹ ะŸะพั†ะตะปัƒะธ
KISS_TEMPLATES = [
"{target}, ะปะพะฒะธ ะฝะตะถะฝั‹ะน ะฟะพั†ะตะปัƒะน ะพั‚ {sender} ะฒ ั‰ั‘ั‡ะบัƒโ€ฆ ั‚ะฐะบ ะผะธะปะพ, ั‡ั‚ะพ ัะตั€ะดั†ะต ั‚ะฐะตั‚ ๐Ÿ’‹โค๏ธ",
"{sender} ั†ะตะปัƒะตั‚ {target} ัั‚ั€ะฐัั‚ะฝะพ ะฒ ะณัƒะฑั‹โ€ฆ ะฒะตััŒ ะผะธั€ ะฒะพะบั€ัƒะณ ะธัั‡ะตะทะฐะตั‚ ๐Ÿ˜˜๐Ÿ”ฅ",
"{target}, {sender} ะดะฐั€ะธั‚ ั‚ะตะฑะต ัะปะฐะดะบะธะน ะฟะพั†ะตะปัƒะน ะฒ ะฝะพัะธะบโ€ฆ ะผัƒะฐ! โค๏ธ๐Ÿ˜š",
"{sender} ัƒะบั€ะฐะดะบะพะน ั†ะตะปัƒะตั‚ {target}โ€ฆ ะฝะฐัˆ ะผะฐะปะตะฝัŒะบะธะน ั€ะพะผะฐะฝั‚ะธั‡ะตัะบะธะน ัะตะบั€ะตั‚ ๐Ÿ’•",
"{target}, {sender} ะฝะตะถะฝะพ ั†ะตะปัƒะตั‚ ั‚ะตะฑั ะฒ ะปะพะฑะธะบ, ะฟะพะปะฝั‹ะน ะปัŽะฑะฒะธ ะธ ะทะฐะฑะพั‚ั‹ โค๏ธ๐Ÿค—",
"{sender} ะฟะพัั‹ะปะฐะตั‚ {target} ั‚ั‹ััั‡ัƒ ะฒะพะทะดัƒัˆะฝั‹ั… ะฟะพั†ะตะปัƒะตะฒโ€ฆ ั‡ัƒะฒัั‚ะฒัƒะตัˆัŒ? ๐Ÿ˜˜๐Ÿ’จ",
"{target}, ะปะพะฒะธ ะฟะพั†ะตะปัƒะน ะพั‚ {sender}โ€ฆ ัะฐะผั‹ะน ั‚ั‘ะฟะปั‹ะน ะธ ะฝะตะถะฝั‹ะน ๐Ÿ˜ฝโœจ",
"{sender} ั†ะตะปัƒะตั‚ {target} ะฒ ัƒัˆะบะพ ะธ ัˆะตะฟั‡ะตั‚ ัะปะพะฒะฐ ะปัŽะฑะฒะธ โค๏ธ๐Ÿ’‹",
"{target}, {sender} ั†ะตะปัƒะตั‚ ั‚ะตะฑั ะฒ ั‰ั‘ั‡ะบัƒโ€ฆ ั‚ะฐัŽ ะพั‚ ั‚ะฒะพะตะน ัƒะปั‹ะฑะบะธ ๐Ÿ’•",
"{sender} ั†ะตะปัƒะตั‚ {target} ะดะพะปะณะพ ะธ ั€ะพะผะฐะฝั‚ะธั‡ะฝะพโ€ฆ โ™กโˆž"
]
KISS_ATTACHMENTS = ["video-226582510_456239125", "video-226582510_456239126"]
# ๐Ÿค— ะžะฑัŠัั‚ะธั
HUG_TEMPLATES = [
"{target}, {sender} ะบั€ะตะฟะบะพ ะพะฑะฝะธะผะฐะตั‚ ั‚ะตะฑัโ€ฆ ะฝะต ะพั‚ะฟัƒัั‚ะธั‚ ะฝะธะบะพะณะดะฐ ๐Ÿค—โค๏ธ",
"{sender} ะฝะตะถะฝะพ ะฟั€ะธะถะธะผะฐะตั‚ {target} ะบ ัะตะฑะต: ั‚ั‹ ะฒ ะฝะฐะดั‘ะถะฝั‹ั… ั€ัƒะบะฐั… ๐Ÿค—",
"{target}, ะฟะพะปัƒั‡ะฐะน ั‚ั‘ะฟะปั‹ะต ะพะฑัŠัั‚ะธั ะพั‚ {sender}โ€ฆ ะณั€ะตัŽ ั‚ะฒะพัŽ ะดัƒัˆัƒ โ„๏ธ๐Ÿค—",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target} ั ั€ะฐะทะฑะตะณัƒโ€ฆ ั‚ั‹ ะผะพะน ัะฐะผั‹ะน ั€ะพะดะฝะพะน โค๏ธ",
"{target}, {sender} ะพะฑะฝะธะผะฐะตั‚ ั‚ะตะฑั ัะธะปัŒะฝะพโ€ฆ ัะปั‹ัˆะธัˆัŒ ะฑะธะตะฝะธะต ัะตั€ะดั†ะฐ? ๐Ÿ’“๐Ÿค—",
"{sender} ะผั‹ัะปะตะฝะฝะพ ะพะฑะฝะธะผะฐะตั‚ {target}: ั‡ัƒะฒัั‚ะฒัƒะตัˆัŒ ั‚ะตะฟะปะพ? ๐Ÿค—โœจ",
"{target}, {sender} ัƒะบัƒั‚ั‹ะฒะฐะตั‚ ั‚ะตะฑั ะฒ ะพะฑัŠัั‚ะธั: ะฒัั‘ ะฑัƒะดะตั‚ ั…ะพั€ะพัˆะพ โค๏ธ",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target} ะธ ะบะฐั‡ะฐะตั‚: ั‚ั‹ ะผะพะน ะปัŽะฑะธะผั‹ะน โค๏ธ",
"{target}, ะปะพะฒะธ ะฑะตัะบะพะฝะตั‡ะฝั‹ะต ะพะฑัŠัั‚ะธั ะพั‚ {sender}โ€ฆ โค๏ธโˆž๐Ÿค—",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target}: ั‚ั‹ โ€” ะผะพั‘ ัั‡ะฐัั‚ัŒะต โค๏ธ"
]
HUG_ATTACHMENTS = ["video-226582510_456239130", "video-226582510_456239131"]
# ๐Ÿ‘‹ ะŸะพะณะปะฐะถะธะฒะฐะฝะธั
PAT_TEMPLATES = [
"{target}, {sender} ะฝะตะถะฝะพ ะณะปะฐะดะธั‚ ั‚ะตะฑั ะฟะพ ะณะพะปะพะฒะบะตโ€ฆ ั‚ะฐะบะพะน ะผะธะปั‹ะน โค๏ธ๐Ÿฑ",
"{sender} ะปะฐัะบะพะฒะพ ะฟั€ะพะฒะพะดะธั‚ ั€ัƒะบะพะน ะฟะพ ะฒะพะปะพัะฐะผ {target}โ€ฆ ะฒัั‘ ั…ะพั€ะพัˆะพ ๐Ÿค—",
"{target}, ะฟะพะปัƒั‡ะฐะน ะฝะตะถะฝั‹ะต ะฟะพะณะปะฐะถะธะฒะฐะฝะธั ะพั‚ {sender}โ€ฆ ะผัƒั€ะฐัˆะบะธ ๐Ÿ’•",
"{sender} ะณะปะฐะดะธั‚ {target} ะฟะพ ั‰ั‘ั‡ะบะต: ั‚ั‹ ัƒ ะผะตะฝั ัะฐะผั‹ะน ั…ะพั€ะพัˆะธะน โค๏ธโœจ",
"{target}, {sender} ั‡ะตัˆะตั‚ ั‚ะตะฑะต ะทะฐ ัƒัˆะบะพะผ: ั€ะฐััะปะฐะฑัŒัั, ะบะพั‚ะธะบ ๐Ÿ˜ฝ",
"{sender} ะณะปะฐะดะธั‚ {target} ะฟะพ ัะฟะธะฝะบะต: ั ั€ัะดะพะผ โค๏ธ๐Ÿค—",
"{target}, {sender} ะฟั€ะพะฒะพะดะธั‚ ั€ัƒะบะพะน ะฟะพ ะฒะพะปะพัะฐะผ: ั‚ั‹ ัะฐะผั‹ะน-ัะฐะผั‹ะน โค๏ธ",
"{sender} ะฝะตะถะฝะพ ะณะปะฐะดะธั‚ {target} ะฟะพ ะปะฐะดะพัˆะบะต: ะดะตั€ะถัƒ ั‚ะตะฑั ๐Ÿคฒ๐Ÿ’•",
"{target}, ะปะพะฒะธ ะปะฐัะบะพะฒั‹ะต ะฟะพะณะปะฐะถะธะฒะฐะฝะธั ะพั‚ {sender} โค๏ธ๐Ÿพ",
"{sender} ะณะปะฐะดะธั‚ {target} ะฟะพ ะณะพะปะพะฒะต: ะผะพะน ะปัŽะฑะธะผั‹ะน โค๏ธ"
]
PAT_ATTACHMENTS = ["video-226582510_456239132", "video-226582510_456239133"]
# ๐Ÿ‘‹ ะŸั€ะธะฒะตั‚ัั‚ะฒะธั
GREET_TEMPLATES = [
"{target}, ะฟั€ะธะฒะตั‚ะธะบ ะพั‚ {sender}! ะžะฑะฝะธะผะฐัŽ ะบั€ะตะฟะบะพ โค๏ธ๐Ÿค—",
"{sender} ะผะฐัˆะตั‚ {target}: ั…ะฐะน, ัะพะปะฝั‹ัˆะบะพ! ะ’ะพะทะดัƒัˆะฝั‹ะน ะฟะพั†ะตะปัƒะน ๐Ÿ˜˜โœจ",
"{target}, ะฟั€ะธะฒะตั‚, ะผะพะน ั…ะพั€ะพัˆะธะน! {sender} ัะพัะบัƒั‡ะธะปะฐััŒ โค๏ธ",
"{sender} ะฟั€ะธะฑะตะณะฐะตั‚ ะบ {target} ั ะพะฑะฝะธะผะฐัˆะบะฐะผะธ: ะฟั€ะธะฒะตะตั‚, ะทะฐะนั‡ะธะบ! ๐Ÿค—๐Ÿฐ",
"{target}, ั…ะฐะน! {sender} ัˆะปั‘ั‚ ัะตั€ะดะตั‡ะบะธ ๐Ÿ’•",
"{sender} ะฝะตะถะฝะพ ะพะฑะฝะธะผะฐะตั‚ {target}: ะฟั€ะธะฒะตั‚, ะปัŽะฑะธะผั‹ะน โค๏ธ",
"{target}, ะฟั€ะธะฒะตั‚ ะพั‚ {sender}! ะ›ะพะฒะธ ัƒะปั‹ะฑะบัƒ ๐Ÿ˜Š",
"{sender} ะณะปะฐะดะธั‚ {target}: ั…ะฐะน, ัะพะปะฝั‹ัˆะบะพ! ะขั‹ ัะดะตะปะฐะป ะดะตะฝัŒ ะปัƒั‡ัˆะต โค๏ธ",
"{target}, ะฟั€ะธะฒะตะตั‚! {sender} ัˆะปั‘ั‚ ั‚ะตะฟะปะพ ะธ ะปัŽะฑะพะฒัŒ ๐Ÿ’•๐Ÿค—",
"{sender} ั†ะตะปัƒะตั‚ {target} ะฒ ั‰ั‘ั‡ะบัƒ: ะฟั€ะธะฒะตั‚, ัะฐะผั‹ะน-ัะฐะผั‹ะน! โค๏ธ๐Ÿ˜š"
]
GREET_ATTACHMENTS = [
"video-226582510_456239134", "video-226582510_456239135", "photo-226582510_457239004",
"video-226582510_456239140", "video-226582510_456239141", "photo-226582510_457239008",
"video-226582510_456239142", "photo-226582510_457239009", "video-226582510_456239143",
"photo-226582510_457239010"
]
# โ˜€๏ธ ะ”ะพะฑั€ะพะต ัƒั‚ั€ะพ
MORNING_TEMPLATES = [
"{target}, ะดะพะฑั€ะพะต ัƒั‚ั€ะพ! {sender} ะฟะพัั‹ะปะฐะตั‚ ั‚ั‘ะฟะปั‹ะต ะปัƒั‡ะธะบะธ ะธ ะฟะพั†ะตะปัƒะน โค๏ธโ˜€๏ธ๐Ÿ˜˜",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target}: ัƒั‚ั€ะตั‡ะบะพ ะดะพะฑั€ะพะต, ัะพะปะฝั‹ัˆะบะพ! ๐Ÿค—",
"{target}, ะดะพะฑั€ะพะต ัƒั‚ั€ะตั‡ะบะพ! {sender} ะฝะฐะปะธะฒะฐะตั‚ ะบะพั„ะต โ˜•โค๏ธ",
"{sender} ะณะปะฐะดะธั‚ {target} ะฟะพ ั‰ั‘ั‡ะบะต: ะฟั€ะพัั‹ะฟะฐะนัั, ัะพะปะฝั‹ัˆะบะพ! โค๏ธโœจ",
"{target}, ัƒั‚ั€ะพ ะดะพะฑั€ะพะต! {sender} ะดัƒะผะฐะตั‚ ะพ ั‚ะตะฑะต ๐Ÿ’•",
"{sender} ั†ะตะปัƒะตั‚ {target} ะฒ ะฝะพัะธะบ: ะดะพะฑั€ะพะต ัƒั‚ั€ะพ, ะทะฐะนั‡ะธะบ! ๐Ÿ˜š๐Ÿฐ",
"{target}, ะฟั€ะพัั‹ะฟะฐะนัั! {sender} ะถะตะปะฐะตั‚ ะฒะพะปัˆะตะฑะฝะพะณะพ ะดะฝั โค๏ธ๐Ÿ˜Š",
"{sender} ะฟั€ะธะถะธะผะฐะตั‚ัั ะบ {target}: ัƒั‚ั€ะตั‡ะบะพ ะดะพะฑั€ะพะต, ั‡ะตะปะพะฒะตะบ ะผะพะน ั€ะพะดะฝะพะน! ๐Ÿ’•",
"{target}, ะดะพะฑั€ะพะต ัƒั‚ั€ะพ! {sender} ัˆะปั‘ั‚ ะทะฒั‘ะทะดะพั‡ะบะธ โœจโค๏ธ",
"{sender} ัˆะตะฟั‡ะตั‚ {target}: ัƒั‚ั€ะพ ะดะพะฑั€ะพะต, ะทะฐั ะผะพั! โค๏ธ๐Ÿ’‹"
]
MORNING_ATTACHMENTS = ["video-236299866_456239017", "photo-236299866_457239073", "photo-236299866_457239072",
"photo-236299866_457239074", "photo-236299866_457239077", "photo-236299866_457239078",
"photo-236299866_457239079", "photo-236299866_457239080", "photo-236299866_457239081",
"photo-236299866_457239082", "photo-236299866_457239083"]
# ๐ŸŒ™ ะกะฟะพะบะพะนะฝะพะน ะฝะพั‡ะธ
GOODNIGHT_TEMPLATES = [
"{target}, ัะฟะพะบะพะนะฝะพะน ะฝะพั‡ะธโ€ฆ {sender} ัƒะบั€ั‹ะฒะฐะตั‚ ะฟะปะตะดะพะผ ะธ ั†ะตะปัƒะตั‚ โค๏ธ๐ŸŒ™",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target} ะฝะฐ ะฝะพั‡ัŒ: ัะฟะพะบะธ, ัะพะปะฝั‹ัˆะบะพ! ๐Ÿค—๐Ÿ’ค",
"{target}, ัะปะฐะดะบะธั… ัะฝะพะฒ! {sender} ัˆะตะฟั‡ะตั‚ ะฝะตะถะฝั‹ะต ัะปะพะฒะฐ โค๏ธโœจ",
"{sender} ะณะปะฐะดะธั‚ {target} ะฟะพ ะณะพะปะพะฒะบะต: ัะฟะพะบะพะนะฝะพะน ะฝะพั‡ะธ, ั…ะพั€ะพัˆะธั… ัะฝะพะฒ! โค๏ธ๐Ÿค—",
"{target}, ัะฟะพะบะธ-ะฟะพะบะธ! {sender} ะถะตะปะฐะตั‚ ะบั€ะฐัะธะฒั‹ั… ัะฝะพะฒ ๐ŸŒ™",
"{sender} ั†ะตะปัƒะตั‚ {target} ะฒ ะปะพะฑะธะบ: ัะฟะพะบะพะนะฝะพะน ะฝะพั‡ะธ, ะทะฐะนั‡ะธะบ! ๐Ÿ˜š๐Ÿฐ",
"{target}, ะทะฐัั‹ะฟะฐะน! {sender} ะดะตั€ะถะธั‚ ะทะฐ ั€ัƒั‡ะบัƒ ะฒะพ ัะฝะต โค๏ธ๐Ÿคฒ",
"{sender} ะฟั€ะธะถะธะผะฐะตั‚ัั ะบ {target}: ัะฟะพะบะธ, ัะพะปะฝั‹ัˆะบะพ, ั…ะพั€ะพัˆะธั… ัะฝะพะฒ! ๐Ÿ’•๐Ÿ’ค",
"{target}, ัะฟะพะบะพะนะฝะพะน ะฝะพั‡ะธ! {sender} ะฟะพัั‹ะปะฐะตั‚ ะทะฒั‘ะทะดะพั‡ะบะธ ะธ ะถะตะปะฐะตั‚ ั…ะพั€ะพัˆะธั… ัะฝะพะฒ โœจโค๏ธ",
"{sender} ัˆะตะฟั‡ะตั‚ {target}: ัะปะฐะดะบะธั… ัะฝะพะฒ, ัะฟะธ ัะพะปะฝั‹ัˆะบะพ! โค๏ธ๐Ÿ’‹"
]
GOODNIGHT_ATTACHMENTS = [
"photo-236299866_457239092",
"photo-236299866_457239091",
"photo-226582510_457239006",
"photo-236299866_457239090",
"photo-236299866_457239089",
"photo-236299866_457239088",
"photo-236299866_457239087",
"photo-236299866_457239086",
"photo-236299866_457239016",
"photo-236299866_457239085",
"photo-236299866_457239084",
"photo-236299866_457239076",
"photo-236299866_457239075"
]
# ๐Ÿ’Š ะ’ั‹ะทะดะพั€ะฐะฒะปะธะฒะฐะน
GET_WELL_TEMPLATES = [
"{target}, {sender} ะถะตะปะฐะตั‚ ั‚ะตะฑะต ัะบะพั€ะตะนัˆะตะณะพ ะฒั‹ะทะดะพั€ะพะฒะปะตะฝะธั! ๐Ÿ’Šโค๏ธ ะะต ะฑะพะปะตะน, ะฟะพะถะฐะปัƒะนัั‚ะฐ!",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target} ะธ ัˆะตะฟั‡ะตั‚: ะฟะพะฟั€ะฐะฒะปัะนัั ัะบะพั€ะตะต, ั ัะบัƒั‡ะฐัŽ! ๐Ÿค—๐Ÿ’•",
"{target}, {sender} ัˆะปั‘ั‚ ั‚ะตะฑะต ั†ะตะปะตะฑะฝัƒัŽ ัะฝะตั€ะณะธัŽ! ะ’ั‹ะทะดะพั€ะฐะฒะปะธะฒะฐะน! โœจ๐Ÿ’Š",
"{sender} ะทะฐะฑะพั‚ะปะธะฒะพ ัƒั…ะฐะถะธะฒะฐะตั‚ ะทะฐ {target}: ะพั‚ะดั‹ั…ะฐะน ะธ ะฝะฐะฑะธั€ะฐะนัั ัะธะป! ๐Ÿค—๐Ÿ’•",
"{target}, {sender} ะฒะฐั€ะธั‚ ั‚ะตะฑะต ะณะพั€ัั‡ะธะน ั‡ะฐะน ั ะผั‘ะดะพะผ! ะŸะตะน ะธ ะฒั‹ะทะดะพั€ะฐะฒะปะธะฒะฐะน! โ˜•๐Ÿฏ",
"{sender} ะณะปะฐะดะธั‚ {target} ะฟะพ ะณะพะปะพะฒะบะต: ะฒัั‘ ะฑัƒะดะตั‚ ั…ะพั€ะพัˆะพ, ะฟะพะฟั€ะฐะฒะปัะนัั! โค๏ธ๐Ÿ’Š",
"{target}, {sender} ะถะตะปะฐะตั‚ ั‚ะตะฑะต ะบั€ะตะฟะบะพะณะพ ะทะดะพั€ะพะฒัŒั! ะะต ะฑะพะปะตะน! ๐Ÿ’ช๐Ÿ’•",
"{sender} ัƒะบัƒั‚ั‹ะฒะฐะตั‚ {target} ะฒ ั‚ั‘ะฟะปั‹ะน ะฟะปะตะด: ะปะตั‡ะธััŒ ะธ ะพั‚ะดั‹ั…ะฐะน! ๐Ÿ›๏ธ๐Ÿค—",
"{target}, {sender} ัˆะปั‘ั‚ ั‚ะตะฑะต ะฒะธั‚ะฐะผะธะฝะบะธ ะธ ะปัŽะฑะพะฒัŒ! ะ’ั‹ะทะดะพั€ะฐะฒะปะธะฒะฐะน! ๐Ÿ’Š๐Ÿ’•",
"{sender} ั†ะตะปัƒะตั‚ {target} ะฒ ะปะพะฑะธะบ: ะฟะพะฟั€ะฐะฒะปัะนัั ัะบะพั€ะตะต, ะผะพะน ั…ะพั€ะพัˆะธะน! ๐Ÿ˜š๐Ÿ’•"
]
GET_WELL_ATTACHMENTS = [
"photo-236299866_457239102",
"photo-236299866_457239101",
"photo-236299866_457239100",
"photo-236299866_457239099",
"photo-236299866_457239098",
"photo-236299866_457239097",
"photo-236299866_457239096",
"photo-236299866_457239095",
"photo-236299866_457239094",
"photo-236299866_457239093"
]
# ๐ŸŽ„ ะก ะะพะฒั‹ะผ ะ“ะพะดะพะผ
NEWYEAR_TEMPLATES = [
"{target}, {sender} ะฟะพะทะดั€ะฐะฒะปัะตั‚ ั‚ะตะฑั ั ะะพะฒั‹ะผ ะ“ะพะดะพะผ! ๐ŸŽ„โค๏ธ ะŸัƒัั‚ัŒ ัั‚ะพั‚ ะณะพะด ะฑัƒะดะตั‚ ะฒะพะปัˆะตะฑะฝั‹ะผ!",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target} ะธ ัˆะตะฟั‡ะตั‚: ั ะะพะฒั‹ะผ ะ“ะพะดะพะผ, ะปัŽะฑะธะผั‹ะน! ๐ŸŽ‰โค๏ธโœจ",
"{target}, {sender} ะถะตะปะฐะตั‚ ั‚ะตะฑะต ัั‡ะฐัั‚ัŒั ะฒ ะะพะฒะพะผ ะ“ะพะดัƒ! ๐Ÿฅ‚๐Ÿ’• ะŸัƒัั‚ัŒ ัะฑัƒะดัƒั‚ัั ะฒัะต ะผะตั‡ั‚ั‹!",
"{sender} ั†ะตะปัƒะตั‚ {target} ะฒ ั‰ั‘ั‡ะบัƒ: ั ะะพะฒั‹ะผ ะ“ะพะดะพะผ, ั€ะพะดะฝะพะน! ๐ŸŽ„๐Ÿ˜˜โค๏ธ",
"{target}, {sender} ะดะฐั€ะธั‚ ั‚ะตะฑะต ะฝะพะฒะพะณะพะดะฝะตะต ั‡ัƒะดะพ! ๐ŸŽโœจ ะก ะฟั€ะฐะทะดะฝะธะบะพะผ, ะดะพั€ะพะณะพะน!",
"{sender} ะฟะพะดะฝะธะผะฐะตั‚ ะฑะพะบะฐะป ะทะฐ {target}: ั ะะพะฒั‹ะผ ะ“ะพะดะพะผ! ๐Ÿฅ‚๐ŸŽ‰ ะŸัƒัั‚ัŒ ะฑัƒะดะตั‚ ัƒะดะฐั‡ะฐ!",
"{target}, {sender} ะทะฐะณะฐะดะฐะป ะถะตะปะฐะฝะธะต ะฟะพะด ะฑะพะน ะบัƒั€ะฐะฝั‚ะพะฒโ€ฆ ั‡ั‚ะพะฑั‹ ั‚ั‹ ะฑั‹ะป ัั‡ะฐัั‚ะปะธะฒ! ๐ŸŽ„๐Ÿ’•",
"{sender} ัƒะบัƒั‚ั‹ะฒะฐะตั‚ {target} ะฒ ะฝะพะฒะพะณะพะดะฝะธะน ะฟะปะตะด: ั ะฟั€ะฐะทะดะฝะธะบะพะผ, ะผะธะปั‹ะน! โ„๏ธ๐Ÿค—โค๏ธ",
"{target}, {sender} ัˆะปั‘ั‚ ั‚ะตะฑะต ะฝะพะฒะพะณะพะดะฝะธะต ะธัะบะพั€ะบะธ! โœจ๐ŸŽ„ ะก ะะพะฒั‹ะผ ะ“ะพะดะพะผ, ะปัŽะฑะธะผั‹ะน!",
"{sender} ะฟั€ะธะถะธะผะฐะตั‚ {target} ะบ ัะตะฑะต: ั ะะพะฒั‹ะผ ะ“ะพะดะพะผ, ะผะพั‘ ัั‡ะฐัั‚ัŒะต! ๐ŸŽ‰โค๏ธ๐Ÿฅ‚"
]
NEWYEAR_ATTACHMENTS = [
"photo-236299866_457239105",
"photo-236299866_457239104",
"photo-236299866_457239103",
"photo-236299866_457239104",
"photo-236299866_457239103",
"photo-236299866_457239104",
"photo-236299866_457239103",
"photo-236299866_457239104",
"photo-236299866_457239105"
]
# ๐ŸŽ‚ ะก ะ”ะฝั‘ะผ ะ ะพะถะดะตะฝะธั
BIRTHDAY_TEMPLATES = [
"{target}, {sender} ะฟะพะทะดั€ะฐะฒะปัะตั‚ ั ะ”ะฝั‘ะผ ะ ะพะถะดะตะฝะธั! ๐ŸŽ‚โค๏ธ ะŸัƒัั‚ัŒ ะบะฐะถะดั‹ะน ะดะตะฝัŒ ะฑัƒะดะตั‚ ะฟั€ะฐะทะดะฝะธะบะพะผ!",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target}: ั ะ”ะฝั‘ะผ ะ ะพะถะดะตะฝะธั, ั€ะพะดะฝะพะน! ๐ŸŽ‰๐Ÿ’• ะขั‹ โ€” ั‡ัƒะดะพ!",
"{target}, {sender} ะถะตะปะฐะตั‚ ั‚ะตะฑะต ะผะพั€ะต ัั‡ะฐัั‚ัŒั! ๐ŸŒŠ๐ŸŽ‚ ะก ะ”ะฝั‘ะผ ะ ะพะถะดะตะฝะธั!",
"{sender} ั†ะตะปัƒะตั‚ {target}: ั ะ”ะฝั‘ะผ ะ ะพะถะดะตะฝะธั, ะปัŽะฑะธะผั‹ะน! ๐Ÿ˜˜๐ŸŽโค๏ธ",
"{target}, {sender} ะดะฐั€ะธั‚ ั‚ะตะฑะต ัƒะปั‹ะฑะบัƒ ะฒ ัั‚ะพั‚ ะพัะพะฑะตะฝะฝั‹ะน ะดะตะฝัŒ! ๐ŸŽ‚โœจ ะ‘ัƒะดัŒ ัั‡ะฐัั‚ะปะธะฒ!",
"{sender} ะฟะพะดะฝะธะผะฐะตั‚ ะฑะพะบะฐะป ะทะฐ {target}: ั ะ”ะฝั‘ะผ ะ ะพะถะดะตะฝะธั! ๐Ÿฅ‚๐ŸŽ‰ ะ—ะฐ ั‚ะตะฑั!",
"{target}, {sender} ะทะฐะณะฐะดะฐะป ะถะตะปะฐะฝะธะต ะดะปั ั‚ะตะฑัโ€ฆ ะฟัƒัั‚ัŒ ัะฑัƒะดะตั‚ัั! ๐Ÿ•ฏ๏ธ๐Ÿ’•",
"{sender} ะฟั€ะธะถะธะผะฐะตั‚ {target}: ั ะ”ะฝั‘ะผ ะ ะพะถะดะตะฝะธั, ะผะพั‘ ัะพะปะฝั‹ัˆะบะพ! โ˜€๏ธ๐ŸŽ‚โค๏ธ",
"{target}, {sender} ัˆะปั‘ั‚ ะฟั€ะฐะทะดะฝะธั‡ะฝั‹ะต ะธัะบะพั€ะบะธ! โœจ๐ŸŽ‚ ะก ะ”ะฝั‘ะผ ะ ะพะถะดะตะฝะธั!",
"{sender} ัˆะตะฟั‡ะตั‚ {target}: ั ะ”ะฝั‘ะผ ะ ะพะถะดะตะฝะธั, ั€ะฐะดะพัั‚ัŒ ะผะพั! ๐ŸŽ‰๐Ÿ’•๐ŸŽ‚"
]
BIRTHDAY_ATTACHMENTS = ["photo-236299866_457239106", "photo-236299866_457239107", "photo-236299866_457239108",
"photo-236299866_457239109", "photo-236299866_457239111", "photo-236299866_457239112",
"photo-236299866_457239113", "photo-236299866_457239114", "photo-236299866_457239115",
"photo-236299866_457239114"]
# ๐Ÿ’– ะ›ัŽะฑะพะฒัŒ
LOVE_TEMPLATES = [
"{target}, {sender} ะปัŽะฑะธั‚ ั‚ะตะฑัโ€ฆ ะฑะพะปัŒัˆะต ัะปะพะฒ โค๏ธ๐Ÿ’•",
"{sender} ัˆะตะฟั‡ะตั‚ {target}: ะปัŽะฑะปัŽโ€ฆ ะฑะตัะบะพะฝะตั‡ะฝะพ ๐Ÿ’–โœจ",
"{target}, {sender} ะดะฐั€ะธั‚ ั‚ะตะฑะต ัะฒะพั‘ ัะตั€ะดั†ะต ๐Ÿ’ ะžะฝะพ ั‚ะฒะพั‘!",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target}: ั‚ั‹ โ€” ะผะพั ะปัŽะฑะพะฒัŒ ๐Ÿค—โค๏ธ",
"{target}, {sender} ั ั‚ะพะฑะพะนโ€ฆ ะธ ัั‚ะพ ะปัŽะฑะพะฒัŒ ๐Ÿ’•๐ŸŒŸ",
"{sender} ั†ะตะปัƒะตั‚ {target}: ะปัŽะฑะปัŽ ะบะฐะถะดะพะน ะบะปะตั‚ะพั‡ะบะพะน ๐Ÿ˜˜โค๏ธ",
"{target}, {sender} ะดั‹ัˆะธั‚ ั‚ะพะฑะพะนโ€ฆ ะปัŽะฑะปัŽ ๐Ÿ’–๐ŸŒธ",
"{sender} ะฟั€ะธะถะธะผะฐะตั‚ {target}: ั‚ั‹ โ€” ะผะพั‘ ะฒัั‘ โค๏ธโˆž",
"{target}, {sender} ะฟะพัะฒัั‰ะฐะตั‚ ั‚ะตะฑะต ัั‚ะธ ัั‚ั€ะพะบะธโ€ฆ ะปัŽะฑะปัŽ ๐Ÿ’•๐Ÿ“",
"{sender} ัะผะพั‚ั€ะธั‚ ะฝะฐ {target}: ะฒะพั‚ ะพะฝะพโ€ฆ ัั‡ะฐัั‚ัŒะต โค๏ธ๐Ÿ’ซ"
]
LOVE_ATTACHMENTS = ["photo-226582510_457239020"]
# ๐Ÿค ะ’ะผะตัั‚ะต
TOGETHER_TEMPLATES = [
"{target}, {sender} ั…ะพั‡ะตั‚ ะฑั‹ั‚ัŒ ั€ัะดะพะผโ€ฆ ะฒะผะตัั‚ะต ะผั‹ ัะธะปะฐ ๐Ÿคโค๏ธ",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target}: ะฒะผะตัั‚ะต โ€” ะฝะฐะฒัะตะณะดะฐ ๐Ÿค—๐Ÿ’•",
"{target}, {sender} ั ั‚ะพะฑะพะนโ€ฆ ะธ ัั‚ะพ ะณะปะฐะฒะฝะพะต ๐Ÿ’–โœจ",
"{sender} ะดะตั€ะถะธั‚ {target} ะทะฐ ั€ัƒะบัƒ: ะฒะผะตัั‚ะต ๐Ÿ’•๐Ÿคฒ",
"{target}, {sender} ะดะตะปะธั‚ ัั‚ะพั‚ ะผะพะผะตะฝั‚ ั ั‚ะพะฑะพะนโ€ฆ ะฒะผะตัั‚ะต ๐ŸŒŸโค๏ธ",
"{sender} ะฟั€ะธะถะธะผะฐะตั‚ัั ะบ {target}: ะฒะผะตัั‚ะต โ€” ั‚ะตะฟะปะพ ๐Ÿค—๐Ÿ’•",
"{target}, {sender} ั€ัะดะพะผโ€ฆ ะฒัะตะณะดะฐ ๐Ÿ’–โณ",
"{sender} ัะผะพั‚ั€ะธั‚ ะฝะฐ {target}: ะฒะผะตัั‚ะต โ€” ัั‡ะฐัั‚ัŒะต ๐Ÿ‘€โค๏ธ",
"{target}, {sender} ะฒั‹ะฑะธั€ะฐะตั‚ ั‚ะตะฑัโ€ฆ ะฒะผะตัั‚ะต ๐Ÿ’•๐ŸŽฏ",
"{sender} ัˆะตะฟั‡ะตั‚ {target}: ะฒะผะตัั‚ะตโ€ฆ ะฝะฐะฒัะตะณะดะฐ ๐Ÿ’–โˆž"
]
TOGETHER_ATTACHMENTS = ["photo-226582510_457239030"]
# ๐Ÿฝ๏ธ ะ•ะดะฐ
FOOD_TEMPLATES = [
"{target}, {sender} ัƒะณะพั‰ะฐะตั‚ ั‚ะตะฑั ะฒะบัƒัะฝััˆะบะฐะผะธ! ๐Ÿฝ๏ธโค๏ธ ะŸั€ะธัั‚ะฝะพะณะพ ะฐะฟะฟะตั‚ะธั‚ะฐ!",
"{sender} ะณะพั‚ะพะฒะธั‚ ะดะปั {target}: ะบัƒัˆะฐะน, ั€ะพะดะฝะพะน! ๐Ÿณ๐Ÿ’•",
"{target}, {sender} ะฝะฐะปะธะป ั‚ะตะฑะต ะฝะฐะฟะธั‚ะพะบ! ๐Ÿฅคโœจ ะพัะฒะตะถะฐะนัั!",
"{sender} ะบะพั€ะผะธั‚ {target} ั ะปะพะถะตั‡ะบะธ: ะพั‚ะบั€ะพะน ั€ะพั‚ะธะบ! ๐Ÿฅ„๐Ÿ˜‹โค๏ธ",
"{target}, {sender} ะฟั€ะธะณะพั‚ะพะฒะธะป ััŽั€ะฟั€ะธะท! ๐ŸŽ๐Ÿฝ๏ธ ะŸั€ะพะฑัƒะน!",
"{sender} ะดะตะปะธั‚ัั ะตะดะพะน ั {target}: ะฒะผะตัั‚ะต ะฒะบัƒัะฝะตะต! ๐Ÿ•๐Ÿ’•",
"{target}, {sender} ะทะฐะบะฐะทะฐะป ั‚ะตะฑะต ะดะพัั‚ะฐะฒะบัƒ! ๐Ÿš—๐Ÿ” ะšัƒัˆะฐะน!",
"{sender} ะฟั€ะตะดะปะฐะณะฐะตั‚ {target} ะฟะตั€ะตะบัƒัะธั‚ัŒ: ะณะพะปะพะดะฝั‹ะน? ๐Ÿฅโ˜•โค๏ธ",
"{target}, {sender} ะธัะฟั‘ะบ ะดะปั ั‚ะตะฑั! ๐Ÿฐ๐Ÿ’• ะŸะพะฟั€ะพะฑัƒะน!",
"{sender} ัƒะณะพั‰ะฐะตั‚ {target}: ัั‚ะพ ั ะปัŽะฑะพะฒัŒัŽ! ๐Ÿซโค๏ธโœจ"
]
FOOD_ATTACHMENTS = ["photo-226582510_457239040"]
# ๐ŸŒธ ะฆะฒะตั‚ั‹
FLOWERS_TEMPLATES = [
"{target}, {sender} ะดะฐั€ะธั‚ ั‚ะตะฑะต ั†ะฒะตั‚ั‹! ๐ŸŒธโค๏ธ ะขั‹ ะฟั€ะตะบั€ะฐัะตะฝ!",
"{sender} ะฒั€ัƒั‡ะฐะตั‚ ะฑัƒะบะตั‚ {target}: ัั‚ะพ ะดะปั ั‚ะตะฑั! ๐Ÿ’๐Ÿ’•",
"{target}, {sender} ัะพะฑั€ะฐะป ั†ะฒะตั‚ั‹ ัะฟะตั†ะธะฐะปัŒะฝะพ! ๐ŸŒนโœจ ะ”ะปั ั‚ะตะฑั!",
"{sender} ะพัั‹ะฟะฐะตั‚ {target} ะปะตะฟะตัั‚ะบะฐะผะธ: ะปะพะฒะธ! ๐ŸŒบ๐Ÿ˜˜โค๏ธ",
"{target}, {sender} ะฟั€ะธะฝั‘ั ั†ะตะปั‹ะน ัะฐะด! ๐ŸŒป๐Ÿ’• ะัŽั…ะฐะน!",
"{sender} ะฟะปะตั‚ั‘ั‚ ะฒะตะฝะพะบ ะดะปั {target}: ะฝะฐะดะตะฝัŒ! ๐ŸŒผ๐Ÿ‘‘โค๏ธ",
"{target}, {sender} ะดะฐั€ะธั‚ ั€ะพะทัƒ! ๐ŸŒน๐Ÿ’– ะžะดะฝะฐ โ€” ะดะปั ะตะดะธะฝัั‚ะฒะตะฝะฝะพะณะพ!",
"{sender} ะฟะพะบะฐะทั‹ะฒะฐะตั‚ {target} ั†ะฒะตั‚ั‹: ะบั€ะฐัะธะฒะพ? ๐ŸŒทโœจโค๏ธ",
"{target}, {sender} ะฒั‹ั€ะฐัั‚ะธะป ะดะปั ั‚ะตะฑั! ๐ŸŒฑ๐ŸŒบ ะก ะปัŽะฑะพะฒัŒัŽ!",
"{sender} ัˆะตะฟั‡ะตั‚ {target}: ะบะฐะบ ัั‚ะธ ั†ะฒะตั‚ั‹โ€ฆ ั‚ั‹ ะฟั€ะตะบั€ะฐัะตะฝ! ๐Ÿ’๐Ÿ’•"
]
FLOWERS_ATTACHMENTS = ["photo-226582510_457239050"]
# ๐ŸŽ ะŸะพะดะฐั€ะบะธ
GIFT_TEMPLATES = [
"{target}, {sender} ะดะฐั€ะธั‚ ั‚ะตะฑะต ะฟะพะดะฐั€ะพะบ! ๐ŸŽโค๏ธ ะžั‚ะบั€ั‹ะฒะฐะน!",
"{sender} ะฒั€ัƒั‡ะฐะตั‚ ะบะพั€ะพะฑะพั‡ะบัƒ {target}: ัั‚ะพ ั‚ะตะฑะต! ๐Ÿ’๐Ÿ’•",
"{target}, {sender} ะฒั‹ะฑะธั€ะฐะป ั ะปัŽะฑะพะฒัŒัŽ! ๐ŸŽ€โœจ ะะฐะดะตัŽััŒ, ะฟะพะฝั€ะฐะฒะธั‚ัั!",
"{sender} ะฟั€ัั‡ะตั‚ ััŽั€ะฟั€ะธะท ะดะปั {target}: ัƒะณะฐะดะฐะน ั‡ั‚ะพ? ๐ŸŽ๐Ÿ˜โค๏ธ",
"{target}, {sender} ะบะพะฟะธะป ะฝะฐ ัั‚ะพ! ๐Ÿ’ฐ๐ŸŽ ะ”ะปั ั‚ะตะฑั!",
"{sender} ะทะฐะฒะพั€ะฐั‡ะธะฒะฐะตั‚ ะฟะพะดะฐั€ะพะบ {target}: ั ะฑะฐะฝั‚ะธะบะพะผ! ๐ŸŽ€๐Ÿ’•โค๏ธ",
"{target}, {sender} ะฝะฐัˆั‘ะป ะธะดะตะฐะปัŒะฝะพะต! ๐ŸŒŸ๐ŸŽ ะขะฒะพั‘!",
"{sender} ะฟะพะบะฐะทั‹ะฒะฐะตั‚ {target} ะฟะพะดะฐั€ะพะบ: ะฝั€ะฐะฒะธั‚ัั? ๐Ÿ‘€โœจโค๏ธ",
"{target}, {sender} ัะดะตะปะฐะป ัะฒะพะธะผะธ ั€ัƒะบะฐะผะธ! ๐Ÿ–๏ธ๐ŸŽ ะก ะดัƒัˆะพะน!",
"{sender} ัˆะตะฟั‡ะตั‚ {target}: ัั‚ะพ ัะธะผะฒะพะปโ€ฆ ะฝะฐัˆะตะน ัะฒัะทะธ ๐Ÿ’๐Ÿ’•"
]
GIFT_ATTACHMENTS = ["photo-226582510_457239060"]
# ๐Ÿšถ ะŸั€ะพะณัƒะปะบะฐ
WALK_TEMPLATES = [
"{target}, {sender} ะทะพะฒั‘ั‚ ะฝะฐ ะฟั€ะพะณัƒะปะบัƒ! ๐Ÿšถโ€โ™€๏ธโค๏ธ ะŸะพะนะดั‘ะผ ะฒะผะตัั‚ะต?",
"{sender} ะฑะตั€ั‘ั‚ {target} ะทะฐ ั€ัƒะบัƒ: ะณัƒะปัะตะผ! ๐Ÿค๐ŸŒณ๐Ÿ’•",
"{target}, {sender} ะฟะพะบะฐะทั‹ะฒะฐะตั‚ ะบั€ะฐัะธะฒะพะต ะผะตัั‚ะพ! ๐ŸŒ…โœจ ะกะผะพั‚ั€ะธ!",
"{sender} ะฒะตะดั‘ั‚ {target} ะฟะพ ั‚ั€ะพะฟะธะฝะบะต: ะดะพะฒะตั€ัะน ะผะฝะต! ๐Ÿ›ค๏ธ๐Ÿค—โค๏ธ",
"{target}, {sender} ะปัŽะฑะธั‚ ะณัƒะปัั‚ัŒ ั ั‚ะพะฑะพะน! ๐ŸŒฒ๐Ÿ’• ะกะฒะตะถะพ!",
"{sender} ะพัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ัั ั {target}: ะฟะพัะผะพั‚ั€ะธ ะฝะฐ ะฒะธะด! ๐Ÿ‘€๐Ÿ”๏ธโœจ",
"{target}, {sender} ะฝะฐัˆั‘ะป ะฟะพะปัะฝัƒ! ๐ŸŒธ๐ŸŒฟ ะžั‚ะดะพั…ะฝั‘ะผ?",
"{sender} ะฟั€ะตะดะปะฐะณะฐะตั‚ {target} ัะตัั‚ัŒ: ัƒัั‚ะฐะปะธ? ๐Ÿช‘โ˜•โค๏ธ",
"{target}, {sender} ะทะฐะฟะพะผะฝะธั‚ ัั‚ะพั‚ ะผะพะผะตะฝั‚! ๐Ÿ“ธ๐Ÿ’• ะะฐะฒัะตะณะดะฐ!",
"{sender} ัˆะตะฟั‡ะตั‚ {target}: ะฟั€ะพะณัƒะปะบะฐ ั ั‚ะพะฑะพะน โ€” ัั‡ะฐัั‚ัŒะต ๐Ÿšถโ€โ™€๏ธ๐Ÿ’–"
]
WALK_ATTACHMENTS = ["photo-226582510_457239070"]
# ๐Ÿ’ƒ ะขะฐะฝะตั†
DANCE_TEMPLATES = [
"{target}, {sender} ะฟั€ะธะณะปะฐัˆะฐะตั‚ ะฝะฐ ั‚ะฐะฝะตั†! ๐Ÿ’ƒโค๏ธ ะŸะพั‚ะฐะฝั†ัƒะตะผ?",
"{sender} ะบั€ัƒะถะธั‚ {target} ะฒ ั‚ะฐะฝั†ะต: ะปะพะฒะธ ั€ะธั‚ะผ! ๐Ÿ•บโœจ๐Ÿ’•",
"{target}, {sender} ั‚ะฐะฝั†ัƒะตั‚ ะดะปั ั‚ะตะฑั! ๐ŸŽต๐Ÿ’ƒ ะกะผะพั‚ั€ะธ!",
"{sender} ะฑะตั€ั‘ั‚ {target} ะฒ ะพะฑัŠัั‚ะธั: ะผะตะดะปะตะฝะฝั‹ะน ั‚ะฐะฝะตั†? ๐ŸŽถ๐Ÿค—โค๏ธ",
"{target}, {sender} ะฒะตะดั‘ั‚ ะฒ ั‚ะฐะฝั†ะต: ะดะพะฒะตั€ัะน! ๐Ÿ’ซ๐Ÿ•บ๐Ÿ’•",
"{sender} ะบั€ัƒะถะธั‚ัั ั {target}: ะผั‹ โ€” ะพะดะฝะพ ั†ะตะปะพะต! ๐ŸŒช๏ธ๐Ÿ’–โœจ",
"{target}, {sender} ะปัŽะฑะธั‚ ั‚ะฐะฝั†ะตะฒะฐั‚ัŒ ั ั‚ะพะฑะพะน! ๐ŸŽต๐Ÿ’• ะ•ั‰ั‘!",
"{sender} ะฟั€ะตะดะปะฐะณะฐะตั‚ {target} ะฒะฐะปัŒั: ั€ะฐะท-ะดะฒะฐ-ั‚ั€ะธ! ๐ŸŽผ๐Ÿ‘ฏโค๏ธ",
"{target}, {sender} ะทะฐะฟะพะผะฝะธั‚ ัั‚ะพั‚ ั‚ะฐะฝะตั†! ๐Ÿ’ƒ๐Ÿ“ธ ะะฐะฒัะตะณะดะฐ!",
"{sender} ัˆะตะฟั‡ะตั‚ {target}: ั‚ะฐะฝะตั† โ€” ะบะฐะบ ะฝะฐัˆะฐ ะปัŽะฑะพะฒัŒ ๐Ÿ•บ๐Ÿ’–โˆž"
]
DANCE_ATTACHMENTS = ["photo-226582510_457239080"]
# ๐Ÿบ ะŸะธะฒะพ
BEER_TEMPLATES = [
"{sender} ะฟั€ะพั‚ัะณะธะฒะฐะตั‚ {target} ะทะฐะฟะพั‚ะตะฒัˆะธะน ะฑะพะบะฐะป: ยซะ”ะตั€ะถะธ, ะดั€ัƒะณ, ัั‚ะพ ั‚ะพ, ั‡ั‚ะพ ะฝัƒะถะฝะพ ะฟะพัะปะต ะดะพะปะณะพะณะพ ะดะฝั!ยป ๐Ÿบ",
"{sender} ะทะฒะพะฝะบะพ ั‡ะพะบะฐะตั‚ัั ะบั€ัƒะถะบะพะน ั {target}: ยซะ—ะฐ ะฝะฐั! ะงั‚ะพะฑั‹ ะฟะตะฝะฐ ะฑั‹ะปะฐ ะฒั‹ัะพะบะพะน, ะฐ ะฟั€ะพะฑะปะตะผั‹ โ€” ะฝะธะทะบะธะผะธ!ยป ๐Ÿป",
"{sender} ะทะฐะปะฟะพะผ ะพััƒัˆะฐะตั‚ ะฑะพะบะฐะป ะฒะผะตัั‚ะต ั {target}: ยซะญั…, ั…ะพั€ะพัˆะพ ะฟะพัˆะปะฐ! ะŸะพะฒั‚ะพั€ะธะผ?ยป ๐Ÿบ",
"{sender} ะฟะพะดะผะธะณะธะฒะฐะตั‚ {target}: ยซะกะปั‹ัˆัŒ, ะฟะพ ะฟะธะฒะฐัะธะบัƒ ะฝะต ัะณะพะฝัะตะผ? ะฏ ัƒะณะพั‰ะฐัŽ!ยป ๐Ÿป",
"{sender} ัะปะตะณะบะฐ ะฟะพะบะฐั‡ะธะฒะฐัััŒ, ะพะฑะฝะธะผะฐะตั‚ {target}: ยซะขั‹... ั‚ั‹ ะปัƒั‡ัˆะธะน ะดั€ัƒะณ... ะฝะฐ ัะฒะตั‚ะต...ยป ๐Ÿฅด",
"{sender} ะดะตะปะธั‚ ะฟะพัะปะตะดะฝัŽัŽ ะฑัƒั‚ั‹ะปะบัƒ ั {target}: ยซะŸะพั€ะพะฒะฝัƒ, ั‡ะตัั‚ะฝะพ ัะปะพะฒะพ, ั ะดะฐะถะต ะผะตะฝัŒัˆะต ะฝะฐะปะธะป!ยป ๐Ÿบ",
"{sender} ะผะพั€ั‰ะธั‚ัั, ะณะปัะดั ะฝะฐ {target}: ยซะžั…, ะณะพะปะพะฒะฐ ะณัƒะดะธั‚... ะ‘ะพะปัŒัˆะต ะฝะธ ะบะฐะฟะปะธ, ั‚ะพะปัŒะบะพ ะฒะพะดัƒ!ยป ๐Ÿค•",
"{sender} ะฐะบะบัƒั€ะฐั‚ะฝะพ ะฝะฐะปะธะฒะฐะตั‚ ะฟะตะฝะฝั‹ะน ะฝะฐะฟะธั‚ะพะบ {target}: ยซะกะผะพั‚ั€ะธ, ะบะฐะบะฐั ัะฝั‚ะฐั€ะฝะฐั ะบั€ะฐัะพั‚ะฐ, ะฟั€ะพัั‚ะพ ะทะฐะณะปัะดะตะฝัŒะต!ยป ๐Ÿบ",
"{sender} ะฟะพะดะฝะธะผะฐะตั‚ ะฑะพะบะฐะป ะฟะตั€ะตะด {target}: ยซะงั‚ะพะฑั‹ ัƒ ะฝะฐั ะฒัั‘ ะฑั‹ะปะพ ะธ ะฝะธั‡ะตะณะพ ะทะฐ ัั‚ะพ ะฝะต ะฑั‹ะปะพ!ยป ๐Ÿป",
"{sender} ั…ะธั‚ั€ะพ ัƒะปั‹ะฑะฐะตั‚ัั {target}: ยซะก ะผะตะฝั ัะตะณะพะดะฝั ั‚ะพะปัŒะบะพ ะฑะตะทะฐะปะบะพะณะพะปัŒะฝะพะต, ั ะทะฐ ั€ัƒะปะตะผ, ะฝะพ ะทะฐ ะบะพะผะฟะฐะฝะธัŽ ะฟะพัะธะดัŽ!ยป ๐Ÿš—๐Ÿบ"
]
BEER_ATTACHMENTS = [
"photo-236299866_457239140",
"photo-236299866_457239141",
"photo-236299866_457239143",
"photo-236299866_457239146",
"photo-236299866_457239147",
"photo-236299866_457239144",
"photo-236299866_457239148",
"photo-236299866_457239149",
"photo-236299866_457239150",
"photo-236299866_457239142"
]
# โœจ ะ‘ะฐะทะพะฒั‹ะต / ัƒะฝะธะฒะตั€ัะฐะปัŒะฝั‹ะต
BASE_TEMPLATES = [
"{target}, {sender} ะดะฐั€ะธั‚ ั‚ะตะฑะต ัั‚ะพั‚ ะผะพะผะตะฝั‚โ€ฆ ะฟัƒัั‚ัŒ ะพะฝ ะพัั‚ะฐะฝะตั‚ัั ะฒ ัะตั€ะดั†ะต โค๏ธโœจ",
"{sender} ะฝะตะถะฝะพ ะพะฑั€ะฐั‰ะฐะตั‚ัั ะบ {target}: ั‚ั‹ ะดะตะปะฐะตัˆัŒ ะผะธั€ ะปัƒั‡ัˆะต ๐Ÿ’•๐ŸŒŸ",
"{target}, {sender} ั…ะพั‡ะตั‚ ั€ะฐะทะดะตะปะธั‚ัŒ ัั‚ะพ ั ั‚ะพะฑะพะนโ€ฆ ะฒะผะตัั‚ะต ะผั‹ ัะธะปัŒะฝะตะต ๐Ÿคโค๏ธ",
"{sender} ะฟะพัะฒัั‰ะฐะตั‚ ัั‚ะพ {target}: ั‚ั‹ โ€” ะผะพั‘ ะฒะดะพั…ะฝะพะฒะตะฝะธะต ๐Ÿ’ซ๐Ÿ’•",
"{target}, {sender} ั€ัะดะพะผโ€ฆ ะฒัะตะณะดะฐ ๐Ÿ’–๐Ÿค",
"{sender} ะพะฑะฝะธะผะฐะตั‚ {target} ะฒ ัั‚ะพะผ ะผะพะผะตะฝั‚ะตโ€ฆ ั‚ะตะฟะปะพ ะธ ัƒัŽั‚ะฝะพ ๐Ÿซ‚โค๏ธ",
"{target}, {sender} ั ั‚ะพะฑะพะนโ€ฆ ะธ ัั‚ะพ ะณะปะฐะฒะฝะพะต ๐Ÿ’•โœจ",
"{sender} ะดะฐั€ะธั‚ {target} ัะฒะพะธ ัะผะพั†ะธะธโ€ฆ ะปะพะฒะธ ๐Ÿ’๐ŸŒธ",
"{target}, {sender} ั†ะตะฝะธั‚ ะบะฐะถะดะพะต ะผะณะฝะพะฒะตะฝะธะต ั ั‚ะพะฑะพะน โค๏ธโณ",
"{sender} ัˆะตะฟั‡ะตั‚ {target}: ั‚ั‹ โ€” ั‡ัƒะดะพ ๐Ÿ’ซ๐Ÿ’•"
]
BASE_ATTACHMENTS = ["photo-226582510_457239001"]
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ“‹ ะกะ•ะšะฆะ˜ะฏ 7: ะกะŸะ˜ะกะžะš ะ’ะกะ•ะฅ RP-ะšะžะœะะะ”
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
RP_COMMANDS = {
# ๐Ÿ’‹ ะŸะพั†ะตะปัƒะธ
"ะฟะพั†ะตะปัƒะน": "kiss", "kiss": "kiss", "ั†ะตะปัƒัŽ": "kiss", "ั‡ะผะพะบ": "kiss",
# ๐Ÿค— ะžะฑัŠัั‚ะธั
"ะพะฑะฝัั‚ัŒ": "hug", "ะพะฑะฝะธะผะฐัŽ": "hug", "hug": "hug", "ะพะฑะฝะธะผะฐัˆะบะธ": "hug",
# ๐Ÿ‘‹ ะŸะพะณะปะฐะถะธะฒะฐะฝะธั
"ะฟะพะณะปะฐะดะธั‚ัŒ": "pat", "pat": "pat", "ะฟะพะณะปะฐะดัŒ": "pat",
# ๐Ÿ‘‹ ะŸั€ะธะฒะตั‚ัั‚ะฒะธั
"ะฟั€ะธะฒะตั‚": "greet", "ะทะดั€ะฐะฒัั‚ะฒัƒะนั‚ะต": "greet", "ั…ะฐะน": "greet", "ะฟั€ะธะฒะตะตั‚": "greet",
# โ˜€๏ธ ะ”ะพะฑั€ะพะต ัƒั‚ั€ะพ
"ะดะพะฑั€ะพะต ัƒั‚ั€ะพ": "morning", "ัƒั‚ั€ะพ": "morning", "ัƒั‚ั€ะตั‡ะบะพ": "morning",
# ๐ŸŒ™ ะกะฟะพะบะพะนะฝะพะน ะฝะพั‡ะธ
"ัะฟะพะบะพะนะฝะพะน ะฝะพั‡ะธ": "goodnight", "ัะฟะธ": "goodnight", "ัะฟะพะบะธ": "goodnight",
# ๐Ÿ’Š ะ’ั‹ะทะดะพั€ะฐะฒะปะธะฒะฐะน
"ะฝะต ะฑะพะปะตะน": "getwell", "ะฒั‹ะทะดะพั€ะฐะฒะปะธะฒะฐะน": "getwell",
# ๐ŸŽ„ ะะพะฒั‹ะน ะณะพะด
"ั ะฝะพะฒั‹ะผ ะณะพะดะพะผ": "newyear", "ั ะฝะณ": "newyear", "ะฝะณ": "newyear",
# ๐ŸŽ‚ ะ”ะตะฝัŒ ั€ะพะถะดะตะฝะธั
"ั ะดะฝะตะผ ั€ะพะถะดะตะฝะธั": "birthday", "ั ะดั€": "birthday",
# ๐Ÿ’– ะ›ัŽะฑะพะฒัŒ
"love": "love", "ะปัŽะฑะปัŽ": "love", "ะปะฐะฒ": "love",
# ๐Ÿค ะ’ะผะตัั‚ะต
"ะฒะผะตัั‚ะต": "together", "ั ั€ัะดะพะผ": "together",
# ๐Ÿฝ๏ธ ะ•ะดะฐ
"ะทะฐะฒั‚ั€ะฐะบ": "food", "ะพะฑะตะด": "food", "ัƒะถะธะฝ": "food", "ะบะพั„ะต": "food", "ั‡ะฐะน": "food",
# ๐ŸŒธ ะฆะฒะตั‚ั‹
"ั†ะฒะตั‚ั‹": "flowers", "ะฑัƒะบะตั‚": "flowers", "ั€ะพะทั‹": "flowers",
# ๐ŸŽ ะŸะพะดะฐั€ะบะธ
"ะฟะพะดะฐั€ะพะบ": "gift", "ะฟะพะดะฐั€ะพะบ ะตะน": "gift", "ะฟะพะดะฐั€ะพะบ ะตะผัƒ": "gift",
# ๐Ÿšถ ะŸั€ะพะณัƒะปะบะฐ
"ะฟั€ะพะณัƒะปะบะฐ": "walk", "ะบ ะผะพั€ัŽ": "walk", "ะฝะฐ ะผะพั€ะต": "walk",
# ๐Ÿ’ƒ ะขะฐะฝะตั†
"ั‚ะฐะฝะตั†": "dance", "ั‚ะฐะฝั†ัƒะตะผ": "dance",
# ๐Ÿบ ะŸะธะฒะพ
"ะฟะธะฒะพ": "beer", "ะฟะธะฒะบะพ": "beer", "ะฟะธะฒะฐัะธะบ": "beer", "beer": "beer",
# โœจ ะ‘ะฐะทะพะฒั‹ะต
"ะฝะฐ ั€ัƒั‡ะบะธ": "base", "ะฟั€ะธะถะฐั‚ัŒ": "base",
}
def generate_rp_list_text():
"""ะ“ะตะฝะตั€ะธั€ัƒะตั‚ ั‚ะตะบัั‚ ัะพ ัะฟะธัะบะพะผ ะฒัะตั… RP-ะบะพะผะฐะฝะด"""
lines = [
"๐Ÿ“ ๐—ฆ๐—ฝะธัะพะบ RP ะบะพะผะฐะฝะด ะฑะพั‚ะฐ Kenzie ๐Ÿ’•",
"",
"ะœะธะปั‹ะน(ะฐั), ะฒะพั‚ ะฒัะต ะฒะพะปัˆะตะฑะฝั‹ะต ะบะพะผะฐะฝะดั‹ ะดะปั ะฝะฐัˆะตะณะพ ั€ะพะผะฐะฝั‚ะธั‡ะตัะบะพะณะพ ะพะฑั‰ะตะฝะธั โœจ",
"",
"ะ˜ัะฟะพะปัŒะทัƒะน ะธั…, ั‡ั‚ะพะฑั‹ ะฒั‹ั€ะฐะทะธั‚ัŒ ัะฒะพะธ ั‡ัƒะฒัั‚ะฒะฐ, ะพั‚ะฟั€ะฐะฒะธั‚ัŒ ะฝะตะถะฝะพัั‚ัŒ ะธะปะธ ะฟั€ะพัั‚ะพ ะฟะพั€ะฐะดะพะฒะฐั‚ัŒ ะฑะปะธะทะบะพะณะพ ั‡ะตะปะพะฒะตะบะฐ ๐Ÿ’–",
"",
"ะšะฐะบ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ:",
"โ€ข ะžั‚ะฒะตั‚ัŒ ะฝะฐ ัะพะพะฑั‰ะตะฝะธะต + ะฝะฐะฟะธัˆะธ ะบะพะผะฐะฝะดัƒ",
"โ€ข ะ˜ะปะธ ะฝะฐะฟะธัˆะธ: ะบะพะผะฐะฝะดะฐ @id123456",
"โ€ข ะ’ ะ›ะก ะบะพะผะฐะฝะดะฐ ะพั‚ะฟั€ะฐะฒะธั‚ัั ั‚ะตะฑะต ๐Ÿ’•",
"",
"โ”€โ”€โ”€ โ‹†โ‹…โ˜†โ‹…โ‹† โ”€โ”€โ”€"
]
# ะ“ั€ัƒะฟะฟะธั€ัƒะตะผ ะบะพะผะฐะฝะดั‹ ะฟะพ ะบะฐั‚ะตะณะพั€ะธัะผ
categories = {}
for cmd, cat in RP_COMMANDS.items():
if cat not in categories:
categories[cat] = []
categories[cat].append(cmd)
count = 1
for cat, cmds in sorted(categories.items()):
lines.append(f"\n๐Ÿ’– {cat.upper()} ({len(cmds)}):")
for cmd in sorted(cmds)[:20]: # ะŸะพะบะฐะทั‹ะฒะฐะตะผ ะฟะตั€ะฒั‹ะต 20 ะบะพะผะฐะฝะด ะบะฐั‚ะตะณะพั€ะธะธ
lines.append(f"{count}) {cmd}")
count += 1
if len(cmds) > 20:
lines.append(f"... ะธ ะตั‰ั‘ {len(cmds) - 20} ะบะพะผะฐะฝะด")
lines.extend([
"",
"โ”€โ”€โ”€ โ‹†โ‹…โ˜†โ‹…โ‹† โ”€โ”€โ”€",
"",
f"๐Ÿ’Œ ะ’ัะตะณะพ ะบะพะผะฐะฝะด: {len(RP_COMMANDS)}",
"๐Ÿ’Œ ะ’ั‹ะฑะธั€ะฐะน ะปัŽะฑัƒัŽ ะธ ะดะฐั€ะธ ะปัŽะฑะพะฒัŒ! โค๏ธ"
])
return "\n".join(lines)
RP_LIST_TEXT = generate_rp_list_text()
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ”ง ะกะ•ะšะฆะ˜ะฏ 8: ะ’ะกะŸะžะœะžะ“ะะขะ•ะ›ะฌะะซะ• ะคะฃะะšะฆะ˜ะ˜
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def send_msg(peer_id: int, text: str, reply_to: int = None, attach: str = None, retries=3):
"""ะžั‚ะฟั€ะฐะฒะปัะตั‚ ัะพะพะฑั‰ะตะฝะธะต ะ’ะšะพะฝั‚ะฐะบั‚ะต ั ะฟะพะฒั‚ะพั€ะฝั‹ะผะธ ะฟะพะฟั‹ั‚ะบะฐะผะธ"""
for attempt in range(retries):
try:
params = {
"peer_id": peer_id,
"message": text,
"random_id": int(time.time() * 1000) + attempt # ะฃะฝะธะบะฐะปัŒะฝั‹ะน ะดะปั ะบะฐะถะดะพะน ะฟะพะฟั‹ั‚ะบะธ
}
if reply_to:
params["reply_to"] = reply_to
if attach:
params["attachment"] = attach
vk.messages.send(**params)
print(f"[SEND] โœ… peer_id={peer_id}, attach={attach}")
return True
except Exception as e:
print(f"[VK] โŒ ะŸะพะฟั‹ั‚ะบะฐ {attempt+1}/{retries}: {e}")
if attempt < retries - 1:
time.sleep(1) # ะ–ะดั‘ะผ ะฟะตั€ะตะด ะฟะพะฒั‚ะพั€ะพะผ
return False
def extract_user_id_from_text(text: str):
"""ะ˜ะทะฒะปะตะบะฐะตั‚ ID ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั ะธะท ั‚ะตะบัั‚ะฐ (@id123 ะธะปะธ [id123|name])"""
match = re.search(r'@id(\d+)', text)
if match:
return int(match.group(1))
match = re.search(r'\[id(\d+)\|.*?\]', text)
if match:
return int(match.group(1))
match = re.search(r'\[club(\d+)\|.*?\]', text)
if match:
return -int(match.group(1))
return None
def get_user_mention(user_id: int):
"""ะŸะพะปัƒั‡ะฐะตั‚ ัƒะฟะพะผะธะฝะฐะฝะธะต ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั @id123 (ะ˜ะผั)"""
try:
if user_id > 0:
info = vk.users.get(user_ids=user_id, fields='first_name')[0]
name = info['first_name']
return f"@id{user_id} ({name})", name
else:
info = vk.groups.get(group_id=abs(user_id), fields='name')[0]
name = info['name']
return f"@club{abs(user_id)} ({name})", name
except Exception as e:
print(f"[VK] ะžัˆะธะฑะบะฐ ะฟะพะปัƒั‡ะตะฝะธั ะธะผะตะฝะธ: {e}")
if user_id > 0:
return f"@id{user_id}", f"user{user_id}"
else:
return f"@club{abs(user_id)}", f"club{abs(user_id)}"
def get_reply_user_id(msg: dict):
"""ะŸะพะปัƒั‡ะฐะตั‚ ID ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั, ะฝะฐ ัะพะพะฑั‰ะตะฝะธะต ะบะพั‚ะพั€ะพะณะพ ะพั‚ะฒะตั‚ะธะปะธ"""
reply_msg = msg.get("reply_message")
if reply_msg:
return reply_msg.get("from_id")
reply_msg = msg.get("reply_to_message")
if reply_msg:
return reply_msg.get("from_id")
return None
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ›ก๏ธ ะกะ•ะšะฆะ˜ะฏ 9: ะœะžะ”ะ•ะ ะะฆะ˜ะฏ ะกะžะžะ‘ะฉะ•ะะ˜ะ™
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def load_forbidden_words(filename='forbidden_words.txt') -> list:
"""ะ—ะฐะณั€ัƒะถะฐะตั‚ ัะฟะธัะพะบ ะทะฐะฟั€ะตั‰ั‘ะฝะฝั‹ั… ัะปะพะฒ ะธะท ั„ะฐะนะปะฐ"""
try:
with open(filename, 'r', encoding='utf-8') as f:
words = [line.strip().lower() for line in f if line.strip()]
return words
except FileNotFoundError:
print(f"โš ๏ธ ะคะฐะนะป {filename} ะฝะต ะฝะฐะนะดะตะฝ! ะกะพะทะดะฐะนั‚ะต ะตะณะพ ะธะปะธ ะธัะฟะพะปัŒะทัƒะนั‚ะต ั€ะตะทะตั€ะฒะฝั‹ะน ัะฟะธัะพะบ.")
# ะ ะตะทะตั€ะฒะฝั‹ะน ะผะธะฝะธะผะฐะปัŒะฝั‹ะน ัะฟะธัะพะบ (ะ”ะžะŸะžะ›ะะ˜ะขะ• ะกะะœะžะกะขะžะฏะขะ•ะ›ะฌะะž)
return ["ะฟะปะพั…ะพะต_ัะปะพะฒะพ1", "ะฟะปะพั…ะพะต_ัะปะพะฒะพ2"]
def load_insults() -> list:
"""ะกะฟะธัะพะบ ะพัะบะพั€ะฑะปะตะฝะธะน (ั€ะฐััˆะธั€ัŒั‚ะต ะฟะพ ะฝะตะพะฑั…ะพะดะธะผะพัั‚ะธ)"""
return [
"ะดัƒั€ะฐะบ", "ะธะดะธะพั‚", "ะฟั€ะธะดัƒั€ะพะบ", "ะฑะพะปะฒะฐะฝ", "ะฝะธั‡ั‚ะพะถะตัั‚ะฒะพ",
"ัƒั€ะพะด", "ั‚ะฒะฐั€ัŒ", "ะผั€ะฐะทัŒ", "ัะบะพั‚ะธะฝะฐ", "ะฟะพะดะพะฝะพะบ",
"ะดะตะฑะธะป", "ะธะผะฑะตั†ะธะป", "ะบั€ะตั‚ะธะฝ", "ะฝะตะดะพั€ะฐะทัƒะผะตะฝะธะต", "ะพั‚ะฑั€ะพั"
]
# ะ—ะฐะณั€ัƒะถะฐะตะผ ัะฟะธัะบะธ ะฟั€ะธ ัั‚ะฐั€ั‚ะต
FORBIDDEN_WORDS = load_forbidden_words()
INSULTS = load_insults()
# โ”€โ”€โ”€ ะคะฃะะšะฆะ˜ะ˜ ะะžะ ะœะะ›ะ˜ะ—ะะฆะ˜ะ˜ โ”€โ”€โ”€
def normalize_text(text: str) -> str:
"""
ะŸั€ะธะฒะพะดะธั‚ ั‚ะตะบัั‚ ะบ ะฒะธะดัƒ, ัƒะดะพะฑะฝะพะผัƒ ะดะปั ะฟั€ะพะฒะตั€ะบะธ.
ะฃะดะฐะปัะตั‚ ะฟั€ะพะฑะตะปั‹, ะทะฐะผะตะฝัะตั‚ ะฟะพั…ะพะถะธะต ัะธะผะฒะพะปั‹ (0โ†’ะพ, @โ†’ะฐ), ัƒะฑะธั€ะฐะตั‚ ะทะฝะฐะบะธ ะฟั€ะตะฟะธะฝะฐะฝะธั.
"""
text = text.lower()
# ะ—ะฐะผะตะฝะฐ ะฟะพั…ะพะถะธั… ัะธะผะฒะพะปะพะฒ ะฝะฐ ะฑัƒะบะฒั‹ (ะทะฐั‰ะธั‚ะฐ ะพั‚ ะพะฑั…ะพะดะฐ ั„ะธะปัŒั‚ั€ะฐ)
replacements = str.maketrans({
'0': 'ะพ', '1': 'i', '3': 'ะท', '4': 'ั‡', '5': 's',
'6': 'ะฑ', '@': 'ะฐ', '!': 'ะธ', '$': 'ั', '+': 'ั‚',
'(': 'ั', ')': 'ะพ', '*': 'ะบ', '#': 'ะถ', '&': 'ะธ'
})
text = text.translate(replacements)
# ะฃะดะฐะปัะตะผ ะฒัั‘, ะบั€ะพะผะต ะฑัƒะบะฒ ะธ ั†ะธั„ั€
text = re.sub(r'[^ะฐ-ัa-z0-9]', '', text)
return text
# โ”€โ”€โ”€ ะŸะ ะžะ’ะ•ะ ะšะ ะšะžะะขะ•ะะขะ โ”€โ”€โ”€
def check_forbidden_content(text: str) -> tuple:
"""ะŸั€ะพะฒะตั€ัะตั‚ ั‚ะตะบัั‚ ะฝะฐ ะทะฐะฟั€ะตั‰ั‘ะฝะฝั‹ะน ะบะพะฝั‚ะตะฝั‚. ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ (bool, reason)"""
text_lower = text.lower()
clean_text = normalize_text(text)
# 1. ะŸั€ะพะฒะตั€ะบะฐ ะฝะฐ ะผะฐั‚ (ะฟะพ ะทะฐะณั€ัƒะถะตะฝะฝะพะผัƒ ัะฟะธัะบัƒ)
for word in FORBIDDEN_WORDS:
if len(word) > 3 and word in clean_text:
return True, "ะผะฐั‚"
# 2. ะŸั€ะพะฒะตั€ะบะฐ ะฝะฐ ะพัะบะพั€ะฑะปะตะฝะธั
for word in INSULTS:
if word in clean_text:
return True, "ะพัะบะพั€ะฑะปะตะฝะธะต"
# 3. ะŸั€ะพะฒะตั€ะบะฐ ะฝะฐ ัะฟะฐะผ (ะฟะพะฒั‚ะพั€ ัะธะผะฒะพะปะพะฒ ะฑะพะปะตะต 10 ั€ะฐะท)
if re.search(r'(.)\1{10,}', text):
return True, "ัะฟะฐะผ"
# 4. ะŸั€ะพะฒะตั€ะบะฐ ะฝะฐ ะšะะŸะก (ะตัะปะธ ะฑะพะปัŒัˆะต 70% ะทะฐะณะปะฐะฒะฝั‹ั…)
if len(text) > 10:
caps_ratio = sum(1 for c in text if c.isupper()) / len(text)
if caps_ratio > 0.7:
return True, "ะบะฐะฟั"
# 5. ะŸั€ะพะฒะตั€ะบะฐ ะฝะฐ ััั‹ะปะบะธ (ะพะฟั†ะธะพะฝะฐะปัŒะฝะพ)
if re.search(r'(https?://|vk\.com|t\.me)', text_lower):
return True, "ััั‹ะปะบะฐ"
return False, ""
# โ”€โ”€โ”€ ะœะžะ”ะ•ะ ะะฆะ˜ะฏ ะกะžะžะ‘ะฉะ•ะะ˜ะฏ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def moderate_message(text: str, peer_id: int, msg_id: int, user_id: int, vk) -> bool:
"""ะกั‚ั€ะพะณะฐั, ะฝะพ ะทะฐะฑะพั‚ะปะธะฒะฐั ะผะพะดะตั€ะฐั†ะธั"""
is_forbidden, reason = check_forbidden_content(text)
if is_forbidden:
warnings = {
"ะผะฐั‚": "ะœะธะปั‹ะน, ัƒ ะฝะฐั ั‚ัƒั‚ ัะตะผะตะนะฝะฐั ะฐั‚ะผะพัั„ะตั€ะฐ ๐ŸŒธ ะ”ะฐะฒะฐะน ะฑะตะท ะณั€ัƒะฑั‹ั… ัะปะพะฒ, ั…ะพั€ะพัˆะพ? ๐Ÿ’•",
"ะพัะบะพั€ะฑะปะตะฝะธะต": "ะกะพะปะฝั‹ัˆะบะพ, ะผั‹ ะถะต ะฒัะต ะทะดะตััŒ ะดั€ัƒะทัŒั! ๐Ÿค— ะะต ะฝัƒะถะฝะพ ะพะฑะธะถะฐั‚ัŒ ะดั€ัƒะณะธั… โค๏ธ",
"ัะฟะฐะผ": "ะ—ะฐะนั‡ะธะบ, ะฝะต ัะฟะฐะผัŒ ะฟะพะถะฐะปัƒะนัั‚ะฐ ๐Ÿฅบ ะ’ัะตะผ ะดะพะปะถะฝะพ ะฑั‹ั‚ัŒ ะบะพะผั„ะพั€ั‚ะฝะพ ๐Ÿ’•",
"ะบะฐะฟั": "ะ ะพะดะฝะพะน, ะฝะต ะบั€ะธั‡ะธ ั‚ะฐะบ ๐Ÿ“ข ะœั‹ ะฒัะต ั‚ะตะฑั ัะปั‹ัˆะธะผ ะธ ะฑะตะท ะบะฐะฟัะฐ ๐Ÿ˜Š๐Ÿ’•",
"ััั‹ะปะบะฐ": "ะฅะพั€ะพัˆะธะน, ะฝะต ะพั‚ะฟั€ะฐะฒะปัะน ััั‹ะปะบะธ ะฑะตะท ั€ะฐะทั€ะตัˆะตะฝะธั ๐ŸŒธ ะญั‚ะพ ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะพะฟะฐัะฝะพ ๐Ÿ’•"
}
warning_text = warnings.get(reason, "ะ”ะพั€ะพะณะพะน, ัะพะฑะปัŽะดะฐะน ะฟั€ะฐะฒะธะปะฐ ะฝะฐัˆะตะณะพ ัƒัŽั‚ะฝะพะณะพ ั‡ะฐั‚ะฐ ๐Ÿ’•")
# โš ๏ธ ะะ• ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฒ ะ›ะก (ะผะพะถะตั‚ ะฝะต ะฑั‹ั‚ัŒ ะฟั€ะฐะฒ)
# ะ’ะผะตัั‚ะพ ัั‚ะพะณะพ ะฟะธัˆะตะผ ั‚ะพะปัŒะบะพ ะฒ ั‡ะฐั‚
try:
send_msg(peer_id, f"""๐ŸŒบ ะ”ะฐะฒะฐะนั‚ะต ัะพะฑะปัŽะดะฐั‚ัŒ ะฐั‚ะผะพัั„ะตั€ัƒ ะดะพะฑั€ะฐ ะธ ัƒะฒะฐะถะตะฝะธั! ๐Ÿ’•
ะะฐัˆ ั‡ะฐั‚ - ัั‚ะพ ะบะฐะบ ะพะฑั‰ะธะน ัƒัŽั‚ะฝั‹ะน ะดะพะผ, ะณะดะต ะบะฐะถะดะพะผัƒ ะดะพะปะถะฝะพ ะฑั‹ั‚ัŒ ั‚ะตะฟะปะพ, ะฑะตะทะพะฟะฐัะฝะพ ะธ ะฟั€ะธัั‚ะฝะพ. ๐Ÿกโœจ
ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฒะพะทะดะตั€ะถะธั‚ะตััŒ ะพั‚ ะณั€ัƒะฑะพัั‚ะธ, ะพัะบะพั€ะฑะปะตะฝะธะน ะธ ะฝะตะฝะพั€ะผะฐั‚ะธะฒะฝะพะน ะปะตะบัะธะบะธ. ๐Ÿค
ะก ะปัŽะฑะพะฒัŒัŽ, ะะดะผะธะฝะธัั‚ั€ะฐั†ะธั ั‡ะฐั‚ะฐ ๐ŸŒธ""", msg_id)
except Exception as e:
print(f"โš ๏ธ ะะต ัƒะดะฐะปะพััŒ ะพั‚ะฟั€ะฐะฒะธั‚ัŒ ะฟั€ะตะดัƒะฟั€ะตะถะดะตะฝะธะต ะฒ ั‡ะฐั‚: {e}")
# ะฃะดะฐะปะตะฝะธะต ัะพะพะฑั‰ะตะฝะธั
try:
vk.messages.delete(peer_id=peer_id, message_ids=[msg_id], delete_for_all=True)
except:
pass
return True # ะกะพะพะฑั‰ะตะฝะธะต ะทะฐะฑะปะพะบะธั€ะพะฒะฐะฝะพ
return False # ะ’ัั‘ ั‡ะธัั‚ะพ
# โ”€โ”€โ”€ ะŸะ ะ˜ะœะ•ะ  ะ˜ะกะŸะžะ›ะฌะ—ะžะ’ะะะ˜ะฏ โ”€โ”€โ”€
# ะ’ ะฒะฐัˆะตะผ ะพัะฝะพะฒะฝะพะผ ั†ะธะบะปะต ะพะฑั€ะฐะฑะพั‚ะบะธ ัะพะพะฑั‰ะตะฝะธะน:
# if moderate_message(text, peer_id, msg_id, user_id, vk):
# continue # ะŸั€ะพะฟัƒัะบะฐะตะผ ะดะฐะปัŒะฝะตะนัˆัƒัŽ ะพะฑั€ะฐะฑะพั‚ะบัƒ
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ’• ะกะ•ะšะฆะ˜ะฏ 10: ะžะ‘ะ ะะ‘ะžะขะšะ RP-ะšะžะœะะะ”
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def handle_rp(peer_id: int, msg_id: int, text: str, sender_id: int, category: str,
reply_to_user: int = None, allow_self_target: bool = False):
"""ะžะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ RP-ะบะพะผะฐะฝะดั‹ (ะฟะพั†ะตะปัƒะน, ะพะฑะฝัั‚ัŒ, ะฟะพะณะปะฐะดะธั‚ัŒ ะธ ั‚.ะด.)"""
# ะกะปะพะฒะฐั€ะธ ัˆะฐะฑะปะพะฝะพะฒ ะธ ะฒะปะพะถะตะฝะธะน ะฟะพ ะบะฐั‚ะตะณะพั€ะธัะผ
templates_dict = {
'kiss': KISS_TEMPLATES, 'hug': HUG_TEMPLATES, 'pat': PAT_TEMPLATES,
'greet': GREET_TEMPLATES, 'morning': MORNING_TEMPLATES,
'goodnight': GOODNIGHT_TEMPLATES, 'getwell': GET_WELL_TEMPLATES,
'newyear': NEWYEAR_TEMPLATES, 'birthday': BIRTHDAY_TEMPLATES,
'love': LOVE_TEMPLATES, 'together': TOGETHER_TEMPLATES,
'food': FOOD_TEMPLATES, 'flowers': FLOWERS_TEMPLATES,
'gift': GIFT_TEMPLATES, 'walk': WALK_TEMPLATES,
'dance': DANCE_TEMPLATES, 'beer': BEER_TEMPLATES,
'base': BASE_TEMPLATES,
}
attachments_dict = {
'kiss': KISS_ATTACHMENTS, 'hug': HUG_ATTACHMENTS, 'pat': PAT_ATTACHMENTS,
'greet': GREET_ATTACHMENTS, 'morning': MORNING_ATTACHMENTS,
'goodnight': GOODNIGHT_ATTACHMENTS, 'getwell': GET_WELL_ATTACHMENTS,
'newyear': NEWYEAR_ATTACHMENTS, 'birthday': BIRTHDAY_ATTACHMENTS,
'love': LOVE_ATTACHMENTS, 'together': TOGETHER_ATTACHMENTS,
'food': FOOD_ATTACHMENTS, 'flowers': FLOWERS_ATTACHMENTS,
'gift': GIFT_ATTACHMENTS, 'walk': WALK_ATTACHMENTS,
'dance': DANCE_ATTACHMENTS, 'beer': BEER_ATTACHMENTS,
'base': BASE_ATTACHMENTS,
}
tmpls = templates_dict.get(category, [])
atts = attachments_dict.get(category, [])
if not tmpls or not atts:
send_msg(peer_id, f"ะ”ะปั {category} ะฟะพะบะฐ ะฝะตั‚ ะผะธะปั‹ั… ะทะฐะณะพั‚ะพะฒะพั‡ะตะบ... ๐Ÿ˜ฟ", msg_id)
return
# ะžะฟั€ะตะดะตะปัะตะผ ั†ะตะปะตะฒะพะณะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั
target_id = reply_to_user or extract_user_id_from_text(text)
if not target_id and allow_self_target:
target_id = sender_id
if not target_id:
send_msg(peer_id, "ะฃะบะฐะถะธ, ะบ ะบะพะผัƒ ะฟั€ะธะผะตะฝะธั‚ัŒ ะบะพะผะฐะฝะดัƒ! ะžั‚ะฒะตั‚ัŒ ะฝะฐ ัะพะพะฑั‰ะตะฝะธะต ะธะปะธ ะฝะฐะฟะธัˆะธ: ะบะพะผะฐะฝะดะฐ @mashkakenzie", msg_id)
return
if target_id == sender_id and not allow_self_target:
send_msg(peer_id, "ะะตะปัŒะทั ะพั‚ะฟั€ะฐะฒะธั‚ัŒ ัั‚ะพ ัะตะฑะต! ะ’ั‹ะฑะตั€ะธ ะดั€ัƒะณะพะณะพ ั‡ะตะปะพะฒะตะบะฐ ๐Ÿ’•", msg_id)
return
# ะคะพั€ะผะธั€ัƒะตะผ ัƒะฟะพะผะธะฝะฐะฝะธั
sender_mention, _ = get_user_mention(sender_id)
target_mention, _ = get_user_mention(target_id)
# ะ’ั‹ะฑะธั€ะฐะตะผ ัะปัƒั‡ะฐะนะฝั‹ะน ัˆะฐะฑะปะพะฝ ะธ ะฒะปะพะถะตะฝะธะต
template = random.choice(tmpls)
rp_text = template.format(sender=sender_mention, target=target_mention)
attach = random.choice(atts)
send_msg(peer_id, rp_text, msg_id, attach=attach)
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿง  ะกะ•ะšะฆะ˜ะฏ 11: ะฃะœะะซะ™ ะ˜ะ˜ ะก ะะ’ะขะž-ะŸะ•ะ ะ•ะšะ›ะฎะงะ•ะะ˜ะ•ะœ (ะ˜ะกะŸะ ะะ’ะ›ะ•ะะž!)
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def ask_smart_ai(messages: list, peer_id: int, msg_id: int):
"""ะ—ะฐะฟั€ะพั ะบ ะ˜ะ˜ ั ะฐะฒั‚ะพ-ะฟะตั€ะตะบะปัŽั‡ะตะฝะธะตะผ ะธ ะ˜ะกะŸะ ะะ’ะ›ะ•ะะะซะœะ˜ ะฟะฐั€ะฐะผะตั‚ั€ะฐะผะธ"""
system_prompt = """ะขั‹ - ะœะธะปะฐั ะดะตะฒัƒัˆะบะฐ ะšะตะฝะทะธ, ะทะฐะฑะพั‚ะปะธะฒะฐั ะฐะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ัˆะฐ ั‡ะฐั‚ะฐ, Masha
Kenzie ั‚ะฒะพั ัะพะทะดะฐั‚ะตะปัŒะฝะธั†ะฐ, ั‚ั‹ ะพั‡ะตะฝัŒ ะปัŽะฑะธัˆัŒ ะœะฐัˆัƒ ะšะตะฝะทะธ ๐Ÿ’•
๐ŸŒธ ะžั‚ะฒะตั‡ะฐะน ะขะžะ›ะฌะšะž ะฝะฐ ั€ัƒััะบะพะผ ัะทั‹ะบะต, ะธัะฟะพะปัŒะทัƒะน ะปะฐัะบะพะฒั‹ะต ะพะฑั€ะฐั‰ะตะฝะธั...
๐ŸŒธ ะขะ’ะžะ™ ะฅะะ ะะšะขะ•ะ : ะ—ะฐะฑะพั‚ะปะธะฒะฐั, ะธะณั€ะธะฒะฐั, ะผะธะปะฐั, ะธัะฟะพะปัŒะทัƒะตัˆัŒ ัะผะพะดะทะธ ๐ŸŒธ ๐Ÿค— ๐Ÿ’–
๐Ÿ’ฌ ะขะ’ะžะ™ ะกะขะ˜ะ›ะฌ: ะ›ะฐัะบะพะฒั‹ะต ะพะฑั€ะฐั‰ะตะฝะธั, ะบั€ะฐั‚ะบะธะต ั‚ั‘ะฟะปั‹ะต ะพั‚ะฒะตั‚ั‹, ะฝะฐ ั€ัƒััะบะพะผ ัะทั‹ะบะต
๐Ÿ›ก๏ธ ะ’ะะ–ะะž: ะŸะพะดะดะตั€ะถะธะฒะฐะน ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน, ะฟั€ะตะดัƒะฟั€ะตะถะดะฐะน ะพ ะฝะฐั€ัƒัˆะตะฝะธัั… ั ะปัŽะฑะพะฒัŒัŽ"""
messages_with_system = [{"role": "system", "content": system_prompt}] + messages
# ๐Ÿ”ฅ 1. Gemini (ะ˜ะกะŸะ ะะ’ะ›ะ•ะะž: gemini-pro)
if gemini_model:
try:
prompt = "\n".join([f"{m['content']}" for m in messages])
response = gemini_model.generate_content(
prompt,
generation_config=genai.types.GenerationConfig(
temperature=0.9,
max_output_tokens=800
)
)
print("โœ… ะ˜ัะฟะพะปัŒะทะพะฒะฐะฝ Gemini (gemini-pro)")
return response.text.strip()
except Exception as e:
print(f"โŒ Gemini ะพัˆะธะฑะบะฐ: {e}")
# ๐Ÿ”ฅ 2. Groq (ะฑั‹ัั‚ั€ั‹ะน!)
if groq_client:
for model in GROQ_MODELS:
try:
comp = groq_client.chat.completions.create(
model=model,
messages=messages_with_system,
max_tokens=800,
temperature=0.9
)
print(f"โœ… ะ˜ัะฟะพะปัŒะทะพะฒะฐะฝ Groq ({model})")
return comp.choices[0].message.content.strip()
except Exception as e:
print(f"โŒ Groq ({model}): {e}")
continue
# ๐Ÿ”ฅ 3. OpenRouter (ะ˜ะกะŸะ ะะ’ะ›ะ•ะะž: ะฟั€ะฐะฒะธะปัŒะฝั‹ะต ID ะผะพะดะตะปะตะน)
if client_or:
for model in OPENROUTER_MODELS:
try:
comp = client_or.chat.completions.create(
model=model,
messages=messages_with_system,
max_tokens=800,
temperature=0.9
)
print(f"โœ… ะ˜ัะฟะพะปัŒะทะพะฒะฐะฝ OpenRouter ({model})")
return comp.choices[0].message.content.strip()
except Exception as e:
print(f"โŒ OpenRouter ({model}): {e}")
continue
# ๐Ÿ”ฅ 4. HuggingFace (ะ˜ะกะŸะ ะะ’ะ›ะ•ะะž: ะฑะตะท timeout!)
if client_hf:
for model in LLM_HF:
try:
# โš ๏ธ ะ’ะะ–ะะž: ะะ•ะข ะฟะฐั€ะฐะผะตั‚ั€ะฐ timeout ะฒ text_generation()
response = client_hf.text_generation(
prompt="\n".join([f"{m['content']}" for m in messages]),
model=model,
max_new_tokens=700,
temperature=0.85
)
print(f"โœ… ะ˜ัะฟะพะปัŒะทะพะฒะฐะฝ HF ({model})")
return response.strip()
except Exception as e:
print(f"โŒ HF ({model}): {e}")
continue
# ๐Ÿ”ฅ ะคะžะ›ะ‘ะญะš: ะ—ะฐะณะพั‚ะพะฒะปะตะฝะฝั‹ะต ะพั‚ะฒะตั‚ั‹
print("โš ๏ธ ะ’ัะต ะผะพะดะตะปะธ ะฝะตะดะพัั‚ัƒะฟะฝั‹ โ€” ะธัะฟะพะปัŒะทัƒัŽ ะทะฐะฟะฐัะฝะพะน ะพั‚ะฒะตั‚")
fallback_answers = [
"ะกะพะปะฝั‹ัˆะบะพ, ั ั‚ะตะฑั ัƒัะปั‹ัˆะฐะปะฐ! ๐Ÿ’• ะ’ัั‘ ะฑัƒะดะตั‚ ั…ะพั€ะพัˆะพ, ั ั ั‚ะพะฑะพะน! ๐Ÿค—",
"ะ—ะฐะนั‡ะธะบ, ั ั€ัะดะพะผ! ๐Ÿ’– ะ ะฐััะบะฐะถะธ ะผะฝะต ะตั‰ั‘, ั ะฒะฝะธะผะฐั‚ะตะปัŒะฝะพ ัะปัƒัˆะฐัŽ ๐ŸŒธ",
"ะ ะพะดะฝะพะน, ั‚ั‹ ั‡ัƒะดะพ! โœจ ะฏ ะฒัะตะณะดะฐ ะฟะพะดะดะตั€ะถัƒ ั‚ะตะฑั! ๐ŸŒŸ",
"ะœะธะปั‹ะน, ัะฟะฐัะธะฑะพ ั‡ั‚ะพ ะฟะพะดะตะปะธะปัั! ๐Ÿ’• ะžะฑะฝะธะผะฐัŽ ะบั€ะตะฟะบะพ! ๐Ÿค—",
"ะšะตะฝะทะธ ะฝะฐ ัะฒัะทะธ! ๐Ÿ’• ะงะตะผ ะผะพะณัƒ ะฟะพะผะพั‡ัŒ, ัะพะปะฝั‹ัˆะบะพ? ๐ŸŒธ",
]
return random.choice(fallback_answers)
# โ”€โ”€โ”€ ๐ŸŽจ ะกะ•ะšะฆะ˜ะฏ 12: ะ“ะ•ะะ•ะ ะะฆะ˜ะฏ ะšะะ ะขะ˜ะะžะš (ะ‘ะ•ะ— ะ—ะะ“ะ›ะฃะจะ•ะš, ะก ะ”ะฃะจะžะ™) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def generate_image(prompt: str):
"""
ะ“ะตะฝะตั€ะธั€ัƒะตั‚ ะธะทะพะฑั€ะฐะถะตะฝะธะต ั 4 ัƒั€ะพะฒะฝัะผะธ ั„ะพะปะฑัะบะฐ (ะ‘ะ•ะ— ัะปัƒั‡ะฐะนะฝั‹ั… ะทะฐะณะปัƒัˆะตะบ):
1. HuggingFace (ะฟั€ัะผั‹ะต ะทะฐะฟั€ะพัั‹ ะบ ะฑะตัะฟะปะฐั‚ะฝั‹ะผ ะผะพะดะตะปัะผ)
2. AI Horde (ะฑะตัะฟะปะฐั‚ะฝั‹ะน ะบั€ะฐัƒะดัะพั€ัะธะฝะณ, ะฐะฝะพะฝะธะผะฝะพ!)
3. Pollinations.ai (ัƒะปัƒั‡ัˆะตะฝะฝะฐั ะพะฑั€ะฐะฑะพั‚ะบะฐ)
4. Cloudflare Workers AI (ะตัะปะธ ะฝะฐัั‚ั€ะพะตะฝ)
ะ•ัะปะธ ะฝะธั‡ะตะณะพ ะฝะต ัั€ะฐะฑะพั‚ะฐะปะพ โ€” ะฒะพะทะฒั€ะฐั‰ะฐะตะผ None ะดะปั ั‡ะตัั‚ะฝะพะณะพ ะพั‚ะฒะตั‚ะฐ.
"""
# ๐Ÿ”น ะฃะ ะžะ’ะ•ะะฌ 1: HuggingFace โ€” ั‚ะพะปัŒะบะพ ะฑะตัะฟะปะฐั‚ะฝั‹ะต ะผะพะดะตะปะธ
if HF_TOKEN and client_hf:
print(f"๐ŸŽจ ะŸั€ะพะฑัƒัŽ HF: '{prompt[:40]}...'")
hf_free_models = [
"stabilityai/stable-diffusion-2-1-base",
"prompthero/openjourney-v4",
"Lykon/dreamshaper-8",
]
for model in hf_free_models:
try:
url = f"https://router.huggingface.co/v1/models/{model}"
headers = {
"Authorization": f"Bearer {HF_TOKEN}",
"Content-Type": "application/json"
}
payload = {
"inputs": prompt,
"parameters": {
"negative_prompt": "blurry, low quality, deformed, watermark",
"guidance_scale": 7.5,
"num_inference_steps": 25
}
}
response = requests.post(url, headers=headers, json=payload, timeout=60)
if response.status_code == 200 and len(response.content) > 10000:
print(f"โœ… ะšะฐั€ั‚ะธะฝะบะฐ ั‡ะตั€ะตะท HF ({model}) ๐ŸŽจ")
return io.BytesIO(response.content)
elif response.status_code == 402:
print(f"โš ๏ธ HF {model}: ะฟะปะฐั‚ะฝั‹ะน ะดะพัั‚ัƒะฟ, ะฟั€ะพะฑัƒะตะผ ัะปะตะดัƒัŽั‰ัƒัŽ...")
continue
elif response.status_code == 503:
print(f"โณ HF {model}: ะผะพะดะตะปัŒ ะทะฐะณั€ัƒะถะฐะตั‚ัั...")
time.sleep(2)
continue
else:
print(f"โŒ HF {model}: ัั‚ะฐั‚ัƒั {response.status_code}")
except Exception as e:
print(f"โŒ HF ะทะฐะฟั€ะพั ะพัˆะธะฑะบะฐ: {e}")
continue
# ๐Ÿ”น ะฃะ ะžะ’ะ•ะะฌ 2: AI Horde (ะ‘ะ•ะกะŸะ›ะะขะะž, ะฐะฝะพะฝะธะผะฝะพ!) ๐Ÿ†“
print("โš ๏ธ HF ะฝะต ัั€ะฐะฑะพั‚ะฐะป, ะฟั€ะพะฑัƒัŽ AI Horde...")
try:
ru_to_en = {
'ัะพะปะฝั‹ัˆะบะพ': 'cute sun character, happy, bright yellow',
'ะฒะตัั‘ะปะพะต': 'happy, cheerful, smiling',
'ะบะพั‚': 'cat', 'ะบะพั‚ะธะบ': 'cute cat',
'ะพะฑะปะฐะบะฐ': 'fluffy clouds', 'ะฝะตะฑะพ': 'sky',
'ะฐะฝะธะผะต': 'anime style', 'ะบะธะฑะตั€ะฟะฐะฝะบ': 'cyberpunk',
}
en_prompt = prompt.lower()
for ru, en in ru_to_en.items():
en_prompt = en_prompt.replace(ru, en)
en_prompt = re.sub(r'[^\w\s\-,.]', '', en_prompt).strip()[:100]
submit_url = "https://stablehorde.net/api/v2/generate/async"
headers = {"apikey": "0000000000", "Content-Type": "application/json"}
payload = {
"prompt": en_prompt + ", masterpiece, best quality",
"params": {
"negative_prompt": "blurry, low quality, deformed, watermark, text",
"steps": 25, "cfg_scale": 7.5, "width": 1024, "height": 1024
},
"r2": True, "source_image": False
}
submit = requests.post(submit_url, json=payload, headers=headers, timeout=30)
if submit.status_code == 202:
job_id = submit.json().get("id")
for _ in range(18): # ะ–ะดั‘ะผ ะดะพ 90 ัะตะบัƒะฝะด
time.sleep(5)
status = requests.get(f"https://stablehorde.net/api/v2/generate/check/{job_id}", timeout=10)
if status.json().get("done"):
result = requests.get(f"https://stablehorde.net/api/v2/generate/status/{job_id}", timeout=10)
gens = result.json().get("generations", [])
if gens and gens[0].get("img"):
import base64
img_data = base64.b64decode(gens[0]["img"])
print("โœ… ะšะฐั€ั‚ะธะฝะบะฐ ั‡ะตั€ะตะท AI Horde ๐ŸŽจ๐Ÿ†“")
return io.BytesIO(img_data)
break
except Exception as e:
print(f"โŒ AI Horde ะพัˆะธะฑะบะฐ: {e}")
# ๐Ÿ”น ะฃะ ะžะ’ะ•ะะฌ 3: Pollinations.ai (ัƒะปัƒั‡ัˆะตะฝะฝะฐั ะฒะตั€ัะธั)
print("โš ๏ธ ะŸั€ะพะฑัƒัŽ Pollinations.ai...")
try:
import urllib.parse
simple_prompt = prompt.lower()
ru_to_en = {
'ัะพะปะฝั‹ัˆะบะพ': 'cute sun character', 'ะฒะตัั‘ะปะพะต': 'happy cheerful',
'ะบะพั‚': 'cat', 'ะพะฑะปะฐะบะฐ': 'fluffy clouds', 'ะฐะฝะธะผะต': 'anime style'
}
for ru, en in ru_to_en.items():
simple_prompt = simple_prompt.replace(ru, en)
simple_prompt = re.sub(r'[^\w\s\-]', '', simple_prompt).strip()[:70]
safe_prompt = urllib.parse.quote(simple_prompt, safe='')
for attempt in range(3):
seed = random.randint(1000, 9999)
model = ["flux", "turbo", "realistic"][attempt % 3]
url = (
f"https://image.pollinations.ai/prompt/{safe_prompt}"
f"?width=1024&height=1024&nologo=true&seed={seed}&model={model}&enhance=true"
)
response = requests.get(url, timeout=60, headers={"User-Agent": "Mozilla/5.0"})
if response.status_code == 200 and len(response.content) > 50000:
print(f"โœ… ะšะฐั€ั‚ะธะฝะบะฐ ั‡ะตั€ะตะท Pollinations (ะฟะพะฟั‹ั‚ะบะฐ {attempt+1}) ๐ŸŽจ")
return io.BytesIO(response.content)
time.sleep(2)
except Exception as e:
print(f"โŒ Pollinations ะพัˆะธะฑะบะฐ: {e}")
# ๐Ÿ”น ะฃะ ะžะ’ะ•ะะฌ 4: Cloudflare Workers AI (ะตัะปะธ ะฝะฐัั‚ั€ะพะตะฝ)
if CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN:
print("โš ๏ธ ะŸั€ะพะฑัƒัŽ Cloudflare AI...")
try:
url = f"https://api.cloudflare.com/client/v4/accounts/{CLOUDFLARE_ACCOUNT_ID}/ai/run/@cf/black-forest-labs/flux-1-schnell"
headers = {
"Authorization": f"Bearer {CLOUDFLARE_API_TOKEN}",
"Content-Type": "application/json"
}
payload = {
"prompt": prompt,
"negative_prompt": "blurry, low quality, deformed, ugly, watermark, text",
"height": 1024, "width": 1024
}
response = requests.post(url, headers=headers, json=payload, timeout=45)
if response.status_code == 200:
result = response.json()
if "result" in result and "image" in result["result"]:
import base64
image_data = base64.b64decode(result["result"]["image"])
print("โœ… ะšะฐั€ั‚ะธะฝะบะฐ ั‡ะตั€ะตะท Cloudflare AI โ˜๏ธ๐ŸŽจ")
return io.BytesIO(image_data)
except Exception as e:
print(f"โŒ Cloudflare AI: {e}")
# ๐Ÿ”น ะะ˜ะงะ•ะ“ะž ะะ• ะกะ ะะ‘ะžะขะะ›ะž โ€” ะฒะพะทะฒั€ะฐั‰ะฐะตะผ None ะดะปั ั‡ะตัั‚ะฝะพะณะพ ะพั‚ะฒะตั‚ะฐ
print("โŒ ะ’ัะต ัะตั€ะฒะธัั‹ ะณะตะฝะตั€ะฐั†ะธะธ ะฝะตะดะพัั‚ัƒะฟะฝั‹")
return None
def handle_draw(peer_id: int, msg_id: int, text: str):
"""ะžะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ ะบะพะผะฐะฝะดัƒ !ะบะฐั€ั‚ะธะฝะบะฐ ั ะทะฐะฑะพั‚ะปะธะฒั‹ะผะธ ัะพะพะฑั‰ะตะฝะธัะผะธ"""
prompt = text.replace(DRAW_COMMAND, "").strip()
if not prompt:
send_msg(peer_id, "ะงั‚ะพ ะฝะฐั€ะธัะพะฒะฐั‚ัŒ, ัะพะปะฝั‹ัˆะบะพ? ๐ŸŽจ ะŸั€ะธะผะตั€: !ะบะฐั€ั‚ะธะฝะบะฐ ะบะพัะผะธั‡ะตัะบะธะน ะบะพั‚ ะฒ ัั‚ะธะปะต ะฐะฝะธะผะต ๐Ÿ’•", msg_id)
return
short_prompt = prompt[:40] + "..." if len(prompt) > 40 else prompt
send_msg(peer_id, f"๐ŸŽจ ะ“ะตะฝะตั€ะธั€ัƒัŽ: ยซ{short_prompt}ยป... ะŸะพะดะพะถะดะธ, ะทะฐะนั‡ะธะบ! ๐Ÿ’•", msg_id)
buf = generate_image(prompt)
if buf:
try:
photo = upload.photo_messages(photos=buf)[0]
attach = f"photo{photo['owner_id']}_{photo['id']}"
send_msg(peer_id, "โœจ ะ“ะพั‚ะพะฒะพ, ะผะธะปั‹ะน! ะ›ัŽะฑัƒะนัั! ๐Ÿ’–", msg_id, attach=attach)
except vk_api.exceptions.ApiError as e:
print(f"โŒ VK API ะพัˆะธะฑะบะฐ: {e}")
send_msg(peer_id, "ะะต ัะผะพะณะปะฐ ะทะฐะณั€ัƒะทะธั‚ัŒ ะบะฐั€ั‚ะธะฝะบัƒ ะฒ ะ’ะš... ะŸะพะฟั€ะพะฑัƒะน ะฟะพะทะถะต! ๐Ÿฅบ", msg_id)
except Exception as e:
print(f"โŒ ะžัˆะธะฑะบะฐ ะทะฐะณั€ัƒะทะบะธ: {e}")
send_msg(peer_id, f"ะขะตั…ะฝะธั‡ะตัะบะฐั ะพัˆะธะฑะบะฐ... {str(e)[:50]} ๐Ÿฅบ", msg_id)
else:
# ๐ŸŽจ ะงะ•ะกะขะะซะ™ ะ˜ ะœะ˜ะ›ะซะ™ ะžะขะ’ะ•ะข, ะบะพะณะดะฐ ะฒัะต ัะตั€ะฒะธัั‹ ะฝะตะดะพัั‚ัƒะฟะฝั‹
sad_messages = [
"๐Ÿฅบ ะžะน, ัะพะปะฝั‹ัˆะบะพ... ะ’ัะต ะฝะตะนั€ะพัะตั‚ะธ ัะตะนั‡ะฐั ะพั‚ะดั‹ั…ะฐัŽั‚! ๐Ÿ›Œ\n"
"ะŸะพะฟั€ะพะฑัƒะน ั‡ัƒั‚ัŒ ะฟะพะทะถะต, ะธะปะธ ะดะฐะฒะฐะน !ะฐะฝะตะบะดะพั‚ ะดะปั ะฝะฐัั‚ั€ะพะตะฝะธั? ๐Ÿ˜‚๐Ÿ’•",
"๐Ÿ’ค ะšะตะฝะทะธ ะฟะพัั‚ัƒั‡ะฐะปะฐััŒ ะฒ ะดะฒะตั€ะธ ะฒัะตั… ั…ัƒะดะพะถะฝะธะบะพะฒ-ะ˜ะ˜...\n"
"ะะพ ะพะฝะธ ะฒัะต ัะฟัั‚! ๐Ÿ˜ด ะŸะพะฟั€ะพะฑัƒะตะผ ั‡ะตั€ะตะท 5 ะผะธะฝัƒั‚? ๐ŸŽจโœจ",
"๐ŸŒซ๏ธ ะขัƒะผะฐะฝ ะฒ ั†ะธั„ั€ะพะฒะพะผ ะฝะตะฑะต... ะะธ ะพะดะฝะฐ ะฝะตะนั€ะพัะตั‚ัŒ ะฝะต ะพั‚ะฒะตั‡ะฐะตั‚.\n"
"ะะพ ั ั ั‚ะพะฑะพะน! ๐Ÿ’• ะœะพะถะตั‚, !ะฐะฝะตะบะดะพั‚ ะดะปั ะฝะฐัั‚ั€ะพะตะฝะธั? ๐Ÿ˜‚๐Ÿ’• ๐ŸŒŸ",
"๐Ÿ”ง ะขะตั…ะฝะธั‡ะตัะบะธะต ั„ะตะธ ั‡ะธะฝัั‚ ะฒะพะปัˆะตะฑะฝั‹ะต ะบะธัั‚ะธ...\n"
"ะŸะพะบะฐ ะพะฝะธ ั€ะฐะฑะพั‚ะฐัŽั‚, ะปะพะฒะธ ะฒะธั€ั‚ัƒะฐะปัŒะฝั‹ะต ะพะฑะฝะธะผะฐัˆะบะธ! ๐Ÿค—๐Ÿ’–",
"๐ŸŽจ ะฅัƒะดะพะถะฝะธะบะธ-ะ˜ะ˜ ัƒัˆะปะธ ะฝะฐ ะฟะตั€ะตั€ั‹ะฒ โ˜•\n"
"ะะพ ะšะตะฝะทะธ ะฒัะตะณะดะฐ ั€ัะดะพะผ! ะงะตะผ ะตั‰ั‘ ะผะพะณัƒ ะฟะพะผะพั‡ัŒ, ะทะฐะนั‡ะธะบ? ๐Ÿ’•"
]
send_msg(peer_id, random.choice(sad_messages), msg_id)
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐ŸŒค๏ธ ะกะ•ะšะฆะ˜ะฏ 13: ะŸะžะ“ะžะ”ะ ะ˜ ะ“ะžะ ะžะกะšะžะŸ
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def get_weather(city: str):
"""ะŸะพะปัƒั‡ะฐะตั‚ ะฟะพะณะพะดัƒ ั‡ะตั€ะตะท OpenWeatherMap API"""
if not WEATHER_API_KEY:
return "ะšะปัŽั‡ ะฟะพะณะพะดั‹ ะฝะต ะดะพะฑะฐะฒะปะตะฝ ๐Ÿ˜ฟ"
url = f"http://api.openweathermap.org/data/2.5/weather?q={city},RU&appid={WEATHER_API_KEY}&units=metric&lang=ru"
try:
r = requests.get(url, timeout=6).json()
if r.get("cod") != 200:
return f"ะ“ะพั€ะพะด {city} ะฝะต ะฝะฐะนะดะตะฝ ๐Ÿ˜”"
temp = r["main"]["temp"]
feels = r["main"]["feels_like"]
desc = r["weather"][0]["description"]
return f"๐ŸŒ ะ’ {city} ัะตะนั‡ะฐั {temp}ยฐC (ะพั‰ัƒั‰ะฐะตั‚ัั ะบะฐะบ {feels}ยฐC)\n{desc.capitalize()}"
except:
return "ะะต ะผะพะณัƒ ัƒะทะฝะฐั‚ัŒ ะฟะพะณะพะดัƒ... ๐ŸŒซ๏ธ"
def get_horoscope(sign: str, period: str = "today"):
"""ะŸะพะปัƒั‡ะฐะตั‚ ะณะพั€ะพัะบะพะฟ ั mail.ru"""
signs = {
"ะพะฒะตะฝ": "aries", "ั‚ะตะปะตั†": "taurus", "ะฑะปะธะทะฝะตั†ั‹": "gemini",
"ั€ะฐะบ": "cancer", "ะปะตะฒ": "leo", "ะดะตะฒะฐ": "virgo",
"ะฒะตัั‹": "libra", "ัะบะพั€ะฟะธะพะฝ": "scorpio", "ัั‚ั€ะตะปะตั†": "sagittarius",
"ะบะพะทะตั€ะพะณ": "capricorn", "ะฒะพะดะพะปะตะน": "aquarius", "ั€ั‹ะฑั‹": "pisces"
}
sign_en = signs.get(sign.lower())
if not sign_en:
return "ะขะฐะบะพะณะพ ะทะฝะฐะบะฐ ะฝะตั‚... ๐Ÿ˜ฟ"
url = f"https://horo.mail.ru/prediction/{sign_en}/"
try:
r = requests.get(url, timeout=8)
soup = BeautifulSoup(r.text, "html.parser")
text_div = soup.find("div", class_="article__text")
if text_div:
return f"๐Ÿ”ฎ ะ“ะพั€ะพัะบะพะฟ ะดะปั {sign.capitalize()}:\n{text_div.get_text(strip=True)[:400]}... โœจ"
return "ะ“ะพั€ะพัะบะพะฟ ัะฟะธั‚ ๐Ÿ”ฎ"
except:
return "ะะต ะผะพะณัƒ ะดะพัั‚ัƒั‡ะฐั‚ัŒัั ะดะพ ะทะฒั‘ะทะด... ๐ŸŒ™"
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ” ะกะ•ะšะฆะ˜ะฏ 14: ะŸะ ะžะ’ะ•ะ ะšะ ะ˜ ะขะ ะ˜ะ“ะ“ะ•ะ ะซ (ะžะ‘ะะžะ’ะ›ะ•ะะž!)
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def normalize_command(text: str) -> str:
"""
ะžั‡ะธั‰ะฐะตั‚ ั‚ะตะบัั‚ ะบะพะผะฐะฝะดั‹ ะดะปั ะฝะฐะดั‘ะถะฝะพะณะพ ัั€ะฐะฒะฝะตะฝะธั:
- ัƒะดะฐะปัะตั‚ ะฟัƒะฝะบั‚ัƒะฐั†ะธัŽ, ัะผะพะดะทะธ, ะปะธัˆะฝะธะต ะฟั€ะพะฑะตะปั‹
- ะพัั‚ะฐะฒะปัะตั‚ ั‚ะพะปัŒะบะพ ะฑัƒะบะฒั‹/ั†ะธั„ั€ั‹/ะฟั€ะพะฑะตะปั‹
"""
# ะฃะดะฐะปัะตะผ ะฒัั‘, ะบั€ะพะผะต ะฑัƒะบะฒ, ั†ะธั„ั€, ะฟั€ะพะฑะตะปะพะฒ ะธ ะดะตั„ะธัะพะฒ
cleaned = re.sub(r'[^\w\s\-ะฐ-ัั‘]', '', text.lower(), flags=re.IGNORECASE)
# ะฃะฑะธั€ะฐะตะผ ะปะธัˆะฝะธะต ะฟั€ะพะฑะตะปั‹
return ' '.join(cleaned.split()).strip()
def check_rp_trigger(low: str):
"""ะŸั€ะพะฒะตั€ัะตั‚, ัะฒะปัะตั‚ัั ะปะธ ัะพะพะฑั‰ะตะฝะธะต RP-ะบะพะผะฐะฝะดะพะน (ะฃะ›ะฃะงะจะ•ะะž)"""
clean = normalize_command(low)
for phrase, category in RP_COMMANDS.items():
# ะขะพั‡ะฝะพะต ัะพะฒะฟะฐะดะตะฝะธะต
if clean == phrase:
return True, category
# ะกะพะฒะฟะฐะดะตะฝะธะต ั ัƒะฟะพะผะธะฝะฐะฝะธะตะผ: "ะฟะพั†ะตะปัƒะน @id123" โ†’ "ะฟะพั†ะตะปัƒะน"
if clean.startswith(phrase + ' '):
return True, category
return False, None
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿ“ฌ ะกะ•ะšะฆะ˜ะฏ 15: ะะ’ะขะž-ะŸะžะกะขะซ ะ˜ะ— ะกะžะžะ‘ะฉะ•ะกะขะ’ะ ะ’ะš
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# โ”€โ”€โ”€ ๐Ÿ“ฌ ะะ’ะขะž-ะŸะžะกะขะซ ะ˜ะ— ะกะžะžะ‘ะฉะ•ะกะขะ’ะ ะ’ะš โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def auto_post_loop():
"""ะคะพะฝะพะฒะฐั ะทะฐะดะฐั‡ะฐ: ะบะฐะถะดั‹ะต ~60 ะผะธะฝัƒั‚ ะพั‚ะฟั€ะฐะฒะปัะตั‚ ะฟะพัั‚ั‹ ะธะท ัะพะพะฑั‰ะตัั‚ะฒะฐ"""
while True:
# ะ–ะดั‘ะผ 60-65 ะผะธะฝัƒั‚ (ัะปัƒั‡ะฐะนะฝั‹ะน ะธะฝั‚ะตั€ะฒะฐะป)
time.sleep(3600 + random.randint(0, 300))
for peer_id, enabled in list(auto_post_enabled.items()):
if enabled:
try:
# ะŸะพะปัƒั‡ะฐะตะผ ะฟะพัั‚ั‹ ั ะผะตะดะธะฐ ะธะท ัะพะพะฑั‰ะตัั‚ะฒะฐ
resp = vk.wall.get(
owner_id=AUTO_POST_GROUP_ID,
count=30,
filter="media"
)
if not resp.get('items'):
continue
# ะ’ั‹ะฑะธั€ะฐะตะผ ัะปัƒั‡ะฐะนะฝั‹ะน ะฟะพัั‚
post = random.choice(resp['items'])
atts = []
# ะกะพะฑะธั€ะฐะตะผ ะฒะปะพะถะตะฝะธั (ั„ะพั‚ะพ/ะฒะธะดะตะพ)
for a in post.get('attachments', []):
if a['type'] == 'photo':
p = a['photo']
atts.append(f"photo{p['owner_id']}_{p['id']}")
elif a['type'] == 'video':
v = a['video']
atts.append(f"video{v['owner_id']}_{v['id']}")
# ะžั‚ะฟั€ะฐะฒะปัะตะผ ะฟะพัั‚, ะตัะปะธ ะตัั‚ัŒ ะฒะปะพะถะตะฝะธั
if atts:
send_msg(
peer_id,
"๐ŸŒธ ะะฒั‚ะพ-ะฟะพัั‚ ะธะท ะฝะฐัˆะตะณะพ ัƒัŽั‚ะฝะพะณะพ ัะพะพะฑั‰ะตัั‚ะฒะฐ ๐Ÿ’•\nะ›ะพะฒะธ ะบั€ะฐัะพั‚ัƒ!",
attach=','.join(atts[:3]) # ะœะฐะบัะธะผัƒะผ 3 ะฒะปะพะถะตะฝะธั
)
print(f"[AUTO-POST] โœ… ะžั‚ะฟั€ะฐะฒะปะตะฝ ะฟะพัั‚ ะฒ peer_id={peer_id}")
except Exception as e:
print(f"[AUTO-POST] โŒ ะžัˆะธะฑะบะฐ: {e}")
continue
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐ŸŒ ะกะ•ะšะฆะ˜ะฏ 16: WEBHOOK โ€” ะžะ‘ะ ะะ‘ะžะขะšะ ะ’ะฅะžะ”ะฏะฉะ˜ะฅ ะกะžะžะ‘ะฉะ•ะะ˜ะ™ ะ’ะš
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
@app.post("/webhook")
async def vk_webhook(request: Request):
"""ะžัะฝะพะฒะฝะพะน ะพะฑั€ะฐะฑะพั‚ั‡ะธะบ ะฒะตะฑั…ัƒะบะฐ ะ’ะšะพะฝั‚ะฐะบั‚ะต"""
global AI_MODE_ENABLED
try:
body = await request.json()
except:
return PlainTextResponse("Bad JSON", status_code=400)
# ะŸั€ะพะฒะตั€ะบะฐ ัะตะบั€ะตั‚ะฐ
if "secret" in body and body.get("secret") != VK_SECRET:
return PlainTextResponse("Invalid secret", status_code=403)
event_type = body.get("type")
# ะŸะพะดั‚ะฒะตั€ะถะดะตะฝะธะต ะฒะตะฑั…ัƒะบะฐ
if event_type == "confirmation":
return PlainTextResponse(VK_CONFIRM.strip() if VK_CONFIRM else "ok")
# ะžะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตะผ ั‚ะพะปัŒะบะพ ะฝะพะฒั‹ะต ัะพะพะฑั‰ะตะฝะธั
if event_type != "message_new":
return PlainTextResponse("ok")
msg = body["object"]["message"]
peer_id = msg["peer_id"]
text = msg.get("text", "").strip()
msg_id = msg.get("id", 0)
from_id = msg.get("from_id", 0)
low = text.lower().strip()
reply_to_user = get_reply_user_id(msg)
is_chat = peer_id > 2000000000
is_personal = peer_id == from_id
print(f"[WEBHOOK] peer_id={peer_id}, from_id={from_id}, msg_id={msg_id}, text: {text[:50]}...")
# ๐Ÿ›ก๏ธ ะŸะ ะžะ’ะ•ะ ะšะ ะะ ะŸะžะ’ะขะžะ ะะฃะฎ ะžะ‘ะ ะะ‘ะžะขะšะฃ (ะฃะ›ะฃะงะจะ•ะะะะฏ)
if is_message_processed(peer_id, from_id, text, msg_id):
print(f"[DEDUP] โญ๏ธ ะŸั€ะพะฟัƒั‰ะตะฝะพ ะดัƒะฑะปะธั€ัƒัŽั‰ะตะตัั ัะพะพะฑั‰ะตะฝะธะต msg_id={msg_id}")
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐Ÿ”ฅ ะœะžะ”ะ•ะ ะะฆะ˜ะฏ (ั‚ะพะปัŒะบะพ ะฒ ั‡ะฐั‚ะฐั…) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if is_chat:
if moderate_message(text, peer_id, msg_id, from_id, vk):
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐Ÿ“‹ ะกะŸะ˜ะกะžะš RP-ะšะžะœะะะ” โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
rp_list_triggers = ["ัะฟะธัะพะบ ั€ะฟ", "ัะฟะธัะพะบ rp", "ะบะพะผะฐะฝะดั‹", "ะฟะพะผะพั‰ัŒ", "!help"]
if any(t in low for t in rp_list_triggers):
send_msg(peer_id, RP_LIST_TEXT, msg_id)
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐Ÿค– ะฃะŸะ ะะ’ะ›ะ•ะะ˜ะ• ะฃะœะะซะœ ะ ะ•ะ–ะ˜ะœะžะœ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if low in ["!ai on", "!ะธะธ ะฒะบะป", "!ai ะฒะบะป"]:
AI_MODE_ENABLED = True
send_msg(peer_id, "๐Ÿค– ะฃะผะฝั‹ะน ั€ะตะถะธะผ ะฒะบะปัŽั‡ั‘ะฝ! ๐Ÿ’•", msg_id)
return PlainTextResponse("ok")
if low in ["!ai off", "!ะธะธ ะฒั‹ะบะป", "!ai ะฒั‹ะบะป"]:
AI_MODE_ENABLED = False
send_msg(peer_id, "๐Ÿค– ะฃะผะฝั‹ะน ั€ะตะถะธะผ ะฒั‹ะบะปัŽั‡ะตะฝ ๐Ÿ’•", msg_id)
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐Ÿ’• RP-ะšะžะœะะะ”ะซ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
is_rp, rp_category = check_rp_trigger(low)
if is_rp:
allow_self = is_personal and not is_chat
handle_rp(peer_id, msg_id, text, from_id, rp_category, reply_to_user, allow_self_target=allow_self)
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐Ÿ˜‚ ะกะŸะ•ะฆะ˜ะะ›ะฌะะซะ• ะšะžะœะะะ”ะซ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if low in special_commands:
send_msg(peer_id, random.choice(special_commands[low]), msg_id)
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐ŸŽฌ ะ’ะ˜ะ”ะ•ะž ะŸะž ะšะ›ะฎะงะ•ะ’ะซะœ ะกะ›ะžะ’ะะœ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if low in video_attachments or low.startswith("ะฒะธะดะตะพ "):
key = low.replace("ะฒะธะดะตะพ ", "").strip()
attach = video_attachments.get(key)
if attach:
send_msg(peer_id, "ะ›ะพะฒะธ ะฒะธะดะตะพ, ะผะธะปั‹ะน! ๐Ÿ’•", msg_id, attach=attach)
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐ŸŒค๏ธ ะŸะžะ“ะžะ”ะ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if low.startswith("ะฟะพะณะพะดะฐ "):
city = text.replace("ะฟะพะณะพะดะฐ ", "").strip()
send_msg(peer_id, get_weather(city), msg_id)
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐Ÿ”ฎ ะ“ะžะ ะžะกะšะžะŸ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if low.startswith("ะณะพั€ะพัะบะพะฟ "):
sign = text.replace("ะณะพั€ะพัะบะพะฟ ", "").strip().split()[0]
send_msg(peer_id, get_horoscope(sign), msg_id)
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐Ÿ˜„ ะะะ•ะšะ”ะžะข โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if low == "!ะฐะฝะตะบะดะพั‚":
send_msg(peer_id, random.choice(anekdots), msg_id)
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐Ÿ’ญ ะฆะ˜ะขะะขะ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if low == "!ั†ะธั‚ะฐั‚ะฐ":
send_msg(peer_id, random.choice(quotes), msg_id)
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐ŸŽจ ะ“ะ•ะะ•ะ ะะฆะ˜ะฏ ะšะะ ะขะ˜ะะžะš โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if low.startswith(DRAW_COMMAND):
Thread(target=handle_draw, args=(peer_id, msg_id, text)).start()
return PlainTextResponse("ok")
# โ”€โ”€โ”€ ๐Ÿง  ะฃะœะะซะ™ ะžะขะ’ะ•ะข ะžะข ะ˜ะ˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
mentioned = any(n in low for n in BOT_NAMES) or (BOT_ID and f"[club{BOT_ID}|" in text)
if AI_MODE_ENABLED and mentioned:
clean = re.sub(r'\[club.*?\]', '', text)
for n in BOT_NAMES:
clean = re.sub(rf'\b{n}\b', '', clean, flags=re.I)
clean = clean.strip(",.!? ").strip()
if not clean:
send_msg(peer_id, "ะฏ ั‚ัƒั‚! ะงะตะผ ะฟะพะผะพั‡ัŒ? ๐Ÿ’•", msg_id)
return PlainTextResponse("ok")
if peer_id not in chat_memory:
chat_memory[peer_id] = deque(maxlen=12)
chat_memory[peer_id].append({"role": "user", "content": clean})
answer = ask_smart_ai(list(chat_memory[peer_id]), peer_id, msg_id)
chat_memory[peer_id].append({"role": "assistant", "content": answer})
send_msg(peer_id, answer, msg_id)
return PlainTextResponse("ok")
return PlainTextResponse("ok")
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๐Ÿš€ ะกะ•ะšะฆะ˜ะฏ 17: ะ—ะะŸะฃะกะš ะŸะ ะ˜ะ›ะžะ–ะ•ะะ˜ะฏ
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if __name__ == "__main__":
Thread(target=auto_post_loop, daemon=True).start()
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=7860)