import base64 import io import json import os import uuid from datetime import datetime from pathlib import Path import pandas as pd import pytz from datasets import load_dataset import streamlit as st from huggingface_hub import CommitScheduler, HfApi # File paths as constants PREDICTIONS_CSV = 'dis_predictions.csv' USERS_JSON = 'leaders/users.json' MATCHES_JSON = 'matches.json' OUTCOMES_JSON = 'match_outcomes.json' PLAYERS_JSON = 'players.json' image_path = 'ipl_image.png' PREDICTIONS_FOLDER = Path("predictions") PREDICTIONS_FOLDER.mkdir(parents=True, exist_ok=True) users_file = Path("leaders") / f"users.json" USERS_FOLDER = users_file.parent USERS_FOLDER.mkdir(parents=True, exist_ok=True) # Initialize CommitScheduler scheduler = CommitScheduler( repo_id="DIS_IPL_Dataset", repo_type="dataset", folder_path=PREDICTIONS_FOLDER, # Local folder where predictions are saved temporarily path_in_repo="predictions", # Path in dataset repo where predictions will be saved every=10, # Push every 240 minutes (4 hours) ) # Initialize CommitScheduler scheduler = CommitScheduler( repo_id="DIS_IPL_Dataset", repo_type="dataset", folder_path=USERS_FOLDER, # Local folder where users are saved temporarily path_in_repo="leaders", # Path in dataset repo where predictions will be saved every=5, # Push every 240 minutes (4 hours) ) # Initialize CSV and JSON files if they don't exist def initialize_files(): # Initialize predictions CSV try: pd.read_csv(PREDICTIONS_CSV) except FileNotFoundError: df = pd.DataFrame(columns=['user_name', 'match_id', 'predicted_winner', 'predicted_motm', 'bid_points']) df.to_csv(PREDICTIONS_CSV, index=False) def load_data(file_path): """ Load data from a JSON or CSV file. Args: file_path (str): The path to the file to load. Returns: pd.DataFrame or dict: The loaded data. """ try: if file_path.endswith('.json'): with open(file_path, 'r') as file: return json.load(file) elif file_path.endswith('.csv'): return pd.read_csv(file_path) except FileNotFoundError: if file_path.endswith('.json'): return {} elif file_path.endswith('.csv'): return pd.DataFrame() def get_base64_of_image(path): with open(path, "rb") as image_file: return base64.b64encode(image_file.read()).decode() # Get today's date in IST to load today's match def get_current_date_ist(): tz_IST = pytz.timezone('Asia/Kolkata') datetime_ist = datetime.now(tz_IST) return datetime_ist.strftime('%Y-%m-%d') # Function to get matches for today def get_today_matches(): today = get_current_date_ist() matches = load_data(MATCHES_JSON) today_matches = [match for match in matches if match['date'] == today] return today_matches # Function to check if prediction submission is allowed def is_submission_allowed(match_id): matches = load_data(MATCHES_JSON) # This loads matches correctly with IST times for match in matches: if match["match_id"] == match_id: # Parse the match start time in IST tz_IST = pytz.timezone('Asia/Kolkata') match_datetime_str = f'{match["date"]} {match["time"]}' # The match time string is like "2024-03-21 7:30 PM" match_datetime = datetime.strptime(match_datetime_str, "%Y-%m-%d %I:%M %p") match_datetime = tz_IST.localize(match_datetime) # Set the timezone to IST # Get the current time in IST current_datetime = datetime.now(tz_IST) if current_datetime > match_datetime: return False else: return True return False # If match_id not found, default to False def load_predictions(PREDICTIONS_CSV): try: return pd.read_csv(PREDICTIONS_CSV) except FileNotFoundError: return pd.DataFrame() # Submit prediction function def submit_prediction( user_name, match_id, predicted_winner, predicted_motm, bid_points, max_bid_points ): # Validation for user selection if user_name == "Select a user...": st.warning("Please select a valid user.") return # Check if prediction submission is allowed for the match if not is_submission_allowed(match_id): st.error("Prediction submission time has passed. Predictions can't be submitted after match start.") return if bid_points > max_bid_points: st.error(f"Your bid points exceed the 20% limit of your total points. Maximum allowed bid points: {max_bid_points}") return prediction_id = uuid.uuid4().hex prediction_date = datetime.now().strftime('%Y-%m-%d') prediction_data = { 'prediction_id': prediction_id, 'user_name': user_name, 'match_id': match_id, 'predicted_winner': predicted_winner, 'predicted_motm': predicted_motm, 'bid_points': bid_points, 'prediction_date': prediction_date # Include the prediction date } # Construct the filename to include match_id for easier retrieval prediction_file_name = f"prediction_{match_id}_{prediction_id}.json" prediction_file = PREDICTIONS_FOLDER / prediction_file_name with scheduler.lock: with prediction_file.open("a") as file: file.write(json.dumps(prediction_data)) file.write("\n") st.success("Prediction submitted successfully!") def get_user_total_points(user_name): users = load_data(USERS_JSON) return users.get(user_name, 0) # Define the new function def calculate_max_bid_points(user_name): total_points = get_user_total_points(user_name) max_bid_points = int(total_points * 0.20) # 20% of total points return max_bid_points def load_users(USERS_JSON): try: with open(USERS_JSON, 'r') as file: return json.load(file) except FileNotFoundError: return {} def user_selection_and_prediction(): users = list(load_data(USERS_JSON)) user_name = st.selectbox("Select User", ["Select a user..."] + users) max_bid_points = None if user_name != "Select a user...": max_bid_points = calculate_max_bid_points(user_name) st.write(f"Maximum bid points you can submit: {max_bid_points}") matches = get_today_matches() if matches: match_choice = st.selectbox("Select Today's Match", matches, format_func=lambda match: f"{match['teams'][0]} vs {match['teams'][1]}") match_id = match_choice['match_id'] teams = match_choice['teams'] predicted_winner = st.selectbox("Predicted Winner", teams) player_list = load_data(PLAYERS_JSON) predicted_motm = "" if predicted_winner in player_list: players = player_list[predicted_winner] predicted_motm = st.selectbox("Predicted Man of the Match", players) bid_points = st.number_input("Bid Points", min_value=1, value=100, format="%d") if st.button("Submit Prediction"): submit_prediction(user_name, match_id, predicted_winner, predicted_motm, bid_points, max_bid_points) else: st.write("No matches are scheduled for today.") def display_predictions(): if st.button("Show Predictions"): all_predictions = [] # Check if the directory exists if not os.path.exists(PREDICTIONS_FOLDER): st.write("No predictions directory found.") return # List all JSON files in the directory for filename in os.listdir(PREDICTIONS_FOLDER): if filename.endswith('.json'): file_path = os.path.join(PREDICTIONS_FOLDER, filename) # Read each JSON file and append its contents to the list with open(file_path, 'r') as file: prediction = json.load(file) all_predictions.append(prediction) # Convert the list of dictionaries to a DataFrame predictions_df = pd.DataFrame(all_predictions) if not predictions_df.empty: predictions_df['prediction_date'] = predictions_df.apply(lambda x: datetime.strptime(x['prediction_date'], '%Y-%m-%d'), axis=1) # Filter for today's predictions today_str = datetime.now().strftime('%Y-%m-%d') todays_predictions = predictions_df[predictions_df['prediction_date'] == today_str] # Remove the 'prediction_id' column if it exists if 'prediction_id' in todays_predictions.columns: todays_predictions = todays_predictions.drop(columns=['prediction_id', 'prediction_date']) st.dataframe(todays_predictions, hide_index=True) else: st.write("No predictions for today's matches yet.") def display_leaderboard(): if st.button("Show Leaderboard"): try: users = load_users(USERS_JSON) leaderboard = sorted(users.items(), key=lambda x: x[1], reverse=True) # Generate a list of dictionaries, each representing a row in the leaderboard leaderboard_dicts = [{"Rank": rank+1, "User": user[0], "Points": user[1]} for rank, user in enumerate(leaderboard)] # Convert the list of dictionaries to a DataFrame df_leaderboard = pd.DataFrame(leaderboard_dicts) st.dataframe(df_leaderboard, hide_index=True) except FileNotFoundError: st.write("Leaderboard data not available.") # Streamlit UI encoded_image = get_base64_of_image(image_path) custom_css = f""" """ # Apply custom CSS st.markdown(custom_css, unsafe_allow_html=True) # Use the custom class in a div with your title st.markdown('