2013-02-22 2 views
7

하스켈에서 차례 기반 게임을위한 서버를 구현하려고합니다. 내 선택은 예 (예 : 관리 및 메타 정보 (예 : 사용자가 어떤 게임에 참여했는지 등)에 사용하는 것입니다.Yesod, WebSockets and Persistent

웹 소켓을 사용하여 게임 내 데이터 오버 헤드를 작게 유지하고 싶습니다.

ws-chat 예제를 보면 Handler Monad 및 Persistent에 액세스하는 방법을 모르겠습니다.

데이터베이스 자체를 업데이트하고 관련 사용자에게 알리는 "일반"처리기를 감싸는 연결에 대한 부기 코드가 있으면 완벽 할 것입니다.

+0

이 예는 도움이됩니까? https://github.com/gertcuykens/haskell-design –

+0

사실, Gert. 나는 Yesods Persist 라이브러리 대신 Acid를 사용할 방법을 찾고 있습니다. 일반적으로 WS.intercept-Handler 내에서 Yesod 처리기 모나드를 시작할 수있는 방법이 필요합니다. – SmokeDispenser

답변

7

이렇게 생각하면됩니다.

{-# 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

Handler 모나드를 직접 실행하려면 runFakeHandler을 사용할 수 있습니다.

+0

Jan과 같은 처리기에 대해 말하고 있는지는 모르겠지만이 작업과 같은 것을 만들 수 있습니까 :) https://gist.github.com/gertcuykens/5022515 –

+0

예 Gert, 내가 찾고있는 것입니다. 감사합니다 :) 마이클 : 답장을 보내 주셔서 감사합니다. 내 목표를 설명하는 것이 정확하지 않은 것 같습니다. 아직 Gert는 내가 원하는 것을 당신의 의견으로 얻은 것 같았습니다 :) 또한 Yesod에 대한 위대한 업적! 고마워요. :) 그 트릭을하는 Gerts 코멘트이기 때문에 나는 당신의 대답을 "받아 들여야"하는지 확신 할 수 없습니다. – SmokeDispenser

+0

성능 문제 또는 기타 문제가 있는지 Michael이 알고 있기 때문에 버전을 확인할 수 있습니까? –