Spaces:
Runtime error
Runtime error
| import os | |
| import gradio as gr | |
| import pandas as pd | |
| from datetime import datetime | |
| import time | |
| from azure_count_ip_data import count_files_per_ip | |
| from log_reader import RemoteLogReader | |
| import threading | |
| # Define the path for storing the data | |
| DATA_DIR = os.path.join(os.path.dirname(__file__), 'data') | |
| STATS_FILE = os.path.join(DATA_DIR, 'battle_stats.csv') | |
| LAST_UPDATE_FILE = os.path.join(DATA_DIR, 'last_update.txt') | |
| # Ensure data directory exists | |
| os.makedirs(DATA_DIR, exist_ok=True) | |
| def save_stats(df, current_time): | |
| """Save statistics and last update time to files""" | |
| df.to_csv(STATS_FILE, index=False) | |
| with open(LAST_UPDATE_FILE, 'w') as f: | |
| f.write(current_time) | |
| def load_stats(): | |
| """Load statistics and last update time from files""" | |
| try: | |
| df = pd.read_csv(STATS_FILE) | |
| with open(LAST_UPDATE_FILE, 'r') as f: | |
| last_update = f.read().strip() | |
| return df, last_update | |
| except (FileNotFoundError, pd.errors.EmptyDataError): | |
| return pd.DataFrame(columns=['IP Address', 'Battle Count']), "" | |
| def update_stats(): | |
| """Get the latest battle statistics""" | |
| try: | |
| # Initialize RemoteLogReader | |
| reader = RemoteLogReader() | |
| # Get IP counts using Azure storage | |
| ip_counts = count_files_per_ip(reader) | |
| # Convert to DataFrame for better display | |
| df = pd.DataFrame(list(ip_counts.items()), columns=['IP Address', 'Battle Count']) | |
| df = df.sort_values('Battle Count', ascending=False) | |
| # Get current time | |
| current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") | |
| # Save the updated stats | |
| save_stats(df, current_time) | |
| return df, current_time | |
| except Exception as e: | |
| print(f"Error updating stats: {e}") | |
| return pd.DataFrame(columns=['IP Address', 'Battle Count']), "" | |
| def auto_update(state): | |
| """Background task to update stats every hour""" | |
| while state['running']: | |
| state['stats'], state['last_update'] = update_stats() | |
| time.sleep(3600) # Sleep for 1 hour | |
| def create_ui(): | |
| state = {'running': True} | |
| # Try to load existing stats first | |
| state['stats'], state['last_update'] = load_stats() | |
| # If no existing stats or they're empty, update them | |
| if state['stats'].empty: | |
| state['stats'], state['last_update'] = update_stats() | |
| # Start background update thread | |
| update_thread = threading.Thread(target=auto_update, args=(state,)) | |
| update_thread.daemon = True | |
| update_thread.start() | |
| def get_current_stats(): | |
| return state['stats'] | |
| def get_last_update(): | |
| return state['last_update'] | |
| def manual_refresh(): | |
| state['stats'], state['last_update'] = update_stats() | |
| return state['stats'], state['last_update'] | |
| with gr.Blocks(title="Battle Count Statistics") as app: | |
| gr.Markdown("# Battle Count Statistics") | |
| gr.Markdown("Displays the count of valid battles per IP address. Updates automatically every hour.") | |
| with gr.Row(): | |
| last_update = gr.Textbox( | |
| value=get_last_update, | |
| label="Last Updated", | |
| interactive=False | |
| ) | |
| with gr.Row(): | |
| output = gr.DataFrame( | |
| value=get_current_stats, | |
| interactive=False, | |
| wrap=True, | |
| ) | |
| # refresh_btn = gr.Button("Refresh Now") | |
| # refresh_btn.click(fn=manual_refresh, outputs=[output, last_update]) | |
| return app | |
| if __name__ == "__main__": | |
| app = create_ui() | |
| app.launch() |