configCommon.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. /**
  2. * TL++整个文件
  3. * 此类是和配置文件相关的函数
  4. */
  5. 'use strict';
  6. var quick = require('quick-pomelo');
  7. var P = quick.Promise;
  8. var uuid = require('node-uuid');
  9. var C = require('./constant');
  10. var _ = require('lodash');/////是一个一致性、模块化、高性能的 JavaScript 实用工具库。
  11. // 构造方法
  12. var configCommon = function (app) {
  13. this.app = app;
  14. };
  15. // 导出类
  16. module.exports = configCommon;
  17. // 原型对象
  18. var proto = configCommon.prototype;
  19. //////获得最新的配置文件
  20. proto.getHallConfig = function (){
  21. // delete require.cache[require.resolve('../app/config/hallConfig')];
  22. let hallConfig = require('../app/config/hallConfig') || {};
  23. return hallConfig;
  24. }
  25. //////获得活动配置的open和开始结束时间
  26. proto.getActiveOpenTime = function (activeType){
  27. let confActive = this.getHallConfig().active || {};
  28. let activeInfoList = confActive.list || [];
  29. let res = {};
  30. for (var i = 0; i < activeInfoList.length; i++) {
  31. if(activeInfoList[i].type == activeType){
  32. res = {
  33. "open": activeInfoList[i].open,
  34. "startTime": activeInfoList[i].startTime,
  35. "endTime": activeInfoList[i].endTime,
  36. "reachAndRewardInfo": activeInfoList[i].reachAndRewardInfo
  37. }
  38. break;
  39. }
  40. }
  41. // console.warn("getActiveOpenTime res "+JSON.stringify(res));
  42. return res;
  43. };
  44. //////获得判定为回归用户未登录的天数
  45. proto.getHuiguiNoLoginDays = function (activeType){
  46. let confhuiguiRequest = this.getHallConfig().huiguiRequest || {};
  47. let res = confhuiguiRequest.noLoginDays || 0;
  48. return res;
  49. };
  50. //TL++,得到今日0点的时间戳
  51. proto.getTodaySJC = function (){
  52. var today = new Date();
  53. today.setHours(0);
  54. today.setMinutes(0);
  55. today.setSeconds(0);
  56. today.setMilliseconds(0);
  57. let jrsjc = today.getTime();
  58. // console.warn("111得到今日0点的时间戳 ",jrsjc, typeof jrsjc);
  59. return jrsjc;
  60. };
  61. //邀请新人按比例送钻这个活动的信息写入数据库
  62. proto.yxActivityAsync = P.coroutine(function* (scorers,etime) {
  63. // console.warn("下面是记录邀请新人按比例送钻这个活动的数据 etime "+etime)
  64. // if(!this.lconfigCommon) {
  65. // // console.warn("邀请新人按比例送钻 this.lconfigCommon 不存在 "+etime);
  66. // this.lconfigCommon = new configCommon(this.app);
  67. // }
  68. let yxhdxx = this.getActiveOpenTime(6);//邀请新人按比例送钻活动是否开启和开始结束时间的信息
  69. let isKQ = false;//邀请新人送钻石活动是否开启
  70. if(yxhdxx && yxhdxx.open && yxhdxx.startTime && yxhdxx.endTime) isKQ = true;
  71. // console.warn("获取配置信息 yxhdxx "+JSON.stringify(yxhdxx));
  72. if(!(isKQ && etime >= yxhdxx.startTime && etime < yxhdxx.endTime)){
  73. return;//活动未开启
  74. }
  75. let xhList = [];
  76. for (let scorer of scorers) {
  77. let xhInfo = {
  78. _id: scorer.playerId,
  79. chairId:scorer.chairId,
  80. userId: scorer.userId,
  81. name: scorer.name,
  82. gameCost: scorer.gameCost,
  83. giftCost: scorer.giftCost,
  84. }
  85. xhList[xhList.length] = xhInfo;
  86. // console.warn("下面是记录邀请新人按比例送钻这个活动的数据 xhInfo "+JSON.stringify(xhInfo));
  87. }
  88. let yqrList = [];//邀请人列表
  89. if(xhList[0]){
  90. var yqxx = yield this.app.models.Invite.findByIdAsync(xhList[0]._id, 'yId yuId');
  91. if (yqxx) {
  92. xhList[0].yId = yqxx.yId;
  93. xhList[0].yuId = yqxx.yuId;
  94. if(yqrList.indexOf(xhList[0].yId) == -1) yqrList[yqrList.length] = xhList[0].yId;
  95. }
  96. }
  97. if(xhList[1]){
  98. var yqxx = yield this.app.models.Invite.findByIdAsync(xhList[1]._id, 'yId yuId');
  99. if (yqxx) {
  100. xhList[1].yId = yqxx.yId;
  101. xhList[1].yuId = yqxx.yuId;
  102. if(yqrList.indexOf(xhList[1].yId) == -1) yqrList[yqrList.length] = xhList[1].yId;
  103. }
  104. }
  105. if(xhList[2]){
  106. var yqxx = yield this.app.models.Invite.findByIdAsync(xhList[2]._id, 'yId yuId');
  107. if (yqxx) {
  108. xhList[2].yId = yqxx.yId;
  109. xhList[2].yuId = yqxx.yuId;
  110. if(yqrList.indexOf(xhList[2].yId) == -1) yqrList[yqrList.length] = xhList[2].yId;
  111. }
  112. }
  113. if(xhList[3]){
  114. var yqxx = yield this.app.models.Invite.findByIdAsync(xhList[3]._id, 'yId yuId');
  115. if (yqxx) {
  116. xhList[3].yId = yqxx.yId;
  117. xhList[3].yuId = yqxx.yuId;
  118. if(yqrList.indexOf(xhList[3].yId) == -1) yqrList[yqrList.length] = xhList[3].yId;
  119. }
  120. }
  121. // console.warn("下面是记录邀请新人按比例送钻这个活动的数据 xhList "+JSON.stringify(xhList));
  122. // console.warn("下面是记录邀请新人按比例送钻这个活动的数据 yqrList "+JSON.stringify(yqrList));
  123. let addCostInfos = [];
  124. for (var i = 0; i < xhList.length; i++) {
  125. if(!xhList[i].yId) continue;
  126. let index = yqrList.indexOf(xhList[i].yId);
  127. let lc = xhList[i].gameCost + xhList[i].giftCost;
  128. let lc2 = Math.floor(lc * yxhdxx.reachAndRewardInfo[0].rewardCount)
  129. // console.warn("下面是记录邀请新人按比例送钻这个活动的数据 addCostInfos "+JSON.stringify(addCostInfos)+" index "+index+" i "+i+" lc2 "+lc2+" xhList[i].yId "+xhList[i].yId);
  130. if(index != -1){
  131. if(addCostInfos[index]){
  132. addCostInfos[index].all += lc2;
  133. }
  134. else{
  135. addCostInfos[addCostInfos.length] = {
  136. yId: xhList[i].yId,
  137. yuId: xhList[i].yuId,
  138. all: lc2
  139. }
  140. }
  141. }
  142. else{
  143. //记录的yid无效(是错的)
  144. }
  145. }
  146. let jrStart = this.getTodaySJC()
  147. // console.warn("下面是记录邀请新人按比例送钻这个活动的数据 jrStart "+jrStart+" addCostInfos "+JSON.stringify(addCostInfos));
  148. if(addCostInfos[0] && addCostInfos[0].yId){
  149. let opts0 = {
  150. pId: addCostInfos[0].yId,
  151. dayTime: { $gte: jrStart, $lt: jrStart+86400000}
  152. };
  153. var jrxhList0 = yield this.app.models.InvitesCost.findMongoAsync(opts0, 'pId uId all');
  154. // console.warn("下面是记录邀请新人按比例送钻这个活动的数据 length "+jrxhList0.length)
  155. if (jrxhList0.length == 0) {
  156. var invitesCostItem0 = new this.app.models.InvitesCost({
  157. _id: uuid.v1(),
  158. pId: addCostInfos[0].yId, // 邀请人标识
  159. uId: addCostInfos[0].yuId, // 邀请人用户id
  160. isSend: 0, //该天产生的奖励是否通过邮件已发送出去
  161. all: addCostInfos[0].all //邀请人邀请的所有新人在该天的全部消耗
  162. });
  163. yield invitesCostItem0.saveAsync();
  164. }
  165. else if (jrxhList0.length == 1) {
  166. jrxhList0[0].all += addCostInfos[0].all;
  167. yield jrxhList0[0].saveAsync();
  168. }
  169. }
  170. if(addCostInfos[1] && addCostInfos[1].yId){
  171. let opts1 = {
  172. pId: addCostInfos[1].yId,
  173. dayTime: { $gte: jrStart, $lt: jrStart+86400000}
  174. };
  175. var jrxhList1 = yield this.app.models.InvitesCost.findMongoAsync(opts1, 'pId uId all');
  176. if (jrxhList1.length == 0) {
  177. var invitesCostItem1 = new this.app.models.InvitesCost({
  178. _id: uuid.v1(),
  179. pId: addCostInfos[1].yId, // 邀请人标识
  180. uId: addCostInfos[1].yuId, // 邀请人用户id
  181. isSend: 0, //该天产生的奖励是否通过邮件已发送出去
  182. all: addCostInfos[1].all //邀请人邀请的所有新人在该天的全部消耗
  183. });
  184. yield invitesCostItem1.saveAsync();
  185. }
  186. else if (jrxhList1.length == 1) {
  187. jrxhList1[0].all += addCostInfos[1].all;
  188. yield jrxhList1[0].saveAsync();
  189. }
  190. }
  191. if(addCostInfos[2] && addCostInfos[2].yId){
  192. let opts2 = {
  193. pId: addCostInfos[2].yId,
  194. dayTime: { $gte: jrStart, $lt: jrStart+86400000}
  195. };
  196. var jrxhList2 = yield this.app.models.InvitesCost.findMongoAsync(opts2, 'pId uId all');
  197. if (jrxhList2.length == 0) {
  198. var invitesCostItem2 = new this.app.models.InvitesCost({
  199. _id: uuid.v1(),
  200. pId: addCostInfos[2].yId, // 邀请人标识
  201. uId: addCostInfos[2].yuId, // 邀请人用户id
  202. isSend: 0, //该天产生的奖励是否通过邮件已发送出去
  203. all: addCostInfos[2].all //邀请人邀请的所有新人在该天的全部消耗
  204. });
  205. yield invitesCostItem2.saveAsync();
  206. }
  207. else if (jrxhList2.length == 1) {
  208. jrxhList2[0].all += addCostInfos[2].all;
  209. yield jrxhList2[0].saveAsync();
  210. }
  211. }
  212. if(addCostInfos[3] && addCostInfos[3].yId){
  213. let opts3 = {
  214. pId: addCostInfos[3].yId,
  215. dayTime: { $gte: jrStart, $lt: jrStart+86400000}
  216. };
  217. var jrxhList3 = yield this.app.models.InvitesCost.findMongoAsync(opts3, 'pId uId all');
  218. if (jrxhList3.length == 0) {
  219. var invitesCostItem3 = new this.app.models.InvitesCost({
  220. _id: uuid.v1(),
  221. pId: addCostInfos[3].yId, // 邀请人标识
  222. uId: addCostInfos[3].yuId, // 邀请人用户id
  223. isSend: 0, //该天产生的奖励是否通过邮件已发送出去
  224. all: addCostInfos[3].all //邀请人邀请的所有新人在该天的全部消耗
  225. });
  226. yield invitesCostItem3.saveAsync();
  227. }
  228. else if (jrxhList3.length == 1) {
  229. jrxhList3[0].all += addCostInfos[3].all;
  230. yield jrxhList3[0].saveAsync();
  231. }
  232. }
  233. // return;
  234. });
  235. // proto.backAsync = cor(function* (user) {
  236. ////给玩家发邮件
  237. proto.senMailToPlayer = P.coroutine(function* (playerId,userId,tittleT,descT,_reward,_rewardT,_rewardC,form) {
  238. //////获得活动配置的open和开始结束时间
  239. // proto.senMailToPlayer = function (playerId,userId,tittleT,descT,_reward,_rewardT,_rewardC,form){
  240. // console.warn("给玩家发邮件 playerId "+playerId+" userId "+userId);
  241. if (!playerId || !userId || !tittleT || !descT || !form) {
  242. return false;
  243. }
  244. var reward = Number(_reward) || 0;;
  245. var rewardT = Number(_rewardT) || 0;
  246. var rewardC = Number(_rewardC) || 0;
  247. if (reward) {
  248. if(!rewardT || !rewardC) return false;//fail: rewardT or rewardC error!
  249. }
  250. else{
  251. if(rewardT) return false;//fail: rewardT error!
  252. if(rewardC) return false;//fail: rewardC error!
  253. }
  254. let receive = 1;
  255. if(reward) receive = 0;
  256. var mail = yield this.app.models.Mails.findByIdAsync(playerId, 'mailInfos');
  257. if (mail) {
  258. let item = {
  259. _id: "",
  260. index: mail.mailInfos.length, // 邮件下标
  261. tittleT: tittleT, // 邮件标题类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  262. descT: descT, // 邮件内容类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  263. reward: reward, // 有无奖励 0:无奖励 1:有奖励
  264. rewardT: rewardT, // 奖励类型 0:未定义 1:钻石,
  265. rewardC: rewardC, // 奖励数量
  266. receive: receive, // 是否领取 0:未领取 1:已领取
  267. read: 0, // 是否已读 0:未读 1:已读
  268. form:form, //邮件来源
  269. sendTime: Date.now() // 发送日期
  270. }
  271. let newItem = _.clone(mail.mailInfos);
  272. let newItem2 = [0].concat(newItem);
  273. newItem2[0] = item;
  274. if(newItem2.length > 60){
  275. newItem2 = newItem2.slice(0,60)
  276. }
  277. mail.mailInfos = [];
  278. mail.mailInfos = _.clone(newItem2);
  279. yield mail.saveAsync();
  280. }
  281. else{
  282. let item = {
  283. _id: "",
  284. index: 0, // 邮件下标
  285. tittleT: tittleT, // 邮件标题类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  286. descT: descT, // 邮件内容类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  287. reward: reward, // 有无奖励 0:无奖励 1:有奖励
  288. rewardT: rewardT, // 奖励类型 0:未定义 1:钻石,
  289. rewardC: rewardC, // 奖励数量
  290. receive: receive, // 是否领取 0:未领取 1:已领取
  291. read: 0, // 是否已读 0:未读 1:已读
  292. form:form, //邮件来源
  293. sendTime: Date.now() // 发送日期
  294. }
  295. let newItem = [];
  296. newItem[0] = item;
  297. var newMail = new this.app.models.Mails({
  298. _id: playerId, // 用户id(player表的主键)
  299. userId: userId, // 用户的userId
  300. mailInfos: newItem // 该活动的达成条件和奖励信息列表
  301. });
  302. yield newMail.saveAsync();
  303. }
  304. return true;
  305. });
  306. ////检查是否是系统创房
  307. proto.checkIsSystemCreat = P.coroutine(function* (playerId) {
  308. if(playerId == "system_promote") return true;
  309. return false;
  310. });
  311. ////检查链接是否可进去,非比赛时间比赛链接不可进去
  312. proto.checkIsCanJoin = P.coroutine(function* (gameid,_agentId,type) {
  313. let agentId = _agentId || "";
  314. if(!agentId) return { code: C.OK};
  315. // type: 1:创建房间,2:加入房间,3:创建或加入房间
  316. let aidsub = agentId.substr(0, 9);
  317. // console.warn("检查链接是否可进去,type: 1:创建房间,2:加入房间,3:创建或加入房间 aidsub "+aidsub+" agentId "+agentId);
  318. let bsIndex = aidsub.indexOf("promote_");
  319. if(bsIndex == -1) return { code: C.OK};//非比赛链接可以进去
  320. let nowTime = Date.now();
  321. // nowTime = 1681977609000;
  322. var opts = {
  323. stime: { $lte: nowTime },
  324. etime: { $gt: nowTime}
  325. };
  326. opts['aid'] = agentId;
  327. let timelist = yield this.app.models.RaceTimeInfos.findMongoAsync(opts, 'agentNo stime etime', { sort: { etime: 1 } });//
  328. let isBSQJ = false;//是否活动期间
  329. // console.warn("这查到的是结束时间在今日的记录 nowTime "+nowTime+" length "+timelist.length+" timelist "+ JSON.stringify(timelist));
  330. if(timelist.length > 0){
  331. //这查到的是开始时间小于等于当前时间而且结束时间大于当前时间的记录
  332. for (var i = 0; i < timelist.length; i++) {
  333. if(timelist[i].stime <= nowTime && nowTime < timelist[i].etime){
  334. // console.warn("是比赛期间")
  335. isBSQJ = true;//是比赛期间
  336. break;
  337. }
  338. }
  339. }
  340. if(!isBSQJ) return { code: C.FAILD, msg: "非比赛时间,不可进入" };
  341. return { code: C.OK};
  342. });
  343. //ts++签名验证
  344. function checkSign(sign) {
  345. var signKey = 'defe6d21422c8b770767f74fcea95';
  346. if (sign!=signKey) return false;
  347. return true;
  348. };