Yesod,WebSockets和Persistent [英] Yesod, WebSockets and Persistent

查看:163
本文介绍了Yesod,WebSockets和Persistent的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在Haskell中实现一个基于回合的游戏的服务器。我的选择是使用Yesod作为管理和元信息(例如,用户参与的游戏等)。



我想使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆