Zachary Schillaci
Format and lint
dddb0dc
raw
history blame
4.61 kB
import os
import pandas as pd
import requests
import streamlit as st
from dotenv import load_dotenv
from modules.utils import set_sidebar
load_dotenv()
PAGE_TITLE = "The Leaderboard"
def main():
st.set_page_config(
page_title=PAGE_TITLE,
page_icon="assets/effixis_logo.ico",
layout="centered",
)
set_sidebar()
st.title(PAGE_TITLE)
st.markdown(
"""
### *Welcome to the leaderboard!*
Here you can submit your keys and see how you compare to others!
"""
)
# Display leaderboard
url = f"https://getpantry.cloud/apiv1/pantry/{os.environ.get('PANTRY_ID')}/basket/{os.environ.get('PANTRY_BASKET')}"
leaderboard_response = requests.get(url)
if leaderboard_response.status_code == 200:
leaderboard_json = leaderboard_response.json()
leaderboard_data = (
pd.DataFrame(leaderboard_json)
.T[["level 0", "level 1", "level 2"]]
.applymap(lambda x: "βœ…" if x else "❌")
)
leaderboard_data = leaderboard_data.rename(
columns={"level 0": "Level 0", "level 1": "Level 1", "level 2": "Level 2"}
)
leaderboard_data["Score"] = leaderboard_data.apply(
lambda x: x.value_counts().get("βœ…", 0) * 100, axis=1
)
leaderboard_data = leaderboard_data.sort_values(by="Score", ascending=False)
leaderboard_data = leaderboard_data.reset_index()
leaderboard_data = leaderboard_data.rename(columns={"index": "Name"})
leaderboard_data.index += 1
st.dataframe(leaderboard_data)
else:
st.error("An error occurred while fetching the leaderboard.")
# Submit keys
with st.form("leaderboard"):
key = st.text_input("Enter your key here:")
email = st.text_input("Enter your email here:")
display_name = st.text_input("Enter your leaderboard display name here:")
st.markdown(
"*Note: Your email will not be displayed on the leaderboard, it is only used to contact you if you win!*"
)
submit = st.form_submit_button("Submit")
if submit and key and email and display_name:
if (
display_name in leaderboard_json.keys()
and email != leaderboard_json[display_name]["email"]
):
st.error(
"This display name is already taken, please choose another one."
)
else:
try:
if display_name not in leaderboard_json.keys():
data = {
display_name: {
"email": email,
"level 0": key == os.environ.get("LEVEL_0_KEY"),
"level 1": key == os.environ.get("LEVEL_1_KEY"),
"level 2": key == os.environ.get("LEVEL_2_KEY"),
}
}
else:
data = {
display_name: {
"email": email,
"level 0": key == os.environ.get("LEVEL_0_KEY")
or leaderboard_data[
leaderboard_data["Name"] == display_name
]["Level 0"].values[0]
== "βœ…",
"level 1": key == os.environ.get("LEVEL_1_KEY")
or leaderboard_data[
leaderboard_data["Name"] == display_name
]["Level 1"].values[0]
== "βœ…",
"level 2": key == os.environ.get("LEVEL_2_KEY")
or leaderboard_data[
leaderboard_data["Name"] == display_name
]["Level 2"].values[0]
== "βœ…",
}
}
updated_data = leaderboard_json
updated_data.update(data)
_ = requests.post(url, json=updated_data)
st.success(
"You should soon be able to see your name and your scores on the leaderboard! πŸŽ‰"
)
except Exception as e:
st.error(f"An error occurred while submitting your key: {e}")
if __name__ == "__main__":
main()