Spaces:
Running
Running
| # ============================================================================= | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| # ๐ค 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 โ ะะะ ะะะะขะะ ะะฅะะะฏะฉะะฅ ะกะะะะฉะะะะ ะะ | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| 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) |