LoginMgr.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. /**
  2. * 登录数据管理
  3. */
  4. let LoginMgr = {
  5. //* ************* 初始化 ************* *//
  6. /**
  7. * 初始化
  8. *
  9. */
  10. init () {
  11. if (CC_EDITOR) {
  12. return;
  13. }
  14. // 注册消息
  15. G.PublicMgr.on(JMC.PUBLIC_MSG.SWITCH_ACCOUNT, JMC.PUBLIC_MSG_ORDER.LOGIN, this.handleDidSwitchAccount, this);
  16. G.PublicMgr.on(JMC.PUBLIC_MSG.LOGIN_SUCCESS, JMC.PUBLIC_MSG_ORDER.LOGIN, this.handleDidLoginSuccess, this);
  17. G.PublicMgr.on(JMC.PUBLIC_MSG.DISCONNECTED, JMC.PUBLIC_MSG_ORDER.LOGIN, this.handleDidDisconnected, this);
  18. this._initEventListener();
  19. this._initPublishListener();
  20. cc.game.on('e_mgr_load_config_done', this.initLocalConfig, this);
  21. cc.game.on('e_middle_auth_logout_result', this._handleAuthLogoutResult, this);
  22. },
  23. /**
  24. * 初始化事件侦听
  25. *
  26. */
  27. _initEventListener () {
  28. cc.game.on('e_socket_on_connected', this._handleSocketOnConected, this);
  29. cc.game.on('e_socket_on_closed', this._handleSocketOnClosed, this);
  30. cc.game.on('e_mgr_conf_download_result', this.handleConfDownloadResult, this);
  31. },
  32. /**
  33. * 初始化服务器请求事件侦听
  34. *
  35. */
  36. _initPublishListener () {
  37. },
  38. /**
  39. * 初始化本地配置
  40. *
  41. */
  42. initLocalConfig () {
  43. },
  44. /**
  45. * 离线
  46. *
  47. */
  48. offline () {
  49. // 容错:避免前面没有关闭socket,这里再关闭一次
  50. // closeSocket有非空判断,正常情况下不会有任何效果
  51. G.NetworkMgr.closeSocket();
  52. // 向各个Mgr发送断线消息
  53. G.PublicMgr.emit(JMC.PUBLIC_MSG.DISCONNECTED);
  54. },
  55. /**
  56. * 收到登录成功事件
  57. *
  58. */
  59. handleDidLoginSuccess () {
  60. // 标记在线状态
  61. this.isOnline = true;
  62. // 重连计数重置
  63. this.reconnectTimes = 0;
  64. // h5user_self_info on_h5user_system_info都收到
  65. cc.game.emit('e_socket_on_logined');
  66. },
  67. /**
  68. * 收到断网事件
  69. *
  70. */
  71. handleDidDisconnected () {
  72. this.isOnline = false;
  73. },
  74. /**
  75. * 收到切换账号事件
  76. *
  77. */
  78. handleDidSwitchAccount () {
  79. },
  80. /**
  81. * 中间层注销账号
  82. *
  83. */
  84. _handleAuthLogoutResult (eventData) {
  85. // eventData.data // 授权信息
  86. // 关闭websocket链接
  87. this.offline();
  88. cc.director.loadScene('scene_login');
  89. },
  90. //* ************* 客户端请求/响应 ************* *//
  91. /**
  92. * 请求注册
  93. *
  94. */
  95. // #注册
  96. // usr_register 1001 {
  97. // request {
  98. // version 1: string # 版本号
  99. // uuid 2: string # UUID
  100. // device 3: string # 设备名称
  101. // sysVer 4: string # 设备信息
  102. // channel 5: integer # 渠道号
  103. // apn 6: string # 玩家网络状态
  104. // operator 7: string # 运营商类型字段
  105. // platform 8: string # 登录平台
  106. // udid 9: string # UDID
  107. // appVerison 10: string # 对内版本号
  108. // deviceId 11: string # 设备号
  109. // }
  110. // response {
  111. // code 0: integer
  112. // sysTime 1: integer # 服务器时间
  113. // ip 2: string # Socket连接的IP
  114. // port 3: integer # Socket连接的Port
  115. // token 4: string # token
  116. // uid 5: integer #
  117. // password 6: string # 密码
  118. // http 7: integer # HTTP PORT
  119. // registerTime 8: integer # 注册时间
  120. // errorMsg 9: string # 登陆失败错误信息
  121. // isGuest 10: boolean # 是否游客
  122. // wsPort 11: integer # websocket连接端口
  123. // uuid 12: string # UUID
  124. // configVersion 13: string # configVersion
  125. // }
  126. // }
  127. requestRegister () {
  128. let info = {
  129. version: G.MiddleMgr.getVersion(),
  130. uuid: G.MiddleMgr.getUUID(),
  131. device: G.MiddleDevice.getDeviceName() + G.FuncUtils.randomInt(100000, 999999),
  132. sysVer: G.MiddleDevice.getDeviceInfo(),
  133. channel: G.MiddleDevice.getChannelId(),
  134. apn: G.MiddleDevice.getApnType(),
  135. operator: G.MiddleDevice.getOperator(),
  136. platform: cc.sys.platform,
  137. udid: G.MiddleMgr.getUDID(),
  138. appVerison: G.APP_VERSION,
  139. deviceId: G.MiddleMgr.getIDFAEncode(),
  140. };
  141. G.NetworkMgr.sendHttpRequestToLoginServer('usr_register', info, this._responseLogin.bind(this));
  142. },
  143. // # 注册 - 手机号
  144. // usr_register_by_phone 1002 {
  145. // request {
  146. // version 1: string # 必填 - 版本号
  147. // channel 2: integer # 必填 - 渠道号
  148. // device 3: string # 选填 - 设备名称
  149. // sysVer 4: string # 选填 - 设备信息
  150. // apn 5: string # 选填 - 玩家网络状态
  151. // operator 6: string # 选填 - 运营商类型字段
  152. // platform 7: string # 选填 - 登录平台
  153. // deviceId 8: string # 选填 - 设备号
  154. // phone 30: string # 必填 - 手机号
  155. // vcode 31: string # 必填 - 验证码
  156. // password 32: string # 必填 - 密码
  157. // nickname 33: string # 选填 - 昵称 - 空:手机号作为昵称
  158. // sharecode 34: string # 选填 - 邀请码
  159. // }
  160. // response {
  161. // code 0: integer
  162. // sysTime 1: integer # 服务器时间
  163. // ip 2: string # 游戏服网关地址
  164. // port 3: integer # 网关Socket连接的Port
  165. // wsPort 4: integer # 网关websocket连接端口
  166. // httpPort 5: integer # 网关HTTP PORT
  167. // token 6: string # token
  168. // uid 7: integer # 玩家id
  169. // registerTime 8: integer # 注册时间
  170. // errorMsg 9: string # 登陆失败错误信息
  171. // configVersion 10: string # configVersion
  172. // }
  173. // }
  174. requestRegisterByPhone (phone, password, nickname, sharecode) {
  175. let info = {
  176. version: G.MiddleMgr.getVersion(),
  177. channel: G.MiddleDevice.getChannelId(),
  178. phone: phone,
  179. vcode: "",
  180. password: password,
  181. nickname: nickname ? nickname : "",
  182. sharecode: sharecode ? sharecode : ""
  183. };
  184. G.NetworkMgr.sendHttpRequestToLoginServer('usr_register_by_phone', info, this._responseLogin.bind(this));
  185. },
  186. /**
  187. * 请求登录
  188. *
  189. * @param {string} uid 用户ID
  190. * @param {string} password 用户密码
  191. */
  192. // #登录
  193. // usr_login 1000 {
  194. // request {
  195. // uid 0: integer
  196. // version 1: string # 版本号
  197. // password 2: string # 密码
  198. // channel 3: integer # 渠道号
  199. // apn 4: string # 玩家网络状态
  200. // operator 5: string # 运营商类型字段
  201. // platform 6: string # 登录平台
  202. // appVerison 7: string # 对内版本号
  203. // uuid 8: string # UUID
  204. // udid 9: string # UDID
  205. // sysVer 10: string # 设备信息
  206. // }
  207. // response {
  208. // code 0: integer
  209. // sysTime 1: integer # 服务器时间
  210. // ip 2: string # Socket连接的IP
  211. // port 3: integer # Socket连接的Port
  212. // token 4: string # token
  213. // http 5: integer # HTTP PORT
  214. // registerTime 6: integer # 注册时间
  215. // errorMsg 7: string # 登陆失败错误信息
  216. // isGuest 8: boolean # 是否游客
  217. // wsPort 9: integer # websocket连接端口
  218. // uuid 10: string # UUID
  219. // configVersion 11: string # configVersion
  220. // }
  221. // }
  222. requestLogin (uid, password) {
  223. let info = {
  224. uid: uid,
  225. version: G.MiddleMgr.getVersion(),
  226. password: password,
  227. channel: G.MiddleDevice.getChannelId(),
  228. apn: G.MiddleDevice.getApnType(),
  229. operator: G.MiddleDevice.getOperator(),
  230. platform: cc.sys.platform,
  231. appVerison: G.APP_VERSION,
  232. udid: G.MiddleMgr.getUDID(),
  233. uuid: G.MiddleMgr.getUUID(),
  234. sysVer: G.MiddleDevice.getDeviceInfo(),
  235. };
  236. G.NetworkMgr.sendHttpRequestToLoginServer('usr_login', info, this._responseLogin.bind(this));
  237. },
  238. // # 登录 - 手机号
  239. // usr_login_by_phone 1003 {
  240. // request {
  241. // version 1: string # 必填 - 版本号
  242. // channel 2: integer # 必填 - 渠道号
  243. // device 3: string # 选填 - 设备名称
  244. // sysVer 4: string # 选填 - 设备信息
  245. // apn 5: string # 选填 - 玩家网络状态
  246. // operator 6: string # 选填 - 运营商类型字段
  247. // platform 7: string # 选填 - 登录平台
  248. // deviceId 8: string # 选填 - 设备号
  249. // phone 30: string # 必填 - 手机号
  250. // vcode 31: string # vcode/password必填 - 验证码 - 优先校验vcode
  251. // password 32: string # vcode/password必填 - 密码
  252. // }
  253. // response {
  254. // code 0: integer
  255. // sysTime 1: integer # 服务器时间
  256. // ip 2: string # 游戏服网关地址
  257. // port 3: integer # 网关Socket连接的Port
  258. // wsPort 4: integer # 网关websocket连接端口
  259. // httpPort 5: integer # 网关HTTP PORT
  260. // token 6: string # token
  261. // uid 7: integer # 玩家id
  262. // registerTime 8: integer # 注册时间
  263. // errorMsg 9: string # 登陆失败错误信息
  264. // configVersion 10: string # configVersion
  265. // }
  266. // }
  267. requestLoginByPhone (phone, password) {
  268. let info = {
  269. version: G.MiddleMgr.getVersion(),
  270. channel: G.MiddleDevice.getChannelId(),
  271. phone: phone,
  272. password: password
  273. };
  274. G.NetworkMgr.sendHttpRequestToLoginServer('usr_login', info, this._responseLogin.bind(this));
  275. },
  276. /**
  277. * 注册和登录的回调
  278. * 登录和注册返回的数据唯一不同是
  279. * 注册多了uid 和 password
  280. *
  281. * @author libo
  282. * @date 2019-06-19
  283. * @param {object} data
  284. */
  285. _responseLogin (data) {
  286. let requestInfo = data.requestInfo;
  287. let responseInfo = data.responseInfo;
  288. switch (responseInfo.code) {
  289. case 200: // 成功d
  290. case 2010: // 已经注册了的用户
  291. {
  292. if (responseInfo.sysTime && responseInfo.sysTime > 0) {
  293. G.TimeUtils.synTime(responseInfo.sysTime);
  294. }
  295. // 记录登录成功时间
  296. this.loginTimestamp = G.TimeUtils.getCurrentTime();
  297. // 特殊处理uid和password
  298. let uid = (responseInfo.uid) ? responseInfo.uid : requestInfo.uid;
  299. let password = (responseInfo.password) ? responseInfo.password : requestInfo.password;
  300. // 设置uid
  301. uid = parseInt(uid);
  302. G.UserMgr.setUid(uid);
  303. this.loginData = responseInfo;
  304. this.loginData.uid = uid;
  305. this.loginData.password = password;
  306. this._connectGameServer(responseInfo.ip, responseInfo.wsPort || responseInfo.http);
  307. break;
  308. }
  309. case 2004: // 密码错误
  310. {
  311. break;
  312. }
  313. case 2009: // 账号被封杀
  314. {
  315. break;
  316. }
  317. default: // 参数错误 或 未知错误
  318. {
  319. // 连接错误或者连接错误会返回 400
  320. break;
  321. }
  322. }
  323. // 将消息下发到ctrl中处理
  324. cc.game.emit('e_nwk_usr_login', data);
  325. },
  326. }
  327. module.exports = LoginMgr;