|
"""
|
|
CanRun Game Compatibility Checker - Simple MCP Server Implementation
|
|
"""
|
|
|
|
import gradio as gr
|
|
import logging
|
|
import os
|
|
import signal
|
|
import sys
|
|
import time
|
|
import asyncio
|
|
import base64
|
|
from src.canrun_engine import CanRunEngine
|
|
from plugin import CanRunGAssistPlugin
|
|
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format="%(asctime)s - %(levelname)s - %(message)s",
|
|
handlers=[logging.StreamHandler(sys.stdout)]
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def signal_handler(signum, frame):
|
|
"""Handle shutdown signals gracefully."""
|
|
logger.info(f"Received signal {signum}, shutting down gracefully...")
|
|
sys.exit(0)
|
|
|
|
async def analyze_game(game_name):
|
|
"""Analyze game compatibility using the CanRun engine"""
|
|
if not game_name:
|
|
return "Please enter a game name to begin the analysis."
|
|
|
|
try:
|
|
plugin = CanRunGAssistPlugin()
|
|
params = {"game_name": game_name, "force_refresh": True}
|
|
|
|
response = await plugin.check_game_compatibility(params)
|
|
|
|
if response.get("success", False):
|
|
return response.get("message", "Analysis completed successfully.")
|
|
else:
|
|
return response.get("message", "Could not analyze the game. Please check the game name and try again.")
|
|
except Exception as e:
|
|
logger.error(f"Error analyzing game: {e}")
|
|
return f"An error occurred during analysis: {e}"
|
|
|
|
def detect_hardware():
|
|
"""Detect hardware specifications"""
|
|
try:
|
|
plugin = CanRunGAssistPlugin()
|
|
response = plugin.detect_hardware({})
|
|
|
|
if response.get("success", False):
|
|
return response.get("message", "Hardware detection successful.")
|
|
else:
|
|
return response.get("message", "Could not detect hardware specifications.")
|
|
except Exception as e:
|
|
logger.error(f"Error detecting hardware: {e}")
|
|
return f"An error occurred during hardware detection: {e}"
|
|
|
|
def get_logo_html():
|
|
"""Get HTML that displays the logo"""
|
|
logo_path = os.path.join(os.path.dirname(__file__), "logo.png")
|
|
|
|
if os.path.exists(logo_path):
|
|
|
|
with open(logo_path, "rb") as image_file:
|
|
encoded_image = base64.b64encode(image_file.read()).decode("utf-8")
|
|
|
|
|
|
return f"""
|
|
<div style="display: flex; align-items: center; margin-bottom: 0.5em">
|
|
<img src="data:image/png;base64,{encoded_image}" alt="CanRun Logo" style="height: 4em; margin-right: 1em;">
|
|
<div>
|
|
<h1 style="margin: 0; padding: 0">CanRun Game Compatibility Checker</h1>
|
|
<p style="margin: 0; padding: 0">Check if your PC can run any game with an advanced tier system and Steam API integration</p>
|
|
</div>
|
|
</div>
|
|
"""
|
|
else:
|
|
logger.warning(f"Logo file not found at {logo_path}")
|
|
return """
|
|
<div>
|
|
<h1>CanRun Game Compatibility Checker</h1>
|
|
<p>Check if your PC can run any game with an advanced tier system and Steam API integration</p>
|
|
</div>
|
|
"""
|
|
|
|
def create_gradio_interface():
|
|
"""Create a simple Gradio interface with logo and favicon"""
|
|
|
|
theme = gr.themes.Default(
|
|
primary_hue="green",
|
|
secondary_hue="gray",
|
|
)
|
|
|
|
|
|
favicon_path = os.path.join(os.path.dirname(__file__), "logo.png")
|
|
|
|
with gr.Blocks(theme=theme, title="CanRun - Game Compatibility Checker", css="") as demo:
|
|
|
|
gr.HTML(get_logo_html())
|
|
|
|
|
|
with gr.Row():
|
|
with gr.Column():
|
|
game_input = gr.Textbox(label="Game Name", placeholder="Enter game name (e.g., Diablo 4)")
|
|
check_btn = gr.Button("Check Compatibility", variant="primary")
|
|
hw_btn = gr.Button("Detect Hardware", variant="secondary")
|
|
|
|
with gr.Column():
|
|
result_output = gr.Textbox(label="Results", lines=20)
|
|
|
|
|
|
gr.HTML("""
|
|
<div style="margin-top: 20px; text-align: center; padding: 10px; border-top: 1px solid #ddd;">
|
|
<p>CanRun - Advanced Game Compatibility Checker with MCP Server Support</p>
|
|
<p>Powered by G-Assist Integration</p>
|
|
</div>
|
|
""")
|
|
|
|
|
|
check_btn.click(fn=analyze_game, inputs=game_input, outputs=result_output)
|
|
hw_btn.click(fn=detect_hardware, inputs=None, outputs=result_output)
|
|
|
|
return demo
|
|
|
|
def is_mcp_available():
|
|
"""Check if the MCP package is available"""
|
|
try:
|
|
import mcp
|
|
return True
|
|
except ImportError:
|
|
return False
|
|
|
|
def main():
|
|
"""Main application entry point"""
|
|
|
|
signal.signal(signal.SIGINT, signal_handler)
|
|
signal.signal(signal.SIGTERM, signal_handler)
|
|
|
|
logger.info("Starting CanRun Game Compatibility Checker")
|
|
|
|
|
|
demo = create_gradio_interface()
|
|
|
|
|
|
mcp_enabled = is_mcp_available()
|
|
if mcp_enabled:
|
|
logger.info("MCP server functionality is enabled")
|
|
else:
|
|
logger.info("MCP server functionality is disabled. Install with 'pip install \"gradio[mcp]\"' to enable")
|
|
|
|
|
|
launch_kwargs = {
|
|
"server_name": "0.0.0.0",
|
|
"share": False,
|
|
"favicon_path": os.path.join(os.path.dirname(__file__), "logo.png"),
|
|
}
|
|
|
|
|
|
if mcp_enabled:
|
|
launch_kwargs["mcp_server"] = True
|
|
|
|
|
|
demo.queue().launch(**launch_kwargs)
|
|
|
|
|
|
logger.info("Press Ctrl+C to stop the server")
|
|
if hasattr(signal, 'pause'):
|
|
|
|
signal.pause()
|
|
else:
|
|
|
|
while True:
|
|
time.sleep(1)
|
|
|
|
if __name__ == "__main__":
|
|
main() |