local WinLogin_Controller = {} local private = {} local JSON = require("cjson") local EventSystem = require('Event/EventSystem') local Login_Implement = require("Modules/Login/Login_Implement") local HttpReq = require('Http/HttpReq') local LuaFuncEntry = require("Main/LuaFuncEntry") local QrcodeDataKey = "QrcodeDataKey" --一些项目配置参数 local PC_AppId = 0 local PC_FunctionId = 0 local PC_PlanId = 0 function WinLogin_Controller.OnStartup() private.SetupEntryFunc(true) if GameAppInfo.IsChinesePackage() then PC_AppId = 1002 PC_FunctionId = 5 PC_PlanId = 2 elseif GameAppInfo.IsOverseaPackage() then PC_AppId = 1009 end if WinLogin_Controller.IsGameStreamerPackage() then --主播PC包添加默认渠道 SDKUtil.OnQrCodeSuccess("channelId=99999") end end function private.SetupEntryFunc(isRegist) LuaFuncEntry.SetupMainEntryFunc(isRegist, LuaFuncEntry.FuncType.OnScanQrcodeSuccess, private.OnScanQrcodeResult, LuaFuncEntry.FuncType.OnLaunchBarcodeScanner, private.OnLaunchBarcodeScanner ) end function WinLogin_Controller.OnShutdown() private.SetupEntryFunc(false) end function WinLogin_Controller.SwitchAccount() local qrcodeData = PersistentData.DeviceData:Get(QrcodeDataKey, {}) qrcodeData.isSwitchAccount = true qrcodeData.time = nil qrcodeData.data = nil qrcodeData.isAutoLogin = false qrcodeData.hadPlayCGOver = true PersistentData.DeviceData:Set(QrcodeDataKey, qrcodeData, true) SDKUtil.OnPCSdkLoginSuccess(string.format("%s|%s|%s|%s|%s|%s|%s", "", "", "", false, "", false, "")) LuaNetManager.RebootGame() end function WinLogin_Controller.TryWinGameStart() if GameAppInfo.IsPCPackageWithSdk() and not SDKUtil.IsHasUserInfo() then if CTL.WinLogin.IsUsePCNtSdk() then SDKUtil.EnableSdkLog(true) return false end local qrcodeData = PersistentData.DeviceData:Get(QrcodeDataKey, {}) if not qrcodeData.hadPlayCGOver then local context = {movieID = MDL.Login.GetLoginShowPath(), banSkipTime = 1, autoPassTime = -1, callback = private.OpenQrcodePanel, noNeedBI = true} UIManager.OpenView(Const_UI_Lua.UIEnum.UIMoviePanel, context) else private.OpenQrcodePanel() end return true end return false end function private.OpenQrcodePanel() --本地是否有扫码登录数据,有的话直接登录 BIManager.DispatchBIClientEvent(BIManager.EventName.PC_ReqScanQrCode) local lastQrcodeData = PersistentData.DeviceData:Get(QrcodeDataKey, {}) if not lastQrcodeData.isAutoLogin or string.isNilOrEmpty(lastQrcodeData.data) or (os.time()-lastQrcodeData.time or 0)>=UTL.Time.TotalSecondsOneWeek then lastQrcodeData.time = nil lastQrcodeData.data = nil lastQrcodeData.hadPlayCGOver = true PersistentData.DeviceData:Set(QrcodeDataKey, lastQrcodeData, true) CTL.Login.ShowLoginMoviePanel(MDL.Login.LoginBGTypeEnum.Video, MDL.Login.GetLoginShowPath()) UIManager.OpenView(Const_UI_Lua.UIEnum.UIQRCodeLogin) else WinLogin_Controller.SetIsAutoLogin(lastQrcodeData.isAutoLogin) private.OnScanQrcodeResult(lastQrcodeData.data, lastQrcodeData.data) end end function WinLogin_Controller.SetIsAutoLogin(isAutoLogin) private.isAutoLogin = isAutoLogin end function private.OnLaunchBarcodeScanner(code) if code == "2110" then UTL.MessageBox.ShowOnlyOkNoCloseBox(Const_IDS.IDS_WARNING, UIUtils.GetLocalizedTxt(Const_IDS.IDS_Pay_TokenError), function() SDKUtil.OnClickKickCallback() end) end end function private.OnScanQrcodeResult(qrCodeData, qrCodeDataHMT) if GameAppInfo.IsOverseaPackage() then TimerUtil.TimeOut(function() private.OnNTLoginSuccessHMT(qrCodeDataHMT, nil) end) elseif GameAppInfo.IsChinesePackage() then private.OnScanQrcodeSuccess(qrCodeData) end end function private.SetLocalQrcodeData(qrCodeData) local saveData = PersistentData.DeviceData:Get(QrcodeDataKey, {}) if not saveData.time then saveData.time = os.time() saveData.data = qrCodeData saveData.isSwitchAccount = false saveData.isAutoLogin = private.isAutoLogin saveData.hadPlayCGOver = true PersistentData.DeviceData:Set(QrcodeDataKey, saveData, true) end end function private.OnScanQrcodeSuccess(qrCodeData) if not string.isNilOrEmpty(qrCodeData) then BIManager.DispatchBIClientEvent(BIManager.EventName.PC_RespScanQrCodeSuccess) local saveData = PersistentData.DeviceData:Get(QrcodeDataKey, {}) if not saveData.time then private.SetLocalQrcodeData(qrCodeData) end local sdkLoginData = {} local paramDataArr = string.split(qrCodeData, "&") for __, loginData in ipairs(paramDataArr) do local tempDataArr = string.split(loginData, "=") sdkLoginData[tempDataArr[1]] = tempDataArr[2] end logging.crit(LTAG.CRIT, "PC扫码数据返回", sdkLoginData) --拿到扫码结果后,开始进行NT登录 SDKUtil.OnQrCodeSuccess(qrCodeData) --之前的酷派渠道停止,加到了官方渠道下面 if sdkLoginData.imgId and sdkLoginData.imgId == LuaConst.SDKSubChannelId.KuPai then SDKUtil.OnQrCodeSuccess("channelId=16") sdkLoginData.channelId = "16" end if not sdkLoginData.cName then sdkLoginData.cName = sdkLoginData.cUid end BIManager.ReInitBIChannelID() private.StartNTLogin(sdkLoginData) else logging.error(LTAG.ERROR, "PC扫码返回失败") BIManager.DispatchBIClientEvent(BIManager.EventName.PC_RespScanQrCodeFail) private.OnPCPackageLoginFailed() end end function private.StartNTLogin(sdkLoginData) local paramFormat = "appId=%s&channelId=%s&clientPlat=pc&deviceId=%s&functionId=%s&phoneModel=pc&planId=%s&thirdName=%s&thirdToken=%s&thirdUid=%s" local paramStr = string.format(paramFormat, PC_AppId, sdkLoginData.channelId, sdkLoginData.deviceNum, PC_FunctionId, PC_PlanId, sdkLoginData.cName, sdkLoginData.accessToken, sdkLoginData.cUid) local tempData = { appId = PC_AppId, channelId=sdkLoginData.channelId, clientPlat="pc", deviceId=sdkLoginData.deviceNum, functionId=PC_FunctionId, phoneModel="pc", planId=PC_PlanId, thirdName=sdkLoginData.cName, thirdToken=sdkLoginData.accessToken, thirdUid=sdkLoginData.cUid, } tempData.sign=SDKUtil.GetNtLoginSign(paramStr, MDL.WinLogin.GetNTServerPublicKey(), "UTF-8") if GameAppInfo.IsOfficalPackage() then Login_Implement.StartNTLogin("https://safeapi.ntplat.com/function/login/enter", JSON.encode(tempData), private.OnNTLoginSuccess, private.OnNTLoginFail) else Login_Implement.StartNTLogin("https://safeapi-qa.ntplat.com/function/login/enter", JSON.encode(tempData), private.OnNTLoginSuccess, private.OnNTLoginFail) end end function private.OnNTLoginSuccess(loginResultJson, url) if not string.isNilOrEmpty(loginResultJson) then local loginRespData = JSON.decode(loginResultJson) if loginRespData then if loginRespData.code == 0 then BIManager.DispatchBIClientEvent(BIManager.EventName.PC_RespLoginNTSuccess) logging.crit(LTAG.CRIT, "NT登录数据返回", loginRespData) SDKUtil.OnPCSdkLoginSuccess(string.format("%s|%s|%s|%s|%s|%s|%s", loginRespData.result.cpUid, loginRespData.result.showName or "", loginRespData.result.id, tostring(loginRespData.result.newUser), string.format("%19.0f", loginRespData.result.uid), false, "")) EventSystem.Dispatch(EventID.PCPackage_NTLoginSuccess) else BIManager.DispatchBIClientEvent(BIManager.EventName.PC_RespLoginNTFail, "ErrorCode", loginRespData.code) logging.error(LTAG.ERROR, "NT登录失败", loginRespData) private.OnPCPackageLoginFailed(loginRespData.code) end else logging.error(LTAG.ERROR, "NT登录失败", loginRespData) BIManager.DispatchBIClientEvent(BIManager.EventName.PC_RespLoginNTFail, "ErrorCode", loginResultJson) private.OnPCPackageLoginFailed() end else logging.error(LTAG.ERROR, "NT登录失败", loginResultJson) BIManager.DispatchBIClientEvent(BIManager.EventName.PC_RespLoginNTFail) private.OnPCPackageLoginFailed() end end function private.OnNTLoginFail(errorCode, exception, stackTrace, failedURL) logging.error(LTAG.ERROR, "NT登录失败", errorCode, exception, failedURL) private.OnPCPackageLoginFailed(errorCode) end function private.OnPCPackageLoginFailed(errorCode) if errorCode and errorCode>0 then if errorCode == 3004 then UTL.MessageBox.ShowOnlyOkNoCloseBox("", Const_IDS.IDS_PCPackage_TryLoginAgain, WinLogin_Controller.SwitchAccount) return end end UTL.MessageBox.ShowOnlyOkNoCloseBox("", Const_IDS.IDS_PCPackage_UseCameraFail, WinLogin_Controller.SwitchAccount) end function WinLogin_Controller.UploadPCLogs(logsPath, prefixStr, logsCount) local logFiles = LuaExt.DirectoryGetFiles(logsPath, prefixStr, true) table.sort(logFiles) if not logFiles[logsCount] then logsCount = #logFiles end --只保留最后5条日志 for i=#logFiles-logsCount, 1, -1 do table.remove(logFiles, i) end SettingAPI.SetLogFilePause(true) local roleName, serverId = MDL.Login.GetRoleNameAndServerId() if string.isNilOrEmpty(roleName) then roleName = SystemInfo.deviceUniqueIdentifier end local tempData = { identification=PersistentData.DeviceData:Get("lastLoginAccid", SDKUtil.CurrentUserInfo.Uid), appId = PC_AppId, channelId=SDKUtil.ChannelID, clientPlat="pc", apkVersion = MDL.HotFix.GetVersionInfo(), phoneModel="pc", areaId = GameAppInfo.Global_ProductId, roleId = PersistentData.DeviceData:Get("lastLoginRoleId") or "2222", roleName = roleName or "roleName", serverId = serverId or "1111", serverName = PersistentData.DeviceData:Get("ServerName", "serverName"), } local paramFormat = "apkVersion=%s&appId=%s&areaId=%s&channelId=%s&clientPlat=pc&identification=%s&phoneModel=pc&roleId=%s&roleName=%s&serverId=%s&serverName=%s" local paramStr = string.format(paramFormat, tempData.apkVersion, tempData.appId, tempData.areaId, tempData.channelId, tempData.identification, tempData.roleId, tempData.roleName, tempData.serverId, tempData.serverName) tempData.sign=SDKUtil.GetNtLoginSign(paramStr, MDL.WinLogin.GetNTServerPublicKey(), "UTF-8") local logUrl if GameAppInfo.IsOfficalPackage() then if GameAppInfo.IsChinesePackage() then logUrl = "https://safeapi.ntplat.com/uout/other/upload/log" elseif GameAppInfo.IsOverseaPackage() then logUrl = "https://safeapi.newtypegames.com/uout/other/upload/log" end else if GameAppInfo.IsChinesePackage() then logUrl = "https://safeapi-qa.ntplat.com/uout/other/upload/log" elseif GameAppInfo.IsOverseaPackage() then logUrl = "https://safeapi-qa.newtypegames.com/uout/other/upload/log" end end Login_Implement.UploadPCLogs(logUrl, logFiles, tempData, private.OnUploadPCLogsSuccess, private.OnUploadPCLogsFail) SettingAPI.SetLogFilePause(false) end function private.OnUploadPCLogsSuccess(uploadResultJson, url) if not string.isNilOrEmpty(uploadResultJson) then local loginRespData = JSON.decode(uploadResultJson) if loginRespData and loginRespData.code == 0 then CTL.Tips.AddTipsMsg(Const_IDS.IDS_UploadLog_Success) else logging.error(LTAG.ERROR, "上传日志失败", loginRespData) CTL.Tips.AddTipsMsg(Const_IDS.IDS_UploadLog_Fail) end else logging.error(LTAG.ERROR, "上传日志失败", uploadResultJson) CTL.Tips.AddTipsMsg(Const_IDS.IDS_UploadLog_Fail) end end function private.OnUploadPCLogsFail(errorCode, exception, stackTrace, failedURL) logging.error(LTAG.ERROR, "上传日志失败", errorCode, exception, failedURL) CTL.Tips.AddTipsMsg(Const_IDS.IDS_UploadLog_Fail) end --是否主播PC包 function WinLogin_Controller.IsGameStreamerPackage() return GameAppInfo.IsGameStreamerPackage() end function private.OnNTLoginSuccessHMT(loginResultJson) if not string.isNilOrEmpty(loginResultJson) then private.SetLocalQrcodeData(loginResultJson) local loginRespData = JSON.decode(loginResultJson) if loginRespData then BIManager.DispatchBIClientEvent(BIManager.EventName.PC_RespLoginNTSuccess) logging.crit(LTAG.CRIT, "NT登录数据返回", loginRespData) SDKUtil.OnQrCodeSuccess("channelId=" .. loginRespData.channelId) SDKUtil.OnPCSdkLoginSuccess(string.format("%s|%s|%s|%s|%s|%s|%s", loginRespData.cpUid, loginRespData.showName or "", loginRespData.accessToken, "false", string.format("%19.0f", loginRespData.uid), false, "")) EventSystem.Dispatch(EventID.PCPackage_NTLoginSuccess) else logging.error(LTAG.ERROR, "NT登录失败", loginRespData) BIManager.DispatchBIClientEvent(BIManager.EventName.PC_RespLoginNTFail, "ErrorCode", loginResultJson) private.OnPCPackageLoginFailed() end else logging.error(LTAG.ERROR, "NT登录失败", loginResultJson) BIManager.DispatchBIClientEvent(BIManager.EventName.PC_RespLoginNTFail) private.OnPCPackageLoginFailed() end end --PC端上传角色信息 function WinLogin_Controller.UploadRoleInfo() local tempData = { accessToken = SDKUtil.CurrentUserInfo.Token, appId = PC_AppId, areaId = GameAppInfo.Global_ProductId, cpUid = SDKUtil.CurrentUserInfo.Uid, deviceId = SystemInfo.deviceUniqueIdentifier, roleId = MDL.Player.GetRoleId(), roleName = BattleDataGetter.GetPlayerName() or "roleName", serverId = MDL.Login.GetRealServerId(), serverName = MDL.Login.GetServerName(), uid = SDKUtil.CurrentUserInfo.SdkChannelUID, uniqueId = BattleDataGetter.GetAcID(), } local paramFormat = "accessToken=%s&appId=%s&areaId=%s&cpUid=%s&deviceId=%s&roleId=%s&roleName=%s&serverId=%s&serverName=%s&uid=%s&uniqueId=%s" local paramStr = string.format(paramFormat, tempData.accessToken, tempData.appId, tempData.areaId, tempData.cpUid, tempData.deviceId, tempData.roleId, tempData.roleName, tempData.serverId, tempData.serverName, tempData.uid, tempData.uniqueId) tempData.sign=SDKUtil.GetNtLoginSign(paramStr, MDL.WinLogin.GetNTServerPublicKey(), "UTF-8") Login_Implement.UploadRoleInfo(MDL.WinLogin.GetUploadRoleInfoUrl(), tempData, private.OnUploadRoleInfoSuccess, private.OnUploadRoleInfoFail) end function private.OnUploadRoleInfoSuccess(uploadResultJson, url) if not string.isNilOrEmpty(uploadResultJson) then local loginRespData = JSON.decode(uploadResultJson) if loginRespData and loginRespData.code == 0 then logging.crit(LTAG.CRIT, "上传角色信息成功", loginRespData) else logging.crit(LTAG.CRIT, "上传角色信息失败", loginRespData) end else logging.crit(LTAG.CRIT, "上传角色信息失败", uploadResultJson) end end function private.OnUploadRoleInfoFail(errorCode, exception, stackTrace, failedURL) logging.crit(LTAG.CRIT, "上传角色信息失败", errorCode, exception, failedURL) end function WinLogin_Controller.IsUsePCNtSdk() if not GameAppInfo.IsPCPackageWithSdk() then return false end if GameAppInfo.IsOverseaPackage() and GameAppInfo.IsVersionGreaterThan116600() then return true end return false end return WinLogin_Controller