我正在尝试为Haskell中基于回合的游戏实现服务器。我的选择是使用Yesod进行管理和元信息(例如,用户参与了哪些游戏等等)。
我想使用Web套接字使游戏中的数据开销较小。
看ws-chat示例,我不确定如何访问Handler Monad及其持久性。
将连接的某些记帐代码包裹在一个“正常”处理程序周围,这本身会更新数据库并通知相关用户,这是非常理想的。
这是我认为的样子。
{-# 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 ".")
如果您想自己运行Handler
单声道,则可以使用runFakeHandler。
我正在使用Yesod.WebSockets库,并且能够访问Web套接字应用程序中的数据库,如下所示:
voteApp :: WebSocketsT Handler ()
voteApp = do
uuid <- liftIO nextRandom
master <- getYesod
runSqlPool (insert (Session uuid)) $ appConnPool master
-- rest of the handler