2013-02-22 8 views
7

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

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

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

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

+0

Помогает ли этот пример? https://github.com/gertcuykens/haskell-design –

+0

Не совсем, Герт. Я ищу способ использования библиотеки Yesods Persist, а не Acid. Как правило, я хотел бы иметь способ запустить Yesod Handler Monad из WS.intercept-Handler. – SmokeDispenser

ответ

7

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

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

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

+0

Не знаю, говорю ли я о том же обработчике, что и Ян, но вы можете сделать что-то вроде этой работы :) https://gist.github.com/gertcuykens/5022515 –

+0

Да, Герт, вот что я искал, спасибо :) Майкл: Спасибо за ответ. Кажется, я был неточным описанием моих целей; но Герт, казалось, получал то, что я хотел с твоей записью :) Также, отличная работа над Йесодом! Большое спасибо за это :) Я не уверен, должен ли я «принять» ваш ответ, поскольку это комментарий Герца, который делает трюк. – SmokeDispenser

+0

Можете ли вы использовать свою версию, потому что Майкл тот, кто точно знает, есть ли какие-либо проблемы с производительностью или что-то в этом роде. –

Смежные вопросы