--!movie
--!encoding=utf-8
global $
-- config
global BASEURL
global ALIVE_SEC
-- ID
global gMyID
-- receive
global gReceiveCh
----------------------------------------
--
----------------------------------------
on startMovie
-- libs
$.import("curl")
$.import("json")
$.import("timer")
-- config
BASEURL = "https://valentin.dasdeck.com/projects/https_chat/"
ALIVE_SEC = 180
-- window settings
w = 640
h = 480
_movie.stage.title = "HTTPS Chat"
_movie.stage.titlebarOptions.visible = TRUE
_movie.stage.rect = rect(0,0,w,h)
_movie.centerStage = TRUE
_movie.exitLock = TRUE
-- create "users" field
m = new(#field)
m.border = 1
m.boxType = #scroll
m.margin = 1
m.name = "users"
m.rect = rect(0,0,120-16,460)
m.alignment = "left"
m.fontsize = 12
sprite(1).puppet = TRUE
sprite(1).member = m
sprite(1).loc = point(10,10)
-- create "messages" field
m = new(#field)
m.border = 1
m.boxType = #scroll
m.margin = 1
m.name = "messages"
m.rect = rect(0,0,490-16,380)
m.alignment = "left"
m.fontsize = 12
sprite(2).puppet = TRUE
sprite(2).member = m
sprite(2).loc = point(140,10)
-- create "msg" field
m = new(#field)
m.editable = TRUE
m.border = 1
m.boxType = #scroll
m.margin = 1
m.name = "msg"
m.rect = rect(0,0,490-16,40)
m.alignment = "left"
m.fontsize = 12
m.scriptText = "on keyDown"&RETURN&\
" if _key.keyCode=36 then sendMessage()"&RETURN&\
" else pass()"&RETURN&\
"end"
sprite(3).puppet = TRUE
sprite(3).member = m
sprite(3).loc = point(140,400)
-- create send button
m = new(#button)
m.rect = rect(0,0,120,40)
m.text = "Send Message"
m.alignment = "center"
m.fontsize = 11
m.fontStyle = "bold"
m.scriptText = "on mouseUp"&RETURN&\
" sendMessage()"&RETURN&\
"end"
sprite(4).puppet = TRUE
sprite(4).member = m
sprite(4).loc = point(140,450)
-- show the window
_movie.stage.visible = 1
-- force immediate stage update
_movie.updateStage()
-- create alive timeout
$.timer.create(ALIVE_SEC*1000, #slotSendAlive)
connect()
end
----------------------------------------
-- @callback
----------------------------------------
on closeRequest
if not voidP(gMyID) then
disconnect()
end if
_movie.halt()
end
----------------------------------------
--
----------------------------------------
on connect ()
_ch = $.curl.init()
_ch.setOption($.curl.CURLOPT.URL, BASEURL&"?connect")
_ch.setOption($.curl.CURLOPT.SSL_VERIFYPEER, 0)
res = _ch.exec(1)
if integerP(res) then
put "ERROR:" && curl_error(res)
else
res = res.readRawString(res.length)
gMyID = integer(res)
-- start HTTP long polling message receive loop
reconnect()
end if
end
----------------------------------------
--
----------------------------------------
on disconnect ()
_ch = $.curl.init()
_ch.setOption($.curl.CURLOPT.URL, BASEURL&"?disconnect="&gMyID)
_ch.setOption($.curl.CURLOPT.SSL_VERIFYPEER, 0)
_ch.exec()
end
----------------------------------------
--
----------------------------------------
on showUserList (users)
str = ""
repeat with user in users
put user&RETURN after str
end repeat
delete the last char of str
member("users").color = rgb(0,0,0)
member("users").text = str
-- hilite myself
pos = users.getPos(gMyID)
if pos then member("users").line[pos].color=rgb(255,0,0)
end
----------------------------------------
--
----------------------------------------
on showNewMessages (msg)
m = member("messages")
if m.text=EMPTY then
n = 0
else
n = m.line.count
end if
repeat with row in msg
n = n+1
m.line[n] = row.peer_id&": "&row.data
if row.peer_id=gMyID then
-- hilite myself
m.line[n].color=rgb(255,0,0)
else
m.line[n].color=rgb(0,0,0)
end if
end repeat
end
----------------------------------------
--
----------------------------------------
on sendMessage ()
msg = member("msg").text
if msg=EMPTY then return
_ch = $.curl.init()
_ch.setOption($.curl.CURLOPT.URL, BASEURL&"?id="&gMyID&"&msg="&curl_escape(msg))
_ch.setOption($.curl.CURLOPT.SSL_VERIFYPEER, 0)
_ch.exec()
member("msg").text = ""
end
----------------------------------------
--
----------------------------------------
on reconnect()
gReceiveCh = VOID
gReceiveCh = $.curl.init()
gReceiveCh.setOption($.curl.CURLOPT.URL, BASEURL&"?id="&gMyID)
gReceiveCh.setOption($.curl.CURLOPT.SSL_VERIFYPEER, 0)
$.curl.execAsyncDetached(gReceiveCh, #slotCurlResult, _movie, 1)
end
----------------------------------------
-- @callback
----------------------------------------
on slotSendAlive ()
_ch = $.curl.init()
_ch.setOption($.curl.CURLOPT.URL, BASEURL&"?alive="&gMyID)
_ch.setOption($.curl.CURLOPT.SSL_VERIFYPEER, 0)
_ch.exec()
end
----------------------------------------
-- @callback
----------------------------------------
on slotCurlResult (res)
if integerP(res) then
put "ERROR:" && curl_error(res)
else
str = res.readRawString(res.length)
if str starts "list:" then
users = $.json.decode(str.char[6..str.length])
showUserList(users)
else if str starts "msg:" then
msg = $.json.decode(str.char[5..str.length])
showNewMessages(msg)
end if
end if
reconnect()
end