Yesod, WebSockets и Persistent


Я пытаюсь реализовать сервер для пошаговой игры в Haskell. Я бы предпочел использовать Yesod для администрирования и метаинформации (например, в каких играх участвует пользователь и т. д.).

Я хотел бы использовать веб-сокеты, чтобы уменьшить накладные расходы на данные в игре.

Глядя на пример ws-chat, я не уверен, как получить доступ к обработчику Monad и с ним Persistent.

Было бы идеально иметь некоторый бухгалтерский код для соединений, обернутых вокруг a "обычный" обработчик, который сам обновляет базу данных и информирует соответствующих пользователей.

2 7

2 ответа:

Вот как, по-моему, это должно выглядеть.

{-# 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 ".")

Если вы хотите запустить монаду Handler самостоятельно, вы можете использовать runFakeHandler.