hallLogic.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. 'use strict';
  2. // var https = require('https');
  3. // var md5 = require('md5');
  4. var quick = require('quick-pomelo');
  5. var P = quick.Promise;
  6. var _ = require('lodash');
  7. var uuid = require('node-uuid');
  8. var C = require('../../../../share/constant');
  9. var configCommon = require('../../../../share/configCommon');//////TL++配置相关的公共方法
  10. // 构造方法
  11. var hallLogic = function (app) {
  12. // this.app = table.game.app;
  13. console.warn("hallLogic 这里是构造方法111 "+(typeof app));
  14. this.app = app;
  15. this.lconfigCommon = new configCommon(this.app);
  16. };
  17. // 导出类
  18. // module.exports = hallLogic;
  19. module.exports = function (app) {
  20. // setInterval(() => checkVersion(), 5000);
  21. // console.warn("活动配置内容 ??? exports() "+typeof require.cache[require.resolve('./hallHandler')]);
  22. return new hallLogic(app);
  23. };
  24. // 原型对象
  25. var proto = hallLogic.prototype;
  26. // ts++绑定手机号之后给用户发邮件
  27. proto.setBindPhone = P.coroutine(function* (msg, session, next,userId) {
  28. let diamond = 200;
  29. let form = "bindPhone";
  30. // console.warn("hallLogic 给用户发邮件 "+session.uid+" diamond "+diamond);
  31. var mail = yield this.app.models.Mails.findByIdAsync(session.uid, 'mailInfos');
  32. if (mail) {
  33. let item = {
  34. _id: "",
  35. index: mail.mailInfos.length, // 邮件下标
  36. tittleT: 6, // 邮件标题类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  37. descT: 6, // 邮件内容类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  38. reward: 1, // 有无奖励 0:无奖励 1:有奖励
  39. rewardT: 1, // 奖励类型 0:未定义 1:钻石,
  40. rewardC: diamond, // 奖励数量
  41. receive: 0, // 是否领取 0:未领取 1:已领取
  42. read: 0, // 是否已读 0:未读 1:已读
  43. form:form, //邮件来源
  44. sendTime: Date.now() // 发送日期
  45. }
  46. let newItem = _.clone(mail.mailInfos);
  47. let newItem2 = [0].concat(newItem);
  48. newItem2[0] = item;
  49. if(newItem2.length > 60){
  50. newItem2 = newItem2.slice(0,60)
  51. }
  52. mail.mailInfos = [];
  53. mail.mailInfos = _.clone(newItem2);
  54. yield mail.saveAsync();
  55. }
  56. else{
  57. let item = {
  58. _id: "",
  59. index: 0, // 邮件下标
  60. tittleT: 6, // 邮件标题类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  61. descT: 6, // 邮件内容类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  62. reward: 1, // 有无奖励 0:无奖励 1:有奖励
  63. rewardT: 1, // 奖励类型 0:未定义 1:钻石,
  64. rewardC: diamond, // 奖励数量
  65. receive: 0, // 是否领取 0:未领取 1:已领取
  66. read: 0, // 是否已读 0:未读 1:已读
  67. form:form, //邮件来源
  68. sendTime: Date.now() // 发送日期
  69. }
  70. let newItem = [];
  71. newItem[0] = item;
  72. var newMail = new this.app.models.Mails({
  73. _id: session.uid, // 用户id(player表的主键)
  74. userId: userId, // 用户的userId
  75. mailInfos: newItem // 该活动的达成条件和奖励信息列表
  76. });
  77. yield newMail.saveAsync();
  78. }
  79. return next(null, { code: C.OK, data: {}});
  80. });
  81. ////获得是否已领取比赛奖品(4~6名发钻石)
  82. proto.getIsTakeBSPrize = P.coroutine(function* (msg, session) {
  83. if (!session.uid) {
  84. return { code: C.ERROR, msg: C.PLAYER_NOT_LOGIN };
  85. }
  86. if (!msg.aid) {
  87. return { code: C.FAILD, msg: C.GAME_PARAM_ERROR };
  88. }
  89. let uid = session.uid;
  90. let agentId = msg.aid;
  91. let aidsub = agentId.substr(0, 9);
  92. let bsIndex = aidsub.indexOf("promote_");
  93. if(bsIndex == -1) return { code: C.FAILD, msg: "is not compete aid" };//非比赛链接
  94. let nowTime = Date.now();
  95. let jrStart = this.lconfigCommon.getTodaySJC();
  96. // nowTime = 1684925400000;
  97. // jrStart = 1681920000000;
  98. var opts = {
  99. stime: { $gte: jrStart },
  100. outTime: {$gt: nowTime}//过期时间大于当前时间
  101. };
  102. opts['aid'] = agentId;
  103. let timelist = yield this.app.models.RaceTimeInfos.findMongoAsync(opts, 'aid agentNo stime etime bigRound gameId round playerCount other outTime yljList', { sort: { stime: 1 } });
  104. if(timelist.length == 0){
  105. this.app.controllers.bisai.setNowBSInfo([],agentId);
  106. return { code: C.FAILD, msg: "today no compate"};
  107. }
  108. let userid = 1;
  109. var player = yield this.app.models.Player.findByIdAsync(uid, 'userId');
  110. if (player) {
  111. if(player.userId) userid = player.userId;
  112. }
  113. let userList = [];//今日比赛所有参与的玩家uid
  114. let scoreList = [];//今日比赛所有参与的玩家的分数
  115. let ccList = [];//今日比赛所有参与的玩家已经统计分数的场次
  116. let ckszbsccxx = timelist[0];//此刻所处比赛场的比赛信息
  117. let iszzpm = false;//是否是最终排名(比赛过程中统计的排名并非本场比赛最终的排名)
  118. let yljList = [];
  119. if(ckszbsccxx){
  120. // console.warn("获得是否已领取比赛奖品 ckszbsccxx "+JSON.stringify(ckszbsccxx));
  121. let jlbspmgbsj = (ckszbsccxx.etime + 15*60*1000) - nowTime;//距离比赛排名公布时间
  122. if(jlbspmgbsj < 0) iszzpm = true;
  123. if(!iszzpm) return { code: C.FAILD, msg: "距离比赛最终排名仅剩 "+jlbspmgbsj+" 秒"};
  124. if(ckszbsccxx.yljList && ckszbsccxx.yljList.length >= 0){
  125. yljList = _.cloneDeep(ckszbsccxx.yljList);
  126. if(yljList.indexOf(userid) != -1){
  127. return { code: C.OK, data: {bsjlsfylq:true}}
  128. }
  129. }
  130. var opts = {
  131. stime: { $gte: ckszbsccxx.stime, $lt: ckszbsccxx.etime },
  132. over: { $gte: 1 }
  133. };
  134. opts['agentId'] = agentId;
  135. var list = yield this.app.models.FHMJTables.findMongoAsync(opts, 'tableNo users', { sort: { stime: 1 } });
  136. for (let i = 0; i < list.length; ++i) {
  137. let bjus = list[i].users;//本局users
  138. for (let j = 0; j < bjus.length; ++j) {
  139. let wjszxb = userList.indexOf(bjus[j].userId);//玩家所在下标
  140. if(wjszxb == -1){
  141. let xwjxb = userList.length;//新玩家下标
  142. userList[xwjxb] = bjus[j].userId;//今日比赛所有参与的玩家
  143. scoreList[xwjxb] = bjus[j].score;//今日比赛所有参与的玩家的分数
  144. ccList[xwjxb] = 1;//今日比赛所有参与的玩家已经统计分数的场次
  145. }
  146. else{
  147. if(ccList[wjszxb] < ckszbsccxx.bigRound){//每个玩家止统计今日的前三场战绩
  148. scoreList[wjszxb] += bjus[j].score;//今日比赛所有参与的玩家的分数
  149. ccList[wjszxb] += 1;//今日比赛所有参与的玩家已经统计分数的场次
  150. }
  151. }
  152. }
  153. }
  154. }
  155. let infoList = [];
  156. for (let i = 0; i < userList.length; ++i) {
  157. infoList[i] = {
  158. score:scoreList[i],
  159. uid:userList[i]
  160. }
  161. }
  162. var scorersSort = _.sortBy(infoList, (i) => i.score);
  163. // let qsmInfoList = [];//分数前十名
  164. // _.reverse(scorersSort);
  165. // for (let i = 0; i < 10; ++i) {
  166. // qsmInfoList[i] = scorersSort[i];
  167. // }
  168. // let zjmcxx = null;//自己的分数信息
  169. // for (let i = 0; i < qsmInfoList.length; ++i) {
  170. // if(qsmInfoList[i] && qsmInfoList[i].uid == userid){
  171. // zjmcxx = qsmInfoList[i];
  172. // zjmcxx.mc = i;
  173. // }
  174. // }
  175. // if(!zjmcxx) return { code: C.FAILD, msg: "no prize"};
  176. // let zjmc = -2;
  177. // if(zjmcxx) zjmc = zjmcxx.mc || -1;
  178. // zjmc++
  179. // let bsjlsfylq = false;//比赛奖励是否已领取
  180. // if(zjmc < 4 || zjmc > 10) return { code: C.FAILD, msg: "ranking error"};
  181. // if(yljList.indexOf(userid) != -1){
  182. // console.warn("此人没有领取过奖励了 ");
  183. // bsjlsfylq = true;
  184. // }
  185. //上面是4~10名可以领取钻石,下面是前10名联系客服10名之后所有参与比赛的玩家都可以领取参与奖送的钻石
  186. _.reverse(scorersSort);
  187. let zjmcxx = null;//自己的分数信息
  188. for (let i = 0; i < scorersSort.length; ++i) {
  189. if(scorersSort[i] && scorersSort[i].uid == userid){
  190. zjmcxx = scorersSort[i];
  191. zjmcxx.mc = i;
  192. break;
  193. }
  194. }
  195. if(!zjmcxx) return { code: C.FAILD, msg: "您未参与该场比赛"};
  196. let zjmc = -2;
  197. if(zjmcxx) zjmc = zjmcxx.mc || -1;
  198. zjmc++
  199. let bsjlsfylq = false;//比赛奖励是否已领取
  200. if(zjmc < 11) return { code: C.FAILD, msg: "ranking error"};
  201. if(yljList.indexOf(userid) != -1){
  202. // console.warn("此人没有领取过奖励了 ");
  203. bsjlsfylq = true;
  204. }
  205. return { code: C.OK, data: {bsjlsfylq:bsjlsfylq}}
  206. });
  207. //// 领取比赛奖品
  208. proto.takeBSPrize = P.coroutine(function* (msg, session) {
  209. if (!session.uid) {
  210. return { code: C.ERROR, msg: C.PLAYER_NOT_LOGIN };
  211. }
  212. if (!msg.aid) {
  213. return { code: C.FAILD, msg: C.GAME_PARAM_ERROR };
  214. }
  215. let uid = session.uid;
  216. let agentId = msg.aid;
  217. let aidsub = agentId.substr(0, 9);
  218. let bsIndex = aidsub.indexOf("promote_");
  219. if(bsIndex == -1) return { code: C.FAILD, msg: "is not compete aid" };//非比赛链接
  220. let nowTime = Date.now();
  221. let jrStart = this.lconfigCommon.getTodaySJC();
  222. // nowTime = 1684925400000;
  223. // jrStart = 1681920000000;
  224. var opts = {
  225. stime: { $gte: jrStart },
  226. outTime: {$gt: nowTime}//过期时间大于当前时间
  227. };
  228. opts['aid'] = agentId;
  229. let timelist = yield this.app.models.RaceTimeInfos.findMongoAsync(opts, 'aid agentNo stime etime bigRound gameId round playerCount other outTime yljList', { sort: { stime: 1 } });
  230. if(timelist.length == 0){
  231. this.app.controllers.bisai.setNowBSInfo([],agentId);
  232. return { code: C.FAILD, msg: "today no compate"};
  233. }
  234. let userid = 1;
  235. var player = yield this.app.models.Player.findByIdAsync(uid, 'userId');
  236. if (player) {
  237. if(player.userId) userid = player.userId;
  238. }
  239. let userList = [];//今日比赛所有参与的玩家uid
  240. let scoreList = [];//今日比赛所有参与的玩家的分数
  241. let ccList = [];//今日比赛所有参与的玩家已经统计分数的场次
  242. let ckszbsccxx = timelist[0];//此刻所处比赛场的比赛信息
  243. let iszzpm = false;//是否是最终排名(比赛过程中统计的排名并非本场比赛最终的排名)
  244. let yljList = [];
  245. if(ckszbsccxx){
  246. let jlbspmgbsj = (ckszbsccxx.etime + 15*60*1000) - nowTime;//距离比赛排名公布时间
  247. if(jlbspmgbsj < 0) iszzpm = true;
  248. if(!iszzpm) return { code: C.FAILD, msg: "距离比赛最终排名仅剩 "+jlbspmgbsj+" 秒"};
  249. if(ckszbsccxx.yljList && ckszbsccxx.yljList.length >= 0){
  250. yljList = _.cloneDeep(ckszbsccxx.yljList);
  251. // console.warn("已领奖人数 "+yljList.length);
  252. if(yljList.indexOf(userid) != -1){
  253. return {code: C.FAILD, msg: "本场比赛奖励已领取了。"}
  254. }
  255. }
  256. var opts = {
  257. stime: { $gte: ckszbsccxx.stime, $lt: ckszbsccxx.etime },
  258. over: { $gte: 1 }
  259. };
  260. opts['agentId'] = agentId;
  261. var list = yield this.app.models.FHMJTables.findMongoAsync(opts, 'tableNo users', { sort: { stime: 1 } });
  262. // console.warn("战绩-------------------length",list.length);
  263. for (let i = 0; i < list.length; ++i) {
  264. let bjus = list[i].users;//本局users
  265. for (let j = 0; j < bjus.length; ++j) {
  266. let wjszxb = userList.indexOf(bjus[j].userId);//玩家所在下标
  267. if(wjszxb == -1){
  268. let xwjxb = userList.length;//新玩家下标
  269. userList[xwjxb] = bjus[j].userId;//今日比赛所有参与的玩家
  270. scoreList[xwjxb] = bjus[j].score;//今日比赛所有参与的玩家的分数
  271. ccList[xwjxb] = 1;//今日比赛所有参与的玩家已经统计分数的场次
  272. }
  273. else{
  274. if(ccList[wjszxb] < ckszbsccxx.bigRound){//每个玩家止统计今日的前三场战绩
  275. scoreList[wjszxb] += bjus[j].score;//今日比赛所有参与的玩家的分数
  276. ccList[wjszxb] += 1;//今日比赛所有参与的玩家已经统计分数的场次
  277. }
  278. }
  279. }
  280. }
  281. }
  282. let infoList = [];
  283. for (let i = 0; i < userList.length; ++i) {
  284. infoList[i] = {
  285. score:scoreList[i],
  286. uid:userList[i]
  287. }
  288. }
  289. var scorersSort = _.sortBy(infoList, (i) => i.score);
  290. // let qsmInfoList = [];//分数前十名
  291. // _.reverse(scorersSort);
  292. // for (let i = 0; i < 10; ++i) {
  293. // qsmInfoList[i] = scorersSort[i];
  294. // }
  295. // let zjmcxx = null;//自己的分数信息
  296. // for (let i = 0; i < qsmInfoList.length; ++i) {
  297. // if(qsmInfoList[i] && qsmInfoList[i].uid == userid){
  298. // zjmcxx = qsmInfoList[i];
  299. // zjmcxx.mc = i;
  300. // }
  301. // }
  302. // if(!zjmcxx) return { code: C.FAILD, msg: "no prize"};
  303. // let zjmc = -2;
  304. // if(zjmcxx) zjmc = zjmcxx.mc || -1;
  305. // zjmc++
  306. // let diamond = 0;
  307. // let bsrslevel = [0,200,400];//比赛人数等级
  308. // let bsszlevel1 = [888,588];//比赛送钻等级1
  309. // let bsszlevel2 = [2888,1888];//比赛送钻等级2
  310. // let bsszlevel3 = [8888,3888];//比赛送钻等级3
  311. // let nowLevel = -1;
  312. // for (var i = 0; i < bsrslevel.length; i++) {
  313. // if(scorersSort.length >= bsrslevel[i]) nowLevel = i;
  314. // else break;
  315. // }
  316. // let szList = [];//送钻列表
  317. // if(nowLevel+1 == 1) szList = szList = bsszlevel1;
  318. // else if(nowLevel+1 == 2) szList = szList = bsszlevel2;
  319. // else if(nowLevel+1 >= 3) szList = szList = bsszlevel3;
  320. // if(zjmc <= 3) return { code: C.FAILD, msg: "no prize!"};
  321. // else if(zjmc <= 6) diamond = szList[0];//888;
  322. // else diamond = szList[1];//588;
  323. //上面是4~10名可以领取钻石,下面是前10名联系客服10名之后所有参与比赛的玩家都可以领取参与奖送的钻石
  324. _.reverse(scorersSort);
  325. let zjmcxx = null;//自己的分数信息
  326. for (let i = 0; i < scorersSort.length; ++i) {
  327. if(scorersSort[i] && scorersSort[i].uid == userid){
  328. zjmcxx = scorersSort[i];
  329. zjmcxx.mc = i;
  330. }
  331. }
  332. if(!zjmcxx) return { code: C.FAILD, msg: "no prize"};
  333. let zjmc = -2;
  334. if(zjmcxx) zjmc = zjmcxx.mc || -1;
  335. zjmc++
  336. if(zjmc <= 10) return { code: C.FAILD, msg: "no prize!"};
  337. let diamond = 88;
  338. if(diamond > 0){
  339. let bsjlsfylq = false;//比赛奖励是否已领取
  340. if(yljList.indexOf(userid) != -1){
  341. bsjlsfylq = true;
  342. }
  343. if(bsjlsfylq) return {code: C.FAILD, msg: "本场比赛奖励已领取"}
  344. let form = "bisaiSys";
  345. yield this.lconfigCommon.senMailToPlayer(session.uid,userid,14,14,1,1,diamond,form);
  346. if(timelist[0].yljList){
  347. let newylq = [];
  348. for (var i = 0; i < timelist[0].yljList.length; i++) {
  349. newylq[i] = timelist[0].yljList[i];
  350. }
  351. newylq[newylq.length] = userid;
  352. timelist[0].yljList = _.cloneDeep(newylq);
  353. yield timelist[0].saveAsync();
  354. }
  355. return { code: C.OK, data: {diamond:diamond,bsid:timelist[0]._id,userid:userid}}
  356. }
  357. return { code: C.FAILD, msg: "您没有可领取的奖励"};
  358. });