CocosHandler.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. /*
  2. * @Author: mojunshou 1637302775@qq.com
  3. * @Date: 2025-03-31 10:45:44
  4. * @LastEditors: mojunshou 1637302775@qq.com
  5. * @LastEditTime: 2025-04-10 10:48:20
  6. * @Description: CocosHandler 处理类负责与安卓交互
  7. */
  8. import { native } from 'cc';
  9. import { _decorator } from 'cc';
  10. import { DeviceUtil } from 'db://oops-framework/core/utils/DeviceUtil';
  11. import { smc } from '../SingletonModuleComp';
  12. import { Account } from '../../account/Account';
  13. import { oops } from 'db://oops-framework/core/Oops';
  14. import { GameEvent } from '../config/GameEvent';
  15. import { ProtocolEvent } from './ProtocolEvent';
  16. import { AndroidEvent } from '../config/AndroidEvent';
  17. import { UIID } from '../config/GameUIConfig';
  18. import { get } from 'http';
  19. import { AD_TYPE } from '../config/GameDefine';
  20. const { ccclass, property } = _decorator;
  21. type CocosHandlerType = {
  22. method: string;
  23. param?: string;
  24. }
  25. export class CocosHandler {
  26. // 单例模式
  27. private static _inst: CocosHandler;
  28. public static get inst(): CocosHandler {
  29. if (!this._inst) {
  30. this._inst = new CocosHandler();
  31. }
  32. return this._inst;
  33. }
  34. // 发送消息到 Android
  35. public async sendMessageToAndroid(data: CocosHandlerType) {
  36. if (DeviceUtil.isAndroid && DeviceUtil.isNative) {
  37. let result = await native.reflection.callStaticMethod("com/cocos/game/AtmobCocosCaller", "call", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", data.method, data.param);
  38. return result;
  39. }
  40. }
  41. //获取隐私授权状态
  42. async getPrivacyStatus() {
  43. const data: CocosHandlerType = {
  44. method: "privacy.grant.get",
  45. }
  46. let result = await this.sendMessageToAndroid(data);
  47. console.log("安卓返回隐私授权状态", result);
  48. return JSON.parse(result);
  49. }
  50. //保存隐私授权状态
  51. async savePrivacyStatus(status: boolean) {
  52. const param = {
  53. "granted": status,
  54. }
  55. const data: CocosHandlerType = {
  56. method: "privacy.grant.set",
  57. param: JSON.stringify(param)
  58. }
  59. let result = await this.sendMessageToAndroid(data);
  60. console.log("安卓返回隐私授权状态", result);
  61. return JSON.parse(result);
  62. }
  63. //打开隐私协议或者用户协议
  64. openAgreement() {
  65. const type = smc.account.AccountModel.protocolType;
  66. const param = {
  67. "url": type == 1 ? oops.config.game.gamePrivacyUrl : oops.config.game.gameProtocolUrl
  68. }
  69. const data: CocosHandlerType = {
  70. method: "system.browser.open",
  71. param: JSON.stringify(param)
  72. }
  73. this.sendMessageToAndroid(data);
  74. }
  75. //微信登录
  76. async wechat_login() {
  77. const param = {
  78. "callback":
  79. {
  80. "onSuccess": "CocosHandler.inst.wechat_login_success",
  81. "onFaile": "CocosHandler.inst.wechat_login_fail"
  82. }
  83. }
  84. const data: CocosHandlerType = {
  85. method: "auth.wechat",
  86. param: JSON.stringify(param)
  87. }
  88. this.sendMessageToAndroid(data);
  89. }
  90. //微信登录成功回调
  91. wechat_login_success(str: string) {
  92. console.log("微信登录成功回调", str);
  93. //保存数据
  94. // oops.message.dispatchEvent(GameEvent.WechatLoginSuss);
  95. // 获取用户信息
  96. //然后就是和服务器通信
  97. this.wx_login(str);
  98. }
  99. //微信登录失败回调
  100. wechat_login_fail(str: string) {
  101. console.log("微信登录失败回调", str);
  102. oops.gui.toast("微信登录失败");
  103. }
  104. //==================跟服务器交互======================
  105. //微信登录
  106. async wx_login(code: string) {
  107. const param = {
  108. "code": code,
  109. "url": ProtocolEvent.WechatLogin
  110. }
  111. const data: CocosHandlerType = {
  112. method: "request.post",
  113. param: JSON.stringify(param)
  114. }
  115. let result = await this.sendMessageToAndroid(data);
  116. console.log("微信登录结果", result);
  117. if (result.data) {
  118. this.getAccountInfo();
  119. }
  120. }
  121. //获取账号信息
  122. getAccountInfo() {
  123. const param = {
  124. "url": ProtocolEvent.AccountInfo,
  125. "callback": {
  126. "onSuccess": "CocosHandler.inst.getAccountInfo_success",
  127. "onFail": "CocosHandler.inst.getAccountInfo_fail"
  128. }
  129. }
  130. this.sendMsgToServer(param);
  131. }
  132. //获取账号信息成功回调
  133. getAccountInfo_success(str: string) {
  134. console.log("获取账号信息成功回调", str);
  135. //保存账号信息
  136. let data = JSON.parse(str);
  137. smc.account.AccountModel.uid = data.uid;
  138. console.log("uid>>>>>>>", data.uid);
  139. smc.account.AccountModel.curScore = data.currentLevelInfo.score;
  140. smc.account.AccountModel.curLevel = data.currentLevelInfo.level;
  141. smc.account.AccountModel.targetScore = smc.account.AccountModel.curLevelConfig.score;
  142. smc.account.AccountModel.curLevelConfig = data.currentLevelConf;
  143. smc.account.AccountModel.costInfo = data.handlingChargeConf;
  144. smc.account.AccountModel.isLogined = data.logined;
  145. smc.account.AccountModel.accountName = data.nickname;
  146. smc.account.AccountModel.uid = data.uid;
  147. smc.account.AccountModel.headUrl = data.headImgUrl;
  148. oops.message.dispatchEvent(GameEvent.UserLogin);
  149. }
  150. //获取账号信息失败回调
  151. getAccountInfo_fail(code: number, str: string) {
  152. console.log("获取账号信息失败回调", str);
  153. }
  154. //领取每日奖励
  155. getDailyReward(level: number) {
  156. const param = {
  157. "url": ProtocolEvent.GetDailyReward,
  158. "param": {
  159. "level": level
  160. },
  161. "callback": {
  162. "onSuccess": "CocosHandler.inst.getDailyReward_success",
  163. "onFail": "CocosHandler.inst.request_fail"
  164. }
  165. }
  166. this.sendMsgToServer(param);
  167. }
  168. //领取每日奖励成功回调
  169. getDailyReward_success(str: string) {
  170. console.log("领取每日奖励成功回调", str);
  171. }
  172. //======获取红包提现列表数据
  173. getDailyTaskReward() {
  174. //先请求一遍用户道具信息
  175. this.getUserItemInfo();
  176. const param = {
  177. "url": ProtocolEvent.GetDailyTask,
  178. "callback": {
  179. "onSuccess": "CocosHandler.inst.getDailyTaskReward_success",
  180. "onFail": "CocosHandler.inst.request_fail"
  181. }
  182. }
  183. this.sendMsgToServer(param);
  184. }
  185. //获取红包提现列表数据成功回调
  186. getDailyTaskReward_success(str: string) {
  187. console.log("获取红包提现列表数据成功回调", str);
  188. //这里再打开记录
  189. oops.message.dispatchEvent(GameEvent.openRedBagView, "openRedBagView");
  190. }
  191. //获取用户道具信息
  192. getUserItemInfo() {
  193. const param = {
  194. "url": ProtocolEvent.UserItemInfo,
  195. "callback": {
  196. "onSuccess": "CocosHandler.inst.getUserItemInfo_success",
  197. "onFail": "CocosHandler.inst.request_fail"
  198. }
  199. }
  200. this.sendMsgToServer(param);
  201. }
  202. //获取用户道具信息成功
  203. getUserItemInfo_success(str: string) {
  204. console.log("获取用户道具信息成功回调", str);
  205. //保存用户道具信息
  206. let result = JSON.parse(str);
  207. // smc.account.AccountModel.setUserItemInfo(result);
  208. smc.account.AccountModel.gameCoin = result.data.props["1005"];
  209. smc.account.AccountModel.cashCoin = result.data.props["1004"];
  210. smc.account.AccountModel.handlingCharge = result.data.props["1009"];
  211. smc.account.AccountModel.goldCoin = result.data.propsp["1006"];
  212. }
  213. //获取提现记录
  214. getRecordList() {
  215. const param = {
  216. "url": ProtocolEvent.GetWithdrawRecord,
  217. "param": {
  218. "offset": 0,
  219. "limit": 50
  220. },
  221. "callback": {
  222. "onSuccess": "CocosHandler.inst.getRecordList_success",
  223. "onFail": "CocosHandler.inst.request_fail"
  224. }
  225. }
  226. this.sendMsgToServer(param);
  227. }
  228. //获取提现记录成功
  229. getRecordList_success(str: string) {
  230. console.log("获取提现记录成功>>>>>>>>>>", str)
  231. let result = JSON.parse(str);
  232. if (result.count > 0) {
  233. smc.account.AccountModel.recordList = result.data.list;
  234. }
  235. oops.message.dispatchEvent(GameEvent.openRecordView);
  236. }
  237. //发送信息给服务器
  238. sendMsgToServer(param: any) {
  239. const data: CocosHandlerType = {
  240. method: "request.post",
  241. param: JSON.stringify(param)
  242. }
  243. this.sendMessageToAndroid(data);
  244. }
  245. request_fail(code: number, str: string) {
  246. console.log("请求失败回调", code, str);
  247. }
  248. //=================================以下是广告方法====================
  249. //每次启动都加载一次启屏广告
  250. //显示广告
  251. async show_ad(id: string) {
  252. const data: CocosHandlerType = {
  253. method: "",
  254. param: ""
  255. }
  256. const param = {
  257. "funcId": "",
  258. "callback":
  259. {
  260. "onLoaded": "",
  261. "onShow": "",
  262. "onLoadFailed": "",
  263. "onShowFailed": "",
  264. "onClose": ""
  265. }
  266. }
  267. switch (id) {
  268. //启屏广告
  269. case AD_TYPE.Start:
  270. param.funcId = id;
  271. param.callback.onShowFailed = "CocosHandler.inst.ad_splash_onShowFailed";
  272. param.callback.onClose = "CocosHandler.inst.ad_splash_close";
  273. data.method = "ad.splash";
  274. break;
  275. //插屏广告
  276. case AD_TYPE.Jion_Main:
  277. case AD_TYPE.Double_Close:
  278. case AD_TYPE.Rebates:
  279. case AD_TYPE.Double_Speed_Close:
  280. param.funcId = id;
  281. data.method = "ad.interstitial";
  282. param.callback.onClose = "CocosHandler.inst.ad_interstitial_close";
  283. param.callback.onShowFailed = "CocosHandler.inst.ad_interstitial_show_failed";
  284. break;
  285. //激励广告
  286. case AD_TYPE.Double_Receive:
  287. case AD_TYPE.Double_Speed_Receive:
  288. case AD_TYPE.Pass_Receive:
  289. case AD_TYPE.Resurrection:
  290. param.funcId = id;
  291. data.method = "ad.reward"
  292. param.callback.onClose = "CocosHandler.inst.ad_reward_close";
  293. param.callback.onShowFailed = "CocosHandler.inst.ad_reward_onShowFailed"
  294. break;
  295. }
  296. data.param = JSON.stringify(param);
  297. let result = await this.sendMessageToAndroid(data);
  298. console.log("广告ID", id, "广告返回数据", result);
  299. return result;
  300. }
  301. async ad_interstitial_start() {
  302. const param = {
  303. "funcId": "101",
  304. "callback":
  305. {
  306. "onShowFailed": "ad_splash_onShowFailed",
  307. "onClose": "CocosHandler.inst.ad_splash_close"
  308. }
  309. }
  310. const data: CocosHandlerType = {
  311. method: "ad.splash",
  312. param: JSON.stringify(param)
  313. }
  314. let result = await this.sendMessageToAndroid(data);
  315. console.log("启屏广告返回数据", result);
  316. return result;
  317. }
  318. //启屏广告关闭时回调
  319. async ad_splash_close() {
  320. if (oops.gui.has(UIID.KindTips)) {
  321. oops.gui.remove(UIID.KindTips);
  322. }
  323. if (oops.gui.has(UIID.Retention)) {
  324. oops.gui.remove(UIID.Retention);
  325. }
  326. let result = await CocosHandler.inst.savePrivacyStatus(true);
  327. if (result.code == 0) {
  328. //广告结束后调用登录
  329. this.getAccountInfo();
  330. }
  331. }
  332. //启屏广告加载失败
  333. ad_splash_onShowFailed() {
  334. this.getAccountInfo();
  335. }
  336. //广告请求--插屏广告
  337. async ad_interstitial(code: string) {
  338. const param = {
  339. "funcId": code,
  340. "callback":
  341. {
  342. "onLoaded": "",
  343. "onLoadFailed": "CocosHandler.inst.ad_interstitial_load_failed",
  344. "onShow": "",
  345. "onShowFailed": "CocosHandler.inst.ad_interstitial_show_failed",
  346. "onClose": "CocosHandler.inst.ad_interstitial_close"
  347. }
  348. }
  349. const data: CocosHandlerType = {
  350. method: "ad.interstitial",
  351. param: JSON.stringify(param)
  352. }
  353. let result = await this.sendMessageToAndroid(data);
  354. return result;
  355. }
  356. //广告关闭回调
  357. ad_interstitial_close(type: boolean) {
  358. console.log("广告关闭回调", type);
  359. }
  360. //广告加载成功回调
  361. ad_interstitial_loaded() {
  362. console.log("广告加载成功回调");
  363. }
  364. //广告加载失败回调
  365. ad_interstitial_load_failed(msg: string) {
  366. console.log("广告加载失败回调", msg);
  367. }
  368. //广告显示失败回调
  369. ad_interstitial_show_failed() {
  370. console.log("广告显示失败回调");
  371. }
  372. //广告请求--激励视频广告
  373. async ad_reward(id: number) {
  374. const param = {
  375. "funcId": `${id}`,
  376. "callback":
  377. {
  378. "onClose": "CocosHandler.inst.ad_reward_close"
  379. }
  380. }
  381. const data: CocosHandlerType = {
  382. method: "ad.reward",
  383. param: JSON.stringify(param)
  384. }
  385. let result = await this.sendMessageToAndroid(data);
  386. return result;
  387. }
  388. //激励视频广告关闭回调
  389. ad_reward_close(str: string) {
  390. console.log("激励视频广告关闭回调", str);
  391. //返回通知主场景,告诉要不要发奖励
  392. }
  393. //激励视频显示失败回调
  394. ad_reward_onShowFailed(str: string) {
  395. console.log("激励视频显示失败回调", str);
  396. }
  397. }
  398. window['CocosHandler'] = CocosHandler;