是,WebSockets和持久性

问题描述 投票:8回答:3

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

我想使用Web套接字使游戏中的数据开销较小。

看ws-chat示例,我不确定如何访问Handler Monad及其持久性。

将连接的某些记帐代码包裹在一个“正常”处理程序周围,这本身会更新数据库并通知相关用户,这是非常理想的。

haskell websocket yesod
3个回答
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 ".")

4
投票

如果您想自己运行Handler单声道,则可以使用runFakeHandler


0
投票

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

voteApp :: WebSocketsT Handler ()
voteApp = do
  uuid <- liftIO nextRandom
  master <- getYesod
  runSqlPool (insert (Session uuid)) $ appConnPool master
  -- rest of the handler
© www.soinside.com 2019 - 2024. All rights reserved.