2013-02-22 16 views
7

Próbuję zaimplementować serwer do gry opartej na turach w Haskell. Moim wyborem byłoby użycie Yesod do administrowania i meta-informacji (takich jak gry, w których uczestniczy użytkownik itp.).Yesod, WebSockets i Persistent

Chciałbym używać gniazd internetowych, aby dane w grze nie były niewielkie.

Patrząc na przykład ws-chat, nie jestem pewien, jak uzyskać dostęp do Handler Monad i z nim Trwałe.

Byłoby świetnie mieć kod księgowy dla połączeń owiniętych wokół "normalnego" Handlera, który sam aktualizuje bazę danych i informuje odpowiednich użytkowników.

+0

Czy ten przykład może pomóc? https://github.com/gertcuykens/haskell-design –

+0

Niezupełnie, Gert. Szukam sposobu na użycie biblioteki Yesods Persist zamiast Acid. Generalnie chciałbym mieć sposób na uruchomienie Monopod Yesod Handler z programu WS.intercept-Handler. – SmokeDispenser

Odpowiedz

7

Tak to powinno wyglądać.

{-# LANGUAGE QuasiQuotes, TypeFamilies, GeneralizedNewtypeDeriving, TemplateHaskell, OverloadedStrings, GADTs, FlexibleContexts #-} 
module Main where 
import Control.Monad.IO.Class (liftIO) 
import Data.String (fromString) 
import Database.Persist 
import Database.Persist.TH 
import Database.Persist.Sqlite 
import Network.Wai.Application.Static (staticApp, defaultWebAppSettings, defaultFileServerSettings) 
import Network.Wai.Handler.Warp (runSettings, defaultSettings, settingsIntercept, settingsPort) 
import Network.Wai.Handler.WebSockets (intercept) 
import qualified Network.WebSockets as WS 

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistUpperCase| 
Person 
    name String 
    age Int 
    deriving Show 
|] 

ws :: WS.Request -> WS.WebSockets WS.Hybi10() 
ws r = do 
    WS.acceptRequest r 
    liftIO $ runSqlite ":memory:" $ do 
     runMigration migrateAll 
     michaelId <- insert $ Person "Michael" 26 
     michael <- get michaelId 
     liftIO $ print michael 

main :: IO() 
main = runSettings defaultSettings 
    { settingsPort = 9160 
    , settingsIntercept = intercept $ ws 
    } $ staticApp (defaultFileServerSettings $ fromString ".") 
4

Jeśli chcesz samodzielnie uruchomić monadę Handler, możesz użyć runFakeHandler.

+0

Nie wiem, czy mówię o tym samym treserze co Jan, ale możesz zrobić coś takiego jak ta praca :) https://gist.github.com/gertcuykens/5022515 –

+0

Tak, Gert, tego właśnie szukałem, dzięki :) Michael: Dzięki za odpowiedź. Wydaje mi się, że byłem niedokładny opisując moje cele; jednak Gert wydawało się, że dostał to, co chciałem z twoją uwagą :) Również świetna praca nad Yesod! Wielkie dzięki za to :) Nie jestem pewien, czy powinienem "zaakceptować" twoją odpowiedź, ponieważ jest to komentarz Gertsa, który robi lewę. – SmokeDispenser

+0

Czy możesz podać swoją wersję, ponieważ Michael jest tym, który wie na pewno, czy są jakieś problemy z wydajnością lub coś takiego. –