File size: 8,289 Bytes
d89cb7d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
import json
from datetime import datetime

import pandas as pd
import pytz
import streamlit as st

# File paths
predictions_csv = 'predictions.csv'
users_json = 'users.json'
matches_json = 'matches.json'
outcomes_json = 'match_outcomes.json'


# 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)


# Load users from JSON
def get_users():
    try:
        with open(users_json, 'r') as file:
            users = json.load(file)
        return list(users.keys())
    except FileNotFoundError:
        return []


# Load matches from JSON
def load_matches():
    try:
        with open(matches_json, 'r') as f:
            return json.load(f)
    except FileNotFoundError:
        return []


def load_match_outcomes():
    try:
        with open(outcomes_json, 'r') as file:
            return json.load(file)
    except FileNotFoundError:
        return []


# 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_matches()
    today_matches = [match for match in matches if match['date'] == today]
    return today_matches


# Submit prediction function
def submit_prediction(user_name, match_id, predicted_winner, predicted_motm, bid_points):
    # Ensure predictions DataFrame is loaded or initialized correctly
    try:
        predictions = pd.read_csv(predictions_csv)
        # Check if all expected columns are present, if not, reinitialize the DataFrame
        expected_columns = ['user_name', 'match_id', 'predicted_winner', 'predicted_motm', 'bid_points']
        if not all(column in predictions.columns for column in expected_columns):
            raise ValueError("CSV file missing one or more columns; Reinitializing.")
    except (FileNotFoundError, ValueError) as e:
        predictions = pd.DataFrame(columns=expected_columns)

    # Check for duplicate prediction for the same match by the same user
    if user_name == "Select a user...":
        st.warning("Please select a valid user.")
        return
    else:
        existing_predictions = predictions[(predictions['user_name'] == user_name) & (predictions['match_id'] == match_id)]
        if not existing_predictions.empty:
            st.error("You've already submitted a prediction for this match.")
            return

    # Append new prediction
    new_prediction = {
        'user_name': user_name,
        'match_id': match_id,
        'predicted_winner': predicted_winner,
        'predicted_motm': predicted_motm,
        'bid_points': bid_points
    }

    predictions = pd.concat([predictions, pd.DataFrame([new_prediction])], ignore_index=True)
    predictions.to_csv(predictions_csv, index=False)
    st.success("Prediction submitted successfully!")


# Streamlit UI
st.title("DIS IPL Match Predictions")

# Prediction form
with st.expander("Submit Prediction"):

    # User selection
    user_name = st.selectbox("Select User", ["Select a user..."] + get_users())

    # Match selection
    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']
    else:
        st.write("No matches are scheduled for today.")
        st.stop()

    # Predictions
    predicted_winner = st.selectbox("Predicted Winner", teams)
    predicted_motm = st.text_input("Predicted Man of the Match")
    bid_points = st.number_input("Bid Points", min_value=1, value=100)

    # Submit button
    if st.button("Submit Prediction"):
        submit_prediction(user_name, match_id, predicted_winner, predicted_motm, bid_points)


# Show predictions
with st.expander("Predictions"):

    # Display predictions
    if st.button("Show Predictions"):
        try:
            df = pd.read_csv(predictions_csv)
            st.dataframe(df)
        except FileNotFoundError:
            st.write("No predictions have been submitted yet.")


# Show leaderboard
with st.expander("Leaderboard"):

    # Display leaderboard
    if st.button("Show Leaderboard"):
        try:
            with open(users_json, 'r') as f:
                users = json.load(f)
            leaderboard = sorted(users.items(), key=lambda x: x[1], reverse=True)
            df_leaderboard = pd.DataFrame(leaderboard, columns=['User', 'Points'])

            # Add a 'Rank' column starting from 1
            df_leaderboard['Rank'] = range(1, len(df_leaderboard) + 1)

            # Reorder DataFrame columns so 'Rank' is first
            df_leaderboard = df_leaderboard[['Rank', 'User', 'Points']]

            st.dataframe(df_leaderboard)
        except FileNotFoundError:
            st.write("Leaderboard data not available.")




ADMIN_PASSPHRASE = "admin123"


def load_predictions():
    # loading predictions from 'predictions.csv'
    try:
        return pd.read_csv(predictions_csv)
    except FileNotFoundError:
        return pd.DataFrame(columns=['user_name', 'match_id', 'predicted_winner', 'predicted_motm', 'bid_points'])


def load_users():
    with open(users_json, 'r') as file:
        return json.load(file)


def save_users(users):
    with open(users_json, 'w') as file:
        json.dump(users, file, indent=4)


def save_match_outcomes(outcomes):
    with open(outcomes_json, 'w') as file:
        json.dump(outcomes, file, indent=4)


def update_leaderboard_and_outcomes(match_id, winning_team, man_of_the_match):
        outcomes = load_match_outcomes()  # Load existing match outcomes
        predictions = load_predictions()  # Load existing predictions
        users = load_users()  # Load existing user points

        # Update match outcomes
        match_outcome = next((outcome for outcome in outcomes if outcome['match_id'] == match_id), None)
        if match_outcome:
            match_outcome['winning_team'] = winning_team
            match_outcome['man_of_the_match'] = man_of_the_match
        else:
            outcomes.append({
                "match_id": match_id,
                "winning_team": winning_team,
                "man_of_the_match": man_of_the_match
            })

        # Update user points based on prediction accuracy
        match_predictions = predictions[predictions['match_id'] == match_id]
        for _, prediction in match_predictions.iterrows():
            user_name = prediction['user_name']
            # Initialize user points if not present
            users[user_name] = users.get(user_name, 1000)

            if prediction['predicted_winner'] == winning_team:
                users[user_name] += prediction['bid_points'] * 2  # Correct team prediction
            else:
                users[user_name] -= prediction['bid_points']  # Deduct points for incorrect prediction

            if prediction['predicted_motm'] == man_of_the_match:
                users[user_name] += 100  # Correct man of the match prediction

        # Save updated outcomes and user points
        save_match_outcomes(outcomes)
        save_users(users)


with st.sidebar.expander("Admin Panel", expanded=False):
    admin_pass = st.text_input("Enter admin passphrase:", type="password")

    if admin_pass == ADMIN_PASSPHRASE:
        st.success("Authenticated")
        matches = get_today_matches()  # this function gets matches for today

        match_id_selection = st.selectbox("Select Match ID", [match['match_id'] for match in matches])
        winning_team = st.text_input("Winning Team")
        man_of_the_match = st.text_input("Man of the Match")

        if st.button("Submit Match Outcome"):
            update_leaderboard_and_outcomes(match_id_selection, winning_team, man_of_the_match)
            st.success("Match outcome submitted and leaderboard updated!")
    else:
        st.error("Not authenticated")