Added chat example
This commit is contained in:
parent
f1ca43e7c6
commit
9eeefca36a
88
yesod-websockets/chat.hs
Normal file
88
yesod-websockets/chat.hs
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-}
|
||||||
|
import Yesod.Core
|
||||||
|
import Yesod.WebSockets
|
||||||
|
import qualified Data.Text.Lazy as TL
|
||||||
|
import Control.Monad (forever)
|
||||||
|
import Control.Monad.Trans.Reader
|
||||||
|
import Control.Concurrent (threadDelay)
|
||||||
|
import Data.Time
|
||||||
|
import Conduit
|
||||||
|
import Data.Monoid ((<>))
|
||||||
|
import Control.Concurrent.STM.Lifted
|
||||||
|
import Data.Text (Text)
|
||||||
|
|
||||||
|
data App = App (TChan Text)
|
||||||
|
|
||||||
|
instance Yesod App
|
||||||
|
|
||||||
|
mkYesod "App" [parseRoutes|
|
||||||
|
/ HomeR GET
|
||||||
|
|]
|
||||||
|
|
||||||
|
chatApp :: WebSocketsT Handler ()
|
||||||
|
chatApp = do
|
||||||
|
sendTextData ("Welcome to the chat server, please enter your name." :: Text)
|
||||||
|
name <- receiveData
|
||||||
|
sendTextData $ "Welcome, " <> name
|
||||||
|
App writeChan <- getYesod
|
||||||
|
readChan <- atomically $ do
|
||||||
|
writeTChan writeChan $ name <> " has joined the chat"
|
||||||
|
dupTChan writeChan
|
||||||
|
race_
|
||||||
|
(forever $ atomically (readTChan readChan) >>= sendTextData)
|
||||||
|
(sourceWS $$ mapM_C (\msg ->
|
||||||
|
atomically $ writeTChan writeChan $ name <> ": " <> msg))
|
||||||
|
|
||||||
|
getHomeR :: Handler Html
|
||||||
|
getHomeR = do
|
||||||
|
webSockets chatApp
|
||||||
|
defaultLayout $ do
|
||||||
|
[whamlet|
|
||||||
|
<div #output>
|
||||||
|
<form #form>
|
||||||
|
<input #input autofocus>
|
||||||
|
|]
|
||||||
|
toWidget [lucius|
|
||||||
|
\#output {
|
||||||
|
width: 600px;
|
||||||
|
height: 400px;
|
||||||
|
border: 1px solid black;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
p {
|
||||||
|
margin: 0 0 0.5em 0;
|
||||||
|
padding: 0 0 0.5em 0;
|
||||||
|
border-bottom: 1px dashed #99aa99;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\#input {
|
||||||
|
width: 600px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|]
|
||||||
|
toWidget [julius|
|
||||||
|
var url = document.URL,
|
||||||
|
output = document.getElementById("output"),
|
||||||
|
form = document.getElementById("form"),
|
||||||
|
input = document.getElementById("input"),
|
||||||
|
conn;
|
||||||
|
|
||||||
|
url = url.replace("http:", "ws:").replace("https:", "wss:");
|
||||||
|
conn = new WebSocket(url);
|
||||||
|
|
||||||
|
conn.onmessage = function(e) {
|
||||||
|
var p = document.createElement("p");
|
||||||
|
p.appendChild(document.createTextNode(e.data));
|
||||||
|
output.appendChild(p);
|
||||||
|
};
|
||||||
|
|
||||||
|
form.addEventListener("submit", function(e){
|
||||||
|
conn.send(input.value);
|
||||||
|
input.value = "";
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
|]
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
chan <- atomically newBroadcastTChan
|
||||||
|
warp 3000 $ App chan
|
||||||
Loading…
Reference in New Issue
Block a user