diff --git a/games/uwu.py b/games/uwu.py
new file mode 100644
index 0000000..634e4f1
--- /dev/null
+++ b/games/uwu.py
@@ -0,0 +1,87 @@
+import aiohttp
+from aiogram import types
+import config
+import logging
+import random
+
+logger = logging.getLogger(__name__)
+
+CAPTIONS = [
+ "Ня :3",
+ "uwu"
+]
+
+async def handle_uwu_cmd(message: types.Message):
+ args = message.text.split(maxsplit=1)
+
+ if len(args) > 1 and args[1].strip() == "-h":
+ help_msg = (
+ "🐈 Справка по тегам e621:\n\n"
+ "Перечислите любые теги через пробел после команды.\n"
+ "• rating: rating:safe (безопасные), rating:questionable, rating:explicit (NSFW)\n"
+ "• score: score:>500 (искать популярные посты с рейтингом больше 500)\n"
+ "• Исключить тег: поставьте минус, например -fox\n\n"
+ "Пример: /uwu wolf -rating:explicit score:>100\n"
+ "По умолчанию: rating:safe score:>500 -animated"
+ )
+ await message.reply(help_msg, parse_mode="HTML")
+ return
+
+ tags = "rating:safe score:>500 -animated"
+ if len(args) > 1:
+ tags = args[1].strip()
+
+ tags += " order:random"
+
+ url = "https://e621.net/posts.json"
+ params = {
+ "tags": tags,
+ "limit": 1
+ }
+
+ auth = None
+ if config.E621_LOGIN and config.E621_API_KEY:
+ auth = aiohttp.BasicAuth(config.E621_LOGIN, config.E621_API_KEY)
+
+ headers = {
+ "User-Agent": f"Sex Bomba TG Bot/1.0 (by {config.E621_LOGIN or 'unknown'} on e621)"
+ }
+
+ try:
+ async with aiohttp.ClientSession() as session:
+ async with session.get(url, params=params, headers=headers, auth=auth) as resp:
+ if resp.status != 200:
+ logger.error(f"e621 API Error: {resp.status}")
+ await message.reply("Не удалось получить картинку от сервера :(")
+ return
+ data = await resp.json()
+
+ posts = data.get("posts", [])
+ if not posts:
+ await message.reply("Ничего не найдено по этим тегам :(")
+ return
+
+ post = posts[0]
+ file_url = post.get("file", {}).get("url")
+ ext = post.get("file", {}).get("ext", "png")
+ if not file_url:
+ await message.reply("У найденного поста нет прямого URL изображения :(")
+ return
+
+ caption = random.choice(CAPTIONS)
+ if ext in ("gif", "webm", "mp4"):
+ # Для анимаций: отправляем caption отдельным сообщением,
+ # а саму гифку/видео через URL напрямую — так Telegram
+ # корректно показывает её как анимацию, а не как файл
+ await message.answer(caption)
+ await message.answer_animation(animation=file_url)
+ elif ext in ("png", "jpg", "jpeg", "webp"):
+ input_file = types.URLInputFile(file_url)
+ await message.answer_photo(photo=input_file, caption=caption)
+ else:
+ input_file = types.URLInputFile(file_url)
+ await message.answer_document(document=input_file, caption=caption)
+
+ except Exception as e:
+ logger.exception("Error in uwu command")
+ await message.reply("Произошла ошибка при обращении к API :(")