friend.php 80 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921
  1. <?php
  2. defined('IN_WEB') or die('Include Error!');
  3. define('MAX_FRIEND_NUM', 300);
  4. define('APPLY_FRIEND_MSG', 0x4200);
  5. define('APPLY_FRIEND_REVIEW', 0x4201);
  6. /**
  7. * 好友相关逻辑
  8. */
  9. class ModelFriend{
  10. /**
  11. * 获取用户的好友列表
  12. * @param $uid
  13. * @param $friends
  14. * @return int 0,失败; =0,没有记录; >0,有记录
  15. * Created by: Owen
  16. * Created on: 2020/9/2 15:15
  17. */
  18. public function getUserFriends($uid, &$friends){
  19. if (!$uid = oo::functions()->uint($uid)) {
  20. return -1;
  21. }
  22. $tb = otable::userfriends($uid);
  23. $query = "select uid, isapper, notapper, game_list,poker ,updatetime, watchme from {$tb} where uid='{$uid}' limit 1";
  24. $friends = oo::commonOprDb('userfriends')->getOne($query, MYSQLI_ASSOC);
  25. if ($friends == false) {
  26. $friends = array('uid' => $uid, 'isapper' => '', 'notapper' => '', 'game_list' => '', 'updatetime' => 0, 'watchme' => '');
  27. }
  28. return 1;
  29. }
  30. /**
  31. * 保存用户的好友列表
  32. * @param $uid
  33. * @param null $array
  34. * @return int
  35. * Created by: Owen
  36. * Created on: 2020/9/2 15:16
  37. */
  38. public function setUserFriends($uid, $array = NULL){
  39. if (!$uid) return -1;
  40. if (empty($array)) return 0;
  41. $data = array(
  42. 'isapper' => $array['sisapper'],
  43. 'notapper' => $array['snotapper'],
  44. 'poker' => $array['spoker'],
  45. 'updatetime' => (int)$array['iupdatetime'],
  46. );
  47. $data['isapper'] = oo::functions()->escape($data['isapper']);
  48. $data['notapper'] = oo::functions()->escape($data['notapper']);
  49. $data['poker'] = oo::functions()->escape($data['poker']);
  50. $tb = otable::userfriends($uid);
  51. $query = "insert into {$tb} (uid,isapper,notapper,poker,updatetime) values ('{$uid}','{$data['isapper']}','{$data['notapper']}','{$data['poker']}','{$data['updatetime']}')";
  52. $ret = oo::commonOprDb('userfriends')->query($query);
  53. return $ret ? 0 : -2;
  54. }
  55. /**
  56. * 获取上次好友召回时间
  57. * @param int $uid
  58. * @param int $toUid
  59. * @return int
  60. */
  61. public function getCallBackTime($uid, $toUid) {
  62. return (int)oo::commonOprRedis('common')->hGet(okeys::callBackFriend($uid), $toUid);
  63. }
  64. /**
  65. * 获取上次好友列表召回时间
  66. */
  67. public function getListCallBackTime($uid, $toUids) {
  68. return oo::commonOprRedis('common')->hMGet(okeys::callBackFriend($uid), $toUids);
  69. }
  70. /**
  71. * 获取召回奖励物品
  72. * @param array
  73. */
  74. public function callbackConf() {
  75. $tmp = oo::commonOprRedis('common')->get(okeys::callbackConfig());
  76. //如果空数据返回一个默认值
  77. $config = [];
  78. if(!empty($tmp)){
  79. $config = (array)json_decode($tmp, true);
  80. }
  81. if(empty($config['level'])){
  82. $config['level'] = 2;
  83. }
  84. if(empty($config['reward'])){
  85. $config['reward'] = ['props' => [['propsId' => 15, 'num' => 30], ['propsId' => 2, 'num' => 1]]];
  86. }
  87. return $config;
  88. }
  89. public function canCallback($userInfo, $levelId, $lastCallbackTime = 0, array $conf = array()) {
  90. if(empty($conf)){
  91. $conf = oo::commonOprModel('friend')->callbackConf();
  92. }
  93. //好友等级太低,不能召回
  94. if($levelId < $conf['level']){
  95. return false;
  96. }
  97. //召回好友只支持fb玩家
  98. if(empty($userInfo['isFb'])){
  99. return false;
  100. }
  101. if($userInfo['lasttime'] + 15 * 24 * 3600 > time()){
  102. return false;
  103. }
  104. if($lastCallbackTime && $lastCallbackTime >= time()){
  105. return false;
  106. }
  107. return true;
  108. }
  109. /**
  110. * 获取好友数量进度奖励配置
  111. */
  112. public function friendsProgressRewardConf() {
  113. $key = okeys::friendProgressRewardConfig();
  114. $tmp = oo::commonOprRedis('common')->hgetall($key);
  115. $data = [];
  116. if(empty($tmp)){
  117. $tb = otable::friendProgressConfig();
  118. $sql = "SELECT * FROM {$tb} ORDER BY num asc";
  119. $tmp =oo::commonOprDb('config')->getAll($sql, MYSQLI_ASSOC);
  120. foreach($tmp as $k => $v){
  121. $v['reward'] = json_decode($v['reward'], true);
  122. $data[] = $v;
  123. }
  124. oo::commonOprRedis('common')->set($key, json_encode($data));
  125. }else{
  126. $data = json_decode($tmp, true);
  127. }
  128. return $data;
  129. }
  130. /**
  131. * 获取我的好友数量进度及奖励
  132. * @param int $uid
  133. * @return array
  134. */
  135. public function getUserFriendsProgress($uid) {
  136. $step = (int)oo::commonOprRedis('common')->get(okeys::friendProgressReward($uid));
  137. $config = $this->friendsProgressRewardConf();
  138. $data = ['step' => $step];
  139. if($step + 1 <= count($config)){
  140. $data['reward'] = $config[$step]['reward'];
  141. $data['num'] = $config[$step]['num'];
  142. }else{
  143. $data['reward'] = [];
  144. }
  145. $coins = 0;
  146. if(!empty($data['reward']['coins'])){
  147. $coins = oo::commonOprModel('goods')->getGoodCoins($uid, $data['reward']['coins']['coins']);
  148. $coins = intval($coins * $data['reward']['coins']['bet']);
  149. unset($data['reward']['coins']);
  150. }
  151. if(empty($data['reward']['props'])){
  152. if($coins > 0){
  153. $data['reward']['props'] = [
  154. ['propsId' => 14, 'num' => $coins],
  155. ];
  156. }
  157. return $data;
  158. }
  159. $coinsAdded = false;
  160. foreach($data['reward']['props'] as $k => $val){
  161. if($val['propsId'] == 14){
  162. $coinsAdded = true;
  163. }
  164. if($coins > 0 && $val['propsId'] == 14){
  165. $val['num'] += $coins;
  166. $data['reward']['props'][$k] = $val;
  167. break;
  168. }
  169. }
  170. if(!$coinsAdded && $coins > 0){
  171. $data['reward']['props'][] = ['propsId' => 14, 'num' => $coins];
  172. }
  173. return $data;
  174. }
  175. /**
  176. * 更新召回可领奖标志
  177. * @param int $uid
  178. */
  179. public function dealCallBackFriend($uid){
  180. $fids = $this->getBeCallBackList($uid);
  181. foreach($fids as $fid){
  182. //添加召回我的好友可领奖标志
  183. oo::commonOprRedis('common')->sAdd(okeys::callBackReward($fid), $uid);
  184. //推送消息
  185. oo::commonOprModel('Workerman')->push($fid,ocmd::$send['Friend_callback'], ['type' => 11]);
  186. //发送消息到message
  187. $userInfo = oo::commonOprModel('member')->getUserInfo($uid);
  188. oo::commonOprModel('message')->addMessage($fid,$uid,$userInfo['nick'],$userInfo['s_picture'],0,11,0);
  189. //30天过期
  190. oo::commonOprRedis('common')->expire(okeys::callBackReward($fid), oo::redisRandomExpire(24 * 3600 * 30));
  191. }
  192. }
  193. /**
  194. * 获取当前是否有新召回的好友
  195. * @param int $uid
  196. * @return int (0|1)
  197. */
  198. public function hasNewCallback($uid) {
  199. return oo::commonOprRedis('common')->sSize(okeys::callBackReward($uid)) ? 1 : 0;
  200. }
  201. /**
  202. * 获取玩家召回奖励
  203. * @param int $uid
  204. * @return array
  205. */
  206. public function getCallbackListInfo($uid) {
  207. $data = [];
  208. $list = oo::commonOprRedis('common')->sMembers(okeys::callBackReward($uid));
  209. if(empty($list)){
  210. return [];
  211. }
  212. $listArr = [];
  213. foreach($list as $v){
  214. $userInfo = oo::commonOprModel('member')->getUserInfo($v);
  215. $listArr[] = [
  216. 'nick' => $userInfo['nick'],
  217. 's_picture' => $userInfo['s_picture'],
  218. 'uid' => $v,
  219. ];
  220. }
  221. $data['list'] = $listArr;
  222. $tmp = $this->callbackConf();
  223. $reward = $tmp['reward'];
  224. $coins = 0;
  225. if(!empty($reward['coins'])){
  226. $coins = oo::commonOprModel('goods')->getGoodCoins($uid,$reward['coins']['coins']);
  227. $coins = intval($coins * $reward['coins']['bet']);
  228. unset($reward['coins']);
  229. }
  230. $count = count($list);
  231. $coinsAdded = false;
  232. foreach($reward['props'] as $k => $val){
  233. if($val['propsId'] == 14){
  234. $coinsAdded = true;
  235. }
  236. if($coins > 0 && $val['propsId'] == 14){
  237. $val['num'] = intval(($val['num'] + $count) * $coins);
  238. }else{
  239. $val['num'] = $val['num'] * $count;
  240. }
  241. $reward['props'][$k] = $val;
  242. }
  243. if(!$coinsAdded && $coins > 0){
  244. if(empty($reward['props'])){
  245. $reward['props'] = [];
  246. }
  247. $reward['props'][] = ['propsId' => 14, 'num' => intval($coins * $count)];
  248. }
  249. $data['reward'] = $reward;
  250. return $data;
  251. }
  252. /**
  253. * 获取召回我的好友id列表
  254. * @param int $uid
  255. * @return array
  256. */
  257. public function getBeCallBackList($uid) {
  258. $expire = strtotime(date('Y-m-d', strtotime('-3 days')));
  259. $ret = oo::commonOprRedis('common')->zRangeByScore(okeys::beCallBackFriend($uid), $expire, time());
  260. //3天之前点击召回的玩家不给奖励
  261. if(!empty($ret) && count($ret) > 10){
  262. //大于10个记录后手动删除过期邀请id数据
  263. oo::commonOprRedis('common')->zDeleteRangeByScore(okeys::beCallBackFriend($uid), 0, $expire - 1);
  264. }
  265. return (array)$ret;
  266. }
  267. /**
  268. * 更新召回好友记录
  269. * @param int $uid
  270. * @param int $toUid
  271. * @return array
  272. */
  273. public function callbackFriend($uid, $toUid) {
  274. $expire = strtotime(date('Y-m-d', strtotime('+1 days')));
  275. oo::commonOprRedis('common')->hSet(okeys::callBackFriend($uid), $toUid, $expire);
  276. oo::commonOprRedis('common')->expireAt(okeys::callBackFriend($uid), oo::redisRandomExpire($expire)); //1天过期
  277. //添加被召回记录,领奖用
  278. $bexpire = strtotime(date('Y-m-d', strtotime('+3 days')));
  279. oo::commonOprRedis('common')->zAdd(okeys::beCallBackFriend($toUid), time(), $uid);
  280. oo::commonOprRedis('common')->expireAt(okeys::beCallBackFriend($toUid), oo::redisRandomExpire($bexpire)); //3天过期
  281. return ['fid' => $toUid, 'expire' => $expire];
  282. }
  283. /**
  284. * 更新用户的好友列表
  285. * @param $uid
  286. * @param array 需要保存的数组字段
  287. * @return int <0,失败; =0,成功
  288. * Created by: Owen
  289. * Created on: 2020/9/2 15:17
  290. */
  291. public function updateUserFriends($uid, $array = NULL){
  292. if (!$uid) return -1;
  293. if (empty($array)) return 0;
  294. $updateStr = "";
  295. if (isset($array['sisapper'])) {
  296. $array['sisapper'] = oo::functions()->escape($array['sisapper']);
  297. $updateStr .= "isapper='{$array['sisapper']}',";
  298. }
  299. if (isset($array['snotapper'])) {
  300. $array['snotapper'] = oo::functions()->escape($array['snotapper']);
  301. $updateStr .= "notapper='{$array['snotapper']}',";
  302. }
  303. if (isset($array['spoker'])) {
  304. $array['spoker'] = oo::functions()->escape($array['spoker']);
  305. $updateStr .= "poker='{$array['spoker']}',";
  306. }
  307. if (isset($array['iupdatetime'])) {
  308. $array['iupdatetime'] = (int)$array['iupdatetime'];
  309. $updateStr .= "updatetime='{$array['iupdatetime']}',";
  310. }
  311. if (empty($updateStr)) {
  312. return 0;
  313. } else {
  314. $updateStr = rtrim($updateStr, ',');
  315. }
  316. $tb = otable::userfriends($uid);
  317. $query = "update {$tb} set {$updateStr} where uid='{$uid}' limit 1";
  318. $ret = oo::commonOprDb('userfriends')->query($query);
  319. oo::commonOprRedis('userinfo')->delete(okeys::userfriends($uid,'fb'));
  320. oo::commonOprRedis('userinfo')->delete(okeys::userfriends($uid,'all'));
  321. //更新干掉缓存,待获取时再更新缓存
  322. return $ret ? 0 : -2;
  323. }
  324. /**
  325. * 单个玩家赠送礼物 暂定每天每人只能送一次 每次1个体力 50K金币 系统给
  326. * @param uid 用户uid fuid 赠送好友uid gid =1金币 2体力 3卡片
  327. */
  328. public function sendPropToFriend($uid = 0, $fuid = 0, $gid = 0)
  329. {
  330. $data = array('code' => -1);
  331. if (!$uid || !$fuid) {
  332. return $data;
  333. }
  334. $hadSend = $this->checkSendPropToFri($uid, $fuid, $gid);
  335. if ($hadSend) {
  336. $data['code'] = -2;
  337. $data['msg'] = '您已经赠送过该好友了。';
  338. return $data;
  339. }
  340. $info = oo::commonOprModel('member')->getUserInfo($uid);
  341. if (empty($info)) {
  342. $data['code'] = -4;
  343. return $data;
  344. }
  345. $key = okeys::userSendFri($uid, $fuid, $gid);
  346. oo::commonOprRedis('common')->setex($key,1, oo::todayDeadline());
  347. $nows = time();
  348. $table = otable::gift($fuid);
  349. $exp = strtotime(date('Y-m-d H:i:s', strtotime('+3day')));
  350. $sql = " INSERT INTO {$table} VALUES (NULL,$fuid, $gid, 2, 0 , $nows, $exp,$uid,NULL)";
  351. $insertRs = oo::commonOprDb('usergift')->query($sql);
  352. if (!$insertRs) {
  353. oo::logs()->debug3($sql, 'addUserGift.log');
  354. return false;
  355. }
  356. $today = strtotime(date("Y-m-d"), time()); //当天开始时间戳
  357. $end = $today + 60 * 60 * 24; //当天结束时间戳
  358. $table = otable::gift($uid);
  359. $sql = "SELECT * FROM " . $table . " WHERE uid =" .$uid . " AND gid= " . $gid . " AND fid = " . $fuid . " AND gtime>={$today} AND gtime <= " . $end;
  360. $usergiftList = oo::commonOprDb('usergift')->getOne($sql, MYSQLI_ASSOC); //
  361. $data['code'] = 1;
  362. $data['msg'] = '赠送成功';
  363. $data['data']['gid'] = $gid;
  364. if($gid == 1){
  365. $data['data']['num'] = oo::commonOprModel('readconfig')->getCon('FriendProp','money');
  366. }else if($gid == 2){
  367. $data['data']['num'] = oo::commonOprModel('readconfig')->getCon('FriendProp','spins');
  368. }
  369. $data['state'] = ($usergiftList)?2:0;
  370. oo::commonOprModel('Workerman')->push($fuid,ocmd::$redPoint,['type'=>5]);
  371. //赠送情况统计
  372. oo::commonOprModel('statistics')->giveSta($gid==1?'money':'spins','Send',$uid,$data['data']['num']);
  373. return $data;
  374. }
  375. /**
  376. * 单个好友道具领取 0已赠送 1赠送 2领取
  377. * $uid 自己的id $fuid 好友的uid $gid 类型id
  378. */
  379. public function FriendPropReceive($uid, $fuid, $gid)
  380. {
  381. $data = array('code' => -1);
  382. if (!$uid || !$gid || !$fuid) {
  383. return $data;
  384. }
  385. //先查出这个用户的状态是否有可领取的道具
  386. //领取当天的所有道具
  387. $receive = $this->checkReceive($uid, $gid,$fuid);//可以领取的uid redis改变状态
  388. $table = otable::gift($uid);
  389. $nows = time();
  390. $sql = "SELECT * FROM " . $table . " WHERE uid =" . $uid . " AND gid= " . $gid . " AND fid = " . $fuid . " AND is_receive=0 AND expire >= " . $nows . " ORDER BY gtime DESC,id DESC ";
  391. $friList = oo::commonOprDb('usergift')->getOne($sql, 1);
  392. $version = oo::commonOprModel('user')->getUserVersion($uid);
  393. if ($receive) {
  394. foreach ($receive as $k => $v) {
  395. if ($v['id'] == $friList['id']) {
  396. //可以领取
  397. if ($gid == 1) {
  398. //金币
  399. $money_num = oo::commonOprModel('readconfig')->getCon('FriendProp','money');
  400. $max = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMax($gid),$uid));
  401. if($max>=$money_num*200){
  402. $money_num = 0;
  403. }else{
  404. oo::commonOprModel('member')->optProperty($uid, array('money' => $money_num), '+',50, '好友赠送金币');
  405. oo::commonOprRedis('common')->hSet(okeys::friendGiftMax($gid),$uid,$max+$money_num);
  406. }
  407. } else if ($gid == 2) {
  408. //体力
  409. $spins_num = oo::commonOprModel('readconfig')->getCon('FriendProp','spins');
  410. $max = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMax($gid),$uid));
  411. if($max>=$spins_num*200){
  412. $spins_num = 0;
  413. }else{
  414. oo::commonOprModel('member')->optProperty($uid, array('spins' => $spins_num), '+',50, '好友赠送体力');
  415. oo::commonOprRedis('common')->hSet(okeys::friendGiftMax($gid),$uid,$max+$spins_num);
  416. }
  417. } else if ($gid == 3) {
  418. //卡片
  419. }
  420. $data['code'] = 1;
  421. $data['msg'] = '领取成功';
  422. $data['money_num'] = isset($money_num) ? $money_num : 0;
  423. $data['spins_num'] = isset($spins_num) ? $spins_num : 0;
  424. // 判斷我是否有給他贈送禮物
  425. $today = strtotime(date("Y-m-d"), time()); //当天开始时间戳
  426. $end = $today + 60 * 60 * 24; //当天结束时间戳
  427. $table = otable::gift($uid);
  428. $sql = "SELECT * FROM " . $table . " WHERE uid =" .$uid . " AND gid= " . $gid . " AND fid = " . $fuid . " AND gtime>={$today} AND gtime <= " . $end;
  429. $usergiftList = oo::commonOprDb('usergift')->getOne($sql, MYSQLI_ASSOC); //
  430. $flag = ($usergiftList)?0:1;
  431. $data['state'] = $flag;
  432. $tempKey = okeys::userSendFri($fuid,$uid,$gid);;
  433. oo::commonOprRedis('common')->delete($tempKey);
  434. oo::commonOprModel('gift')->updateUserGift($v['id'], $uid, $gid);
  435. //领取情况统计
  436. if($gid == 1){
  437. $num = $data['money_num'];
  438. }else{
  439. $num = $data['spins_num'];
  440. }
  441. oo::commonOprModel('statistics')->giveSta($gid==1?'money':'spins','Receive',$uid,$num);
  442. }
  443. }
  444. } else {
  445. oo::commonOprRedis('common')->delete(okeys::userSendFri($fuid,$uid,$gid));
  446. $data['code'] = -2;
  447. $data['msg'] = '失败';
  448. }
  449. return $data;
  450. }
  451. /**
  452. * 一键批量领取并赠送赠送好友 卡片除外 暂时game_list好友
  453. */
  454. public function sendPropToFriends($uid = 0, $gid = 0)
  455. {
  456. $data = array('code' => -1);
  457. if (!$uid || !$gid) {
  458. return $data;
  459. }
  460. //获取好友列表
  461. $friendList = $this->getUserAllFriend($uid);
  462. if (!is_array($friendList)) {
  463. $data['code'] = -2;
  464. $data['msg'] = '您的好友列表为空!';
  465. return $data;
  466. }
  467. //领取当天的所有道具
  468. $receive = $this->checkReceive($uid, $gid);//可以领取的uid
  469. if ($receive) {
  470. $count_num = count($receive); //统计数量
  471. if ($gid == 1) {
  472. //金币
  473. $money_num = oo::commonOprModel('readconfig')->getCon('FriendProp','money');
  474. $action_num = $count_num * $money_num;
  475. $max = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMax($gid),$uid));
  476. $temp = $money_num*200 - $max;
  477. if($temp>=$action_num){
  478. oo::commonOprModel('member')->optProperty($uid, array('money' => $action_num), '+',50, '好友赠送金币');
  479. oo::commonOprRedis('common')->hSet(okeys::friendGiftMax($gid),$uid,$max+$action_num);
  480. oo::commonOprModel('Workerman')->push($uid,ocmd::$SVR_UPDATE_COINS,['num'=>$action_num]);
  481. }else{
  482. oo::commonOprModel('member')->optProperty($uid, array('money' => $temp), '+',50, '好友赠送金币');
  483. oo::commonOprRedis('common')->hSet(okeys::friendGiftMax($gid),$uid,$max+$temp);
  484. oo::commonOprModel('Workerman')->push($uid,ocmd::$SVR_UPDATE_COINS,['num'=>$temp]);
  485. }
  486. } else if ($gid == 2) {
  487. //体力
  488. $spins_num = max(oo::commonOprModel('readconfig')->getCon('FriendProp','spins'),1);
  489. $userAssets = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  490. $needAdd = max(50 - $userAssets['spins'],0);
  491. $needAcTime = ceil($needAdd/$spins_num);
  492. $count_num = min($count_num,$needAcTime);
  493. $action_num = $count_num * $spins_num;
  494. $max = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMax($gid),$uid));
  495. $temp = $spins_num*200 - $max;
  496. if($temp>=$action_num){
  497. oo::commonOprModel('member')->optProperty($uid, array('spins' => $action_num), '+',50, '好友赠送体力');
  498. oo::commonOprRedis('common')->hSet(okeys::friendGiftMax($gid),$uid,$max+$action_num);
  499. }else{
  500. oo::commonOprModel('member')->optProperty($uid, array('spins' => $temp), '+',50, '好友赠送体力');
  501. oo::commonOprRedis('common')->hSet(okeys::friendGiftMax($gid),$uid,$max+$temp);
  502. }
  503. }
  504. foreach ($receive as $k=> $v) {
  505. if($gid == 2 && $k >= $count_num){
  506. continue;
  507. }
  508. //更改礼物领取状态
  509. oo::commonOprModel('gift')->updateUserGift($v['id'], $uid, $gid);
  510. $tempKey = okeys::userSendFri($v['fuid'], $uid, $gid);
  511. oo::commonOprRedis('common')->delete($tempKey);
  512. }
  513. //领取情况
  514. if(isset($action_num) && isset($temp)){
  515. if($temp >= $action_num){
  516. oo::commonOprModel('statistics')->giveSta($gid==1?'money':'spins','Receive',$uid,$action_num);
  517. }else{
  518. oo::commonOprModel('statistics')->giveSta($gid==1?'money':'spins','Receive',$uid,$temp);
  519. }
  520. //一键领取 人数统计
  521. oo::commonOprModel('statistics')->givesSta($gid==1?'money':'spins','Receive',$uid);
  522. }
  523. }
  524. $myGameList = $friendList;
  525. $myGameList = array_filter($myGameList);
  526. if (empty($myGameList)) {
  527. $data['code'] = -2;
  528. return $data;
  529. }
  530. //忽略已经赠送的好友
  531. $hasSendFriList = array();
  532. foreach ($myGameList as $fuid) {
  533. $key = okeys::userSendFri($uid, $fuid, $gid);
  534. $hasSend = oo::commonOprRedis('common')->get($key);
  535. if ($hasSend) {
  536. array_push($hasSendFriList, $fuid);
  537. }else{
  538. // 查庫
  539. $today = strtotime(date("Y-m-d"), time()); //当天开始时间戳
  540. $end = $today + 60 * 60 * 24; //当天结束时间戳
  541. $table = otable::gift($fuid);
  542. $sql = "SELECT * FROM " . $table . " WHERE uid =" .$fuid . " AND gid= " . $gid . " AND fid = " . $uid . " AND gtime>={$today} AND gtime <= " . $end;
  543. $usergiftList = oo::commonOprDb('usergift')->getOne($sql, MYSQLI_ASSOC); //
  544. if($usergiftList)
  545. array_push($hasSendFriList, $fuid);
  546. }
  547. }
  548. $myGameList = array_diff($myGameList, $hasSendFriList);//过滤的
  549. if (empty($myGameList)) {//所有好友已经赠送完毕
  550. $data['code'] = -3;
  551. $data['msg'] = '所有好友已经赠送完毕';
  552. return $data;
  553. }
  554. $GameListCount = count($myGameList);//赠送好友的数量
  555. //开始赠送
  556. $info = oo::commonOprModel('member')->getUserInfo($uid);
  557. if (empty($info)) {
  558. $data['code'] = -6;
  559. return $data;
  560. }
  561. //记录缓存(批量操作)
  562. $cacheList = array();
  563. $nows = time();
  564. $exp = strtotime(date('Y-m-d H:i:s', strtotime('+3day')));
  565. $uidInfo = oo::commonOprModel('member')->getUserInfo($uid);
  566. $myGameList = array_unique($myGameList);
  567. foreach ($myGameList as $fuid) {
  568. if ($gid != 3) {
  569. $table = otable::gift($fuid);
  570. $key = okeys::userSendFri($uid, $fuid, $gid);
  571. $cacheList[$key] = 1;
  572. $sql = " INSERT INTO {$table} VALUES (NULL,$fuid, $gid, 2, 0 , $nows, $exp,$uid,NULL)";
  573. $insertRs = oo::commonOprDb('usergift')->query($sql);
  574. oo::commonOprModel('Workerman')->push($fuid,ocmd::$redPoint,['type'=>5]);
  575. oo::commonOprModel('push')->pushNews($fuid, 'push.title.gift', 'push.content.gift', [$uidInfo['nick']],'gift');
  576. foreach ($cacheList as $keys=>$row){
  577. oo::commonOprRedis('common')->setex($keys,$row, oo::todayDeadline());
  578. }
  579. if (!$insertRs) {
  580. oo::logs()->debug3($sql, 'addUserGift.log');
  581. return false;
  582. }
  583. }
  584. }
  585. // 任务系统 统计赠送好友筹码次数
  586. $data['code'] = 1;
  587. $data['total'] = $GameListCount;
  588. $data['money_num'] = isset($money_num) ? intval($money_num) : 0;
  589. $data['spins_num'] = isset($spins_num) ? intval($spins_num) : 0;
  590. $data['friend_list'] = oo::commonOprModel('friend')->getList($uid);
  591. //赠送情况统计
  592. if($gid == 1){
  593. if(!isset($money_num)){
  594. $num = oo::commonOprModel('readconfig')->getCon('FriendProp','money');
  595. }else{
  596. $num = $money_num;
  597. }
  598. }else{
  599. if(!isset($spins_num)){
  600. $num = oo::commonOprModel('readconfig')->getCon('FriendProp','spins');
  601. }else{
  602. $num = $spins_num;
  603. }
  604. }
  605. oo::commonOprModel('statistics')->giveSta($gid==1?'money':'spins','Send',$uid,$GameListCount * $num);
  606. //一键赠送 人数统计
  607. oo::commonOprModel('statistics')->givesSta($gid==1?'money':'spins','Send',$uid);
  608. return $data;
  609. }
  610. /**
  611. * 领取卡片
  612. * YANG丶 2019年5月17日
  613. * $uid 当前用户uid $fuid 领取好友uid
  614. */
  615. public function FriendReceiveCard($uid,$fuid){
  616. if (empty($uid) || empty($fuid)) {
  617. $data = ['code'=>-1,'msg'=>'参数错误','data'=>['card'=>[]]];
  618. return $data;
  619. }
  620. $key = okeys::userGiftList($uid);
  621. $list = oo::commonOprRedis('common')->lGetRange($key, 0, -1);
  622. if(count($list) > 0)
  623. {
  624. foreach ($list as $v){
  625. $tempCardArr = json_decode($v,true);
  626. if($fuid == $tempCardArr['fromId']){
  627. //要领取了
  628. $cgid = $tempCardArr['cgid'];
  629. $pos = $tempCardArr['pos'];
  630. $cardInfo = otable::cardinfo_config();
  631. $sql = " SELECT * FROM {$cardInfo} WHERE cgid={$cgid} AND ciid={$pos}";
  632. $cardInfo = oo::commonOprDb('cardinfo')->getOne($sql, MYSQLI_ASSOC);
  633. $flag = false;
  634. $cards = oo::commonOprModel('card')->getUserCardInfo($uid);
  635. $userCard = [];
  636. $totalCardType = [];
  637. foreach ($cards['ciid'] as $k=>$c){
  638. $userCard[] = $k;
  639. $totalCardType[] = $k;
  640. }
  641. if(!in_array($cardInfo['ciid'],$totalCardType)){
  642. $totalCardType[] = $cardInfo['ciid'];
  643. $flag = true;
  644. oo::commonOprModel('member')->optProperty($uid,array('star'=>$cardInfo['ci_star_rank']),'+',32,'获取新卡片星星');
  645. }
  646. $res = oo::commonOprModel('card')->updateFriendsCardQuantity($uid,$tempCardArr['pos'],1);
  647. if($res['code'] >=1){
  648. //删掉队列里面这个key
  649. oo::commonOprRedis('common')->lRemove($key, $v, $count=0);
  650. $list = oo::commonOprRedis('common')->lGetRange($key, 0, -1);
  651. $num = 0; //当前用户剩余待领取卡片数量
  652. foreach ($list as $v){
  653. $pending_card = json_decode($v,true);
  654. if($pending_card['fromId'] == $fuid){
  655. $num ++;
  656. }
  657. }
  658. $newCard = oo::commonOprModel('card')->getInfo($uid);
  659. $receive[] = [
  660. 'group'=>$cardInfo['cgid'],
  661. 'card'=>$cardInfo['cgposition'],
  662. 'isNew'=>$flag
  663. ];
  664. oo::logs()->debug4(['cardId'=>$cardInfo['ciid'],'cardGroup'=>$cardInfo['cgid'],'cardName'=>$cardInfo['ci_name'],'time'=>date('Y-m-d H:i'),'from'=>'firend-'.$fuid],$uid.'.log','cardlog/');
  665. $cardReward = ['spins'=>0,'coins'=>0];//卡片奖励
  666. $cardGroupReward = ['spins'=>0,'coins'=>0];//卡组奖励
  667. $data = ['code'=>1,'msg'=>'领取成功','data'=>['receive'=>$receive,'card'=>$newCard,'cardReward'=>$cardReward,'cardGroupReward'=>$cardGroupReward,'pendingCard'=>$num]];
  668. }
  669. break;
  670. }else{
  671. $data = ['code'=>-1,'msg'=>'没有该好友待领卡片数据','data'=>['card'=>[]]];
  672. }
  673. }
  674. }else{
  675. $data = ['code'=>-1,'msg'=>'没有该好友待领卡片数据','data'=>['card'=>[]]];
  676. }
  677. return $data;
  678. }
  679. /**
  680. * 检查当天是否有赠送过
  681. */
  682. public function checkSendPropToFri($uid = 0, $fuid = 0, $gid = 0)
  683. {
  684. $key = okeys::userSendFri($uid, $fuid, $gid);
  685. $flag = oo::commonOprRedis('common')->get($key);
  686. if(!$flag){
  687. $today = strtotime(date("Y-m-d"), time()); //当天开始时间戳
  688. $end = $today + 60 * 60 * 24; //当天结束时间戳
  689. $table = otable::gift($fuid);
  690. $sql = "SELECT * FROM " . $table . " WHERE uid =" .$fuid . " AND gid= " . $gid . " AND fid = " . $uid . " AND gtime>={$today} AND gtime <= " . $end;
  691. $usergiftList = oo::commonOprDb('usergift')->getOne($sql, MYSQLI_ASSOC); //
  692. $flag = ($usergiftList)?1:0;
  693. }
  694. return $flag ? 1 : 0;
  695. }
  696. /**
  697. * 检查当天是否有领取过
  698. * uid 自己的id fuid 好友赠送的id gid
  699. * 返回uid未领取的id //2020-1-16 owen 追加参数fuid ,单人检索单人
  700. */
  701. public function checkReceive($uid = 0, $gid = 0,$fuid = 0)
  702. {
  703. //先查出所有未过期的礼物列表
  704. $table = otable::gift($uid);
  705. $nows = time();
  706. if($fuid != 0){
  707. $sql = "SELECT * FROM " . $table . " WHERE uid =" . $uid . " AND gid= " . $gid . " AND fid = " . $fuid . " AND expire >= " . $nows . " ORDER BY gtime DESC,id DESC";
  708. }else{
  709. $sql = "SELECT * FROM " . $table . " WHERE uid =" . $uid . " AND gid= " . $gid . " AND expire >= " . $nows . " ORDER BY gtime DESC,id DESC";
  710. }
  711. $usergiftList = oo::commonOprDb('usergift')->getAll($sql, MYSQLI_ASSOC); //
  712. // 找出当天有领取的id
  713. $tempReceiveFid = [];
  714. $tempFid = [];
  715. $temp_arr = [];
  716. $today = strtotime(date("Y-m-d"), time()); //当天开始时间戳
  717. $end = $today + 60 * 60 * 24; //当天结束时间戳
  718. foreach ($usergiftList as $key => $val) {
  719. if (!empty($val['receive_time']) && $val['is_receive'] == 1) {
  720. //说明是已经领取了 然后在看是不是当天领取的
  721. if ($val['receive_time'] > $today && $val['receive_time'] < $end) {
  722. //push当天领取的uid
  723. array_push($tempReceiveFid, $val['fid']);
  724. }
  725. }
  726. if (!in_array($val['fid'], $tempFid)) {
  727. array_push($tempFid, $val['fid']);
  728. array_push($temp_arr, $val['id']);
  729. }
  730. }
  731. $result = [];
  732. foreach ($tempFid as $k => $v) {
  733. if (!in_array($v, $tempReceiveFid)) {
  734. $result[$k]['fuid'] = $v;
  735. $result[$k]['id'] = $temp_arr[$k];
  736. }
  737. }
  738. return $result;
  739. }
  740. /**
  741. * 批量查看是否可以领取
  742. * @param 返回可领取好友list
  743. */
  744. public function checkReceivePropMult($uid = 0, $fuidlist = [])
  745. {
  746. $keyArr = [];
  747. foreach ($fuidlist as $fuid) {
  748. for ($i = 1; $i < 4; $i++) {
  749. $tempKey = okeys::userSendFri($fuid, $uid, $i);
  750. array_push($keyArr, $tempKey);
  751. }
  752. }
  753. $list = oo::commonOprRedis('common')->getMultiple($keyArr);
  754. $sendUidList = [];//已赠送的好友uid 体力 金币 卡片三种情况
  755. $tempList = [];
  756. foreach ($list as $key => $value) {
  757. if ($value) {
  758. array_push($tempList, explode(':', $keyArr[$key]));
  759. }
  760. }
  761. if(!empty($tempList)){
  762. foreach ($tempList as $key => $val) {
  763. // 类型[1 2 3] =》 已经赠送的好友id
  764. $sendUidList[$val[4]][] = substr($tempList[$key][2], 0, -1);
  765. }
  766. }
  767. $sendUidList[1] = empty($sendUidList[1])?[]:$sendUidList[1];
  768. $sendUidList[2] = empty($sendUidList[2])?[]:$sendUidList[2];
  769. $sendUidList[3] = empty($sendUidList[3])?[]:$sendUidList[3];
  770. return $sendUidList;
  771. }
  772. /**
  773. * 批量查看是否已经赠送过筹码
  774. * @param 返回已经发送好友list
  775. */
  776. public function checkSendPropToFriMult($uid = 0, $fuidlist = [])
  777. {
  778. $keyArr = [];
  779. foreach ($fuidlist as $fuid) {
  780. for ($i = 1; $i < 4; $i++) {
  781. $tempKey = okeys::userSendFri($uid, $fuid, $i);
  782. array_push($keyArr, $tempKey);
  783. }
  784. }
  785. $list = oo::commonOprRedis('common')->getMultiple($keyArr);
  786. $sendUidList = [];//已赠送的好友uid 体力 金币 卡片三种情况
  787. $tempList = [];
  788. foreach ($list as $key => $value) {
  789. if ($value) {
  790. array_push($tempList, explode(':', $keyArr[$key]));
  791. }
  792. }
  793. foreach ($tempList as $key => $val) {
  794. // 类型[1 2 3] =》 已经赠送的好友id
  795. $sendUidList[$val[4]][] = substr($tempList[$key][3], 0, -1);
  796. }
  797. $sendUidList[1] = empty($sendUidList[1])?[]:$sendUidList[1];
  798. $sendUidList[2] = empty($sendUidList[2])?[]:$sendUidList[2];
  799. // 查庫
  800. $today = strtotime(date("Y-m-d"), time()); //当天开始时间戳
  801. $end = $today + 60 * 60 * 24; //当天结束时间戳
  802. foreach ($fuidlist as $row){
  803. if(!in_array($row,$sendUidList[1])){
  804. $table = otable::gift($row);
  805. $sql = "SELECT * FROM " . $table . " WHERE uid =" .$row . " AND gid= " . 1 . " AND fid = " . $uid . " AND gtime>={$today} AND gtime <= " . $end;
  806. $usergiftList = oo::commonOprDb('usergift')->getOne($sql, MYSQLI_ASSOC); //
  807. if($usergiftList)
  808. array_push($sendUidList[1],$row);
  809. }
  810. }
  811. foreach ($fuidlist as $row){
  812. if(!in_array($row,$sendUidList[2])){
  813. $table = otable::gift($row);
  814. $sql = "SELECT * FROM " . $table . " WHERE uid =" .$row . " AND gid= " . 2 . " AND fid = " . $uid . " AND gtime>={$today} AND gtime <= " . $end;
  815. $usergiftList = oo::commonOprDb('usergift')->getOne($sql, MYSQLI_ASSOC); //
  816. if($usergiftList)
  817. array_push($sendUidList[2],$row);
  818. }
  819. }
  820. $sendUidList[1] = empty($sendUidList[1])?[]:$sendUidList[1];
  821. $sendUidList[2] = empty($sendUidList[2])?[]:$sendUidList[2];
  822. return $sendUidList;
  823. }
  824. // -----------------------------------------------------------------------------------------------------------------
  825. public function addUserFriend($uid,$toUid,$type = 'game'){
  826. $uidArr = [$uid,$toUid];
  827. $uidCurFriendList = [];
  828. foreach ($uidArr as $row){
  829. $friend = $this->getUserAllFriend($row,$type);
  830. if($row==$uid){
  831. $acUid = $toUid;
  832. $uidCurFriendList = $friend;
  833. }else{
  834. $acUid = $uid;
  835. }
  836. array_push($friend,$acUid);
  837. $friend = array_filter(array_unique($friend));
  838. $friend = implode(',',$friend);
  839. $tb = otable::userfriends($row);
  840. if($type == 'game'){
  841. $sql = " UPDATE {$tb} SET game_list='{$friend}' WHERE uid = {$row} LIMIT 1 ";
  842. }else if($type == 'fb'){
  843. $sql = " UPDATE {$tb} SET poker='{$friend}' WHERE uid = {$row} LIMIT 1 ";
  844. }
  845. oo::commonOprDb('userfriends')->query($sql);
  846. oo::commonOprRedis('userinfo')->delete(okeys::userfriends($row,$type));
  847. oo::commonOprRedis('userinfo')->delete(okeys::userfriends($row,'all'));
  848. oo::commonOprRedis('userinfo')->delete(okeys::userIndexFriends($row));
  849. // oo::commonOprRedis('Usercache')->zAdd(okeys::Landing("USERFRIENDS", $row),time(),$uid);
  850. }
  851. oo::commonOprModel('ta')->setEventData($uid,'user_set',['friend_num'=>count($this->getUserAllFriend($uid))]);
  852. return [$type=>$uidCurFriendList];
  853. }
  854. public function getUserAllFriend($uid,$type = 'all'){
  855. $friends = oo::commonOprRedis('userinfo')->get(okeys::userfriends($uid,$type));
  856. if(!empty($friends)){
  857. $friends = json_decode($friends,true);
  858. }else{
  859. $this->getUserFriends($uid,$temp);
  860. $friends = [];
  861. if($type == 'game' || $type == 'all'){
  862. $gameList = explode(',',$temp['game_list']);
  863. foreach ($gameList as $row){
  864. $row != $uid && $friends[] = $row;
  865. }
  866. }
  867. if($type == 'fb' || $type == 'all'){
  868. $poker= explode(',',$temp['poker']);
  869. foreach ($poker as $row){
  870. $row != $uid && $friends[] = $row;
  871. }
  872. }
  873. $friends = array_unique(array_filter($friends));
  874. sort($friends);
  875. oo::commonOprRedis('userinfo')->setex(okeys::userfriends($uid,$type),json_encode($friends),oo::redisRandomExpire(7*24*60*60));
  876. }
  877. foreach ($friends as $key=>$row){
  878. if($row == $uid){
  879. unset($friends[$key]);
  880. }
  881. }
  882. return array_values($friends);
  883. }
  884. public function applyFriend($uid,$toUid){
  885. // 判断是否为好友
  886. if($uid == $toUid){
  887. return false;
  888. }
  889. $friends = $this->getUserAllFriend($uid);
  890. if(in_array($toUid,$friends)){
  891. return ['code'=>-2,'msg'=>'Already your friend'];
  892. }
  893. if(count($this->getUserAllFriend($uid,'game'))>=200){
  894. return ['code'=>-4,'msg'=>'Already your friend'];
  895. }
  896. oo::commonOprRedis('common')->hSet(okeys::applyFriend($uid),$toUid,time());
  897. oo::commonOprRedis('common')->expire(okeys::applyFriend($uid),86400*3);
  898. $tb = otable::friendLog();
  899. $sql = "SELECT * FROM {$tb} WHERE uid={$uid} AND touid={$toUid} AND status=0";
  900. $ret = oo::commonOprDb('userfriendlog')->getOne($sql,MYSQLI_ASSOC);
  901. if(!empty($ret)){
  902. return ['code'=>-3,'msg'=>'apply under review'];
  903. }
  904. $time = date('Y-m-d H:i:s');
  905. $sql = "INSERT INTO {$tb} (uid, touid, created_at) VALUES({$uid},{$toUid},'{$time}')";
  906. $ret = oo::commonOprDb('userfriendlog')->query($sql);
  907. if(!$ret){
  908. return ['code'=>-1,'msg'=>'INSERT ERROR'];
  909. }
  910. $arr = ['uid','nick','sex','s_picture','signature','u_flag','vip','avatar'];
  911. $userInfo = oo::commonOprModel('member')->getUserInfo($uid,$arr);
  912. $userInfo['toUid'] = $uid;
  913. oo::commonOprModel('Workerman')->push($toUid,APPLY_FRIEND_MSG,$userInfo);
  914. oo::commonOprModel('Workerman')->push($toUid,ocmd::$redPoint,['type'=>4,'data'=>oo::commonOprModel('message')->getApplyFriendMessageData($toUid,$uid)]);
  915. return ['code'=>1,'msg'=>'apply success'];
  916. }
  917. public function reviewFriend($uid,$toUid,$status){
  918. $tb = otable::friendLog();
  919. $sql = "SELECT * FROM {$tb} WHERE uid={$toUid} AND touid={$uid} AND status=0";
  920. $ret = oo::commonOprDb('userfriendlog')->getOne($sql,MYSQLI_ASSOC);
  921. if(empty($ret)){
  922. return ['code'=>-3,'msg'=>'review error'];
  923. }
  924. if($status == 1){
  925. $sql = "UPDATE {$tb} SET `status`=1 WHERE uid = {$toUid} AND touid = {$uid} ";
  926. $ret = oo::commonOprDb('userfriendlog')->query($sql);
  927. if($ret){
  928. $uidtb = otable::userfriends($uid);
  929. $sql = "SELECT * FROM {$uidtb} WHERE uid={$uid}";
  930. $ret = oo::commonOprDb('userfriends')->getOne($sql,MYSQLI_ASSOC);
  931. $uidFriend = explode(',',$ret['game_list']);
  932. array_push($uidFriend,$toUid);
  933. $uidFriend = array_unique($uidFriend);
  934. if(count($uidFriend)>=200){
  935. return ['code'=>-4,'msg'=>'好友超出上限'];
  936. }
  937. $uidFriend = implode(',',$uidFriend);
  938. $uidFriend = trim($uidFriend,',');
  939. $toUidtb = otable::userfriends($toUid);
  940. $sql = "SELECT * FROM {$toUidtb} WHERE uid={$toUid}";
  941. $ret = oo::commonOprDb('userfriends')->getOne($sql,MYSQLI_ASSOC);
  942. $toUidFriend = explode(',',$ret['game_list']);
  943. array_push($toUidFriend,$uid);
  944. $toUidFriend = array_unique($toUidFriend);
  945. if(count($toUidFriend)>=200){
  946. return ['code'=>-5,'msg'=>'对方好友超出上限'];
  947. }
  948. $toUidFriend = implode(',',$toUidFriend);
  949. $toUidFriend = trim($toUidFriend,',');
  950. $uidSql = "UPDATE {$uidtb} SET `game_list`='{$uidFriend}' WHERE uid = {$uid}";
  951. oo::commonOprDb('userfriends')->query($uidSql);
  952. $toUidSql = "UPDATE {$toUidtb} SET `game_list`='{$toUidFriend}' WHERE uid = {$toUid}";
  953. oo::commonOprDb('userfriends')->query($toUidSql);
  954. $userInfo = oo::commonOprModel('member')->getUserInfo($uid);
  955. oo::commonOprModel('Workerman')->push($toUid,APPLY_FRIEND_REVIEW,$userInfo);
  956. oo::commonOprRedis('userinfo')->delete([
  957. okeys::userfriends($uid,'game'),
  958. okeys::userfriends($uid,'all'),
  959. okeys::userfriends($toUid,'game'),
  960. okeys::userfriends($toUid,'all')
  961. ]);
  962. }
  963. }else if($status == 2){
  964. $sql = "UPDATE {$tb} SET `status`=2 WHERE uid = {$toUid} AND touid = {$uid} ";
  965. oo::commonOprDb('userfriendlog')->query($sql);
  966. }
  967. return ['code'=>1,'msg'=>'review success'];
  968. }
  969. public function deleteFriend($uid,$toUid){
  970. $arr = [$uid,$toUid];
  971. $list = [];
  972. foreach ($arr as $key=>$row){
  973. $target = ($row==$uid)?$toUid:$uid;
  974. $ftb = otable::userfriends($row);
  975. $sql = "SELECT * FROM {$ftb} WHERE uid={$row}";
  976. $ret = oo::commonOprDb('userfriends')->getOne($sql,MYSQLI_ASSOC);
  977. $set = "";
  978. $sqlKey = ['game_list','poker'];
  979. foreach ($sqlKey as $k){
  980. if(strpos($ret[$k],(string)$target) === false){
  981. continue;
  982. }
  983. $friend = explode(',',$ret[$k]);
  984. foreach ($friend as $x=>$y){
  985. if($y== $target){
  986. unset($friend[$x]);
  987. }
  988. }
  989. $newList = trim(implode(',',array_unique($friend)),',');
  990. $list[$k] = $newList;
  991. $set .= "`{$k}`='{$newList}',";
  992. }
  993. $set = trim($set,',');
  994. oo::commonOprRedis('userinfo')->delete([
  995. okeys::userfriends($row,'fb'),
  996. okeys::userfriends($row,'all'),
  997. okeys::userfriends($row,'game'),
  998. okeys::userIndexFriends($row)
  999. ]);
  1000. if(empty($set)){
  1001. continue;
  1002. }
  1003. $sql = "UPDATE {$ftb} SET {$set} WHERE uid = {$row}";
  1004. oo::commonOprDb('userfriends')->query($sql);
  1005. }
  1006. return ['code'=>1,'msg'=>'delete success',$list];
  1007. }
  1008. public function recommendFriend($uid){
  1009. $friends = $this->getUserAllFriend($uid);
  1010. if(empty($friends)){
  1011. return ['code'=>1,'data'=>[]];
  1012. }
  1013. $IntersectionFriends = [];
  1014. foreach ($friends as $row){
  1015. $temp = $this->getUserAllFriend($row);
  1016. foreach ($temp as $f){
  1017. if(!in_array($f,$friends)){
  1018. $IntersectionFriends[] = $f;
  1019. }
  1020. }
  1021. }
  1022. $IntersectionFriends = array_unique($IntersectionFriends);
  1023. unset($IntersectionFriends[array_search($uid,$IntersectionFriends)]);
  1024. /**
  1025. * 好友申请中的剔除
  1026. */
  1027. $applyFriend = oo::commonOprRedis('common')->hGetAll(okeys::applyFriend($uid));
  1028. foreach ($applyFriend as $key=>$row){
  1029. if(time() - $row < 4*60*60){
  1030. unset($IntersectionFriends[array_search($key,$IntersectionFriends)]);
  1031. }else{
  1032. oo::commonOprRedis('common')->hDel(okeys::applyFriend($uid),$key);
  1033. }
  1034. }
  1035. /**
  1036. * 已经推荐过的剔除
  1037. */
  1038. $applyFriend = oo::commonOprRedis('common')->hGetAll(okeys::recommendFriend($uid));
  1039. foreach ($applyFriend as $key=>$row){
  1040. if(time() - $row < 10*60){
  1041. unset($IntersectionFriends[array_search($key,$IntersectionFriends)]);
  1042. }else{
  1043. oo::commonOprRedis('common')->hDel(okeys::applyFriend($uid),$key);
  1044. }
  1045. }
  1046. if(empty($IntersectionFriends)){
  1047. return ['code'=>1,'data'=>[]];
  1048. }
  1049. shuffle($IntersectionFriends);
  1050. $uidList = [];
  1051. $maxRecommend = 9;
  1052. foreach ($IntersectionFriends as $key=>$row){
  1053. $memberInfo = oo::commonOprModel('member')->getUserInfo($row);
  1054. $propertyInfo = oo::commonOprModel('member')->getUserAssetsInfo($row);
  1055. if(empty($memberInfo) || empty($propertyInfo) || $memberInfo['isFb'] == 0){
  1056. continue;
  1057. }
  1058. $temp = $memberInfo;
  1059. $temp['star'] = $propertyInfo['star'];
  1060. $uidList[] = $temp;
  1061. if(count($uidList) >= $maxRecommend){
  1062. break;
  1063. }
  1064. }
  1065. if(count($uidList) < $maxRecommend){
  1066. $IntersectionFriends = implode(',',$IntersectionFriends);
  1067. $tb = otable::userinfo();
  1068. $sql = "SELECT * FROM {$tb} WHERE uid IN ({$IntersectionFriends}) order by lasttime DESC LIMIT {$maxRecommend}";
  1069. $ret = oo::commonOprDb('userinfo')->getAll($sql,MYSQLI_ASSOC);
  1070. foreach ($ret as $key=>$row){
  1071. $propertyInfo = oo::commonOprModel('member')->getUserAssetsInfo($row['uid']);
  1072. if(empty($propertyInfo)){
  1073. continue;
  1074. }
  1075. $uidList[] = [
  1076. 'star' => $propertyInfo['star'],
  1077. 'uid' => $row['uid'],
  1078. 'nick' => $row['nick'],
  1079. 's_picture'=> $row['s_picture'],
  1080. 'u_flag' => $row['u_flag'],
  1081. 'signature'=> $row['signature'],
  1082. 'vip' => $row['vip'],
  1083. 'vipLv' => $row['vipLv'],
  1084. 'avatar' => intval($row['avatar']),
  1085. ];
  1086. if(count($uidList) >= $maxRecommend){
  1087. break;
  1088. }
  1089. }
  1090. }
  1091. $time = time();
  1092. foreach ($uidList as $key=>$row){
  1093. oo::commonOprRedis('common')->hSet(okeys::recommendFriend($uid),$row['uid'],$time);
  1094. }
  1095. $recommendCount = $maxRecommend - count($uidList);
  1096. if($recommendCount > 0){
  1097. $recommendFriend = oo::commonOprRedis('common')->hGetAll(okeys::recommendFriend($uid));
  1098. asort($recommendFriend);
  1099. foreach ($recommendFriend as $key=>$row){
  1100. oo::commonOprRedis('common')->hDel(okeys::recommendFriend($uid),$key);
  1101. $recommendCount = $recommendCount -1;
  1102. if($recommendCount <= 0){
  1103. break;
  1104. }
  1105. }
  1106. }
  1107. oo::commonOprRedis('common')->expire(okeys::applyFriend($uid),3*24*60*60);
  1108. oo::commonOprRedis('common')->expire(okeys::recommendFriend($uid),3*24*60*60);
  1109. return ['code'=>1,'data'=>$uidList];
  1110. }
  1111. /**
  1112. * 获取该用户的好友列表
  1113. * @param $srcUid
  1114. * @return mixed 礼物状态类型:领取 赠送 已赠送 每天每用户可以赠送一次 每晚00.00重置状态
  1115. */
  1116. public function getList($srcUid)
  1117. {
  1118. $data = array();
  1119. if (!$srcUid) {
  1120. return $data;
  1121. }
  1122. $userarr = array();//存储返回的值
  1123. $game_listArray = $this->getUserAllFriend($srcUid);
  1124. if (empty($game_listArray)) {
  1125. return array('flist' => array());
  1126. }
  1127. $uidList = array();
  1128. foreach ($game_listArray as $value) {
  1129. $temp = intval($value);
  1130. if (empty($temp) || $temp <= 0) continue;
  1131. if ($temp == $srcUid) continue;
  1132. array_push($uidList, $temp);
  1133. }
  1134. $infoList = array();
  1135. //获取玩家当天赠送的玩家
  1136. $todaySendMoneyUserList = $this->checkSendPropToFriMult($srcUid, $uidList);
  1137. //可以领取的uid 状态改为2
  1138. $UserReceivePropList = $this->checkReceivePropMult($srcUid, $uidList);
  1139. $key = okeys::userGiftList($srcUid);
  1140. $list = oo::commonOprRedis('common')->lGetRange($key, 0, -1);
  1141. //可领取卡片的用户uid
  1142. $cardCollection = [];
  1143. $cardNum = [];
  1144. foreach ($list as $v) {
  1145. $tempCardArr = json_decode($v, true);
  1146. array_push($cardCollection, $tempCardArr['fromId']);
  1147. $cardNum[$tempCardArr['fromId']] += intval($tempCardArr['num']);
  1148. }
  1149. $userinfo = array();
  1150. $ret = oo::commonOprModel('member')->getUserInfoMulti(array('keylist' => $uidList), $userinfo);
  1151. $fbList = $this->getUserAllFriend($srcUid,'fb');
  1152. if ($ret == 1) {
  1153. usort($userinfo, 'TimeCmp');
  1154. $uidList = array();
  1155. $money = oo::commonOprModel('readconfig')->getCon('FriendProp','money');
  1156. $spins = oo::commonOprModel('readconfig')->getCon('FriendProp','spins');
  1157. $accumulationMoney = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMax(1),$srcUid));
  1158. $accumulationSpins = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMax(2),$srcUid));
  1159. $accumulationMoneyFlag = true;
  1160. $accumulationSpinsFlag = true;
  1161. if($accumulationMoney >= $money*200){
  1162. $accumulationMoneyFlag = false;
  1163. }
  1164. if($accumulationSpins >= $spins*200){
  1165. $accumulationSpinsFlag = false;
  1166. }
  1167. $moneyReceiveUserList = [];
  1168. $checkReceiveMoney = oo::commonOprModel('friend')->checkReceive($srcUid,1);
  1169. if(!empty($checkReceiveMoney)){
  1170. $moneyReceiveUserList = array_column($checkReceiveMoney,'fuid');
  1171. }
  1172. $spinsReceiveUserList = [];
  1173. $checkReceiveSpins = oo::commonOprModel('friend')->checkReceive($srcUid,2);
  1174. if(!empty($checkReceiveSpins)){
  1175. $spinsReceiveUserList = array_column($checkReceiveSpins,'fuid');
  1176. }
  1177. $flag = false;
  1178. foreach ($userinfo as $v) {
  1179. $uid = $v['uid'];
  1180. $img = $v['s_picture'];
  1181. if (strpos($img, 'http') === false) {
  1182. $img = intval($img);
  1183. $img = empty($img) ? 1 : $img;
  1184. }
  1185. $infoList[$uid]['uid'] = $uid;
  1186. $infoList[$uid]['siteid'] = (string)$v['siteuid'];
  1187. $infoList[$uid]['nick'] = empty($v['nick']) ? '' : strval($v['nick']);
  1188. $infoList[$uid]['s_picture'] = $img;
  1189. $infoList[$uid]['u_flag'] = $v['u_flag'];
  1190. $infoList[$uid]['sex'] = ($v['sex'] == 'f') ? 'f' : 'm';
  1191. //获取财产信息
  1192. $userProperty = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  1193. if ($userProperty) {
  1194. $infoList[$uid]['money'] = $userProperty['money'];
  1195. $infoList[$uid]['star'] = $userProperty['star'];
  1196. $infoList[$uid]['levelId'] = $userProperty['levelId'];
  1197. $infoList[$uid]['signature'] = $userProperty['signature'];
  1198. }
  1199. //查询是否属于FB
  1200. $infoArr = oo::commonOprModel('member')->getAccount($v['siteuid']);
  1201. if (!empty($infoArr) && $infoArr['uid'] == $uid) {
  1202. $infoList[$uid]['isFb'] = 1;
  1203. $infoList[$uid]['fbId'] = $v['siteuid'];
  1204. if(in_array($uid,$fbList)){
  1205. $infoList[$uid]['isFbFriend'] = 1;
  1206. }else{
  1207. $infoList[$uid]['isFbFriend'] = 0;
  1208. }
  1209. } else {
  1210. $infoList[$uid]['isFb'] = 0;
  1211. $infoList[$uid]['isFbFriend'] = 0;
  1212. }
  1213. if($flag && (in_array($uid, $todaySendMoneyUserList[1])) && (in_array($uid, $UserReceivePropList[1]) && $accumulationMoneyFlag && in_array($uid,$moneyReceiveUserList)) ){
  1214. $infoList[$uid]['is_send_Coin'] = 3;
  1215. }else if (in_array($uid, $UserReceivePropList[1]) && $accumulationMoneyFlag && in_array($uid,$moneyReceiveUserList)) {
  1216. $infoList[$uid]['is_send_Coin'] = 2;
  1217. } else if (in_array($uid, $todaySendMoneyUserList[1])) {
  1218. $infoList[$uid]['is_send_Coin'] = 0;
  1219. } else {
  1220. $infoList[$uid]['is_send_Coin'] = 1;
  1221. }
  1222. if($flag && (in_array($uid, $todaySendMoneyUserList[2])) && (in_array($uid, $UserReceivePropList[2]) && $accumulationSpinsFlag && in_array($uid,$spinsReceiveUserList))){
  1223. $infoList[$uid]['is_send_Coin'] = 3;
  1224. }elseif (in_array($uid, $UserReceivePropList[2]) && $accumulationSpinsFlag && in_array($uid,$spinsReceiveUserList)) {
  1225. $infoList[$uid]['is_send_Spin'] = 2;
  1226. } else if (in_array($uid, $todaySendMoneyUserList[2])) {
  1227. $infoList[$uid]['is_send_Spin'] = 0;
  1228. } else {
  1229. $infoList[$uid]['is_send_Spin'] = 1;
  1230. }
  1231. //0已赠送 1赠送 2领取
  1232. if (in_array($uid, $cardCollection)) {
  1233. $infoList[$uid]['is_send_Card'] = 2;
  1234. $infoList[$uid]['card_num'] = intval($cardNum[$uid]);
  1235. }else{
  1236. $infoList[$uid]['is_send_Card'] = 1;
  1237. $infoList[$uid]['card_num'] = 0;
  1238. }
  1239. $infoList[$uid]['coin_num'] = $money;
  1240. $infoList[$uid]['spin_num'] = $spins;
  1241. $infoList[$uid]['vip'] = $v['vip'];
  1242. $infoList[$uid]['vipLv'] = $v['vipLv'];
  1243. $infoList[$uid]['vipExpire'] = $v['vip_expire'];
  1244. $infoList[$uid]['avatar'] = intval($v['avatar']);
  1245. $uidList[] = $uid;
  1246. }
  1247. }else{
  1248. $return = array_values($infoList);
  1249. return array('flist' => $return);
  1250. }
  1251. foreach ($infoList as $v) {
  1252. if (empty($v) || empty($v['siteid'])) continue;
  1253. $ret = preg_match('/^[0-9A-Za-z]*$/', $v['siteid']);
  1254. if ($ret <= 0) continue;
  1255. array_push($userarr, $v);
  1256. }
  1257. usort($userarr, 'cmpThree');
  1258. foreach ($userarr as $key => $value) {
  1259. $code1 = mb_detect_encoding($value['nick']);
  1260. $nick = @iconv($code1, "utf-8//IGNORE", $userarr[$key]['nick']);
  1261. $userarr[$key]['nick'] = empty($nick) ? '' : strval($nick);
  1262. }
  1263. if (empty($userarr) && count($userarr) > 0) {
  1264. return array('flist' => array());
  1265. }
  1266. return array('flist' => $userarr);
  1267. }
  1268. /**
  1269. * 当天是否有礼物可领取
  1270. * @param int $uid
  1271. * @return bool
  1272. */
  1273. public function hasNewGiftReceive($uid) {
  1274. $friends = self::getUserAllFriend($uid);
  1275. $userCard = oo::commonOprModel('card')->getUserCardInfo($uid);
  1276. $sended = array_keys($userCard['sended_card']);
  1277. if(!empty($sended)){
  1278. return true;
  1279. }
  1280. $coinsMaxTimes = oo::commonOprModel('readconfig')->getCon('FriendProp','coinsMaxTimes');
  1281. $spinsMaxTimes = oo::commonOprModel('readconfig')->getCon('FriendProp','spinsMaxTimes');
  1282. $coinsCurTimes = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMaxTimes(1),$uid));
  1283. $spinsCurTimes = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMaxTimes(2),$uid));
  1284. $accumulationMoneyFlag = $coinsCurTimes >= $coinsMaxTimes ? false : true;
  1285. $accumulationSpinsFlag = $spinsCurTimes >= $spinsMaxTimes ? false : true;
  1286. foreach($friends as $row){
  1287. //金币
  1288. $isSend = intval(oo::commonOprRedis('common')->get(okeys::SendGiftToday($uid,$row,1)));
  1289. $isReceive = intval(oo::commonOprRedis('common')->get(okeys::SendEdGiftToday($row,$uid,1)));
  1290. if($isReceive == 1 && $accumulationMoneyFlag){
  1291. return true;
  1292. }
  1293. //体力
  1294. $isSend = intval(oo::commonOprRedis('common')->get(okeys::SendGiftToday($uid,$row,2)));
  1295. $isReceive = intval(oo::commonOprRedis('common')->get(okeys::SendEdGiftToday($row,$uid,2)));
  1296. if($isReceive == 1 && $accumulationSpinsFlag){
  1297. return true;
  1298. }
  1299. }
  1300. return false;
  1301. }
  1302. // --------------------------------------------------1.5.0--------------------------------------------------------//
  1303. //0已赠送 1赠送 2领取
  1304. //1金币,2体力
  1305. public function getFriendAndGiftList($uid, $page = 0){
  1306. $friendList = [];
  1307. $friends = self::getUserAllFriend($uid);
  1308. $userCard= oo::commonOprModel('card')->getUserCardInfo($uid);
  1309. $sended = array_keys($userCard['sended_card']);
  1310. $coinsMaxTimes = oo::commonOprModel('readconfig')->getCon('FriendProp','coinsMaxTimes');
  1311. $spinsMaxTimes = oo::commonOprModel('readconfig')->getCon('FriendProp','spinsMaxTimes');
  1312. $coinsCurTimes = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMaxTimes(1),$uid));
  1313. $spinsCurTimes = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMaxTimes(2),$uid));
  1314. $accumulationMoneyFlag = $coinsCurTimes >= $coinsMaxTimes ? false : true;
  1315. $accumulationSpinsFlag = $spinsCurTimes >= $spinsMaxTimes ? false : true;
  1316. $i = 0;
  1317. $version = oo::commonOprModel('user')->getUserVersion($uid);
  1318. $callbackTimeList = $friends ? $this->getListCallBackTime($uid, array_values($friends)) : [];
  1319. $count = count($friends);
  1320. $oFriends = $friends;
  1321. if($page){
  1322. $offset = 10;
  1323. $friendNum = count($friends);
  1324. $showFriend = $userInfoArr = [];
  1325. for ($i=0;$i<ceil($friendNum/$offset);$i++){
  1326. sort($friends);
  1327. $showFriend = array_slice($friends, ($page - 1) * $offset, $offset);
  1328. foreach ($showFriend as $key=>$row){
  1329. if(!empty($userInfoArr[$row])){
  1330. continue;
  1331. }
  1332. $userInfo = oo::commonOprModel('member')->getUserInfo($row);
  1333. if(empty($userInfo)){
  1334. $this->deleteFriend($uid,$row);
  1335. foreach ($friends as $k=>$u){
  1336. if($u == $row){
  1337. unset($friends[$k]);
  1338. unset($showFriend[$key]);
  1339. break;
  1340. }
  1341. }
  1342. }else{
  1343. $userInfoArr[$row] = $userInfo;
  1344. }
  1345. }
  1346. if(count($showFriend) == $offset){
  1347. break;
  1348. }
  1349. }
  1350. $friends = array_values($showFriend) ?? [];
  1351. }else{
  1352. $userInfoArr = [];
  1353. foreach ($friends as $fuid){
  1354. $userInfo = oo::commonOprModel('member')->getUserInfo($fuid);
  1355. if(empty($userInfo)){
  1356. $this->deleteFriend($uid,$fuid);
  1357. foreach ($friends as $k=>$u){
  1358. if($u == $fuid){
  1359. unset($friends[$k]);
  1360. break;
  1361. }
  1362. }
  1363. }else{
  1364. $userInfoArr[$fuid] = $userInfo;
  1365. }
  1366. }
  1367. }
  1368. $myLevelId = oo::commonOprModel('member')->getUserLevelId($uid);
  1369. $callbackConf = $this->callbackConf();
  1370. $helpInfo = oo::commonOprModel('level')->getHelpRepairInfo($uid);
  1371. $repaired = false;
  1372. //当天不能帮好友修了
  1373. if($helpInfo && isset($helpInfo['repair']['expire']) && $helpInfo['repair']['expire'] > time()){
  1374. $repaired = true;
  1375. $repaireArr = [];
  1376. }else{
  1377. $repaireArr = oo::commonOprModel('level')->getRepairInfoArr(array_values($friends));
  1378. }
  1379. $versionFlag = oo::compareVersion($version,'1.7.8');
  1380. foreach ($friends as $row){
  1381. if($row == $uid){
  1382. continue;
  1383. }
  1384. $userInfo = $userInfoArr[$row];
  1385. $lastCallbackTime = !empty($callbackTimeList[$row]) ? $callbackTimeList[$row] : 0;
  1386. $assetsInfo = oo::commonOprModel('member')->getUserAssetsInfo($row);
  1387. $canCallback = $this->canCallback($userInfo, $assetsInfo['levelId'], $lastCallbackTime, $callbackConf);
  1388. if($myLevelId < $assetsInfo['levelId'] || $repaired){
  1389. $canRepair = 0;
  1390. }else{
  1391. if(isset($repaireArr[$row], $repaireArr[$row]['berepair'], $repaireArr[$row]['berepair']['expire'])){
  1392. $canRepair = $repaireArr[$row]['berepair']['expire'] > time() ? 0 : 1;
  1393. }else{
  1394. $levelInfo = oo::commonOprModel('member')->getUserLevel($row);
  1395. $element = empty($levelInfo['element']) ? [] : $levelInfo['element'];
  1396. //有损坏的建筑才显示可维修
  1397. $canRepair = empty(array_filter(array_column($element, 'status'))) ? 0 : 1;
  1398. }
  1399. }
  1400. $i = $row;
  1401. $friendList[$i] = [
  1402. 'uid' => $row,
  1403. 'siteid' => $userInfo['siteuid'],
  1404. 'nick' => $versionFlag ? $userInfo['nick'] : oo::commonOprModel('member')->getUserFirstName($userInfo['nick']),
  1405. 's_picture' => $userInfo['s_picture'],
  1406. 'u_flag' => $userInfo['u_flag'],
  1407. 'callback_expire' => !empty($callbackTimeList[$row]) ? $callbackTimeList[$row] : 0,
  1408. 'can_callback' => $canCallback ? 1 : 0,
  1409. 'can_repair' => $canRepair,
  1410. 'sex' => $userInfo['sex'],
  1411. 'money' => $assetsInfo['money'],
  1412. 'coins' => $assetsInfo['money'],
  1413. 'star' => $assetsInfo['star'],
  1414. 'levelId' => $assetsInfo['levelId'],
  1415. 'signature' => $userInfo['signature'],
  1416. 'isFb' => $userInfo['isFb'],
  1417. 'isFbFriend' => $userInfo['isFb']?1:0,
  1418. 'vip' => $userInfo['vip'],
  1419. 'vipLv' => $userInfo['vipLv'],
  1420. 'vipExpire' => $userInfo['vip_expire'],
  1421. 'avatar' => $userInfo['avatar'],
  1422. ];
  1423. if(in_array($row,$sended)){
  1424. $cards = $userCard['sended_card'][$row];
  1425. $friendList[$i]['is_send_Card'] = 2;
  1426. $friendList[$i]['card_num'] = array_sum(array_values($cards));
  1427. $friendList[$i]['card_data'] = $cards;
  1428. }else{
  1429. $friendList[$i]['is_send_Card'] = 1;
  1430. $friendList[$i]['card_num'] = 0;
  1431. $friendList[$i]['card_data'] = json_decode("{}");
  1432. }
  1433. /**
  1434. * 金币
  1435. */
  1436. $isSend = intval(oo::commonOprRedis('common')->get(okeys::SendGiftToday($uid,$row,1)));
  1437. $isReceive = intval(oo::commonOprRedis('common')->get(okeys::SendEdGiftToday($row,$uid,1)));
  1438. if($isReceive == 2 && !$isSend && $accumulationMoneyFlag){
  1439. $friendList[$i]['is_send_Coin'] = 3;
  1440. }else if($isReceive == 1 && $accumulationMoneyFlag){
  1441. $friendList[$i]['is_send_Coin'] = 2;
  1442. }else if($isSend){
  1443. $friendList[$i]['is_send_Coin'] = 0;
  1444. }else{
  1445. $friendList[$i]['is_send_Coin'] = 1;
  1446. }
  1447. /**
  1448. * 体力
  1449. */
  1450. $isSend = intval(oo::commonOprRedis('common')->get(okeys::SendGiftToday($uid,$row,2)));
  1451. $isReceive = intval(oo::commonOprRedis('common')->get(okeys::SendEdGiftToday($row,$uid,2)));
  1452. if($isReceive == 2 && !$isSend && $accumulationSpinsFlag){
  1453. $friendList[$i]['is_send_Spin'] = 3;
  1454. }else if($isReceive == 1 && $accumulationSpinsFlag){
  1455. $friendList[$i]['is_send_Spin'] = 2;
  1456. }else if($isSend){
  1457. $friendList[$i]['is_send_Spin'] = 0;
  1458. }else{
  1459. $friendList[$i]['is_send_Spin'] = 1;
  1460. }
  1461. }
  1462. $sendsArr = [];
  1463. $coinsCount = $spinsCount = $coins1Count = $spins1Count = 0;
  1464. if(oo::compareVersion($version,'1.7.5')){
  1465. foreach($oFriends as $row){
  1466. if(isset($friendList[$row])){
  1467. if($friendList[$row]['is_send_Spin'] == 2){
  1468. $spinsCount++;
  1469. }
  1470. if($friendList[$row]['is_send_Spin'] == 1){
  1471. $spins1Count++;
  1472. }
  1473. if($friendList[$row]['is_send_Coin'] == 2){
  1474. $coinsCount++;
  1475. }
  1476. if($friendList[$row]['is_send_Coin'] == 1){
  1477. $coins1Count++;
  1478. }
  1479. if($friendList[$row]['card_num'] > 0){
  1480. $sendsArr[$row]['uid'] = $row;
  1481. $sendsArr[$row]['nick'] = $friendList[$row]['nick'];
  1482. $sendsArr[$row]['u_flag'] = $friendList[$row]['u_flag'];
  1483. $sendsArr[$row]['avatar'] = $friendList[$row]['avatar'];
  1484. $sendsArr[$row]['s_picture'] = $friendList[$row]['s_picture'];
  1485. $sendsArr[$row]['card_num'] = $friendList[$row]['card_num'];
  1486. $sendsArr[$row]['card_data'] = $friendList[$row]['card_data'];
  1487. }
  1488. continue;
  1489. }
  1490. $cards = isset($userCard['sended_card'][$row]) ? $userCard['sended_card'][$row] : [];
  1491. if(in_array($row,$sended) && !empty($cards)){
  1492. $userInfo = oo::commonOprModel('member')->getUserInfo($row);
  1493. $sendsArr[$row]['uid'] = $row;
  1494. $sendsArr[$row]['nick'] = oo::commonOprModel('member')->getUserFirstName($userInfo['nick']);
  1495. $sendsArr[$row]['u_flag'] = $userInfo['u_flag'];
  1496. $sendsArr[$row]['avatar'] = $userInfo['avatar'];
  1497. $sendsArr[$row]['s_picture'] = $userInfo['s_picture'];
  1498. $sendsArr[$row]['card_num'] = array_sum(array_values($cards));
  1499. $sendsArr[$row]['card_data'] = $cards;
  1500. }
  1501. //金币
  1502. $isSend = intval(oo::commonOprRedis('common')->get(okeys::SendGiftToday($uid,$row,1)));
  1503. $isReceive = intval(oo::commonOprRedis('common')->get(okeys::SendEdGiftToday($row,$uid,1)));
  1504. if($isReceive == 2 && !$isSend && $accumulationMoneyFlag){
  1505. //$sendsArr[$row]['is_send_Coin'] = 3;
  1506. }else if($isReceive == 1 && $accumulationMoneyFlag){
  1507. $coinsCount++;
  1508. }else if($isSend){
  1509. //$friendList[$i]['is_send_Coin'] = 0;
  1510. }else{
  1511. $coins1Count++;
  1512. }
  1513. //体力
  1514. $isSend = intval(oo::commonOprRedis('common')->get(okeys::SendGiftToday($uid,$row,2)));
  1515. $isReceive = intval(oo::commonOprRedis('common')->get(okeys::SendEdGiftToday($row,$uid,2)));
  1516. if($isReceive == 2 && !$isSend && $accumulationMoneyFlag){
  1517. //$sendsArr[$row]['is_send_Spin'] = 3;
  1518. }else if($isReceive == 1 && $accumulationSpinsFlag){
  1519. $spinsCount++;
  1520. }else if($isSend){
  1521. //$friendList[$i]['is_send_Spin'] = 0;
  1522. }else{
  1523. $spins1Count++;
  1524. }
  1525. }
  1526. }
  1527. $data = [
  1528. 'list' =>array_values($friendList),
  1529. 'reward'=>[
  1530. 'coins' => self::getUserFriendGiftCoins($uid),
  1531. 'spins' => oo::commonOprModel('readconfig')->getCon('FriendProp','spins'),
  1532. 'card' => 1,
  1533. ],
  1534. 'is_send_list' => array_values($sendsArr),
  1535. 'canGet_coins_num' => $coinsCount,
  1536. 'canGet_spins_num' => $spinsCount,
  1537. 'canSend_coins_num' => $coins1Count,
  1538. 'canSend_spins_num' => $spins1Count,
  1539. 'callback_reward' => $callbackConf['reward'],
  1540. 'limit' =>[
  1541. 'spins' =>[
  1542. 'max' =>$spinsMaxTimes,
  1543. 'times'=>$spinsCurTimes
  1544. ],
  1545. 'coins' =>[
  1546. 'max' =>$coinsMaxTimes,
  1547. 'times'=>$coinsCurTimes
  1548. ],
  1549. 'maxFriendNum' => 200,
  1550. 'refreshTime' => 24
  1551. ]
  1552. ];
  1553. if(!empty($page)){
  1554. $data['page'] = $page;
  1555. $data['total'] = $count;
  1556. }
  1557. return oo::response(1,$data,"",true);
  1558. }
  1559. /**
  1560. * 单个玩家赠送礼物 暂定每天每人只能送一次 每次1个体力 50K金币 系统给
  1561. * @param int $uid
  1562. * @param int $toUid
  1563. * @param int $gid 1金币 2体力
  1564. * @return array|bool
  1565. * Created by: Owen
  1566. * Created on: 2020/3/30 15:03
  1567. */
  1568. public function sendGift($uid,$toUid,$gid){
  1569. $cacheKey = okeys::SendGiftToday($uid,$toUid,$gid);
  1570. $cache = oo::commonOprRedis('common')->get($cacheKey);
  1571. if($cache){
  1572. return oo::response(-2,[],"已赠送礼物");
  1573. }
  1574. if($gid == 1){
  1575. $num = self::getUserFriendGiftCoins($toUid);
  1576. }else{
  1577. $num = oo::commonOprModel('readconfig')->getCon('FriendProp','spins');
  1578. }
  1579. oo::commonOprRedis('common')->setex($cacheKey,1, 24*60*60);
  1580. oo::commonOprRedis('common')->setex(okeys::SendEdGiftToday($uid,$toUid,$gid),1, 7*24*60*60);
  1581. oo::commonOprModel('Workerman')->push($toUid,ocmd::$redPoint,['type'=>5]);
  1582. $uidInfo = oo::commonOprModel('member')->getUserInfo($uid);
  1583. oo::commonOprModel('push')->pushNews($toUid, 'push.title.gift', 'push.content.gift', [$uidInfo['nick']],'gift');
  1584. //召回活动-赠送金币,体力
  1585. $tid = $gid==1?10:9;
  1586. oo::commonOprModel('callback')->doTask($uid, $tid, 1);
  1587. //赠送情况统计
  1588. oo::commonOprModel('statistics')->giveSta($gid==1?'money':'spins','Send',$uid,$num);
  1589. $isSend = oo::commonOprRedis('common')->get(okeys::SendEdGiftToday($toUid,$uid,$gid));
  1590. $data['gid'] = $gid;
  1591. $data['num'] = $num;
  1592. $data['state'] = ($isSend==1)?2:0;
  1593. if($gid == 1){
  1594. oo::commonOprModel('ta')->setEventData($uid,"coin_send",["coin_send_object_user"=>$toUid,"coin_send_num"=>$num]);
  1595. }else if($gid == 2){
  1596. oo::commonOprModel('ta')->setEventData($uid,"spin_send",["spin_send_object_user"=>$toUid,"spin_send_num"=>$num]);
  1597. }
  1598. return oo::response(1,$data,"赠送成功");
  1599. }
  1600. /**
  1601. * 领取好友礼物
  1602. * @param $uid
  1603. * @param $toUid
  1604. * @param $gid
  1605. * @return string
  1606. * Created by: Owen
  1607. * Created on: 2020/3/30 15:19
  1608. */
  1609. public function receiveGift($uid,$toUid,$gid){
  1610. $cacheKey = okeys::SendEdGiftToday($toUid,$uid,$gid);
  1611. $cache = oo::commonOprRedis('common')->get($cacheKey);
  1612. if(empty($cache)){
  1613. return oo::response(-2,[],"无礼物赠送记录");
  1614. }
  1615. if($cache == 2){
  1616. return oo::response(-3,[],"礼物已领取");
  1617. }
  1618. oo::commonOprRedis('common')->setex($cacheKey,2,oo::todayDeadline());
  1619. if($gid == 1){
  1620. $money_num = $num = self::getUserFriendGiftCoins($uid);
  1621. $type= 'money';
  1622. }else if($gid == 2){
  1623. $spins_num = $num = intval(oo::commonOprModel('readconfig')->getCon('FriendProp','spins'));
  1624. $type= 'spins';
  1625. }
  1626. $MaxTimes = oo::commonOprModel('readconfig')->getCon('FriendProp','coinsMaxTimes');
  1627. $CurTimes = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMaxTimes($gid),$uid));
  1628. if($CurTimes >= $MaxTimes){
  1629. return oo::response(-3,[],"领取礼物次数已达最大限制");
  1630. }
  1631. oo::commonOprModel('member')->optProperty($uid, [$type=>$num], '+',50, '好友赠送金币');
  1632. oo::commonOprRedis('common')->hIncrBy(okeys::friendGiftMax($gid),$uid,$num);
  1633. oo::commonOprRedis('common')->hIncrBy(okeys::friendGiftMaxTimes($gid),$uid,1);
  1634. $isSend = oo::commonOprRedis('common')->get(okeys::SendGiftToday($uid,$toUid,$gid));
  1635. $data['money_num'] = $money_num ?? 0;
  1636. $data['spins_num'] = $spins_num ?? 0;
  1637. $flag = ($isSend)?0:3;
  1638. $data['state'] = $flag;
  1639. /**
  1640. * ta 事件--卡组完成
  1641. */
  1642. if($gid == 1){
  1643. oo::commonOprModel('ta')->setEventData($uid,"coin_accept",["coin_accept_from_user"=>$toUid,"coin_accept_num"=>$num]);
  1644. }else if($gid == 2){
  1645. oo::commonOprModel('ta')->setEventData($uid,"spin_accept",["spin_accept_from_user"=>$toUid,"spin_accept_num"=>$num]);
  1646. }
  1647. return oo::response(1,$data,"领取成功");
  1648. }
  1649. /**
  1650. * 一键领取并赠送
  1651. * @param $uid
  1652. * @param $gid
  1653. * @return string
  1654. * Created by: Owen
  1655. * Created on: 2020/3/30 15:53
  1656. */
  1657. public function sendAndReceiveGifts($uid,$gid){
  1658. $friends = self::getUserAllFriend($uid);
  1659. if($gid == 1){
  1660. $num = self::getUserFriendGiftCoins($uid);
  1661. $MaxTimes = oo::commonOprModel('readconfig')->getCon('FriendProp','coinsMaxTimes');
  1662. $type= 'money';
  1663. $tips= '金币';
  1664. }else if($gid == 2){
  1665. $num = oo::commonOprModel('readconfig')->getCon('FriendProp','spins');
  1666. $MaxTimes = oo::commonOprModel('readconfig')->getCon('FriendProp','spinsMaxTimes');
  1667. $type= 'spins';
  1668. $tips= '体力';
  1669. }
  1670. $total = 0;
  1671. $CurTimes = intval(oo::commonOprRedis('common')->hGet(okeys::friendGiftMaxTimes($gid),$uid));
  1672. $uidInfo = oo::commonOprModel('member')->getUserInfo($uid);
  1673. if($gid == 2){
  1674. $assetsInfo = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  1675. $curSpins = intval($assetsInfo['spins']);
  1676. $maxSpins = oo::commonOprModel('member')->getLevelUpLimit($assetsInfo['levelId'],'spins') ?? 50;
  1677. }
  1678. //当前剩余未领完的好友个数
  1679. $remainCount = 0;
  1680. $receiveSpins = [];
  1681. $sendNum = 0;
  1682. foreach($friends as $row){
  1683. /**
  1684. * 赠送
  1685. */
  1686. $sendkey = okeys::SendGiftToday($uid,$row,$gid);
  1687. if(!oo::commonOprRedis('common')->get($sendkey)){
  1688. oo::commonOprRedis('common')->setex($sendkey,1,24*60*60);
  1689. oo::commonOprRedis('common')->setex(okeys::SendEdGiftToday($uid,$row,$gid),1,7*24*60*60);
  1690. oo::commonOprModel('Workerman')->push($row,ocmd::$redPoint,['type'=>5]);
  1691. oo::commonOprModel('push')->pushNews($row, 'push.title.gift', 'push.content.gift', [$uidInfo['nick']],'gift');
  1692. if($gid == 1){
  1693. oo::commonOprModel('ta')->setEventData($uid,"coin_send",["coin_send_object_user"=>$row,"coin_send_num"=>$num]);
  1694. }else if($gid == 2){
  1695. oo::commonOprModel('ta')->setEventData($uid,"spin_send",["spin_send_object_user"=>$row,"spin_send_num"=>$num]);
  1696. }
  1697. $sendNum++;
  1698. }
  1699. if($gid == 2 && $curSpins >= $maxSpins){
  1700. if(oo::commonOprRedis('common')->get(okeys::SendEdGiftToday($row,$uid,$gid)) == 1){
  1701. $remainCount++;
  1702. }
  1703. continue;
  1704. }
  1705. /**
  1706. * 领取
  1707. */
  1708. $receiveKey = okeys::SendEdGiftToday($row,$uid,$gid);
  1709. if(oo::commonOprRedis('common')->get($receiveKey) == 1){
  1710. if($CurTimes < $MaxTimes){
  1711. oo::commonOprRedis('common')->setex($receiveKey,2,oo::todayDeadline());
  1712. $total += 1;
  1713. $CurTimes += 1;
  1714. if($gid == 2){
  1715. $curSpins += 1;
  1716. $receiveSpins[] = $row;
  1717. }
  1718. if($gid == 1){
  1719. oo::commonOprModel('ta')->setEventData($uid,"coin_accept",["coin_accept_from_user"=>$row,"coin_accept_num"=>$num]);
  1720. }else if($gid == 2){
  1721. oo::commonOprModel('ta')->setEventData($uid,"spin_accept",["spin_accept_from_user"=>$row,"spin_accept_num"=>$num]);
  1722. }
  1723. }
  1724. }
  1725. }
  1726. $tid = $gid==1?10:9;
  1727. oo::commonOprModel('callback')->doTask($uid, $tid, $sendNum);//召回任务
  1728. if($total != 0){
  1729. oo::commonOprModel('member')->optProperty($uid, [$type=>$total*$num], '+',50, '好友赠送'.$tips);
  1730. }
  1731. $reward = [$type=>$total*$num];
  1732. if($type == 'money'){
  1733. $reward['coins'] = $total*$num;
  1734. }
  1735. return oo::response(1,['reward'=>$reward,"remain_count" => $remainCount, "receive"=>['spins'=>$receiveSpins]]);
  1736. }
  1737. /**
  1738. * 获取用户好友礼物金币数量
  1739. * @param $uid
  1740. * @return int
  1741. * Created by: Owen
  1742. * Created on: 2020/9/2 18:41
  1743. */
  1744. public function getUserFriendGiftCoins($uid){
  1745. $config = oo::commonOprModel('config')->getFriendGiftCoinConfig();
  1746. $assetsInfo = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  1747. $num = 10000;
  1748. foreach ($config as $levelId=>$coins){
  1749. if($levelId <= $assetsInfo['levelId']){
  1750. $num = $coins;
  1751. }else{
  1752. break;
  1753. }
  1754. }
  1755. return intval($num);
  1756. }
  1757. /**
  1758. * 判断是否是好友
  1759. * @param $uid
  1760. * @param $toUid
  1761. * @return bool
  1762. * Created by: Owen
  1763. * Created on: 2020/9/28 19:20
  1764. */
  1765. public function isFriend($uid,$toUid){
  1766. if(in_array($toUid,self::getUserAllFriend($uid))){
  1767. return true;
  1768. }
  1769. return false;
  1770. }
  1771. }
  1772. function TimeCmp($a, $b) {
  1773. return (@$a['lasttime'] < @$b['lasttime']) ? 1 : -1;
  1774. }
  1775. function cmpThree($a, $b) {
  1776. if (@$a['type'] == @$b['type']) {
  1777. return (@$a['money'] < @$b['money']) ? 1 : -1;
  1778. } else {
  1779. return (@$a['type'] < @$b['type']) ? -1 : 1;
  1780. }
  1781. }