Terry Zhuo
update
ad443d7
raw
history blame
3.67 kB
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()