Files changed (1) hide show
  1. app.py +72 -19
app.py CHANGED
@@ -714,15 +714,41 @@ def home_page():
714
  st.markdown("---")
715
 
716
  # Recent games
717
- games = unified_get("games") or {}
718
- players_map = unified_get("players") or {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
719
 
720
- st.subheader("Recent games")
721
- for g in sorted(list(games.values()), key=lambda x: x.get("created_at",""), reverse=True)[:10]:
722
- gid = g.get("game_id")
723
- st.markdown(f"### ๐ŸŽฎ Game: **{gid}** {'(Closed)' if g.get('closed') else ''}")
724
- st.write(f"Host: {g.get('host')} โ€” Topics: {', '.join(g.get('topics',[]))}")
725
- st.write(f"Created: {g.get('created_at')}")
726
 
727
  players_here = players_map.get(gid, {}) or {}
728
  st.write(f"Players joined: **{len(players_here)}**")
@@ -757,17 +783,27 @@ def home_page():
757
  send_game_invite(st.session_state['username'], f, gid)
758
  st.success("Invites sent to friends.")
759
 
760
- if st.button(f"Challenge friends with a new game like {gid}", key=f"challenge_{gid}"):
761
- new_id = create_game(
762
- st.session_state.get('username','Host'),
763
- g.get('topics',[]),
764
- num_questions=len(g.get('questions',[]))
765
- )
766
- st.success(f"Challenge created: {new_id}")
767
-
768
- st.markdown("---")
769
-
770
-
 
 
 
 
 
 
 
 
 
 
771
 
772
  # Create game
773
  def create_game(topics=None, num_questions=5, auto_close=True, ai_topic=None):
@@ -948,10 +984,14 @@ def play_page():
948
  "correct_flags": " || ".join(flags)
949
  }
950
  unified_push_leaderboard(row)
 
 
951
  players = unified_get("players") or {}
952
  if players.get(gid) and players[gid].get(uname):
953
  players[gid][uname]['submitted'] = True
954
  players[gid][uname]['submitted_at'] = now
 
 
955
  unified_set("players", players)
956
  if game.get('auto_close', True):
957
  games = unified_get("games") or {}
@@ -1115,6 +1155,19 @@ def leaderboard_page():
1115
  st.plotly_chart(fig, use_container_width=True)
1116
 
1117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1118
  # Route pages
1119
  if page == "Home":
1120
  home_page()
 
714
  st.markdown("---")
715
 
716
  # Recent games
717
+ games = unified_get("games") or {}
718
+ players_map = unified_get("players") or {}
719
+
720
+ st.subheader("Recent games")
721
+
722
+ for g in sorted(games.values(), key=lambda x: x.get("created_at", ""), reverse=True)[:10]:
723
+ gid = g.get("game_id")
724
+
725
+ st.markdown(f"### ๐ŸŽฎ Game: **{gid}** {'(Closed)' if g.get('closed') else ''}")
726
+ st.write(f"Host: {g.get('host')} โ€” Topics: {', '.join(g.get('topics', []))}")
727
+ st.write(f"Created: {g.get('created_at')}")
728
+
729
+ # โœ… FIX: get players for THIS game
730
+ players_here = players_map.get(gid, {}) or {}
731
+
732
+ st.write(f"Players joined: **{len(players_here)}**")
733
+
734
+ # โœ… Submitted count
735
+ submitted_count = sum(1 for p in players_here.values() if p.get("submitted"))
736
+ st.write(f"Submitted: **{submitted_count} / {len(players_here)}**")
737
+
738
+ # โœ… Final scores per game
739
+ if players_here:
740
+ st.markdown("**๐Ÿ“Š Final Scores**")
741
+ for uname_p, info in players_here.items():
742
+ if info.get("submitted"):
743
+ st.write(
744
+ f"{info.get('avatar','๐ŸŽฎ')} **{uname_p}** โ€” "
745
+ f"Score: **{info.get('score', 0)}**, "
746
+ f"Percentage: **{info.get('percentage', 0)}%**"
747
+ )
748
+
749
+ st.markdown("---")
750
+
751
 
 
 
 
 
 
 
752
 
753
  players_here = players_map.get(gid, {}) or {}
754
  st.write(f"Players joined: **{len(players_here)}**")
 
783
  send_game_invite(st.session_state['username'], f, gid)
784
  st.success("Invites sent to friends.")
785
 
786
+ if st.button(f"Challenge friends with a new game like {gid}", key=f"challenge_{gid}"):
787
+ new_id = create_game(
788
+ st.session_state.get('username','Host'),
789
+ g.get('topics',[]),
790
+ num_questions=len(g.get('questions',[]))
791
+ )
792
+ st.success(f"Challenge created: {new_id}")
793
+
794
+ st.markdown("---")
795
+
796
+ st.subheader("๐Ÿ† Weekly Leaderboard (Top 10)")
797
+
798
+ weekly = get_weekly_leaderboard()
799
+ if not weekly:
800
+ st.info("No scores yet this week.")
801
+ else:
802
+ for i, r in enumerate(weekly, 1):
803
+ st.write(
804
+ f"{i}. {r.get('avatar','๐ŸŽฎ')} **{r['name']}** "
805
+ f"(Game {r['game_id']}) โ€” {r['score']} pts"
806
+ )
807
 
808
  # Create game
809
  def create_game(topics=None, num_questions=5, auto_close=True, ai_topic=None):
 
984
  "correct_flags": " || ".join(flags)
985
  }
986
  unified_push_leaderboard(row)
987
+ players[gid][uname]['score'] = score
988
+ players[gid][uname]['percentage'] = round((score / len(questions)) * 100, 2)
989
  players = unified_get("players") or {}
990
  if players.get(gid) and players[gid].get(uname):
991
  players[gid][uname]['submitted'] = True
992
  players[gid][uname]['submitted_at'] = now
993
+ players[gid][uname]['score'] = score
994
+ players[gid][uname]['percentage'] = round((score / len(questions)) * 100, 2)
995
  unified_set("players", players)
996
  if game.get('auto_close', True):
997
  games = unified_get("games") or {}
 
1155
  st.plotly_chart(fig, use_container_width=True)
1156
 
1157
 
1158
+ def get_weekly_leaderboard():
1159
+ rows = unified_get("leaderboard") or []
1160
+ one_week_ago = datetime.utcnow() - timedelta(days=7)
1161
+
1162
+ weekly = []
1163
+ for r in rows:
1164
+ ts = parse_iso(r.get("timestamp"))
1165
+ if ts and ts >= one_week_ago:
1166
+ weekly.append(r)
1167
+
1168
+ # Sort by score desc
1169
+ weekly.sort(key=lambda x: x.get("score", 0), reverse=True)
1170
+ return weekly[:10]
1171
  # Route pages
1172
  if page == "Home":
1173
  home_page()