更新联网相关代码(非最终,但不会运行到)

This commit is contained in:
MrZ626
2021-03-01 16:35:09 +08:00
parent 33101665e3
commit a9c892e6c7
9 changed files with 230 additions and 134 deletions

View File

@@ -427,9 +427,10 @@ function love.errorhandler(msg)
love.timer.sleep(.26) love.timer.sleep(.26)
end end
end end
local WSnames={"app","chat","play","stream"} local WSnames={"app","user","chat","play","stream"}
local WScolor={ local WScolor={
{1,0,0,.26}, {1,0,0,.26},
{1,.7,0,.26},
{0,.7,1,.26}, {0,.7,1,.26},
{0,1,0,.26}, {0,1,0,.26},
{1,1,0,.26} {1,1,0,.26}
@@ -540,7 +541,7 @@ function love.run()
gc_push("transform") gc_push("transform")
gc.translate(SCR.w,0) gc.translate(SCR.w,0)
gc.scale(SCR.k) gc.scale(SCR.k)
for i=1,4 do for i=1,5 do
local status=WS.status(WSnames[i]) local status=WS.status(WSnames[i])
gc_setColor(WScolor[i]) gc_setColor(WScolor[i])
gc_rectangle("fill",0,20*i,-20,-20) gc_rectangle("fill",0,20*i,-20,-20)

View File

@@ -328,6 +328,11 @@ do
end end
end end
if STAT.version<1301 then
fs.remove("conf/user")
NOGAME=true
end
for _,v in next,VK_org do for _,v in next,VK_org do
if not v.color then if not v.color then
NOGAME=true NOGAME=true

View File

@@ -1063,84 +1063,200 @@ end
--Network tick function --Network funcs
function TICK_httpREQ_getAccessToken(task) do
local time=0 --[[
while true do launch:
coroutine.yield() local res=json.decode(res.body)
local response,request_error=client.poll(task) if res.message=="OK"then
if response then LOG.print(res.notice,360,COLOR.sky)
local res=json.decode(response.body) if VERSION_CODE>=res.version_code then
if response.code==200 and res.message=="OK"then LATEST_VERSION=true
LOG.print(text.accessSuccessed)
USER.access_token=res.access_token
FILE.save(USER,"conf/user")
SCN.swapTo("net_menu")
else else
LOGIN=false LOG.print(string.gsub(text.oldVersion,"$1",res.version_name),"warn")
USER.access_token=false
USER.auth_token=false
LOG.print(text.loginFailed..": "..text.httpCode..response.code.."-"..res.message,"warn")
end end
return else
elseif request_error then LOG.print(text.httpCode..res.code..": "..res.message,"warn")
LOG.print(text.loginFailed..": "..request_error,"warn")
return
end end
time=time+1
if time>360 then register:
LOG.print(text.loginFailed..": "..text.httpTimeout,"message") if response.message=="OK"then
return LOGIN=true
USER.name=res.name
USER.id=res.id
USER.motto=res.motto
USER.avatar=res.avatar
FILE.save(USER,"conf/user","q")
LOG.print(text.registerSuccessed..": "..res.message)
else
LOG.print(text.httpCode..response.code..": "..res.message,"warn")
end end
end
end autoLogin:
function TICK_httpREQ_getUserInfo(task) if res.message=="OK"then
local time=0 LOGIN=true
while true do LOG.print(text.loginSuccessed)
coroutine.yield() httpRequest(
local response,request_error=client.poll(task) TICK_httpREQ_getUserInfo,
if response then PATH.http..PATH.user,
local res=json.decode(response.body) "GET",
if response.code==200 and res.message=="OK"then {["Content-Type"]="application/json"},
USER.name=res.username json.encode{
USER.motto=res.motto email=USER.email,
USER.avatar=res.avatar authToken=USER.authToken,
FILE.save(USER,"conf/user") }
else )
LOG.print("Get user info failed: "..text.httpCode..response.code.."-"..res.message,"warn") else
LOGIN=false
LOG.print(text.loginFailed..": "..text.httpCode..res.code.."-"..res.message,"warn")
end
return
newLogin:
if res.message=="OK"then
LOGIN=true
USER.email=res.email
USER.authToken=res.authToken
USER.id=res.id
FILE.save(USER,"conf/user","q")
LOG.print(text.loginSuccessed)
--TODO:getUserInfo
json.encode{
email=USER.email,
authToken=USER.authToken,
}
--TODO:getAccessToken
json.encode{
email=USER.email,
authToken=USER.authToken,
}
else
LOG.print(text.httpCode..res.code..": "..res.message,"warn")
end
manualAutoLogin:
if res.message=="OK"then
LOG.print(text.accessSuccessed)
SCN.go("net_menu")
elseif res.code==403 or res.code==401 then
httpRequest(
TICK_httpREQ_getAccessToken,
PATH.http..PATH.access,
"POST",
{["Content-Type"]="application/json"},
json.encode{
email=USER.email,
authToken=USER.authToken,
}
)
else
local err=json.decode(res.body)
if err then
LOG.print(text.httpCode..res.code..": "..err.message,"warn")
end end
return
elseif request_error then
LOG.print(text.loginFailed..": "..request_error,"warn")
return
end end
time=time+1
if time>360 then getAccessToken:
LOG.print(text.loginFailed..": "..text.httpTimeout,"message") if res.message=="OK"then
return LOG.print(text.accessSuccessed)
USER.accessToken=res.accessToken
FILE.save(USER,"conf/user")
SCN.swapTo("net_menu")
else
LOGIN=false
USER.accessToken=false
USER.authToken=false
LOG.print(text.loginFailed..": "..text.httpCode..response.code.."-"..res.message,"warn")
end end
end
end getUserInfo:
function TICK_wsRead() if res.message=="OK"then
while true do USER.name=res.username
coroutine.yield() USER.motto=res.motto
if not WSCONN then return end USER.avatar=res.avatar
local messages,readErr=client.read(WSCONN) FILE.save(USER,"conf/user")
if messages then else
if SCN.socketRead then LOG.print("Get user info failed: "..text.httpCode..response.code.."-"..res.message,"warn")
for i=1,#messages do end
SCN.socketRead(messages[i])
goChatRoom:
if res.message=="OK"then
SCN.go("net_chat")
LOG.print(text.wsSuccessed,"warn")
else
LOG.print(text.wsFailed..": "..connErr,"warn")
end
fetchRooms:
if res.message=="OK"then
rooms=res.room_list
else
LOG.print(text.httpCode..response.code..": "..res.message,"warn")
end
createRoom:
if res.message=="OK" then
LOG.print(text.createRoomSuccessed)
enterRoom(res.room.id)
else
LOG.print(text.httpCode..res.code..": "..res.message,"warn")
end
enterRoom:
if res.message=="OK"then
loadGame("netBattle",true,true)
LOG.print(text.wsSuccessed,"warn")
else
LOG.print(text.wsFailed..": "..connErr,"warn")
end
]]
function TICK_WS_app()
while true do
coroutine.yield()
local status=WS.status("app")
if status=="running"then
local message,op=WS.read("app")
if message then
if op=="ping"then
WS.send("app",message,"pong")
--TODO: ping animation
--TODO: what to do with res?
elseif op=="close"then
LOG.print(text.wsClose..message,"warn")
return
else
message=json.decode(message)
end
end end
else elseif status~="connecting"then
return WS.connect("app","/app")
end end
elseif readErr then
WSCONN=false
LOG.print(text.wsError..tostring(readErr),"warn")
while #SCN.stack>4 do
SCN.pop()
end
return
end end
end end
function TICK_WS_chat()
while true do
coroutine.yield()
local status=WS.status("chat")
if status=="running"then
local message,op=WS.read("chat")
if message then
if op=="ping"then
WS.send("chat",message,"pong")
--TODO: ping animation
--TODO: what to do with res?
elseif op=="close"then
LOG.print(text.wsClose..message,"warn")
return
else
message=json.decode(message)
end
end
end
end
end
--TODO: more WSs
end end

View File

@@ -236,8 +236,8 @@ USER=FILE.load("conf/user")or{--User infomation
email=false, email=false,
motto=false, motto=false,
avatar=false, avatar=false,
auth_token=false, authToken=false,
access_token=false, accessToken=false,
--Local data --Local data
xp=0,lv=1, xp=0,lv=1,

View File

@@ -132,19 +132,10 @@ function scene.update()
SFX.play("welcome_sfx") SFX.play("welcome_sfx")
VOC.play("welcome_voc") VOC.play("welcome_voc")
--[[TODO --[[TODO
httpRequest(tick_httpREQ_launch,PATH.http..PATH.appInfo) WS.send("user",json.encode{
if USER.auth_token and USER.email then id=USER.id,
httpRequest( authToken=USER.authToken,
tick_httpREQ_autoLogin, })
PATH.http..PATH.auth,
"GET",
{["Content-Type"]="application/json"},
json.encode{
email=USER.email,
auth_token=USER.auth_token,
}
)
end
]] ]]
if FESTIVAL=="Xmas"then if FESTIVAL=="Xmas"then
LOG.print("==============",COLOR.red) LOG.print("==============",COLOR.red)

View File

@@ -7,10 +7,10 @@ local function login()
LOG.print(text.noPassword)return LOG.print(text.noPassword)return
end end
--[[TODO --[[TODO
json.encode{ WS.send("user",json.encode{
email=email, email=email,
password=password, password=password,
} })
]] ]]
end end

View File

@@ -71,28 +71,18 @@ scene.widgetList={
WIDGET.newButton{name="online", x=370,y=220,w=200,h=140,color="lCyan", font=40,code=function() WIDGET.newButton{name="online", x=370,y=220,w=200,h=140,color="lCyan", font=40,code=function()
if LOGIN then if LOGIN then
--[[TODO --[[TODO
if USER.access_token then if USER.accessToken then
httpRequest( WS.send("app",json.encode{
tick_httpREQ_manualAutoLogin, opration="access",
PATH.http..PATH.access, email=USER.email,
"GET", accessToken=USER.accessToken,
{["Content-Type"]="application/json"}, })
json.encode{
email=USER.email,
access_token=USER.access_token,
}
)
else else
httpRequest( WS.send("app",json.encode{
TICK_httpREQ_getAccessToken, opration="access",
PATH.http..PATH.access, email=USER.email,
"POST", authToken=USER.authToken,
{["Content-Type"]="application/json"}, })
json.encode{
email=USER.email,
auth_token=USER.auth_token,
}
)
end end
]] ]]
else else

View File

@@ -7,14 +7,7 @@ end
scene.widgetList={ scene.widgetList={
WIDGET.newButton{name="ffa", x=640, y=200,w=350,h=120,font=40,code=NULL}, WIDGET.newButton{name="ffa", x=640, y=200,w=350,h=120,font=40,code=NULL},
WIDGET.newButton{name="rooms", x=640, y=360,w=350,h=120,font=40,code=goScene"net_rooms"}, WIDGET.newButton{name="rooms", x=640, y=360,w=350,h=120,font=40,code=goScene"net_rooms"},
WIDGET.newButton{name="chat", x=640, y=540,w=350,h=120,font=40,code=function() WIDGET.newButton{name="chat", x=640, y=540,w=350,h=120,font=40,code=goScene"net_chat",hide=function()return WS.status("chat")~="running"end},
--[[TODO
wsConnect("chat","/chat",json.encode{
email=USER.email,
token=USER.access_token,
})
]]
end},
WIDGET.newButton{name="back", x=1140, y=640,w=170,h=80,font=40,code=backScene}, WIDGET.newButton{name="back", x=1140, y=640,w=170,h=80,font=40,code=backScene},
} }

View File

@@ -8,23 +8,23 @@ local lastCreateRoomTime=0
local function enterRoom(roomID) local function enterRoom(roomID)
--[[TODO --[[TODO
WS.connect("play","/play",json.encode{ WS.connect("play","/play",json.encode{
email=USER.email, email=USER.email,
token=USER.access_token, token=USER.accessToken,
id=roomID, id=roomID,
conf=dumpBasicConfig(), conf=dumpBasicConfig(),
-- password=password, -- password=password,
}) })
]] ]]
end end
local function fresh() local function fresh()
lastfreshTime=TIME() lastfreshTime=TIME()
rooms=nil rooms=nil
--[[TODO --[[TODO
WS.connect("play","/play",json.encode{ WS.connect("play","/play",json.encode{
email=USER.email, email=USER.email,
access_token=USER.access_token, accessToken=USER.accessToken,
}) })
]] ]]
end end
@@ -48,12 +48,12 @@ function scene.keyDown(k)
elseif k=="n"then elseif k=="n"then
if TIME()-lastCreateRoomTime>26 then if TIME()-lastCreateRoomTime>26 then
--[[TODO --[[TODO
WS.send("room",json.encode{ WS.send("room",json.encode{
email=USER.email, email=USER.email,
access_token=USER.access_token, accessToken=USER.accessToken,
room_name=(USER.name or"???").."'s room", room_name=(USER.name or"???").."'s room",
room_password=nil, room_password=nil,
}) })
]] ]]
lastCreateRoomTime=TIME() lastCreateRoomTime=TIME()
else else