Yesod, WebSockets и Persistent
Я пытаюсь реализовать сервер для пошаговой игры в Haskell. Я бы предпочел использовать Yesod для администрирования и метаинформации (например, в каких играх участвует пользователь и т. д.).
Я хотел бы использовать веб-сокеты, чтобы уменьшить накладные расходы на данные в игре.
Глядя на пример ws-chat, я не уверен, как получить доступ к обработчику Monad и с ним Persistent.
Было бы идеально иметь некоторый бухгалтерский код для соединений, обернутых вокруг a "обычный" обработчик, который сам обновляет базу данных и информирует соответствующих пользователей.
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.