import os import asyncio from aiogram import Bot, Dispatcher, types from aiogram.filters import Command from vndb import VNDBClient TOKEN = os.getenv("TELEGRAM_TOKEN") bot = Bot(token=TOKEN) dp = Dispatcher() vndb = VNDBClient(os.getenv("VNDB_API_URL")) def safe_text(x): if not x: return "—" return str(x) @dp.message(Command("start")) async def start(msg: types.Message): await msg.answer( "VNDB Bot ready.\n" "Commands:\n" "/search \n" "/vn \n" "/char \n" "/release " ) @dp.message(Command("help")) async def help(msg: types.Message): await start(msg) @dp.message(Command("search")) async def search(msg: types.Message): query = msg.text.replace("/search", "").strip() if not query: return await msg.answer("Empty query") result = await vndb.search_vn(query) if not result: return await msg.answer("Not found") text = "\n\n".join( f"{i['id']} — {i.get('title') or i.get('name')}" for i in result ) await msg.answer(text[:4000]) @dp.message(Command("vn")) async def vn(msg: types.Message): vid = msg.text.replace("/vn", "").strip() if not vid: return await msg.answer("No ID") data = await vndb.get_vn(vid) if not data: return await msg.answer("Not found") await msg.answer( f"{safe_text(data.get('title'))}\n" f"Original: {safe_text(data.get('original'))}\n" f"Released: {safe_text(data.get('released'))}\n" f"Rating: {safe_text(data.get('rating'))}\n" f"Votes: {safe_text(data.get('votecount'))}" ) @dp.message(Command("char")) async def char(msg: types.Message): cid = msg.text.replace("/char", "").strip() if not cid: return await msg.answer("No ID") data = await vndb.get_char(cid) if not data: return await msg.answer("Not found") await msg.answer( f"{safe_text(data.get('name'))}\n" f"Original: {safe_text(data.get('original'))}" ) @dp.message(Command("release")) async def release(msg: types.Message): rid = msg.text.replace("/release", "").strip() if not rid: return await msg.answer("No ID") data = await vndb.get_release(rid) if not data: return await msg.answer("Not found") await msg.answer( f"{safe_text(data.get('title'))}\n" f"Released: {safe_text(data.get('released'))}" ) async def main(): await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main())