2013-02-22 15 views
7

私はHaskellでターンベースのゲーム用のサーバーを実装しようとしています。私の選択は、管理とメタ情報(ユーザーがどのようなゲームに参加しているかなど)にYesodを使用することです。Yesod、WebSockets and Persistent

私はゲーム内のデータオーバーヘッドを小さく保つためにWebソケットを使用したいと思います。

ws-chatの例を見ると、Handler MonadとPersistentにアクセスする方法がわかりません。

データベースを更新して関連するユーザーに通知する「通常の」ハンドラを包み込む接続のためのいくつかの保守コードを持つことは完璧です。

+0

この例は役に立ちますか? https://github.com/gertcuykens/haskell-design –

+0

本当に、Gert。私はYesods PersistライブラリをAcidの代わりに使う方法を探しています。一般的に、私は、WS.intercept-Handlerの中からYesod Handler Monadを起動する方法を持っています。 – 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があなたのバージョンを把握できますか? –