
Extended hello_chat with Opa
By:
bahman on
Oct 18th, 2011 | syntax:
None | size: 2.14 KB | hits: 30 | expires: Never
// Extended hello_chat
// Bahman Movaqar
import stdlib.core.date
type message = {user: string; text: string; date: string;}
start() =
(
<div id=#main>
<h1>Welcome to Extended Hello Chat Application!</h1><hr />
<table>
<tr><td>Username:</td><td><input id=#user /></td></tr>
<tr><td>Room:</td><td><input id=#room /></td></tr>
<tr><td colspan="2"><input type="button" onclick={_ -> join_room()} value="Join" /></td></tr>
</table>
</div>
)
join_room() =
(
roomname = Dom.get_value(#room)
room = Network.cloud(roomname): Network.network(message)
user = String.to_lower(Dom.get_value(#user))
do notify_room(room, user)
callback = user_update(_, user)
line =
<h1>Room {roomname}</h1><hr />
<div id=#conversation onready={_ -> Network.add_callback(callback, room)} />
<input id=#user type="hidden" value="{user}" />
<input id=#entry onnewline={_ -> broadcast(room, user)} />
<input type="button" value="Send" onclick={_ -> broadcast(room, user)} />
do Dom.transform([#main <- line])
void
)
notify_room(room, user) =
(
date = Date.now()
do Network.broadcast({user="SERVER"
text="User '{user}' joined the room."
date="{Date.get_hour(date)}:{Date.get_min(date)}"}, room)
void
)
broadcast(room, user) =
(
text = Dom.get_value(#entry)
date = Date.now()
message = {~user ~text date="{Date.get_hour(date)}:{Date.get_min(date)}"}
do Network.broadcast(message, room)
Dom.clear_value(#entry)
)
user_update(x: message, current_user: string) =
(
line =
<div>{x.date} <b>{if current_user == x.user then "YOU" else x.user}</b>: {x.text}</div>
do Dom.transform([#conversation +<- line])
Dom.scroll_to_bottom(#conversation)
)
server = Server.one_page_bundle("Extended Hello Chat With Opa", [], [], start)