【不能用】继续改联网,实现并替换一些发送ws请求的方法

框架跟进
This commit is contained in:
MrZ_26
2022-09-29 02:41:00 +08:00
parent 9ccc019bb9
commit f3face791f
9 changed files with 230 additions and 194 deletions

View File

@@ -178,6 +178,7 @@ Z.setOnFnKeys({
function()for k,v in next,_G do print(k,v)end end,
function()if love['_openConsole']then love['_openConsole']()end end,
})
Z.setVersionText(VERSION.string)
Z.setDebugInfo{
{"Cache",gcinfo},
{"Tasks",TASK.getCount},
@@ -691,6 +692,6 @@ if TABLE.find(arg,'--test')then
love.event.quit(1)
end)
end
WS.switchHost('cafuuchino1.3322.org','10026','/tech/socket/v1')
WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
HTTP.setHost("cafuuchino1.3322.org:10026")
HTTP.setThreadCount(1)

View File

@@ -1,5 +1,3 @@
local loveEncode,loveDecode=love.data.encode,love.data.decode
local WS=WS
local PLAYERS=PLAYERS
@@ -61,7 +59,7 @@ end
--------------------------<NEW API>
--------------------------<NEW HTTP API>
local function getMsg(request,timeout)
HTTP(request)
local totalTime=0
@@ -127,13 +125,13 @@ function NET.codeLogin(code)
if res then
if res.code==200 then
USER.rToken=res.refreshToken
USER.aToken=res.accessToken
-- TODO: connect WS
USER.rToken=res.data.refreshToken
USER.aToken=res.data.accessToken
NET.connectWS()
SCN.pop()SCN.go('net_menu')
elseif res.code==201 then
USER.rToken=res.refreshToken
USER.aToken=res.accessToken
USER.rToken=res.data.refreshToken
USER.aToken=res.data.accessToken
SCN.pop()SCN.push('net_menu')
SCN.fileDropped(3)
else
@@ -207,7 +205,7 @@ function NET.autoLogin()
if res then
if res.code==200 then
-- TODO: connect WS
NET.connectWS()
SCN.go('net_menu')
WAIT.interrupt()
return
@@ -228,9 +226,9 @@ function NET.autoLogin()
if res then
if res.code==200 then
USER.rToken=res.refreshToken
USER.aToken=res.accessToken
-- TODO: connect WS
USER.rToken=res.data.refreshToken
USER.aToken=res.data.accessToken
NET.connectWS()
MES.new('info',"Login successed",5)
SCN.go('net_menu')
WAIT.interrupt()
@@ -253,10 +251,11 @@ function NET.autoLogin()
},
},6.26)
if res then
print(TABLE.dump(res))
if res.code==200 then
USER.rToken=res.refreshToken
USER.aToken=res.accessToken
-- TODO: connect WS
USER.rToken=res.data.refreshToken
USER.aToken=res.data.accessToken
NET.connectWS()
MES.new('info',"Login successed",5)
SCN.go('net_menu')
WAIT.interrupt()
@@ -298,9 +297,9 @@ function NET.pwLogin(email,pw)
if res.code==200 then
USER.email=email
USER.password=pw
USER.rToken=res.refreshToken
USER.aToken=res.accessToken
-- TODO: connect WS
USER.rToken=res.data.refreshToken
USER.aToken=res.data.accessToken
NET.connectWS()
SCN.go('net_menu')
else
MES.new('error',res.message,5)
@@ -319,30 +318,200 @@ function NET.pwLogin(email,pw)
timeout=12.6,
}
end
--------------------------</NEW API>
--------------------------<NEW WS API>
local function wsSend(act,data)
WS.send('game',JSON.encode{
action=act,
data=data,
})
end
--Room
NET.room={}
function NET.room.chat(mes,rid)
wsSend(1300,{
message=mes,
roomId=rid,--Admin
})
end
function NET.room.create(roomName,description,capacity,roomType,roomData,password)
if TASK.lock('enterRoom',2)then
NET.roomState.private=not not password
NET.roomState.capacity=capacity
wsSend(1301,{
capacity=capacity,
info={
name=roomName,
type=roomType,
version=VERSION.room,
description=description,
},
data=roomData,
--Connect
function NET.wsconn()
password=password,
})
end
end
function NET.room.getData(rid)
wsSend(1302,{
roomId=rid,--Admin
})
end
function NET.room.setData(data,rid)
wsSend(1303,{
data=data,
roomId=rid,--Admin
})
end
function NET.room.getInfo(rid)
wsSend(1304,{
roomId=rid,--Admin
})
end
function NET.room.setInfo(info,rid)
wsSend(1305,{
info=info,
roomId=rid,--Admin
})
end
function NET.room.enter(rid,password)
if TASK.lock('enterRoom',6)then
SFX.play('reach',.6)
wsSend(1306,{
data={
rid=rid,
password=password,
}
})
end
end
function NET.room.kick(pid,rid)
wsSend(1307,{
playerId=pid,--Host
roomId=rid,--Admin
})
end
function NET.room.leave()
wsSend(1308)
end
function NET.room.fetch()
if TASK.lock('fetchRoom',3)then
wsSend(1309,{
data={
pageIndex=0,
pageSize=26,
}
})
end
end
function NET.room.setPW(pw,rid)
if TASK.lock('fetchRoom',3)then
wsSend(1310,{
data={
password=pw,
roomId=rid,--Admin
}
})
end
end
function NET.room.remove(rid)
wsSend(1311,{
roomId=rid--Admin
})
end
--Player
NET.player={}
function NET.player.updateConf()
wsSend(1200,dumpBasicConfig())
end
function NET.player.finish(mes)--what mes?
wsSend(1201,mes)
end
function NET.player.joinGroup(gid)
wsSend(1202,gid)
end
function NET.player.setReady(bool)
wsSend(1203,bool)
end
function NET.player.setHost(pid)
wsSend(1204,{
playerId=pid,
role='Admin',
})
end
function NET.player.setState(state)-- what state?
wsSend(1205,state)
end
function NET.player.stream(stream)
wsSend(1206,stream)
end
function NET.player.setPlaying(playing)
wsSend(1207,playing and 'Gamer' or 'Spectator')
end
--WS
function NET.connectWS()
if WS.status('game')=='dead'then
NET.roomState.start=true
WS.connect('stream','/stream',JSON.encode{
accessToken=USER.aToken,
WS.connect('game','',{
['x-access-token']=USER.aToken,
},6)
TASK.new(NET.updateWS_stream)
TASK.new(NET.updateWS)
end
end
function NET.closeWS()
WS.close('game')
end
function NET.updateWS()
while WS.status('game')~='dead'do
coroutine.yield()
local message,op=WS.read('game')
if message then
if op=='ping'then
elseif op=='pong'then
elseif op=='close'then
_closeMessage(message)
return
else
local res=_parse(message)
if res then
if res.type=='Connect'then
MES.new('info','Connected!')
elseif res.action==1100 then-- TODO
elseif res.action==1101 then-- TODO
elseif res.action==1102 then-- TODO
elseif res.action==1201 then-- TODO
elseif res.action==1202 then-- TODO
elseif res.action==1203 then-- TODO
elseif res.action==1204 then-- TODO
elseif res.action==1205 then-- TODO
elseif res.action==1206 then-- TODO
elseif res.action==1207 then-- TODO
elseif res.action==1301 then-- TODO
elseif res.action==1302 then-- TODO
elseif res.action==1303 then-- TODO
elseif res.action==1304 then-- TODO
elseif res.action==1305 then-- TODO
elseif res.action==1306 then-- TODO
elseif res.action==1307 then-- TODO
elseif res.action==1308 then-- TODO
elseif res.action==1309 then-- TODO
elseif res.action==1310 then-- TODO
elseif res.action==1311 then-- TODO
end
else
WS.alert('user')
end
end
end
end
end
--Disconnect
function NET.wsclose()
-- WS.close()
end
--------------------------<OLD ONLINE API>
--Account & User
function NET.getUserInfo(uid)
WS.send('game',JSON.encode{
action=1,
wsSend({
data={
uid=uid,
hash=USERS.getHash(uid),
@@ -353,7 +522,7 @@ end
--Save
function NET.uploadSave()
if TASK.lock('uploadSave',8)then
WS.send('game',JSON.encode{action=2,data={sections={
wsSend({data={sections={
{section=1,data=STRING.packTable(STAT)},
{section=2,data=STRING.packTable(RANKS)},
{section=3,data=STRING.packTable(SETTING)},
@@ -367,7 +536,7 @@ function NET.uploadSave()
end
function NET.downloadSave()
if TASK.lock('downloadSave',8)then
WS.send('game',JSON.encode{action=3,data={sections={1,2,3,4,5,6,7}}})
wsSend({data={sections={1,2,3,4,5,6,7}}})
MES.new('info',"Downloading")
end
end
@@ -415,145 +584,4 @@ function NET.loadSavedData(sections)
end
end
--Room
function NET.fetchRoom()
if TASK.lock('fetchRoom',3)then
WS.send('game',JSON.encode{
action=0,
data={
type=nil,
begin=0,
count=10,
}
})
end
end
function NET.createRoom(roomName,description,capacity,roomType,roomData,password)
if TASK.lock('enterRoom',2)then
NET.roomState.private=not not password
NET.roomState.capacity=capacity
WS.send('game',JSON.encode{
action=1,
data={
capacity=capacity,
password=password,
roomInfo={
name=roomName,
type=roomType,
version=VERSION.room,
description=description,
},
roomData=roomData,
config=dumpBasicConfig(),
}
})
end
end
function NET.enterRoom(room,password)
if TASK.lock('enterRoom',6)then
SFX.play('reach',.6)
WS.send('game',JSON.encode{
action=2,
data={
rid=room.rid,
config=dumpBasicConfig(),
password=password,
}
})
end
end
--Play
function NET.checkPlayDisconn()
return WS.status('game')~='running'
end
function NET.signal_quit()
if TASK.lock('quit',3)then
WS.send('game',JSON.encode{action=3})
end
end
function NET.sendMessage(mes)
WS.send('game',JSON.encode{action=3,data={message=mes}})
end
function NET.changeConfig()
WS.send('game',JSON.encode{action=5,data={config=dumpBasicConfig()}})
end
function NET.signal_setMode(mode)
if not NET.roomState.start and TASK.lock('ready',3)then
WS.send('game',JSON.encode{action=6,data={mode=mode}})
end
end
function NET.signal_die()
WS.send('game',JSON.encode{action=4,data={score=0,survivalTime=0}})
end
function NET.uploadRecStream(stream)
WS.send('game',JSON.encode{action=5,data={stream=loveEncode('string','base64',stream)}})
end
--Chat
function NET.sendChatMes(mes)
WS.send('game',"T"..loveEncode('string','base64',mes))
end
function NET.quitChat()
WS.send('game','q')
end
--WS task funcs
function NET.freshPlayerCount()
while WS.status('game')=='running'do
TEST.yieldN(260)
if TASK.lock('freshPlayerCount',10)then
WS.send('game',JSON.encode{action=3})
end
end
end
function NET.updateWS_user()
while WS.status('game')~='dead'do
coroutine.yield()
local message,op=WS.read('user')
if message then
if op=='ping'then
elseif op=='pong'then
elseif op=='close'then
_closeMessage(message)
return
else
local res=_parse(message)
if res then
if res.type=='Connect'then
if res.uid then
USER.uid=res.uid
USER.authToken=res.authToken
if SCN.cur=='login'then
SCN.back()
end
end
MES.new('check',text.loginOK)
--Get self infos
NET.getUserInfo(USER.uid)
TASK.unlock('wsc_user')
elseif res.action==0 then--Get accessToken
NET.accessToken=res.accessToken
MES.new('check',text.accessOK)
NET.wsconn()
elseif res.action==1 then--Get userInfo
USERS.updateUserData(res.data)
elseif res.action==2 then--Upload successed
TASK.unlock('uploadSave')
MES.new('check',text.exportSuccess)
elseif res.action==3 then--Download successed
TASK.unlock('downloadSave')
NET.loadSavedData(res.data.sections)
MES.new('check',text.importSuccess)
end
else
WS.alert('user')
end
end
end
end
end
return NET

View File

@@ -2845,7 +2845,7 @@ function Player:lose(force)
gameOver()
self:newTask(#PLAYERS>1 and task_lose or task_finish)
if GAME.net and not NET.spectate then
NET.signal_die()
NET.player.finish()
else
TASK.new(task_autoPause)
end

View File

@@ -9,7 +9,7 @@ function scene.sceneInit()
sysAndScn=SYSTEM.."-"..VERSION.string.." scene:"..Z.getErr('#').scene
errorText=LOADED and text.errorMsg or"An error has occurred while the game was loading.\nAn error log has been created so you can send it to the author."
errorShot,errorInfo=Z.getErr('#').shot,Z.getErr('#').mes
NET.wsclose()
NET.closeWS()
if SETTING then
SFX.fplay('error',SETTING.voc*.8 or 0)
end

View File

@@ -27,16 +27,24 @@ local function _hideReadyUI()
TASK.getLock('ready')
end
local function _setCancel()NET.signal_setMode(0)end
local function _setReady()NET.signal_setMode(1)end
local function _setSpectate()NET.signal_setMode(2)end
local function _setCancel()
NET.player.setPlaying(true)
NET.player.setReady(true)
end
local function _setReady()
NET.player.setReady(true)
end
local function _setSpectate()
NET.player.setPlaying(false)
end
local function _gotoSetting()
GAME.prevBG=BG.cur
SCN.go('setting_game')
end
local function _quit()
if tryBack()then
NET.signal_quit()
NET.room.leave()
if SCN.stack[#SCN.stack-1]=='net_newRoom'then
SCN.pop()
end
@@ -69,14 +77,13 @@ function scene.sceneInit()
newMessageTimer=0
if SCN.prev=='setting_game'then
NET.changeConfig()
NET.player.updateConf()
end
if GAME.prevBG then
BG.set(GAME.prevBG)
GAME.prevBG=false
end
if NET.specSRID then
NET.wsconn_stream(NET.specSRID)
NET.specSRID=false
end
end
@@ -137,7 +144,7 @@ function scene.keyDown(key,isRep)
elseif key=='return'then
local mes=STRING.trim(inputBox:getText())
if not inputBox.hide and #mes>0 then
NET.sendMessage(mes)
NET.room.chat(mes)
inputBox:clear()
else
_switchChat()
@@ -231,8 +238,8 @@ function scene.socketRead(cmd,d)
end
function scene.update(dt)
if NET.checkPlayDisconn()then
NET.wsclose()
if WS.status('game')~='running' then
NET.closeWS()
SCN.back()
return
end
@@ -261,7 +268,7 @@ function scene.update(dt)
elseif #stream%3==2 then
stream=stream.."\0\0\0\0"
end
NET.uploadRecStream(stream)
NET.player.stream(stream)
lastUpstreamTime=PLAYERS[1].alive and P1.frameRun or 1e99
end
else

View File

@@ -4,7 +4,7 @@ function scene.sceneInit()
BG.set()
end
function scene.sceneBack()
NET.wsclose()
NET.closeWS()
end
function scene.draw()
@@ -21,7 +21,7 @@ scene.widgetList={
code=function()
if tryBack()then
if USER.uid then
NET.wsclose()
NET.closeWS()
USER.uid=false
USER.authToken=false
SCN.back()

View File

@@ -36,7 +36,7 @@ local function _createRoom()
if #roomname==0 then
roomname=(USERS.getUsername(USER.uid)or"Anonymous").."'s room"
end
NET.createRoom(
NET.room.create(
roomname,
descriptionBox.value,
ROOMENV.capacity,

View File

@@ -51,7 +51,7 @@ local passwordBox=WIDGET.newInputBox{name='password',x=350,y=505,w=500,h=50,secr
}]]
local function _fetchRoom()
fetchTimer=10
NET.fetchRoom()
NET.room.fetch()
end
local scene={}
@@ -70,7 +70,7 @@ function scene.keyDown(key)
local R=roomList:getSel()
if TASK.getLock('fetchRoom')or not R then return end
if R.roomInfo.version==VERSION.room then
NET.enterRoom(R,passwordBox.value)
NET.room.enter(R,passwordBox.value)
else
MES.new('error',text.versionNotMatch)
end