import gradio as gr from tools.general import ( letter_counter, prime_factors, roll_dice, coin_flip, ) from tools.obr import ( create_shape, create_token, game_state, move_item, delete_item, fill_fog, clear_fog, add_token_light, animate_token_viewport, insert_map, clean_map ) from tools.test import test_function from dotenv import load_dotenv import os import re load_dotenv() with open("README.md", "r", encoding="utf-8") as f: readme = f.read() if readme.startswith("---"): parts = readme.split("---", 2) if len(parts) >= 3: readme = parts[2] html_blocks = re.findall(r'```html\n(.*?)\n```', readme, re.DOTALL) for i, html_block in enumerate(html_blocks): readme = readme.replace(f"```html\n{html_block}\n```", f"{{HTML_BLOCK_{i}}}") with gr.Blocks() as intro_demo: parts = re.split(r'({HTML_BLOCK_\d+})', readme) for part in parts: if part.startswith("{HTML_BLOCK_"): block_idx = int(part.replace("{HTML_BLOCK_", "").replace("}", "")) gr.HTML(html_blocks[block_idx]) else: if part.strip(): gr.Markdown(part) # === GRADIO INTERFACE === demo = gr.TabbedInterface( [ intro_demo, gr.Interface( test_function, [ gr.Textbox(label="Tab ID"), ], gr.JSON(label="Test Results"), title="OBR Test Window", description="This window demonstrates all available OwlBear Rodeo functionalities.", api_name=False ), gr.Interface(letter_counter, [gr.Textbox(), gr.Textbox()], gr.Textbox(), api_name="letter_counter"), gr.Interface(prime_factors, gr.Number(), gr.JSON(), api_name="prime_factors"), gr.Interface(roll_dice, [gr.Number(label="Faces"), gr.Number(label="Rolls")], gr.JSON(), api_name="roll_dice"), gr.Interface(coin_flip, gr.Number(label="Flips"), gr.JSON(), api_name="coin_flip"), gr.Interface( create_shape, [ gr.Number(label="width"), gr.Number(label="height"), gr.Number(label="X"), gr.Number(label="Y"), gr.Textbox(label="Shape Type"), gr.Textbox(label="Color (hex, e.g., #ff0000)"), gr.Textbox(label="Stroke Color (hex, e.g., #ff0000)"), gr.Textbox(label="Tab ID"), ], gr.JSON(), api_name="create_shape" ), gr.Interface( create_token, [ gr.Textbox(label="Name"), gr.Textbox(label="Type"), gr.Number(label="X"), gr.Number(label="Y"), gr.Number(label="Size"), gr.Textbox(label="Tab ID") ], gr.JSON(), api_name="create_token" ), gr.Interface( game_state, gr.Textbox(label="Tab ID"), gr.JSON(), api_name=False # Removed because it is forced ), gr.Interface( move_item, [ gr.Textbox(label="Tab ID"), gr.Textbox(label="Item ID"), gr.Number(label="X"), gr.Number(label="Y") ], gr.JSON(), api_name="move_item" ), gr.Interface( delete_item, [ gr.Textbox(label="Tab ID"), gr.Textbox(label="Item ID") ], gr.JSON(), api_name="delete_item" ), gr.Interface( fill_fog, [ gr.Textbox(label="Tab ID"), ], gr.JSON(), api_name="fill_fog" ), gr.Interface( clear_fog, [ gr.Textbox(label="Tab ID"), ], gr.JSON(), api_name="clear_fog" ), gr.Interface( add_token_light, [ gr.Textbox(label="Tab ID"), gr.Textbox(label="Token ID"), gr.Number(label="Radius") ], gr.JSON(), api_name="add_token_light" ), gr.Interface( animate_token_viewport, [ gr.Textbox(label="Tab ID"), gr.Textbox(label="Token ID") ], gr.JSON(), api_name="animate_token_viewport" ), gr.Interface( insert_map, [ gr.Textbox(label="Tab ID"), gr.Textbox(label="Map Name") ], gr.JSON(), api_name="insert_map" ), gr.Interface( clean_map, [ gr.Textbox(label="Tab ID") ], gr.JSON(), api_name="clean_map" ) ], [ "๐Ÿง™โ€โ™‚๏ธ Introduction", "๐Ÿงช Tests", "Letter Counter", "Prime Factors", "Roll Dice", "Coin Flip", "Create Shape", "Create Token", "Game State", "Move Item", "Delete Item", "Fill Fog", "Clear Fog", "Add Token Light", "Animate Token Viewport", "Insert Map", "Clean Map" ] ) demo.launch(mcp_server=True,server_port=int(os.getenv("GRADIO_PORT", 7860)),ssl_verify=False)