Last commit not found
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=['Annotator', '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=['Annotator', '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=['Annotator', '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() |