From 7a141fb94b447fff46256554ce16626de2b602f9 Mon Sep 17 00:00:00 2001 From: Max Wofford Date: Sat, 15 Mar 2025 21:14:12 -0400 Subject: [PATCH] Add tracking for scrapyard pins --- .../scrapyard_leaderboards_controller.rb | 36 +++++++++++++++++++ .../scrapyard_leaderboards/index.html.erb | 26 +++++--------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/app/controllers/scrapyard_leaderboards_controller.rb b/app/controllers/scrapyard_leaderboards_controller.rb index dcac642..6d7f4e5 100644 --- a/app/controllers/scrapyard_leaderboards_controller.rb +++ b/app/controllers/scrapyard_leaderboards_controller.rb @@ -1,10 +1,16 @@ class ScrapyardLeaderboardsController < ApplicationController # March 14, 2024 at 8:00 PM Eastern TRACKING_START_TIME = Time.find_zone("Eastern Time (US & Canada)").local(2025, 3, 14, 20, 0).to_i + PINNED_EVENT_TIMEOUT = 1.minutes def index @sort_by = params[:sort] == "average" ? "average" : "total" + # If there's a pinned event, cache it + if params[:event_pin].present? + mark_event_as_pinned(params[:event_pin]) + end + # Cache the expensive computations for 10 seconds @event_stats = Rails.cache.fetch("scrapyard_leaderboard_stats", expires_in: 10.seconds) do # Get all attendees and their emails in one query @@ -63,6 +69,15 @@ class ScrapyardLeaderboardsController < ApplicationController -stats[:total_seconds] end end + + # Get currently pinned events + @pinned_events = get_pinned_events + end + + def pin + event_id = params[:id] + mark_event_as_pinned(event_id) + head :ok end def show @@ -104,4 +119,25 @@ class ScrapyardLeaderboardsController < ApplicationController stats.sort_by { |stats| -stats[:total_seconds] } end end + + private + + def mark_event_as_pinned(event_id) + Rails.cache.write( + "pinned_event:#{event_id}", + true, + expires_in: PINNED_EVENT_TIMEOUT + ) + end + + def get_pinned_events + # Get all cache keys for pinned events + cache_keys = Rails.cache.instance_variable_get(:@data) + .keys + .select { |k| k.start_with?("pinned_event:") } + return [] if cache_keys.empty? + + event_ids = cache_keys.map { |k| k.split(":").last } + Warehouse::ScrapyardEvent.where(id: event_ids) + end end diff --git a/app/views/scrapyard_leaderboards/index.html.erb b/app/views/scrapyard_leaderboards/index.html.erb index ba2f7ae..7b8d735 100644 --- a/app/views/scrapyard_leaderboards/index.html.erb +++ b/app/views/scrapyard_leaderboards/index.html.erb @@ -14,7 +14,7 @@ <% @event_stats.each_with_index do |stats, index| %>
- 📌 + 📌

<%= link_to scrapyard_leaderboard_path(stats[:event]) do %> <% case index %> @@ -28,6 +28,9 @@ <%= (index + 1).ordinalize %> <% end %> <%= stats[:event].name %> + <% if @pinned_events.include?(stats[:event]) %> + 👀 + <% end %> <% end %>

@@ -62,8 +65,8 @@ <% content_for :head do %>