Kaynağa Gözat

Load initial sets

Cadel Watson 1 yıl önce
ebeveyn
işleme
4fd777ea5a
5 değiştirilmiş dosya ile 137 ekleme ve 20 silme
  1. 3 1
      elm.json
  2. 2 2
      js/app.js
  3. 16 0
      server/main.py
  4. 45 0
      src/API.elm
  5. 71 17
      src/Main.elm

+ 3 - 1
elm.json

@@ -10,6 +10,7 @@
             "elm/browser": "1.0.2",
             "elm/core": "1.0.5",
             "elm/html": "1.0.0",
+            "elm/http": "2.0.0",
             "elm/json": "1.1.3",
             "elm/parser": "1.1.0",
             "elm/svg": "1.0.1",
@@ -20,6 +21,8 @@
         "indirect": {
             "K-Adam/elm-dom": "1.0.0",
             "danhandrea/elm-time-extra": "1.1.0",
+            "elm/bytes": "1.0.8",
+            "elm/file": "1.0.5",
             "elm/time": "1.0.0",
             "elm/url": "1.0.0",
             "elm/virtual-dom": "1.0.2",
@@ -34,7 +37,6 @@
             "elm-explorations/test": "2.2.0"
         },
         "indirect": {
-            "elm/bytes": "1.0.8",
             "elm/random": "1.0.0"
         }
     }

+ 2 - 2
js/app.js

@@ -1,6 +1,6 @@
-import setData from "../data/mkm.json";
+import setData from "../data/sets/mkm/card-data.json";
 import draftData from "../data/draft_mkm.json";
-import cardRatings from "../data/card-ratings.json";
+import cardRatings from "../data/sets/mkm/card-ratings-all.json";
 
 import {Elm} from '../src/Main.elm';
 

+ 16 - 0
server/main.py

@@ -2,9 +2,25 @@ import json
 import os
 
 from fastapi import FastAPI
+from fastapi.middleware.cors import CORSMiddleware
 
 app = FastAPI()
 
+origins = [
+    "http://drafter.cadel.me",
+    "https://drafter.cadel.me",
+    "http://localhost",
+    "http://localhost:1234",
+]
+
+app.add_middleware(
+    CORSMiddleware,
+    allow_origins=origins,
+    allow_credentials=True,
+    allow_methods=["*"],
+    allow_headers=["*"],
+)
+
 
 def discover_sets():
     # find all set directories

+ 45 - 0
src/API.elm

@@ -0,0 +1,45 @@
+module API exposing (getSets)
+
+import Http
+import Json.Decode as Decode
+
+
+apiUrl : String
+apiUrl =
+    "http://localhost:8000"
+
+
+makeApiUrl : List String -> String
+makeApiUrl paths =
+    apiUrl ++ "/" ++ String.join "/" paths
+
+
+getSets : (Result String (List String) -> msg) -> Cmd msg
+getSets onSuccess =
+    Http.get
+        { url = makeApiUrl [ "sets" ]
+        , expect =
+            Http.expectJson (Result.mapError httpErrorToString >> onSuccess)
+                (Decode.field "sets"
+                    (Decode.list Decode.string)
+                )
+        }
+
+
+httpErrorToString : Http.Error -> String
+httpErrorToString error =
+    case error of
+        Http.BadUrl url ->
+            "Bad URL: " ++ url
+
+        Http.Timeout ->
+            "Timeout"
+
+        Http.NetworkError ->
+            "Network error"
+
+        Http.BadStatus status ->
+            "Bad status: " ++ String.fromInt status
+
+        Http.BadBody body ->
+            "Bad body: " ++ body

+ 71 - 17
src/Main.elm

@@ -1,5 +1,6 @@
 module Main exposing (..)
 
+import API
 import Browser exposing (Document)
 import Card exposing (CardData, CardPerformanceDistributions, calculatePerformanceDistributions, manaCostToSymbol)
 import Chart as C
@@ -7,7 +8,7 @@ import Chart.Attributes as CA
 import Database
 import Deck
 import Draft exposing (Draft)
-import Html exposing (Html, a, button, div, img, li, span, text, ul)
+import Html exposing (Html, a, button, div, img, li, p, span, text, ul)
 import Html.Attributes exposing (alt, class, classList, disabled, src)
 import Html.Events as Events exposing (onClick, onMouseEnter)
 import Html.Keyed as Keyed
@@ -30,7 +31,8 @@ main =
 
 
 type Model
-    = Ready ReadyModel
+    = ChooseSet ChooseSetModel
+    | Ready ReadyModel
     | Error ErrorModel
 
 
@@ -51,6 +53,14 @@ type alias ToolboxAccordion =
     { cmc : Bool, signals : Bool, signalsDelta : Bool, deckList : Bool }
 
 
+type alias ChooseSetModel =
+    { draftData : String
+    , cardRatings : String
+    , setData : String
+    , sets : Maybe (List String)
+    }
+
+
 type alias ReadyModel =
     { draft : Draft
     , database : Database.Database
@@ -71,7 +81,34 @@ type alias ErrorModel =
 
 init : { setData : String, draftData : String, cardRatings : String } -> ( Model, Cmd Msg )
 init flags =
-    case ( Draft.decode flags.draftData, Database.decode flags.setData flags.cardRatings ) of
+    ( ChooseSet
+        { setData = flags.setData
+        , draftData = flags.draftData
+        , cardRatings = flags.cardRatings
+        , sets = Nothing
+        }
+    , API.getSets IOGotSets
+    )
+
+
+type Msg
+    = Increment
+    | Decrement
+    | Highlight String
+    | FlipHighlightedCard
+    | SetFocusStat FocusStat
+    | SetDeckProgress DeckProgress
+    | ToggleCMCChart
+    | ToggleSignalsChart
+    | ToggleSignalsDeltaChart
+    | ToggleDeckList
+    | SetDeckSortMethod Deck.DeckSortMethod
+    | IOGotSets (Result String (List String))
+
+
+startDraft : ChooseSetModel -> ( Model, Cmd Msg )
+startDraft initFlags =
+    case ( Draft.decode initFlags.draftData, Database.decode initFlags.setData initFlags.cardRatings ) of
         ( Ok draftData, Ok database ) ->
             ( Ready
                 { draft = draftData
@@ -102,23 +139,20 @@ init flags =
             ( Error { error = "Error decoding draft data: " ++ draftError ++ ", set data: " ++ databaseError }, Cmd.none )
 
 
-type Msg
-    = Increment
-    | Decrement
-    | Highlight String
-    | FlipHighlightedCard
-    | SetFocusStat FocusStat
-    | SetDeckProgress DeckProgress
-    | ToggleCMCChart
-    | ToggleSignalsChart
-    | ToggleSignalsDeltaChart
-    | ToggleDeckList
-    | SetDeckSortMethod Deck.DeckSortMethod
-
-
 update : Msg -> Model -> ( Model, Cmd Msg )
 update msg model =
     case model of
+        ChooseSet mdl ->
+            case msg of
+                IOGotSets (Ok sets) ->
+                    ( ChooseSet { mdl | sets = Just sets }, Cmd.none )
+
+                IOGotSets (Err e) ->
+                    ( Error { error = "Error fetching sets (" ++ e ++ ")" }, Cmd.none )
+
+                _ ->
+                    ( ChooseSet mdl, Cmd.none )
+
         Ready mdl ->
             case msg of
                 Increment ->
@@ -176,6 +210,9 @@ update msg model =
                 SetDeckSortMethod method ->
                     ( Ready { mdl | deckSortOrder = method }, Cmd.none )
 
+                IOGotSets _ ->
+                    ( Ready mdl, Cmd.none )
+
         Error mdl ->
             ( Error mdl, Cmd.none )
 
@@ -185,6 +222,9 @@ view model =
     { title = "Drafter"
     , body =
         [ case model of
+            ChooseSet mdl ->
+                viewChooseSet mdl
+
             Ready mdl ->
                 viewReady mdl
 
@@ -194,6 +234,20 @@ view model =
     }
 
 
+viewChooseSet : ChooseSetModel -> Html Msg
+viewChooseSet model =
+    div [ class "w-full h-full bg-slate-100 flex justify-center items-center" ]
+        [ div [ class "max-w-2xl max-h-2xl" ]
+            [ case model.sets of
+                Just sets ->
+                    ul [] (List.map (\s -> li [] [ text s ]) sets)
+
+                Nothing ->
+                    p [] [ text "Loading..." ]
+            ]
+        ]
+
+
 viewReady : ReadyModel -> Html Msg
 viewReady model =
     div [ class "grid grid-cols-12 gap-6 h-full bg-slate-100" ]