ApiController.ts 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966
  1. import Msg from '../utils/msg'; // 确保路径是正确的
  2. import {
  3. RefreshToken,
  4. PackageName,
  5. ProductId,
  6. IosUrl,
  7. SandboxIosUrl,
  8. Account,
  9. ClientSecret,
  10. ClientId,
  11. AppSecret360
  12. } from '../config/thirdParams'
  13. import {
  14. compareVersions,
  15. generateOrderNumber,
  16. formatDate,
  17. getServerList
  18. } from '../utils/common'
  19. const CryptoJS = require("crypto-js");
  20. const Order = require('../model/OrderModel')
  21. const Server = require('../model/ServerModel')
  22. const Version = require('../model/VersionModel')
  23. const CDK = require("../model/CDK")
  24. const notice = require("../json/notice.json")
  25. const logger = require('../utils/log')
  26. const axios = require('axios');
  27. const googleCallPay = async (ctx) => {
  28. let ret = {
  29. code: 0,
  30. msg: '发货失败'
  31. }
  32. let data = ctx.request.body
  33. logger.info("pay callback params:", { "url": ctx.href, "params": data })
  34. const redisClient = ctx.redis.client;
  35. let access_token = await redisClient.get('access_token');
  36. if (!access_token) {
  37. console.log('请求api获取token')
  38. const apiData = {
  39. "grant_type": "refresh_token",
  40. "client_id": ClientId,
  41. "client_secret": ClientSecret,
  42. "refresh_token": RefreshToken
  43. }
  44. const response = await axios.post('https://accounts.google.com/o/oauth2/token', apiData, {
  45. headers: {
  46. 'Content-Type': 'application/x-www-form-urlencoded'
  47. }
  48. });
  49. logger.info("token params:", { "data": response.data, "params": apiData })
  50. if (!response.data.access_token) {
  51. return ret
  52. }
  53. access_token = response.data.access_token
  54. await redisClient.set('access_token', response.data.access_token);
  55. await redisClient.expire('access_token', 1800);
  56. }
  57. if (!access_token) {
  58. return ret;
  59. }
  60. let orderId = data.orderId
  61. let googleToken = data.purchaseToken
  62. let out_trade_no = ''
  63. const orderInfo = (await Order.getOrder(orderId))[0]
  64. if (!orderInfo) {
  65. logger.info(`订单${orderId}不存在`)
  66. ret.msg = `订单${orderId}不存在`
  67. return ret
  68. }
  69. if (orderInfo.status == 2) {
  70. logger.info(`订单${orderId}已经重复发货`)
  71. ret.code = 1
  72. ret.msg = `订单${orderId}已经重复发货`
  73. return ret
  74. }
  75. let url = await getServerList(orderInfo.server_id, 'default')
  76. if (!url) {
  77. logger.info(`区服id错误: serverId ${orderInfo.server_id}`)
  78. ret.msg = `区服id错误: serverId ${orderInfo.server_id}`
  79. return ret
  80. }
  81. const productId = ProductId + orderInfo.product_id
  82. let apiUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}?access_token=${access_token}`
  83. let maxRetries = 5;
  84. let currentRetry = 0;
  85. let isCheck = false;
  86. // 使用 while 循环进行重试
  87. while (currentRetry < maxRetries) {
  88. try {
  89. // // 尝试执行的操作
  90. const googleRes = await axios.get(apiUrl, {
  91. headers: {
  92. 'Content-Type': 'application/x-www-form-urlencoded'
  93. }
  94. })
  95. console.log(googleRes.data)
  96. // 如果操作成功,退出循环
  97. if (googleRes.data.purchaseState == 0) {
  98. out_trade_no = googleRes.data.orderId
  99. isCheck = true
  100. break;
  101. }
  102. } catch (error) {
  103. // 如果操作失败,记录错误并继续尝试
  104. console.log(error)
  105. }
  106. currentRetry++;
  107. }
  108. if (!isCheck) {
  109. return ret;
  110. }
  111. Msg.connect(url, Account);
  112. let orgMemId = orderInfo.uid
  113. let orgOderId = orderId
  114. let orgProductId = orderInfo.product_id
  115. let orgProductPrice = orderInfo.amount
  116. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  117. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
  118. return new Promise((resolve) => {
  119. setTimeout(async () => {
  120. const send_res = Msg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN', ctx.request.ip, params);
  121. if (!send_res) {
  122. resolve(ret);
  123. return;
  124. }
  125. let acknowledgeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:acknowledge?access_token=${access_token}`
  126. console.log(acknowledgeUrl)
  127. const acknowledgeRes = await axios.post(acknowledgeUrl,
  128. {
  129. developerPayload: ""
  130. }
  131. ,
  132. {
  133. headers: {
  134. 'Content-Type': 'application/json'
  135. }
  136. })
  137. let consumeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:consume?access_token=${access_token}`
  138. const consumeRes = await axios.post(consumeUrl,
  139. {
  140. developerPayload: ""
  141. }
  142. ,
  143. {
  144. headers: {
  145. 'Content-Type': 'application/json'
  146. }
  147. })
  148. logger.info("check :", { "orderId": orderId, "consumeRes": consumeRes, "acknowledgeRes": acknowledgeRes })
  149. const update_time = formatDate(new Date())
  150. const res = await Order.updateOrderStats(
  151. orderId,
  152. 2,
  153. out_trade_no,
  154. update_time
  155. );
  156. if (res.affectedRows <= 0) {
  157. logger.info(`订单${orderId} 发货失败`)
  158. ret.msg = '发货失败'
  159. resolve(ret);
  160. return;
  161. }
  162. ret.code = 1
  163. ret.msg = '发货成功'
  164. resolve(ret);
  165. }, 1000);
  166. });
  167. }
  168. const appleCallPay = async (ctx) => {
  169. let ret = {
  170. code: 0,
  171. msg: '发货失败'
  172. }
  173. let data = ctx.request.body
  174. logger.info("pay callback params:", { "url": ctx.href, "params": data })
  175. if (!data.purchaseToken || !data.orderId) {
  176. return ret;
  177. }
  178. let receipt_data = data.purchaseToken.replace(/ /g, '+')
  179. let orderId = data.orderId
  180. let maxRetries = 5;
  181. let currentRetry = 0;
  182. let isCheck = false;
  183. let out_trade_no = orderId
  184. // 使用 while 循环进行重试
  185. while (currentRetry < maxRetries) {
  186. try {
  187. const apiData = {
  188. "receipt-data": receipt_data,
  189. }
  190. const response = await axios.post(SandboxIosUrl, apiData, {
  191. headers: {
  192. 'Content-Type': 'application/json'
  193. }
  194. });
  195. logger.info(`苹果返回的状态:${response.data.status}`)
  196. // 如果操作成功,退出循环
  197. if (response.data.status == 0) {
  198. isCheck = true
  199. break;
  200. }
  201. } catch (error) {
  202. // 如果操作失败,记录错误并继续尝试
  203. console.log(error)
  204. }
  205. currentRetry++;
  206. }
  207. if (!isCheck) {
  208. logger.info(`票据验证失败!`)
  209. ret.msg = `票据验证失败!`
  210. return ret;
  211. }
  212. const orderInfo = (await Order.getOrder(orderId))[0]
  213. if (!orderInfo) {
  214. logger.info(`订单${orderId}不存在`)
  215. ret.msg = `订单${orderId}不存在`
  216. return ret
  217. }
  218. if (orderInfo.status == 2) {
  219. logger.info(`订单${orderId}已经重复发货`)
  220. ret.code = 1
  221. ret.msg = `订单${orderId}已经重复发货`
  222. return ret
  223. }
  224. let url = await getServerList(orderInfo.server_id, 'default')
  225. if (!url) {
  226. logger.info(`区服id错误: serverId ${orderInfo.server_id}`)
  227. ret.msg = `区服id错误: serverId ${orderInfo.server_id}`
  228. return ret
  229. }
  230. Msg.connect(url, Account);
  231. let orgMemId = orderInfo.uid
  232. let orgOderId = orderId
  233. let orgProductId = orderInfo.product_id
  234. let orgProductPrice = orderInfo.amount
  235. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  236. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
  237. return new Promise((resolve) => {
  238. setTimeout(async () => {
  239. logger.info(`订单${orderId}通知游戏发货开始`)
  240. const send_res = Msg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN', ctx.request.ip, params);
  241. if (!send_res) {
  242. resolve(ret);
  243. return;
  244. }
  245. logger.info(`订单${orderId}通知游戏发货结束`)
  246. const update_time = formatDate(new Date())
  247. const res = await Order.updateOrderStats(
  248. orderId,
  249. 2,
  250. out_trade_no,
  251. update_time
  252. );
  253. if (res.affectedRows <= 0) {
  254. logger.info(`订单${orderId} 发货失败`)
  255. ret.msg = '发货失败'
  256. resolve(ret);
  257. return;
  258. }
  259. ret.code = 1
  260. ret.msg = '发货成功'
  261. resolve(ret);
  262. }, 1000);
  263. });
  264. }
  265. const CallPay360 = async (ctx) => {
  266. let ret = {
  267. code: 0,
  268. msg: '发货失败'
  269. }
  270. let data = ctx.request.body
  271. let sign = data.sign
  272. let serverId = data.serverId
  273. let orderId = data.cpOrder
  274. let out_trade_no = data.orderId
  275. logger.info("pay callback params:", { "url": ctx.href, "params": data })
  276. const orderInfo = (await Order.getOrder(orderId))[0]
  277. if (!orderInfo) {
  278. logger.info(`订单${orderId}不存在`)
  279. ret.msg = `订单${orderId}不存在`
  280. return ret
  281. }
  282. if (orderInfo.status == 2) {
  283. logger.info(`订单${orderId}已经重复发货`)
  284. ret.code = 1
  285. ret.msg = `订单${orderId}已经重复发货`
  286. return ret
  287. }
  288. //签名参数
  289. let signData = Object.keys(data).sort().filter(key => key !== 'sign');
  290. let signStr = signData.map(key => `${data[key]}`).join('');
  291. signStr += AppSecret360
  292. let newSign = CryptoJS.MD5(signStr).toString();
  293. console.log("signStr:", signStr)
  294. console.log("newSign:", newSign)
  295. if (sign != newSign) {
  296. logger.info(`签名错误: 签名串 ${signStr} newSign ${newSign} sign ${sign}`)
  297. ret.msg = `签名错误`
  298. return ret
  299. }
  300. let url = await getServerList(serverId, 'default')
  301. if (!url) {
  302. logger.info(`区服id错误: serverId ${serverId}`)
  303. ret.msg = `区服id错误: serverId ${serverId}`
  304. return ret
  305. }
  306. //发货
  307. // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
  308. Msg.connect(url, Account);
  309. let orgMemId = data.uid
  310. let orgOderId = data.cpOrder
  311. let orgProductId = orderInfo.product_id
  312. let orgExt = data.cText
  313. let orgProductPrice = data.skuPrice
  314. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  315. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
  316. return new Promise((resolve) => {
  317. setTimeout(async () => {
  318. console.log("这个消息将在3秒后打印出来");
  319. const send_res = Msg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN', ctx.request.ip, params);
  320. if (!send_res) {
  321. resolve(ret);
  322. return;
  323. }
  324. const update_time = formatDate(new Date())
  325. const res = await Order.updateOrderStats(
  326. orderId,
  327. 2,
  328. out_trade_no,
  329. update_time
  330. );
  331. if (res.affectedRows <= 0) {
  332. logger.info(`订单${orderId} 发货失败`)
  333. ret.msg = '发货失败'
  334. resolve(ret);
  335. return;
  336. }
  337. ret.code = 1
  338. ret.msg = '发货成功'
  339. resolve(ret);
  340. }, 1000);
  341. });
  342. }
  343. const testGoogleCallPay = async (ctx) => {
  344. let ret = {
  345. code: 0,
  346. msg: '消费失败'
  347. }
  348. let data = ctx.request.body
  349. logger.info("pay callback params:", { "url": ctx.href, "params": data })
  350. const redisClient = ctx.redis.client;
  351. let access_token = await redisClient.get('access_token');
  352. if (!access_token) {
  353. console.log('请求api获取token')
  354. const apiData = {
  355. "grant_type": "refresh_token",
  356. "client_id": ClientId,
  357. "client_secret": ClientSecret,
  358. "refresh_token": RefreshToken
  359. }
  360. const response = await axios.post('https://accounts.google.com/o/oauth2/token', apiData, {
  361. headers: {
  362. 'Content-Type': 'application/x-www-form-urlencoded'
  363. }
  364. });
  365. logger.info("token params:", { "data": response.data, "params": apiData })
  366. if (!response.data.access_token) {
  367. return ret
  368. }
  369. access_token = response.data.access_token
  370. await redisClient.set('access_token', response.data.access_token);
  371. await redisClient.expire('access_token', 1800);
  372. }
  373. if (!access_token) {
  374. return ret;
  375. }
  376. let googleToken = data.purchaseToken
  377. let product_id = data.orderId
  378. const productId = ProductId + product_id
  379. let apiUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}?access_token=${access_token}`
  380. let maxRetries = 5;
  381. let currentRetry = 0;
  382. let isCheck = false;
  383. // 使用 while 循环进行重试
  384. while (currentRetry < maxRetries) {
  385. try {
  386. // // 尝试执行的操作
  387. const googleRes = await axios.get(apiUrl, {
  388. headers: {
  389. 'Content-Type': 'application/x-www-form-urlencoded'
  390. }
  391. })
  392. console.log(googleRes.data)
  393. // 如果操作成功,退出循环
  394. if (googleRes.data.purchaseState == 0) {
  395. isCheck = true
  396. break;
  397. }
  398. } catch (error) {
  399. // 如果操作失败,记录错误并继续尝试
  400. console.log(error)
  401. }
  402. currentRetry++;
  403. }
  404. if (!isCheck) {
  405. return ret;
  406. }
  407. return new Promise(async (resolve) => {
  408. let acknowledgeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:acknowledge?access_token=${access_token}`
  409. console.log(acknowledgeUrl)
  410. const acknowledgeRes = await axios.post(acknowledgeUrl,
  411. {
  412. developerPayload: ""
  413. }
  414. ,
  415. {
  416. headers: {
  417. 'Content-Type': 'application/json'
  418. }
  419. })
  420. let consumeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:consume?access_token=${access_token}`
  421. const consumeRes = await axios.post(consumeUrl,
  422. {
  423. developerPayload: ""
  424. }
  425. ,
  426. {
  427. headers: {
  428. 'Content-Type': 'application/json'
  429. }
  430. })
  431. ret.code = 1
  432. ret.msg = '发货成功'
  433. resolve(ret);
  434. });
  435. }
  436. const checkVersion = async (ctx) => {
  437. let ret = {
  438. code: 0,
  439. msg: '无需更新',
  440. url: '',
  441. }
  442. let data = ctx.request.body
  443. let version = data.version
  444. let tag = data.tag || 'default'
  445. logger.info("checkVersion params:", { "url": ctx.href, "params": data })
  446. const versionInfo = (await Version.getGameVersion(tag))[0]
  447. if (!versionInfo) {
  448. return ret
  449. }
  450. if (compareVersions(versionInfo.version, version) === 1) {
  451. if (versionInfo.download_url) {
  452. ret.code = 1
  453. ret.msg = '需要更新'
  454. ret.url = versionInfo.download_url
  455. }
  456. }
  457. return ret
  458. }
  459. //验证账号
  460. const checkUserToken = async (ctx) => {
  461. }
  462. class ApiController {
  463. async createOrder(ctx) {
  464. let {
  465. uid,
  466. level,
  467. amount,
  468. role_id,
  469. role_name,
  470. product_id,
  471. server_id
  472. } = ctx.request.body
  473. logger.info("create params:", { "params": ctx.request.body })
  474. if (!product_id || !server_id || !role_name || !role_id || !amount || !uid) {
  475. ctx.body = { code: -1, message: '参数错误,创建订单失败!!', data: '' }
  476. return
  477. }
  478. const orderId = generateOrderNumber(); // 生成一个长度为8的订单号
  479. const create_time = formatDate(new Date())
  480. const res = await Order.createOrder(
  481. orderId,
  482. uid,
  483. level,
  484. amount,
  485. role_id,
  486. role_name,
  487. product_id,
  488. server_id,
  489. create_time
  490. );
  491. if (res.affectedRows > 0) {
  492. ctx.body = { code: 0, message: '创建订单成功', data: orderId }
  493. } else {
  494. ctx.body = { code: -1, message: '创建订单失败', data: '' }
  495. }
  496. logger.info("创建订单返回结果:", { "params": ctx.body })
  497. }
  498. async checkUserToken(ctx) {
  499. // const result = await checkUserToken(ctx);
  500. // let data = { "status": false, "sign": "" }
  501. // if (result) {
  502. // data.status = true
  503. // data.sign = result
  504. // }
  505. // ctx.body = data
  506. }
  507. async callPay(ctx) {
  508. let data = ctx.request.body
  509. let platform = data.platform || '360'
  510. switch (platform) {
  511. case 'google':
  512. var result = await googleCallPay(ctx)
  513. console.log('发货结果', result)
  514. ctx.body = result
  515. break;
  516. case 'apple':
  517. var result = await appleCallPay(ctx)
  518. console.log('发货结果', result)
  519. ctx.body = result
  520. break;
  521. case '360':
  522. var result = await CallPay360(ctx)
  523. console.log('发货结果', result)
  524. ctx.body = result
  525. break;
  526. // case 'testGoogle':
  527. // var result = await testGoogleCallPay(ctx)
  528. // console.log('发货结果', result)
  529. // ctx.body = result
  530. // break;
  531. default:
  532. ctx.body = {
  533. code: 0,
  534. msg: '渠道错误'
  535. }
  536. }
  537. }
  538. async checkVersion(ctx) {
  539. var result = await checkVersion(ctx)
  540. console.log('校验版本', result)
  541. ctx.body = result
  542. }
  543. async getServerList(ctx) {
  544. let tag = ctx.query.tag || 'default'
  545. const servers = (await Server.getServerList(tag))
  546. let data = []
  547. let ip = ctx.request.ip
  548. if (ip.startsWith('::ffff:')) {
  549. ip = ip.substring('::ffff:'.length);
  550. }
  551. logger.info("区服接口", { "ip": ctx.request.ip })
  552. if (servers.length > 0) {
  553. servers.forEach(function (element) {
  554. let status = element.status
  555. if (status == 0 && element.white_list) {
  556. const list = element.white_list.split(",");
  557. if (list.length > 0) {
  558. if (list.includes(ip)) {
  559. status = 1
  560. }
  561. }
  562. }
  563. data.push({
  564. "id": element.id,
  565. "name": element.name,
  566. "ip": element.ip,
  567. "port": element.port,
  568. "tips": element.tips,
  569. "status": status,
  570. })
  571. });
  572. }
  573. ctx.body = data
  574. }
  575. async getAllServerList(ctx) {
  576. let tag = ctx.query.tag || 'default'
  577. let ip = ctx.request.ip
  578. if (ip.startsWith('::ffff:')) {
  579. ip = ip.substring('::ffff:'.length);
  580. }
  581. logger.info("getAllServerList 区服接口", { "ip": ctx.request.ip })
  582. const servers = (await Server.getAllServerList(tag,ip))
  583. ctx.body = servers
  584. }
  585. async enterServer(ctx) {
  586. let ret = {
  587. code: 0,
  588. msg: '请求失败'
  589. }
  590. let {
  591. uid,
  592. server_id
  593. } = ctx.request.body
  594. let url = await getServerList(server_id, 'default')
  595. if (!url) {
  596. ctx.body = { code: -1, message: `区服id错误: serverId ${server_id}`, data: '' }
  597. return
  598. }
  599. logger.info("create params:", { "params": ctx.request.body })
  600. if (!server_id || !uid) {
  601. ctx.body = { code: -1, message: '参数错误!!', data: '' }
  602. return
  603. }
  604. const create_time = formatDate(new Date())
  605. const serverInfo = (await Server.checkEnterServerByUid(uid, server_id))[0]
  606. let res = null
  607. if (serverInfo) {
  608. res = await Server.updateEnterServer(
  609. serverInfo.id,
  610. create_time
  611. );
  612. } else {
  613. res = await Server.enterServer(
  614. uid,
  615. server_id,
  616. create_time
  617. );
  618. }
  619. if (res.affectedRows > 0) {
  620. ctx.body = { code: 0, message: '请求成功', data: '' }
  621. } else {
  622. ctx.body = { code: -1, message: '请求失败', data: '' }
  623. }
  624. }
  625. async getLastServerList(ctx) {
  626. let {
  627. uid,
  628. } = ctx.request.body
  629. let tag = 'default'
  630. let data = [];
  631. let isNewAccount = 1
  632. let enterServerList = (await Server.getEnterServerListByUid(uid))
  633. if (enterServerList.length > 0) {
  634. isNewAccount = 0
  635. enterServerList.forEach(function (element) {
  636. data.push({
  637. "channel": "Thailand", //渠道固定
  638. "minSid": 1, //最小服务器
  639. "maxSid": 10, //最大服务器 这里会控制 服务器列表显示的数量
  640. "isNewAccount": isNewAccount, //1为新号 会弹出用户协议
  641. //以下是最近登陆的服务器 (不可为空 如果没有参数可以填最后一个区)
  642. "sid": element.server_id || 1,
  643. "id": element.server_id || 1,
  644. "name": element.name || "1区",
  645. "server": element.ip ? `ws://${element.ip}:${element.port}` : "",
  646. "status": element.status || 0,
  647. })
  648. });
  649. } else {
  650. const servers = (await Server.getServerList(tag))
  651. const serverInfo = servers[servers.length - 1]
  652. data.push({
  653. "channel": "Thailand", //渠道固定
  654. "minSid": 1, //最小服务器
  655. "maxSid": 10, //最大服务器 这里会控制 服务器列表显示的数量
  656. "isNewAccount": isNewAccount, //1为新号 会弹出用户协议
  657. //以下是最近登陆的服务器 (不可为空 如果没有参数可以填最后一个区)
  658. "sid": serverInfo.id || 1,
  659. "id": serverInfo.id || 1,
  660. "name": serverInfo.name || "1区",
  661. "server": serverInfo.ip ? `ws://${serverInfo.ip}:${serverInfo.port}` : "",
  662. "status": serverInfo.status || 0,
  663. })
  664. }
  665. ctx.body = data
  666. }
  667. async getNotice(ctx) {
  668. ctx.body = notice
  669. }
  670. async genCDK(ctx) {
  671. /*
  672. data = {
  673. cnt : number -- 生成数量
  674. useCnt : number -- 当前批次最大使用数量
  675. serverList : string -- 区服列表Json字符串
  676. itemList : string -- CDK对应物品列表Json字符串
  677. }
  678. */
  679. let data = ctx.request.body
  680. await CDK.genCDK(ctx, data.cnt, data.useCnt, data.serverList, data.itemList)
  681. ctx.body = {
  682. code: 0,
  683. msg: 'success'
  684. }
  685. return
  686. }
  687. async getCDK(ctx) {
  688. let data = ctx.request.body
  689. let ret = await CDK.getCDK(ctx, data.batch)
  690. if (ret.length <= 0) {
  691. ctx.body = {
  692. code: 1,
  693. msg: "batch invalid"
  694. }
  695. return
  696. }
  697. ctx.body = {
  698. code: 0,
  699. msg: ret
  700. }
  701. }
  702. async useCDK(ctx) {
  703. let data = ctx.request.body
  704. let url = await getServerList(data.serverId, 'default')
  705. let err = ""
  706. if (!url) {
  707. ctx.body = {
  708. code: 1,
  709. msg: `区服id错误: serverId ${data.serverId}`
  710. }
  711. err = "server id invalid"
  712. }
  713. let param: string = ""
  714. // 验证CDK
  715. if (err.length == 0) {
  716. let batchInfo = await CDK.getCDKItemList(ctx, data.code)
  717. if (batchInfo.length <= 0) {
  718. err = "cdk not found"
  719. } else {
  720. err = await CDK.checkCDK(ctx, data.code, data.serverId)
  721. param = JSON.stringify({
  722. type: "UseCDK",
  723. err: err,
  724. batchInfo: batchInfo
  725. })
  726. }
  727. }
  728. // 固定码
  729. if (err == "cdk not found" || err == "server id invalid") {
  730. param = JSON.stringify({
  731. code: data.code,
  732. type: "UseFixCDK"
  733. })
  734. }
  735. // 测试是否可以调用过去
  736. // 通知给服务器,发放道具
  737. // "ws://43.143.193.23:18192"
  738. Msg.connect(url, Account);
  739. new Promise((resolve) => {
  740. setTimeout(async () => {
  741. Msg.CG_TEST_PROTO(data.account, param)
  742. }, 500);
  743. });
  744. ctx.body = {
  745. code: 0,
  746. msg: "success"
  747. }
  748. }
  749. async validCDK(ctx) {
  750. let data = ctx.request.body
  751. if (data.code.length == 10) {
  752. let ret = await CDK.useCDK(ctx, data.code)
  753. if (ret != "success") {
  754. ctx.body = {
  755. code: 1,
  756. msg: ret
  757. }
  758. return
  759. }
  760. }
  761. ctx.body = {
  762. code: 0,
  763. msg: "success"
  764. }
  765. }
  766. // 维护服务器,踢掉所有玩家
  767. async maintenance(ctx) {
  768. let data = ctx.request.body
  769. let url = await getServerList(data.serverId, 'default')
  770. if (!url) {
  771. ctx.body = {
  772. code: 1,
  773. msg: `区服id错误: serverId ${data.serverId}`
  774. }
  775. return
  776. }
  777. let param = JSON.stringify({
  778. type: "kickAllUser"
  779. })
  780. Msg.connect(url, Account);
  781. new Promise((resolve) => {
  782. setTimeout(async () => {
  783. Msg.CG_TEST_PROTO("test", param)
  784. }, 500);
  785. });
  786. ctx.body = {
  787. code: 0,
  788. msg: "success"
  789. }
  790. }
  791. async sendMail(ctx) {
  792. let data = ctx.request.body
  793. let url = await getServerList(data.serverId, 'default')
  794. if (!url) {
  795. ctx.body = {
  796. code: 1,
  797. msg: `区服id错误: serverId ${data.serverId}`
  798. }
  799. return
  800. }
  801. let param = JSON.stringify({
  802. type:"sendMail",
  803. mail: JSON.stringify({
  804. uuid:data.uuid,
  805. title:data.title,
  806. content:data.content,
  807. items:JSON.parse(data.items),
  808. expire:data.expire
  809. })
  810. })
  811. Msg.connect(url, Account);
  812. new Promise((resolve) => {
  813. setTimeout(async () => {
  814. Msg.CG_TEST_PROTO("test", param)
  815. }, 500);
  816. });
  817. ctx.body = {
  818. code: 0,
  819. msg: "success"
  820. }
  821. }
  822. }
  823. module.exports = new ApiController()