tier list
Some checks failed
Build and Deploy / Build & Push Image (push) Failing after 5s

This commit is contained in:
2026-03-16 20:06:26 -06:00
parent cbeecb1021
commit f69f287ece
5 changed files with 150 additions and 15 deletions

View File

@@ -3,7 +3,10 @@ defmodule CobblemonUiWeb.DashboardLive do
@impl true
def mount(_params, _session, socket) do
if connected?(socket), do: :timer.send_interval(1000, self(), :tick)
if connected?(socket) do
:timer.send_interval(1000, self(), :tick)
unless File.exists?(CobblemonUi.TierListScraper.output_file()), do: send(self(), :scrape_tier_list)
end
players =
case CobblemonUi.CobblemonFS.list_players() do
@@ -18,6 +21,7 @@ defmodule CobblemonUiWeb.DashboardLive do
player_data: nil,
battle: nil,
selected_pokemon: nil,
tier_list: CobblemonUi.TierListScraper.load_tier_list(),
view_mode: :party,
loading: false,
error: nil
@@ -96,6 +100,19 @@ defmodule CobblemonUiWeb.DashboardLive do
{:noreply, do_refresh(socket)}
end
def handle_info(:scrape_tier_list, socket) do
lv = self()
Task.start(fn ->
CobblemonUi.TierListScraper.run()
send(lv, :reload_tier_list)
end)
{:noreply, socket}
end
def handle_info(:reload_tier_list, socket) do
{:noreply, assign(socket, tier_list: CobblemonUi.TierListScraper.load_tier_list())}
end
defp do_refresh(socket) do
players =
case CobblemonUi.CobblemonFS.list_players() do
@@ -262,7 +279,11 @@ defmodule CobblemonUiWeb.DashboardLive do
<div :if={@view_mode == :party}>
<div class="grid grid-cols-2 sm:grid-cols-3 gap-3">
<%= for {pokemon, idx} <- Enum.with_index(@player_data.party) do %>
<.pokemon_card pokemon={pokemon} index={idx} />
<.pokemon_card
pokemon={pokemon}
index={idx}
tier={Map.get(@tier_list, String.downcase(pokemon.species || ""), nil)}
/>
<% end %>
</div>
</div>
@@ -278,6 +299,7 @@ defmodule CobblemonUiWeb.DashboardLive do
<.pokemon_card
pokemon={pokemon}
index={pc_global_index(@player_data.pc, box.box, idx)}
tier={Map.get(@tier_list, String.downcase(pokemon.species || ""), nil)}
compact
/>
<% end %>
@@ -292,7 +314,11 @@ defmodule CobblemonUiWeb.DashboardLive do
</div>
<%!-- Pokémon detail panel --%>
<.pokemon_detail :if={@selected_pokemon} pokemon={@selected_pokemon} />
<.pokemon_detail
:if={@selected_pokemon}
pokemon={@selected_pokemon}
tier={Map.get(@tier_list, String.downcase(@selected_pokemon.species || ""), nil)}
/>
</div>
</div>
@@ -307,6 +333,7 @@ defmodule CobblemonUiWeb.DashboardLive do
attr :pokemon, :map, required: true
attr :index, :integer, required: true
attr :compact, :boolean, default: false
attr :tier, :string, default: nil
defp pokemon_card(%{pokemon: nil} = assigns) do
~H"""
@@ -321,7 +348,7 @@ defmodule CobblemonUiWeb.DashboardLive do
defp pokemon_card(assigns) do
~H"""
<button
<div
phx-click="select_pokemon"
phx-value-index={@index}
class={[
@@ -346,14 +373,17 @@ defmodule CobblemonUiWeb.DashboardLive do
Lv. {@pokemon.level || "?"}
</p>
</div>
<div :if={@pokemon.shiny} class="shrink-0" title="Shiny">
<.icon
name="hero-sparkles"
class={[
"text-warning",
if(@compact, do: "size-3", else: "size-4")
]}
/>
<div class="flex items-center gap-1 shrink-0">
<.tier_badge :if={@tier} tier={@tier} species={@pokemon.species} compact={@compact} />
<div :if={@pokemon.shiny} title="Shiny">
<.icon
name="hero-sparkles"
class={[
"text-warning",
if(@compact, do: "size-3", else: "size-4")
]}
/>
</div>
</div>
</div>
<div :if={!@compact} class="flex items-center gap-2 mt-2">
@@ -373,11 +403,40 @@ defmodule CobblemonUiWeb.DashboardLive do
{gender_symbol(@pokemon.gender)}
</span>
</div>
</button>
</div>
"""
end
attr :tier, :string, required: true
attr :species, :string, required: true
attr :compact, :boolean, default: false
defp tier_badge(assigns) do
~H"""
<a
href={"https://rankedboost.com/pokemon/#{String.downcase(@species || "")}/"}
target="_blank"
rel="noopener noreferrer"
class={[
"inline-flex items-center justify-center font-black rounded leading-none shrink-0 hover:scale-110 transition-transform",
if(@compact, do: "text-[9px] w-4 h-4", else: "text-[10px] w-5 h-5"),
case @tier do
"S" -> "bg-red-500/20 text-red-400 ring-1 ring-red-500/30 hover:bg-red-500/30"
"A" -> "bg-orange-500/20 text-orange-400 ring-1 ring-orange-500/30 hover:bg-orange-500/30"
"B" -> "bg-yellow-500/20 text-yellow-400 ring-1 ring-yellow-500/30 hover:bg-yellow-500/30"
"C" -> "bg-green-500/20 text-green-400 ring-1 ring-green-500/30 hover:bg-green-500/30"
"D" -> "bg-blue-500/20 text-blue-400 ring-1 ring-blue-500/30 hover:bg-blue-500/30"
_ -> "bg-base-300/30 text-base-content/40 ring-1 ring-base-300/40"
end
]}
>
{@tier}
</a>
"""
end
attr :pokemon, :map, required: true
attr :tier, :string, default: nil
defp pokemon_detail(assigns) do
~H"""
@@ -389,11 +448,12 @@ defmodule CobblemonUiWeb.DashboardLive do
<.icon name="hero-bolt" class="size-4 text-primary/70" />
</div>
<div>
<h3 class="font-bold text-base-content capitalize text-lg">
<h3 class="font-bold text-base-content capitalize text-lg flex items-center gap-2">
{@pokemon.species || "Unknown"}
<.tier_badge :if={@tier} tier={@tier} species={@pokemon.species} />
<span
:if={@pokemon.shiny}
class="text-warning text-sm ml-1"
class="text-warning text-sm"
title="Shiny"
>