聊天室添加ui,websocket连接/断开功能拓展

This commit is contained in:
MrZ626
2020-12-05 16:53:43 +08:00
parent f5d4866996
commit 2a5242aa6e
10 changed files with 223 additions and 99 deletions

View File

@@ -33,6 +33,7 @@ local SCN={
keyUp=nil, keyUp=nil,
gamepadDown=nil, gamepadDown=nil,
gamepadUp=nil, gamepadUp=nil,
socketRead=nil,
}--Scene datas, returned }--Scene datas, returned
function SCN.add(name,scene) function SCN.add(name,scene)
@@ -72,6 +73,7 @@ function SCN.init(s,org)
SCN.keyUp=S.keyUp SCN.keyUp=S.keyUp
SCN.gamepadDown=S.gamepadDown SCN.gamepadDown=S.gamepadDown
SCN.gamepadUp=S.gamepadUp SCN.gamepadUp=S.gamepadUp
SCN.socketRead=S.socketRead
if SCN.sceneInit then SCN.sceneInit(org)end if SCN.sceneInit then SCN.sceneInit(org)end
end end
function SCN.push(tar,style) function SCN.push(tar,style)

View File

@@ -544,41 +544,75 @@ do--urlencode
end end
do--httpRequest & wsConnect do--httpRequest & wsConnect
client=LOADLIB("NETlib") client=LOADLIB("NETlib")
httpRequest= if client then
client and function(tick,path,method,header,body) function httpRequest(tick,path,method,header,body)
local task,err=client.httpraw{ local task,err=client.httpraw{
url="http://krakens.tpddns.cn:10026"..path, url="http://krakens.tpddns.cn:10026"..path,
method=method or"GET", method=method or"GET",
header=header, header=header,
body=body, body=body,
} }
if task then if task then
TASK.newNet(tick,task) TASK.newNet(tick,task)
else else
LOG.print("NETlib error: "..err,"warn") LOG.print("NETlib error: "..err,"warn")
end
TASK.netTaskCount=TASK.netTaskCount+1
end end
TASK.netTaskCount=TASK.netTaskCount+1
end or
function()
LOG.print("[NO NETlib]",5,COLOR.yellow)
end
wsConnect= function wsConnect(tick,path,header)
client and function(tick,path,header) local task,err=client.wsraw{
local task,err=client.wsraw{ url="ws://krakens.tpddns.cn:10026"..path,
url="ws://krakens.tpddns.cn:10026"..path, origin="krakens.tpddns.cn",
origin="krakens.tpddns.cn", header=header,
header=header, }
} if task then
if task then TASK.newNet(tick,task)
TASK.newNet(tick,task) else
else LOG.print("NETlib error: "..err,"warn")
LOG.print("NETlib error: "..err,"warn") end
TASK.netTaskCount=TASK.netTaskCount+1
end
function wsWrite(data)
if WSCONN then
local writeErr=client.write(WSCONN,data)
if writeErr then
LOG.print(writeErr,"error")
return
end
return true
else
LOG.print(text.wsNoConn,"warn")
end
end
else
local function noNetLib()
LOG.print("[NO NETlib]",5,COLOR.yellow)
end
httpRequest=noNetLib
wsConnect=noNetLib
wsWrite=noNetLib
end
end
do--wheelScroll
local floatWheel=0
function wheelScroll(y)
if y>0 then
if floatWheel<0 then floatWheel=0 end
floatWheel=floatWheel+y^1.2
elseif y<0 then
if floatWheel>0 then floatWheel=0 end
floatWheel=floatWheel-(-y)^1.2
end
while floatWheel>=1 do
love.keypressed("up")
floatWheel=floatWheel-1
end
while floatWheel<=-1 do
love.keypressed("down")
floatWheel=floatWheel+1
end end
TASK.netTaskCount=TASK.netTaskCount+1
end or
function()
LOG.print("[NO NETlib]",5,COLOR.yellow)
end end
end end
function copyList(org) function copyList(org)

View File

@@ -86,8 +86,15 @@ return{
loginFailed="Login failed", loginFailed="Login failed",
accessSuccessed="Successfully authorized!", accessSuccessed="Successfully authorized!",
accessFailed="Authorization failed", accessFailed="Authorization failed",
wsSuccessed="Websocket connected!", -- wsSuccessed="WS连接成功",
wsFailed="Websocket failed to connect", -- wsFailed="WS连接失败",
-- wsDisconnected="WS连接断开",
-- wsNoConn="WS未连接",
-- chatJoin="有人来了,当前人数:",
-- chatLeave="有人离开了,当前人数:",
-- chatRemain="人数:",
-- chatHistory="------以上是历史消息------",
errorMsg="An error has occurred and Techmino needs to restart.\nError info has been created, and you can send it to the author.", errorMsg="An error has occurred and Techmino needs to restart.\nError info has been created, and you can send it to the author.",
@@ -215,6 +222,7 @@ return{
chat="Chat", chat="Chat",
}, },
chat={ chat={
clear="Clear",
send="Send", send="Send",
}, },
setting_game={ setting_game={

View File

@@ -89,8 +89,15 @@ return{
-- loginFailed="Login failed", -- loginFailed="Login failed",
-- accessSuccessed="Successfully authorized!", -- accessSuccessed="Successfully authorized!",
-- accessFailed="Authorization failed", -- accessFailed="Authorization failed",
-- wsSuccessed="Websocket connected!", -- wsSuccessed="WS连接成功",
-- wsFailed="Websocket failed to connect", -- wsFailed="WS连接失败",
-- wsDisconnected="WS连接断开",
-- wsNoConn="WS未连接",
-- chatJoin="有人来了,当前人数:",
-- chatLeave="有人离开了,当前人数:",
-- chatRemain="人数:",
-- chatHistory="------以上是历史消息------",
errorMsg="Une erreur est survenue et Techmino doit redémarrer.\nDes informations concernant l'erreur ont été créées, et vous pouvez les envoyer au créateur.", errorMsg="Une erreur est survenue et Techmino doit redémarrer.\nDes informations concernant l'erreur ont été créées, et vous pouvez les envoyer au créateur.",
@@ -217,6 +224,7 @@ return{
-- chat="Chat", -- chat="Chat",
}, },
chat={ chat={
-- clear="Clear",
-- send="Send", -- send="Send",
}, },
setting_game={ setting_game={

View File

@@ -90,8 +90,15 @@ return{
-- loginFailed="Login failed", -- loginFailed="Login failed",
-- accessSuccessed="Successfully authorized!", -- accessSuccessed="Successfully authorized!",
-- accessFailed="Authorization failed", -- accessFailed="Authorization failed",
-- wsSuccessed="Websocket connected!", -- wsSuccessed="WS连接成功",
-- wsFailed="Websocket failed to connect", -- wsFailed="WS连接失败",
-- wsDisconnected="WS连接断开",
-- wsNoConn="WS未连接",
-- chatJoin="有人来了,当前人数:",
-- chatLeave="有人离开了,当前人数:",
-- chatRemain="人数:",
-- chatHistory="------以上是历史消息------",
errorMsg="Ha ocurrido un error y Techmino necesita reiniciarse.\nSe creó un registro de error, puedes enviarlo al autor.", errorMsg="Ha ocurrido un error y Techmino necesita reiniciarse.\nSe creó un registro de error, puedes enviarlo al autor.",
@@ -221,6 +228,7 @@ return{
-- chat="Chat", -- chat="Chat",
}, },
chat={ chat={
-- clear="Clear",
-- send="Send", -- send="Send",
}, },
setting_game={ setting_game={

View File

@@ -83,12 +83,19 @@ return{
diffPassword="两次密码不一致", diffPassword="两次密码不一致",
registerSuccessed="注册成功!", registerSuccessed="注册成功!",
registerFailed="注册失败", registerFailed="注册失败",
loginSuccessed="登录成功!", loginSuccessed="登录成功",
loginFailed="登录失败", loginFailed="登录失败",
accessSuccessed="授权成功!", accessSuccessed="授权成功",
accessFailed="授权失败", accessFailed="授权失败",
wsSuccessed="连接成功", wsSuccessed="WS连接成功",
wsFailed="连接失败", wsFailed="WS连接失败",
wsDisconnected="WS连接断开",
wsNoConn="WS未连接",
chatJoin="有人来了,当前人数:",
chatLeave="有人离开了,当前人数:",
chatRemain="人数:",
chatHistory="------以上是历史消息------",
errorMsg="Techmino遭受了雷击,需要重新启动.\n我们已收集了一些错误信息,你可以向作者进行反馈.", errorMsg="Techmino遭受了雷击,需要重新启动.\n我们已收集了一些错误信息,你可以向作者进行反馈.",
@@ -241,6 +248,7 @@ return{
chat="聊天室", chat="聊天室",
}, },
chat={ chat={
clear="清空",
send="发送", send="发送",
}, },
setting_game={ setting_game={

View File

@@ -1,36 +1,66 @@
local function socketWrite(message) local gc=love.graphics
if WSCONN then local Timer=love.timer.getTime
local writeErr=client.write(WSCONN,message)
if writeErr then print(writeErr,"warn")end local ins=table.insert
else local max,min=math.max,math.min
LOG.print("尚未连接到服务器","warn")
end local texts={}
end local remain--People in chat room
local scroll--Bottom message no.
local newMessasge=false--If there is a new message
local function sendMessage() local function sendMessage()
local W=WIDGET.active.text local W=WIDGET.active.text
if #W.value>0 then if #W.value>0 and wsWrite(W.value)then
socketWrite(W.value)
W.value="" W.value=""
end end
end end
local function clearHistory()
if #texts>0 then
texts={}
scroll=0
SFX.play("fall")
collectgarbage()
end
end
local scene={} local scene={}
function scene.sceneInit() function scene.sceneInit()
remain=nil
scroll=#texts
if scroll>0 then
if texts[scroll][1]~=COLOR.green then
ins(texts,{COLOR.green,text.chatHistory})
scroll=scroll+1
end
end
WIDGET.sel=WIDGET.active.text
BG.set("none") BG.set("none")
wsConnect( wsConnect(
TICK.wsCONN_connect, TICK.wsCONN_connect,
PATH.socket..PATH.chat.."?email="..urlEncode(ACCOUNT.email).."&access_token="..urlEncode(ACCOUNT.access_token) PATH.socket..PATH.chat.."?email="..urlEncode(ACCOUNT.email).."&access_token="..urlEncode(ACCOUNT.access_token)
) )
end end
function scene.sceneBack() function scene.sceneBack()
WSCONN=nil wsWrite("/quit")
WSCONN=nil
LOG.print(text.wsDisconnected,"warn")
end end
function scene.wheelMoved(_,y)
wheelScroll(y)
end
function scene.keyDown(k) function scene.keyDown(k)
if k=="return"then if k=="up"then
scroll=max(scroll-1,min(#texts,12))
elseif k=="down"then
scroll=min(scroll+1,#texts)
if scroll==#texts then
newMessasge=false
end
elseif k=="return"then
sendMessage() sendMessage()
elseif k=="escape"then elseif k=="escape"then
SCN.back() SCN.back()
@@ -39,8 +69,73 @@ function scene.keyDown(k)
end end
end end
function scene.socketRead(mes)
if mes:byte()==35 then--system message
local sep=mes:find(":")
local cmd=mes:sub(2,sep-1)
local data=mes:sub(sep+1)
if cmd=="J"then
remain=tonumber(data)
if remain<=10 then
ins(texts,{COLOR.yellow,text.chatJoin..remain})
end
elseif cmd=="L"then
remain=tonumber(data)
if remain<=10 then
ins(texts,{COLOR.yellow,text.chatLeave..remain})
end
end
else--user message
local sep=mes:find(":")
local num=mes:find("#")
ins(texts,{
COLOR.white,mes:sub(1,num-1),
COLOR.dY,mes:sub(num,sep-1).." ",
COLOR.sky,mes:sub(sep+1),
})
end
if scroll==#texts-1 then
scroll=scroll+1
else
SFX.play("spin_0",.8)
newMessasge=true
end
end
function scene.draw()
setFont(25)
gc.setColor(1,1,1)
gc.printf(text.chatRemain,800,10,400,"right")
gc.print(remain or"?",1205,10)
setFont(30)
for i=max(scroll-11,1),scroll do
gc.printf(texts[i],40,449-39*(scroll-i),1240)
end
--Slider
if #texts>12 then
gc.setLineWidth(2)
gc.rectangle("line",10,30,20,450)
local len=450*12/#texts
gc.rectangle("fill",10,30+(450-len)*(scroll-12)/(#texts-12),20,len)
end
--Draw
if scroll~=#texts then
setFont(40)
if newMessasge then
gc.setColor(1,Timer()%.4<.2 and 1 or 0,0)
else
gc.setColor(1,1,1)
end
gc.print("v",8,480)
end
end
scene.widgetList={ scene.widgetList={
WIDGET.newTextBox{name="text", x=40, y=500,w=980,h=180,font=40}, WIDGET.newTextBox{name="text", x=40, y=500,w=980,h=180,font=40},
WIDGET.newButton{name="clear", x=1140, y=440,w=170,h=80,font=40,code=clearHistory},
WIDGET.newButton{name="send", x=1140, y=540,w=170,h=80,font=40,code=sendMessage}, WIDGET.newButton{name="send", x=1140, y=540,w=170,h=80,font=40,code=sendMessage},
WIDGET.newButton{name="back", x=1140, y=640,w=170,h=80,font=40,code=WIDGET.lnk_BACK}, WIDGET.newButton{name="back", x=1140, y=640,w=170,h=80,font=40,code=WIDGET.lnk_BACK},
} }

View File

@@ -1,25 +1,6 @@
local gc=love.graphics local gc=love.graphics
local max,min=math.max,math.min local max,min=math.max,math.min
local floatWheel=0
local function wheelScroll(y)
if y>0 then
if floatWheel<0 then floatWheel=0 end
floatWheel=floatWheel+y^1.2
elseif y<0 then
if floatWheel>0 then floatWheel=0 end
floatWheel=floatWheel-(-y)^1.2
end
while floatWheel>=1 do
love.keypressed("up")
floatWheel=floatWheel-1
end
while floatWheel<=-1 do
love.keypressed("down")
floatWheel=floatWheel+1
end
end
local scene={} local scene={}
function scene.sceneInit() function scene.sceneInit()

View File

@@ -3,25 +3,6 @@ local Timer=love.timer.getTime
local sin=math.sin local sin=math.sin
local floatWheel=0
local function wheelScroll(y)
if y>0 then
if floatWheel<0 then floatWheel=0 end
floatWheel=floatWheel+y^1.2
elseif y<0 then
if floatWheel>0 then floatWheel=0 end
floatWheel=floatWheel-(-y)^1.2
end
while floatWheel>=1 do
love.keypressed("up")
floatWheel=floatWheel-1
end
while floatWheel<=-1 do
love.keypressed("down")
floatWheel=floatWheel+1
end
end
local scene={} local scene={}
function scene.sceneInit() function scene.sceneInit()

View File

@@ -323,6 +323,7 @@ function Tick.wsCONN_connect(task)
if wsconn then if wsconn then
WSCONN=wsconn WSCONN=wsconn
TASK.new(Tick.wsCONN_read) TASK.new(Tick.wsCONN_read)
LOG.print(text.wsSuccessed,"warn")
return return
elseif connErr then elseif connErr then
LOG.print(text.wsFailed..": "..connErr,"warn") LOG.print(text.wsFailed..": "..connErr,"warn")
@@ -341,15 +342,13 @@ function Tick.wsCONN_read()
if not WSCONN then return end if not WSCONN then return end
local messages,readErr=client.read(WSCONN) local messages,readErr=client.read(WSCONN)
if messages then if messages then
if messages[1]then for i=1,#messages do
LOG.print(messages[1]) SCN.socketRead(messages[i])
end end
elseif readErr then elseif readErr then
print("Read error: "..readErr) wsWrite("/quit")
if readErr=="EOF"then
LOG.print("Socket closed!","warn")
end
WSCONN=nil WSCONN=nil
LOG.print(text.wsDisconnected,"warn")
return return
end end
end end