我正在尝试在Haskell中实现一个基于回合的游戏的服务器。我的选择是使用Yesod进行管理和元信息(比如,用户参与了什么游戏等等)。
我喜欢使用web套接字来保持游戏中的数据开销很小。
看一下ws-chat示例,我不确定如何访问Handler Monad并持久化它。
在一个“普通”处理程序周围为连接提供一些记账代码将是完美的,该处理程序本身会更新数据库并通知相关用户。
发布于 2013-02-25 01:02:04
这就是我认为应该是这样的。
{-# 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 ".")
发布于 2013-02-24 11:09:32
如果你想自己运行Handler
monad,你可以使用runFakeHandler。
发布于 2020-03-17 00:33:00
我正在使用Yesod.WebSockets库,并且能够在web套接字应用程序中访问DB,如下所示:
voteApp :: WebSocketsT Handler ()
voteApp = do
uuid <- liftIO nextRandom
master <- getYesod
runSqlPool (insert (Session uuid)) $ appConnPool master
-- rest of the handler
https://stackoverflow.com/questions/15031607
复制相似问题