Yesod,WebSockets和Persistent [英] Yesod, WebSockets and Persistent
问题描述
我想使用web套接字保持游戏中的数据开销很小。
查看ws-chat示例,我不确定如何访问Handler Monad并使其持久。
对于包含一个正常处理程序的连接,有一些簿记代码是完美的,它自己更新数据库并通知相关用户。 b $ b
这就是我应该看起来的样子。 c $ c $ { - #LANGUAGE QuasiQuotes,TypeFamilies,GeneralizedNewtypeDiving,TemplateHaskell,OverloadedStrings,GADTs,FlexibleContexts# - }
module Main其中
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)
导入Network.Wai.Handler.Warp(runSettings,defaultSettings,settingsIntercept,settingsPort)
导入Network.Wai.Handler.WebSockets(截获)
将合格的Network.WebSockets导入为WS
share [mkPersist sqlSettings,mkMigratemigrateAll] [persistUpperCase |
Person
name String
年龄Int
派生Show
|]
ws :: WS.Request - > WS.WebSockets WS.Hybi10()
ws r = do
WS.acceptRequest r
liftIO $ runSqlite:memory:$ do
runMigration migrateAll
michaelId< ; - 插入$ PersonMichael26
michael< - get michaelId
liftIO $ print michael
main :: IO()
main = runSettings defaultSettings
{settingsPort = 9160
,settingsIntercept =拦截$ ws
} $ staticApp(defaultFileServerSettings $ fromString。)
I'm trying to implement a server for a turn based game in Haskell. My choice would be to use Yesod for adminstration and meta-information (like, what games a user participates in and such).
I'd like to use web sockets to keep the in-game data overhead small.
Looking at the ws-chat example, I'm not sure how to get access to the Handler Monad and with it Persistent.
It would be perfect to have some bookkeeping-code for the connections wrapped around a "normal" Handler that itself updates the database and informs relevant users.
This is how I think it should look like.
{-# 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 ".")
这篇关于Yesod,WebSockets和Persistent的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!