我正在尝试在 Haskell 中实现一个基于回合的游戏的服务器。我的选择是使用 Yesod 进行管理和元信息(例如,用户参与哪些游戏等)。
我想使用网络套接字来保持游戏内数据开销较小。
看看 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 ".")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)