message.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. <?php
  2. defined( 'IN_WEB') or die( 'Include Error!');
  3. /**
  4. * 消息
  5. * Class ModelMessage
  6. * Created by: Owen
  7. * Created on: 2019/8/29 17:29
  8. * Description:
  9. */
  10. class ModelMessage{
  11. public $maxTime = 7 * 24 * 60 * 60;
  12. /**
  13. * 获取当前用户的消息数量 -- 未读
  14. * @param $uid
  15. * @return false|int|string
  16. * Created by: Owen
  17. * Created on: 2019/8/29 17:34
  18. * Description:
  19. */
  20. public function getTotalNum($uid){
  21. $uid = intval($uid);
  22. if(empty($uid)){
  23. $data = array('code' => -1,'desc'=>'参数错误!');
  24. return json_encode($data);
  25. }
  26. //查询所有未读的消息
  27. $table = otable::messageLog($uid);
  28. $time = time() - $this->maxTime;
  29. $sql = " SELECT count(*) AS count FROM {$table} WHERE `uid` = $uid AND `time` > {$time} AND `is_read`=0 order by time desc";
  30. $ret = oo::commonOprDb('message_log')->getOne($sql, MYSQLI_ASSOC);
  31. if($ret){
  32. return $ret['count'];
  33. }else{
  34. return 0;
  35. }
  36. }
  37. /**
  38. * 好友申請數量
  39. * @param $uid
  40. * @return int
  41. * Created by: Owen
  42. * Created on: 2019/9/4 18:34
  43. */
  44. public function getFriApplyNum($uid){
  45. $time = time() - $this->maxTime;
  46. $date = date('Y-m-d H:i:s',$time);
  47. $ftb = otable::friendLog();
  48. $sql = "SELECT count(*) as count FROM {$ftb} WHERE `touid` = {$uid} AND created_at > '{$date}' AND status=0";
  49. $ret = oo::commonOprDb('userfriendlog')->getOne($sql, MYSQLI_ASSOC);
  50. if($ret){
  51. return $ret['count'];
  52. }else{
  53. return 0;
  54. }
  55. }
  56. /**
  57. * 增加消息
  58. * @param $uid
  59. * @param $toUid
  60. * @param $nick
  61. * @param $s_picture
  62. * @param $gbaseReward
  63. * @param $is_read
  64. * @param $petSkill
  65. * @param $type 1 偷,2盾牌,3、4建筑,6支付,7邀請,8、9寵物,10邀请码进入,11召回好友成功消息 12挖雷奖励
  66. * Created by: Owen
  67. * Created on: 2019/9/4 18:53
  68. */
  69. public function addMessage($uid,$toUid,$nick,$s_picture,$gbaseReward,$type,$is_read = 0,$petSkill = []){
  70. $tb = otable::messageLog($uid);
  71. $start_time = time();
  72. $end_time = $start_time + $this->maxTime;
  73. $nick = str_replace("\\","",$nick);
  74. $nick = str_replace("'","\'",$nick);
  75. $tempPetSkill = 0;
  76. if(!empty($petSkill[1]) && $petSkill[1] != 0){
  77. $tempPetSkill = $petSkill[1];
  78. }
  79. if(isset($petSkill['petGetExp'])){
  80. $tempPetSkill = intval($petSkill['petGetExp']);
  81. }
  82. oo::commonOprDb('common')->query("INSERT INTO {$tb} (uid, toUid, name, s_picture, num, type, is_read, time, exp_time, bubble,petSkill) VALUES({$uid},{$toUid},'{$nick}','{$s_picture}',{$gbaseReward},{$type},{$is_read}, {$start_time},{$end_time},0,{$tempPetSkill})");
  83. $data = [
  84. 'uid' => $uid,
  85. 'toUid' => $toUid,
  86. 'name' => $nick,
  87. 's_picture' => $s_picture,
  88. 'num' => $gbaseReward,
  89. 'type' => $type,
  90. 'is_read' => $is_read,
  91. 'time' => $start_time,
  92. 'exp_time' => $end_time,
  93. 'bubble' => 0,
  94. 'petSkill' => $tempPetSkill,
  95. ];
  96. if($type != 6){
  97. $friends = oo::commonOprModel('friend')->getUserAllFriend($uid);
  98. $data = array_merge($data,$this->getMessageData($toUid,$friends,['petSkill'=>$tempPetSkill]));
  99. }
  100. oo::commonOprModel('Workerman')->push($uid,ocmd::$redPoint,['type'=>4,"data"=>$data]);
  101. }
  102. /**
  103. * 消息中心--宠物消息
  104. * @param $uid
  105. * @param $toUid
  106. * @param $nick
  107. * @param $s_picture
  108. * @param $type
  109. * Created by: Owen
  110. * Created on: 2020/3/19 18:11
  111. */
  112. public function addPetMessage($uid,$toUid,$nick,$s_picture,$type){
  113. $tb = otable::messageLog($uid);
  114. $start_time = time();
  115. $end_time = $start_time + $this->maxTime;
  116. $nick = str_replace("\\","",$nick);
  117. $nick = str_replace("'","\'",$nick);
  118. $sql = "INSERT INTO {$tb} (uid, toUid, name, s_picture,num,type, time, exp_time) VALUES($uid,$toUid,'$nick','$s_picture',0,$type,$start_time,$end_time)";
  119. oo::commonOprDb('common')->query($sql);
  120. $data = [
  121. 'uid' => $uid,
  122. 'toUid' => $toUid,
  123. 'name' => $nick,
  124. 's_picture' => $s_picture,
  125. 'num' => 0,
  126. 'type' => $type,
  127. 'is_read' => 0,
  128. 'time' => $start_time,
  129. 'exp_time' => $end_time,
  130. 'bubble' => 0,
  131. 'petSkill' => 0,
  132. ];
  133. $data = array_merge($data,$this->getMessageData($toUid,oo::commonOprModel('friend')->getUserAllFriend($uid)));
  134. oo::commonOprModel('Workerman')->push($uid,ocmd::$redPoint,['type'=>4,"data"=>$data]);
  135. }
  136. /**
  137. * 重构消息列表
  138. * @param $uid
  139. * @return array
  140. * Created by: Owen
  141. * Created on: 2020/3/6 15:50
  142. */
  143. public function getMessageList($uid){
  144. if(empty($uid)){
  145. return ['code' => -1,'desc'=>'参数错误!'];
  146. }
  147. $tb = otable::messageLog($uid);
  148. $minTime = $time = time() - $this->maxTime;
  149. $list = oo::commonOprDb('message_log')->getAll("SELECT * FROM {$tb} WHERE `uid`={$uid} AND `time`>={$time} ORDER BY time DESC LIMIT 30", MYSQLI_ASSOC);
  150. $readArrId = [];
  151. $friends = oo::commonOprModel('friend')->getUserAllFriend($uid);
  152. $attackAndStealLimit=0;
  153. foreach ($list as $k=>$v){
  154. //打偷消息只显示10条
  155. if(in_array($v['type'],[1,2,3])){
  156. $attackAndStealLimit++;
  157. if($attackAndStealLimit>10){
  158. unset($list[$k]);
  159. continue;
  160. }
  161. }
  162. !$v['is_read'] && array_push($readArrId,$v['id']);
  163. $v['type'] != 6 && $list[$k] = array_merge($list[$k],$this->getMessageData($v['toUid'],$friends,$v));
  164. $list[$k]['from'] = "messgae";
  165. $minTime = $v['time'];
  166. }
  167. !empty($readArrId) && $this->changeMessageReadStatus($uid,$readArrId);
  168. $ftb = otable::friendLog();
  169. $minTime = date("Y-m-d H:i:s",$minTime);
  170. $review = oo::commonOprDb('userfriendlog')->getAll("SELECT * FROM {$ftb} WHERE `touid`={$uid} AND created_at>'{$minTime}' ORDER BY created_at DESC", MYSQLI_ASSOC);
  171. foreach ($review as $k=>$v){
  172. $temp = $this->getApplyFriendMessageData($uid,$v['touid'],$v);
  173. !empty($temp) && $list[] = $temp;
  174. }
  175. if(!empty($list)){
  176. array_multisort(array_column($list,'time'),SORT_DESC,$list);
  177. }
  178. return ['code' => 1,'desc'=>'获取列表成功','data'=>$list];
  179. }
  180. /**
  181. * 删除消息
  182. * Created by: Owen
  183. * Created on: 2020/3/6 16:02
  184. */
  185. public function delMessgae(){
  186. $time = time() - $this->maxTime;
  187. $created_at = date("Y-m-d H:i:s",$time);
  188. for ($i=0;$i<100;$i++){
  189. $tb = otable::messageLog($i);
  190. oo::commonOprDb('message_log')->query("DELETE FROM {$tb} WHERE `time`<{$time}");
  191. }
  192. // $ftb = otable::friendLog();
  193. // oo::commonOprDb('userfriendlog')->query("DELETE FROM {$ftb} WHERE `created_at`<'{$created_at}'");
  194. }
  195. /**
  196. * 消息数据结构
  197. * @param $uid
  198. * @param array $friends
  199. * @param array $vData
  200. * @return array
  201. * Created by: Owen
  202. * Created on: 2020/12/25 11:47
  203. */
  204. public function getMessageData($uid,$friends = [],$vData = []){
  205. $memberInfo = oo::commonOprModel('member')->getUserInfo($uid);
  206. $assetsInfo = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  207. return [
  208. 'u_flag' => $memberInfo['u_flag'],
  209. 'vip' => $memberInfo['vip'],
  210. 'vipLv' => $memberInfo['vipLv'],
  211. 'vipExpire' => $memberInfo['vip_expire'],
  212. 'avatar' => intval($memberInfo['avatar']),
  213. 'isFb' => intval($memberInfo['isFb']),
  214. 'sex' => intval($memberInfo['sex']),
  215. 'signature' => intval($memberInfo['signature']),
  216. 'isFbFriend'=> (in_array($uid,$friends) && $memberInfo['isFb'])?1:0,
  217. 'isFriend' => (in_array($uid,$friends))?1:0,
  218. 'levelId' => intval($assetsInfo['levelId']),
  219. 'star' => intval($assetsInfo['star']),
  220. 'money' => intval($assetsInfo['money']),
  221. 'coins' => intval($assetsInfo['money']),
  222. 'petSkill' => intval($vData['petSkill']),
  223. ];
  224. }
  225. /**
  226. * 好友消息结构
  227. * @param $uid
  228. * @param $toUid
  229. * @param array $vData
  230. * @return array
  231. * Created by: Owen
  232. * Created on: 2020/12/25 11:29
  233. */
  234. public function getApplyFriendMessageData($uid,$toUid,$vData = []){
  235. $memberInfo = oo::commonOprModel('member')->getUserInfo($toUid);
  236. if(!empty($memberInfo)){
  237. $assetsInfo = oo::commonOprModel('member')->getUserAssetsInfo($toUid);
  238. if(!empty($assetsInfo)){
  239. return [
  240. 'is_read' => 1,
  241. 'name' => oo::commonOprModel('member')->getUserFirstName($memberInfo['nick']),
  242. 'num' => 0,
  243. 's_picture'=> $memberInfo['s_picture'],
  244. 'time' => empty($vData['created_at']) ? time() : strtotime($vData['created_at']),
  245. 'toUid' => $memberInfo['uid'],
  246. 'type' => 5,
  247. 'u_flag' => $memberInfo['u_flag'],
  248. 'vip' => $memberInfo['vip'],
  249. 'vipLv' => $memberInfo['vipLv'],
  250. 'vipExpire'=> $memberInfo['vip_expire'],
  251. 'avatar' => $memberInfo['avatar'],
  252. 'uid' => $uid,
  253. 'from' => 'friend',
  254. 'status' => empty($vData['status']) ? 0 : $vData['status'],
  255. 'isFb' => $memberInfo['isFb'],
  256. 'sex' => $memberInfo['sex'],
  257. 'signature'=> $memberInfo['signature'],
  258. 'isFbFriend'=> 0,
  259. 'isFriend'=> 0,
  260. 'petSkill'=> 0,
  261. 'levelId' => intval($assetsInfo['levelId']),
  262. 'star' => intval($assetsInfo['star']),
  263. 'money' => intval($assetsInfo['money']),
  264. 'coins' => intval($assetsInfo['money']),
  265. ];
  266. }
  267. }
  268. return [];
  269. }
  270. /**
  271. * 设置已读
  272. * @param $uid
  273. * @param $arrId
  274. * @return string
  275. * Created by: Owen
  276. * Created on: 2020/12/25 15:15
  277. */
  278. public function changeMessageReadStatus($uid,$arrId = []){
  279. $tb = otable::messageLog($uid);
  280. if(!empty($arrId)){
  281. $arrId = implode(',',$arrId);
  282. oo::commonOprDb('message_log')->query("UPDATE {$tb} SET `is_read`=1 WHERE id IN ({$arrId})");
  283. }else{
  284. oo::commonOprDb('message_log')->query("UPDATE {$tb} SET `is_read`=1 WHERE uid={$uid}");
  285. }
  286. return oo::response(1);
  287. }
  288. //===========================邮件系统===========================
  289. /**
  290. * 钻石自动转换成体力系统邮件
  291. * @return array
  292. */
  293. private function getDiamondToSysMailInfo() {
  294. return [
  295. 'body' => [
  296. 'EN' => "To bring you better gaming experiences, the gem system will be officially canceled in the next version.\r\n\r\nTo avoid your losses, your Gems have been automatically 1:1 converted into Spins. Please collect here. \r\nWe sincerely apologize for the inconvenience caused to you. If you have any questions, please do not hesitate to contact our customer service team.\r\nThank you!",
  297. "ZH" => "为了给您带来更好的游戏体验,宝石系统将会在下个版本中正式取消。\r\n为了避免您的损失,您的宝石被自动1:1兑换为体力进行返还。 请在这里收集您的体力。\r\n给您带来的不便,我们深表歉意。 如果您有任何问题,请与我们的客户服务团队联系。\r\n谢谢您!",
  298. "FR" => "Pour vous offrir de meilleures expériences de jeu, le système GEM sera officiellement annulé dans la prochaine version.\r\n\r\nPour éviter des pertes, vos GEM ont été automatiquement 1:1 converties en Spins. Veuillez récupérer ici. \r\n\r\nNous vous présentons nos sincères excuses pour le désagrément qui vous a été causé. Si vous avez des questions, n\'hésitez pas à contacter notre service client.\r\n\r\nMerci!",
  299. "DE" => "Um Ihnen ein besseres Spielerlebnis zu bieten, wird das Edelstein-System in der nächsten Version offiziell abgeschafft.\r\n\r\n Um Ihre Verluste zu vermeiden, wurden Ihre Edelsteine automatisch 1:1 in Drehungen umgewandelt. Bitte sammeln Sie diese hier ein. \r\n\r\nWir entschuldigen uns aufrichtig für die Unannehmlichkeiten. Bei Fragen können Sie sich gerne an unseren Kundenservice wenden. \r\n\r\nVielen Dank!",
  300. ],
  301. "title" => [
  302. 'EN' => 'Dear Voyager',
  303. 'ZH' => '亲爱的旅行者',
  304. 'FR' => 'Cher voyageur',
  305. 'DE' => 'Liebe Reisende',
  306. ],
  307. "langs" => ["ZH","EN","TW","FR","PT","DE","ES","TH","ID","VI","NO"],
  308. ];
  309. }
  310. public function getDiamondToSpinsNum($diamond = 0){
  311. //return $diamond; //1:1兑换
  312. if($diamond <= 10){
  313. $diamond = 10;
  314. } elseif($diamond <= 50){
  315. $diamond = 50;
  316. } elseif($diamond <= 100){
  317. $diamond = 100;
  318. } else {
  319. $diamond = $diamond;
  320. }
  321. return $diamond;
  322. }
  323. /**
  324. * 钻石转化成体力更新公告
  325. * @param int $uid
  326. * @param int $diamond
  327. * @return bool
  328. */
  329. public function diamondToSysMail($uid, $diamond = 0) {
  330. //$switch = oo::commonOprRedis('userinfo')->get(okeys::sysMsgGetNSatus());
  331. //if(empty($switch) && $diamond > 1000){
  332. // return [];
  333. //}
  334. if($diamond > 0){
  335. $diamond = $this->getDiamondToSpinsNum($diamond);
  336. }
  337. //领取状态(2:已领取,1:可领取,0:未读)
  338. $dCache = $this->getDiamondToSysMail($uid);
  339. if($diamond > 0){
  340. //有奖励且未领取,在原基础上加
  341. if(isset($dCache['status']) && !$dCache['status'] && !empty($dCache['props'])){
  342. $diamond += $dCache['props'][0]['num'];
  343. }
  344. $dCache = ['props'=>[['propsId' => '15','num' => (int)$diamond]], 'status' => 0];
  345. $ret = oo::commonOprRedis('userinfo')->setex(okeys::sysMsgGetN($uid), json_encode($dCache), 30 * 24 * 3600);
  346. } else {
  347. if(empty($dCache)){
  348. return [];
  349. }
  350. }
  351. $got = $dCache['status'];
  352. $data = $this->getDiamondToSysMailInfo();
  353. $rewardInfo = [
  354. 'title' => $data['title'],
  355. 'body' => $data['body'],
  356. 'langs' => $data['langs'],
  357. 'rewards' => $dCache['props'],
  358. 'msgid' => 1000001, //给默认值
  359. 'id' => 1000001, //给默认值
  360. 'got' => $got,
  361. ];
  362. return $rewardInfo;
  363. }
  364. public function getDiamondToSysMail($uid) {
  365. $key = okeys::sysMsgGetN($uid);
  366. $tmp = oo::commonOprRedis('userinfo')->get($key);
  367. return empty($tmp) ? [] : (array)json_decode($tmp, true);
  368. }
  369. /**
  370. * 设置钻石转换体力已领取
  371. * @param int $uid
  372. * @param int $flag (1:已读,2:已领)
  373. * @return bool
  374. */
  375. public function setDiamondNoticeStatus($uid, $flag = 1) {
  376. $key = okeys::sysMsgGetN($uid);
  377. $tmp = oo::commonOprRedis('userinfo')->get($key);
  378. if(empty($tmp)){
  379. return true;
  380. }
  381. $dCache = (array)json_decode($tmp, true);
  382. if(empty($dCache)){
  383. oo::logs()->debug3(['uid' => $uid, 'flag' => $flag, 'data' => $dCache], 'diamond_to_sysmail_log');
  384. oo::commonOprRedis('userinfo')->delete($key);
  385. return true;
  386. }
  387. $flag = !in_array($flag, [1, 2]) ? 2 : $flag;
  388. $dCache['status'] = $flag;
  389. return (bool)oo::commonOprRedis('userinfo')->setex($key, json_encode($dCache), 30 * 24 * 3600);
  390. }
  391. /**
  392. * 获取系统配置的邮件内容
  393. * @param int $uid
  394. * @return array
  395. */
  396. public function getSysMailMsg() {
  397. $key = okeys::sysMailMsg();
  398. $cacheArr = oo::commonOprRedis('common')->hGetAll($key);
  399. $msgs = [];
  400. if(empty($cacheArr)){
  401. $tb = otable::sysMailMsg();
  402. $time = time() - 15 * 24 * 3600; //15天之前的内容不读了
  403. $sql = "SELECT * FROM {$tb} WHERE create_time > {$time} order by id desc";
  404. $list = oo::commonOprDb('config')->getAll($sql, 1);
  405. $upArr = [];
  406. foreach($list as $v){
  407. $v['title'] = (array)json_decode($v['title'], true);
  408. $v['body'] = (array)json_decode($v['body'], true);
  409. $v['langs'] = (array)json_decode($v['langs'], true);
  410. $v['rewards'] = (array)json_decode($v['rewards'], true);
  411. $v['uids'] = (array)json_decode($v['uids'], true);
  412. $v['version'] = explode(',', $v['version']);
  413. $upArr[$v['id']] = json_encode($v);
  414. $msgs[] = $v;
  415. }
  416. oo::commonOprRedis('common')->hMSet($key, $upArr);
  417. $a = oo::commonOprRedis('common')->hGetAll($key);
  418. //设置过期时间
  419. oo::commonOprRedis('common')->expire($key, oo::redisRandomExpire(20 * 24 * 3600));
  420. }else{
  421. krsort($cacheArr);
  422. foreach($cacheArr as $k => $v){
  423. $v = json_decode($v, true);
  424. $msgs[] = $v;
  425. }
  426. }
  427. return $msgs;
  428. }
  429. /**
  430. * 获取我的系统邮件
  431. * @param
  432. */
  433. public function getMySysMail($uid, $id = 0) {
  434. $key = okeys::sysMsgGet($uid);
  435. $cacheArr = oo::commonOprRedis('user')->hGetAll($key);
  436. $arr = [];
  437. $time = time();
  438. if(empty($cacheArr)){
  439. $tb = otable::userSysMail($uid);
  440. //$sql = "SELECT * FROM {$tb} WHERE uid={$uid} AND expire > {$time}";
  441. $expired = $time - 30 * 24 * 3600; //30天之前的内容不读了
  442. $sql = "SELECT * FROM {$tb} WHERE uid={$uid} AND create_time > {$expired}";
  443. $tmp = oo::commonOprDb('usersysmail')->getAll($sql, MYSQLI_ASSOC);
  444. $upArr = [];
  445. foreach($tmp as $k => $v){
  446. $v['rewards'] = $v['rewards'] ? (array)json_decode($v['rewards'], true) : [];
  447. $arr[$v['msgid']] = $v;
  448. $msgId = $v['msgid'];
  449. unset($v['msgid']);
  450. $upArr[$msgId] = json_encode($v);
  451. }
  452. if($upArr){
  453. oo::commonOprRedis('user')->hMSet($key, $upArr);
  454. //个人邮件保留7天
  455. oo::commonOprRedis('user')->expire($key, oo::redisRandomExpire(7 * 24 * 3600));
  456. }
  457. }else{
  458. foreach($cacheArr as $k => $v){
  459. $v = json_decode($v, true);
  460. $arr[$k] = $v;
  461. }
  462. }
  463. /////////////////////////////////////////////
  464. //存量钻石转化系统邮件
  465. $diamondInfo = $this->diamondToSysMail($uid);
  466. if($id == 1000001) {
  467. return $diamondInfo;
  468. }
  469. if(!empty($id)){
  470. return isset($arr[$id]) ? $arr[$id] : [];
  471. }
  472. $arr[1000001] = $diamondInfo;
  473. return $arr;
  474. }
  475. /**
  476. * 获取玩家对应的系统消息
  477. * @param int $uid
  478. * @return array
  479. * Created by: Richard
  480. * Created on: 2021/03/03 12:20
  481. */
  482. public function getSysMailMsgByUid($uid, $sid = 0, $lasttime = 0) {
  483. $list = $this->getSysMailMsg();
  484. $levelId = oo::commonOprModel('member')->getUserLevelId($uid);
  485. $version = oo::commonOprModel('user')->getUserVersion($uid);
  486. $userinfo = oo::commonOprModel('member')->getUserInfo($uid);
  487. if(empty($lasttime)){
  488. $lasttime = $userinfo['lasttime'];
  489. }
  490. $vipPoint = empty($userinfo['vipPoint']) ? 0 : $userinfo['vipPoint'];
  491. $myMsgArr = $this->getMySysMail($uid);
  492. $key = okeys::sysMsgGet($uid);
  493. $sid = empty($sid) ? oo::getDefinedSid($uid) : $sid;
  494. $lang = ''; //玩家所在国家
  495. $msgs = [];
  496. $newNum = 0;
  497. $sql = '';
  498. $tb = otable::userSysMail($uid);
  499. $time = time();
  500. //钻石存量转系统邮件数据
  501. if(!empty($myMsgArr[1000001])){
  502. $tmp = $myMsgArr[1000001];
  503. $tmp['id'] = 1000001;
  504. $tmp['expire'] = 24 * 3600 * 30;
  505. $list[] = $myMsgArr[1000001];
  506. }
  507. foreach($list as $v){
  508. if(!empty($myMsgArr[$v['id']])){
  509. if(!empty($myMsgArr[$v['id']]['expire']) && $myMsgArr[$v['id']]['expire'] < $time){
  510. continue; //过期的邮件
  511. }
  512. $v['got'] = $myMsgArr[$v['id']]['got'];
  513. $info = [
  514. 'id' => $v['id'],
  515. 'title' => $v['title'],
  516. 'body' => $v['body'],
  517. 'rewards' => $myMsgArr[$v['id']]['rewards'],
  518. 'got' => $v['got'],
  519. 'expire' => isset($myMsgArr[$v['id']]['expire']) ? $myMsgArr[$v['id']]['expire'] : time(),
  520. 'create_time' => empty($v['create_time']) ? $time : $v['create_time'],
  521. ];
  522. $msgs[] = $info;
  523. if(empty($v['got'])){
  524. $newNum++;
  525. }
  526. continue;
  527. }
  528. if(!empty($v['online_start']) && $lasttime < $v['online_start']){
  529. continue;
  530. }
  531. if(!empty($v['online_end']) && $lasttime > $v['online_end']){
  532. continue;
  533. }
  534. //uid列表
  535. if(!empty($v['uids']) && !in_array($uid, $v['uids'])){
  536. continue;
  537. }
  538. //版本
  539. if(!empty($v['version'][0]) && !oo::compareVersion($version, $v['version'][0])){
  540. continue;
  541. }
  542. if(!empty($v['version'][1]) && oo::compareVersion($version, $v['version'][1], false)){
  543. continue;
  544. }
  545. //玩家等级区间
  546. if(($v['level_start'] && $levelId < $v['level_start']) || ($v['level_end'] && $levelId > $v['level_end'])){
  547. continue;
  548. }
  549. //积分区间
  550. if(($v['score_start'] && $vipPoint < $v['score_start']) || $v['score_end'] && $vipPoint > $v['score_end']){
  551. continue;
  552. }
  553. //设备
  554. if(!empty($v['sid']) && $sid != $v['sid']){
  555. continue;
  556. }
  557. //国家语言
  558. if(!empty($v['langs'])){
  559. $lang = $lang ? $lang : oo::commonOprModel('member')->getUserLang($uid);
  560. if(!in_array($lang, $v['langs'])){
  561. continue;
  562. }
  563. }
  564. if(empty($v['days'])){
  565. continue;
  566. }
  567. $rewards = $v['rewards'];
  568. $newNum++;
  569. $t = json_encode($rewards);
  570. $up = ['got' => 0, 'uid' => $uid, 'expire' => $time + 24 * 3600 * $v['days'], 'rewards' => $rewards, 'create_time' => $time];
  571. //写入数据库
  572. oo::commonOprRedis('user')->hSet($key, $v['id'], json_encode($up));
  573. if($sql){
  574. $sql .= ",(NULL,{$uid},{$v['id']},0,'{$t}',{$up['expire']},{$time})";
  575. }else{
  576. $sql = "REPLACE INTO {$tb} (id,uid,msgid,got,rewards,expire,create_time) VALUES (NULL,{$uid},{$v['id']},0,'{$t}',{$up['expire']},{$time})";
  577. }
  578. $info = [
  579. 'id' => $v['id'],
  580. 'title' => $v['title'],
  581. 'body' => $v['body'],
  582. 'rewards' => $rewards,
  583. 'got' => 0,
  584. 'expire' => $up['expire'],
  585. 'create_time' => $time,
  586. ];
  587. if(!empty($id) && $v['id'] == $id){
  588. return $info;
  589. }
  590. $msgs[] = $info;
  591. }
  592. if($sql){
  593. $ret = oo::commonOprDb('usersysmail')->query($sql);
  594. if(empty($myMsgArr) && $newNum > 0){
  595. oo::commonOprRedis('user')->expire($key, oo::redisRandomExpire(7 * 24 * 3600));
  596. }
  597. }
  598. $data = ['msgs' => $msgs, 'newNum' => $newNum];
  599. return $data;
  600. }
  601. /**
  602. * 获取邮件奖励
  603. * @param int $id
  604. * @param int $uid
  605. * @return array
  606. * Created by: Richard
  607. * Created on: 2021/03/03 12:20
  608. */
  609. public function getUserMailMsgReward($uid, $id) {
  610. $key = okeys::sysMsgGet($uid); //领取状态
  611. $info = $this->getMySysMail($uid, $id);
  612. $data = ['code' => errorCode::SUCCESS];
  613. if(empty($info)){
  614. $data['code'] = errorCode::NONE_REWARD;
  615. $data['msg'] = 'no msg found';
  616. return json_encode($data);
  617. }
  618. if($info['got'] == 2){
  619. $data['code'] = errorCode::OVER_RECEIVE_REWARD;
  620. return json_encode($data);
  621. }
  622. $reason = '获取系统邮件奖励';
  623. if($id == 1000001){
  624. $reason = '钻石转体力邮件奖励';
  625. $this->setDiamondNoticeStatus($uid, 2);
  626. } else {
  627. $info['got'] = 2;
  628. oo::commonOprRedis('user')->hSet($key, $id, json_encode($info));
  629. //更新数据库
  630. $tb = otable::userSysMail($uid);
  631. $sql = "UPDATE {$tb} set got = 2 WHERE uid = {$uid} AND msgid={$id}";
  632. $ret = oo::commonOprDb('usersysmail')->query($sql);
  633. if(!$ret){
  634. oo::logs()->debug3(['uid' => $uid, 'id' => $id], 'sysmail_reward_error');
  635. $data['code'] = errorCode::SYSTEM_ERROR;
  636. return json_encode($data);
  637. }
  638. }
  639. foreach($info['rewards'] as $k => $reward){
  640. oo::commonOprModel('member')->sendReward($uid,$reward['propsId'],$reward['num'],600,$reason);
  641. }
  642. $data['rewards'] = $info['rewards'];
  643. return json_encode($data);
  644. }
  645. /**
  646. * 设置已读
  647. * @param int $uid
  648. * @param $id
  649. * @return bool
  650. */
  651. public function readMailMsg($uid, $id) {
  652. if($id == 1000001){
  653. return $this->setDiamondNoticeStatus($uid, 1);
  654. }
  655. $key = okeys::sysMsgGet($uid);
  656. $cache = oo::commonOprRedis('user')->hGet($key, $id);
  657. if(empty($cache)){ //记录不存在
  658. return false;
  659. }
  660. $info = (array)json_decode($cache, true);
  661. if(!empty($info['got'])){
  662. return true;
  663. }
  664. $info['got'] = 1;
  665. oo::commonOprRedis('user')->hSet($key, $id, json_encode($info));
  666. //更新数据库
  667. $tb = otable::userSysMail($uid);
  668. $sql = "UPDATE {$tb} set got = 1 WHERE uid = {$uid} AND msgid={$id}";
  669. return oo::commonOprDb('usersysmail')->query($sql);
  670. }
  671. }