Yesod,WebSockets和Persistent

时间:2013-02-22 19:16:22

标签: haskell websocket yesod

我正在尝试在Haskell中为一个基于回合的游戏实现一个服务器。我的选择是使用Yesod进行管理和元信息(比如,用户参与的游戏等)。

我想使用网络套接字来保持游戏内数据开销很小。

查看ws-chat示例,我不知道如何访问Handler Monad并使用Persistent。

对于包含“普通”处理程序的连接有一些簿记代码是完美的,该处理程序本身会更新数据库并通知相关用户。

3 个答案:

答案 0 :(得分:8)

我认为这应该是这样的。

{-# 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 ".")

答案 1 :(得分:4)

如果您希望自己运行Handler monad,可以使用runFakeHandler

答案 2 :(得分:0)

我正在使用Yesod.WebSockets库,并且能够访问Web套接字应用程序中的数据库,如下所示:

voteApp :: WebSocketsT Handler ()
voteApp = do
  uuid <- liftIO nextRandom
  master <- getYesod
  runSqlPool (insert (Session uuid)) $ appConnPool master
  -- rest of the handler