فهرست منبع

Load initial sets

Cadel Watson 1 سال پیش
والد
کامیت
4fd777ea5a
5فایلهای تغییر یافته به همراه137 افزوده شده و 20 حذف شده
  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/browser": "1.0.2",
             "elm/core": "1.0.5",
             "elm/core": "1.0.5",
             "elm/html": "1.0.0",
             "elm/html": "1.0.0",
+            "elm/http": "2.0.0",
             "elm/json": "1.1.3",
             "elm/json": "1.1.3",
             "elm/parser": "1.1.0",
             "elm/parser": "1.1.0",
             "elm/svg": "1.0.1",
             "elm/svg": "1.0.1",
@@ -20,6 +21,8 @@
         "indirect": {
         "indirect": {
             "K-Adam/elm-dom": "1.0.0",
             "K-Adam/elm-dom": "1.0.0",
             "danhandrea/elm-time-extra": "1.1.0",
             "danhandrea/elm-time-extra": "1.1.0",
+            "elm/bytes": "1.0.8",
+            "elm/file": "1.0.5",
             "elm/time": "1.0.0",
             "elm/time": "1.0.0",
             "elm/url": "1.0.0",
             "elm/url": "1.0.0",
             "elm/virtual-dom": "1.0.2",
             "elm/virtual-dom": "1.0.2",
@@ -34,7 +37,6 @@
             "elm-explorations/test": "2.2.0"
             "elm-explorations/test": "2.2.0"
         },
         },
         "indirect": {
         "indirect": {
-            "elm/bytes": "1.0.8",
             "elm/random": "1.0.0"
             "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 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';
 import {Elm} from '../src/Main.elm';
 
 

+ 16 - 0
server/main.py

@@ -2,9 +2,25 @@ import json
 import os
 import os
 
 
 from fastapi import FastAPI
 from fastapi import FastAPI
+from fastapi.middleware.cors import CORSMiddleware
 
 
 app = FastAPI()
 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():
 def discover_sets():
     # find all set directories
     # 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 (..)
 module Main exposing (..)
 
 
+import API
 import Browser exposing (Document)
 import Browser exposing (Document)
 import Card exposing (CardData, CardPerformanceDistributions, calculatePerformanceDistributions, manaCostToSymbol)
 import Card exposing (CardData, CardPerformanceDistributions, calculatePerformanceDistributions, manaCostToSymbol)
 import Chart as C
 import Chart as C
@@ -7,7 +8,7 @@ import Chart.Attributes as CA
 import Database
 import Database
 import Deck
 import Deck
 import Draft exposing (Draft)
 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.Attributes exposing (alt, class, classList, disabled, src)
 import Html.Events as Events exposing (onClick, onMouseEnter)
 import Html.Events as Events exposing (onClick, onMouseEnter)
 import Html.Keyed as Keyed
 import Html.Keyed as Keyed
@@ -30,7 +31,8 @@ main =
 
 
 
 
 type Model
 type Model
-    = Ready ReadyModel
+    = ChooseSet ChooseSetModel
+    | Ready ReadyModel
     | Error ErrorModel
     | Error ErrorModel
 
 
 
 
@@ -51,6 +53,14 @@ type alias ToolboxAccordion =
     { cmc : Bool, signals : Bool, signalsDelta : Bool, deckList : Bool }
     { cmc : Bool, signals : Bool, signalsDelta : Bool, deckList : Bool }
 
 
 
 
+type alias ChooseSetModel =
+    { draftData : String
+    , cardRatings : String
+    , setData : String
+    , sets : Maybe (List String)
+    }
+
+
 type alias ReadyModel =
 type alias ReadyModel =
     { draft : Draft
     { draft : Draft
     , database : Database.Database
     , database : Database.Database
@@ -71,7 +81,34 @@ type alias ErrorModel =
 
 
 init : { setData : String, draftData : String, cardRatings : String } -> ( Model, Cmd Msg )
 init : { setData : String, draftData : String, cardRatings : String } -> ( Model, Cmd Msg )
 init flags =
 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 ) ->
         ( Ok draftData, Ok database ) ->
             ( Ready
             ( Ready
                 { draft = draftData
                 { draft = draftData
@@ -102,23 +139,20 @@ init flags =
             ( Error { error = "Error decoding draft data: " ++ draftError ++ ", set data: " ++ databaseError }, Cmd.none )
             ( 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 -> ( Model, Cmd Msg )
 update msg model =
 update msg model =
     case model of
     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 ->
         Ready mdl ->
             case msg of
             case msg of
                 Increment ->
                 Increment ->
@@ -176,6 +210,9 @@ update msg model =
                 SetDeckSortMethod method ->
                 SetDeckSortMethod method ->
                     ( Ready { mdl | deckSortOrder = method }, Cmd.none )
                     ( Ready { mdl | deckSortOrder = method }, Cmd.none )
 
 
+                IOGotSets _ ->
+                    ( Ready mdl, Cmd.none )
+
         Error mdl ->
         Error mdl ->
             ( Error mdl, Cmd.none )
             ( Error mdl, Cmd.none )
 
 
@@ -185,6 +222,9 @@ view model =
     { title = "Drafter"
     { title = "Drafter"
     , body =
     , body =
         [ case model of
         [ case model of
+            ChooseSet mdl ->
+                viewChooseSet mdl
+
             Ready mdl ->
             Ready mdl ->
                 viewReady 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 : ReadyModel -> Html Msg
 viewReady model =
 viewReady model =
     div [ class "grid grid-cols-12 gap-6 h-full bg-slate-100" ]
     div [ class "grid grid-cols-12 gap-6 h-full bg-slate-100" ]