Yesod,WebSockets和Persistent

Tob*_*ary 8 haskell websocket yesod

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

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

看看ws-chat示例,我不确定如何访问Handler Monad并使用Persistent.

对于围绕"普通"处理程序的连接有一些簿记代码是完美的,该处理程序本身更新数据库并通知相关用户.

Ger*_*ens 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 ".")
Run Code Online (Sandbox Code Playgroud)