where('id',$gameid*1) ->find(); return Tools::set_res(200,'查询成功',$data); }); } /** * desc:根据openid查询用户 * api/Users/getUserInfo * 参数: * openid * * 返回: * now_rank 当前排名 * all_coins: 累计获得金币 * enemy 累计击杀数 * eliminate 消消乐道具 */ function getUserInfo(){ Tools::log_to_write_txt(['查询单个用户 入参:'=>input()]); try { $openid = input('openid'); if(empty($openid)){ return json(Tools::set_fail('参数错误')); } $model_obj = Db::table('fa_users'); if(input('openid')){ $model_obj->where('openid',input('openid')); } $data = $model_obj->find(); if(empty($data)){ return json(Tools::set_res(234,'用户不存在')); } //更新用户最后登录时间 Db::table('fa_users') ->data(['last_login_time'=>Tools::get_now_date()]) ->where('id',$data['id']) ->update(); //写入登录记录 Mmodel::existsUpdateInsert('fa_login_record',['date'=>date('Y-m-d')],[ 'openid'=>$openid, 'date'=>date('Y-m-d') ]); //总计登录天数 $data['total_login_days'] = Db::table('fa_login_record') ->where('openid',$openid) ->count('id'); //当前排名 $data['now_rank'] = $this->countRank($openid); //eliminate $eliminate = Db::table('fa_usereliminate') ->where('openid',$data['openid']) ->select(); $data['eliminate'] = $eliminate; return json(Tools::set_ok('ok',$data)); }catch(\Exception $e){ Tools::log_to_write_txt([ 'error'=>'查询单个用户.异常.'.$e->getMessage(), '参数'=>input(), 'error_info'=>$e->getTraceAsString() ]); return json(Tools::set_res(500,'操作异常',[])); } } /** * desc:计算排名 * author:wh */ private function countRank($openid){ if(cache('user_rank_'.$openid)){ return cache('user_rank_'.$openid); } $lists = Db::table(TabConf::$fa_users) ->order('now_level desc') ->field('openid,now_level') ->select(); if($lists){ foreach ($lists as $k=>$v){ if($v['openid'] == $openid){ cache('user_rank_'.$openid,$k+1,3600); return $k+1; } } } return 0;//没有排名 } /** * desc:授权,登录 * * /api/users/login * * 参数:clientid 客户端标识 * username 用户名 * password 密码 * * author:wh */ function login() { try { $clientid = input('clientid'); if(empty($clientid)){ return json(Tools::set_fail('clientid error')); } $username = input('username'); if(empty($username)){ return json(Tools::set_fail('参数错误:1')); } $password = input('password'); if(empty($password)){ return json(Tools::set_fail('参数错误:2')); } $user = Db::table(TabConf::$fa_users) ->where('username',$username) ->find(); if(empty($user)){ return json(Tools::set_fail('参数错误')); } if($password != $user['password']){ return json(Tools::set_fail('密码错误')); } //session('api_user_info',$user); unset($user['password']); $expires = 7*86400+time(); //返回票据 $ticketstr = md5($user['username'].$expires); //修改有效期 Db::table(TabConf::$fa_users) ->data([ 'ticket'=>$ticketstr, 'expires'=>$expires,//7天 'clientid'=>$clientid, ]) ->where('username',$username) ->update(); return json(Tools::set_ok('登录成功',['ticket'=>$ticketstr])); }catch (\Exception $e){ Tools::log_to_write_text([ 'error'=>'授权异常。'.$e->getMessage(), 'input'=>input(), 'error_info'=>$e->getTraceAsString() ]); return json(Tools::set_fail('请求异常')); } } /** * desc:修改用户昵称、头像 * * /api/users/updateuser * * 参数: * openid 必传 * nickname,headimage */ function updateuser(){ return Mmodel::catchJson(function (){ $nickname = input('nickname',''); $headimage = input('headimage',''); $data = []; if($nickname){ $data['nickname'] = $nickname; } if($headimage){ $data['headimage'] = $headimage; } $openid = input('openid'); if(empty($openid)){ return Tools::set_fail('OPENID MUST'); } if(!empty($data)){ Db::table(TabConf::$fa_users) ->where('openid',$openid) ->data($data) ->update(); } return Tools::set_ok(); }); } /** * desc:更新最新关卡 * api/users/updatenowlevel * * 参数: * now_level 最新关卡 * author:wh */ function updateNowLevel(){ return Mmodel::catchJson(function (){ $now_level = input('now_level'); if(empty($now_level)){ return Tools::set_fail('now_level 必须'); } Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->update([ 'now_level'=>$now_level, ]); return Tools::set_ok(); }); } /** * desc:查询好友列表-计算离线奖励 * /api/users/getFriendsOfflinePrizeList * * 离线奖励:从用户下线时刻开始,每3个小时奖励一瓶随机等级的肥料,只取整数,不四舍五入。离线时长除以3取整数。 * 比如:离线 0-2.9 个小时 不奖励 离线 3-5.9 个小时 奖励 1瓶 离线 6-8.9 个小时 奖励 2瓶 * gameprop_id 道具奖品 prize_all_num 总奖励数量 self_got_num 自己保底所得数量(固定) can_lose_num 可被偷取的数量(固定) now_can_lose_num 已偷取(偷取后数值增加,数值大于可被偷取的总数量时,拒绝偷取) * author:wh */ function getFriendsOfflinePrizeList(){ return Mmodel::catchJson(function (){ //查询我的离线好友 $friends = Db::table(TabConf::$fa_gamefriend) ->where('openid',api_user_openid()) ->select(); if(empty($friends)){ return Tools::set_res(220,'没有好友'); } //可偷取的奖励部分每次允许偷取比例配置 $lose_rate = SundryConfig::val('offline_prize_can_lose_per_times_lose_rate'); foreach ($friends as &$list){ $friend_openid = $list['friend_openid']; $sql = " select * from fa_user_offline_prize a left join fa_user_offline_prize_got_record b on a.id = b.user_offline_prizeid where a.openid='{$friend_openid}' and b.user_offline_prizeid is null; "; //查询好友的离线奖励 $friend_prize = Db::query($sql); //统计我的已偷取数量 //$my_already_lose_num = Db::table(TabConf::$fa_user_offline_prize_got_record) // ->where('openid',api_user_openid()) // ->whereIn('user_offline_prizeid',array_column($friend_prize,'id')) // ->sum('num'); //统计我的已偷取数量=$can_lose_num*$lose_rate,如果相等就设置偷取数量为0 $can_lose_num_arr = array_column($friend_prize,'can_lose_num'); //总的可偷取数量 $can_lose_num = array_sum($can_lose_num_arr); $already_lose_num_arr = array_column($friend_prize,'already_lose_num'); //已偷取的总数量 $already_lose_num = array_sum($already_lose_num_arr); $friend_prize['now_can_lose_num'] = floor(($can_lose_num-$already_lose_num)*$lose_rate); $friend_prize['lose_rate'] = $lose_rate; $tmp_arr = []; //查询好友的奖励 $tmp_arr['friend_prize'] = $friend_prize; $list = array_merge($list, $tmp_arr); //$can_lose_num_arr = array_column($friend_prize,'can_lose_num'); //$can_lose_num = array_sum($can_lose_num_arr);//总的可偷取数量 //if($my_already_lose_num == $can_lose_num*$lose_rate){ // //默认为0 // $friend_prize['now_can_lose_num'] = 0; // $friend_prize['lose_rate'] = 0; // $tmp_arr = []; // $tmp_arr['friend_prize'] = $friend_prize; // $list = array_merge($list, $tmp_arr); //}else{ // //过滤已偷过的记录 // //$already_lose_record = Db::table(TabConf::$fa_user_offline_prize_got_record) // // ->where('openid',api_user_openid()) // // ->whereIn('user_offline_prizeid',array_column($friend_prize,'id')) // // ->select(); // $friend_prize = Db::table(TabConf::$fa_user_offline_prize) // ->where('openid',$list['friend_openid']) // ->whereNotIn('id',array_column($already_lose_record,'id'))//剔除已偷过的记录 // ->select(); // // $can_lose_num_arr = array_column($friend_prize,'can_lose_num'); // //总的可偷取数量 // $can_lose_num = array_sum($can_lose_num_arr); // $already_lose_num_arr = array_column($friend_prize,'already_lose_num'); // //已偷取的总数量 // $already_lose_num = array_sum($already_lose_num_arr); // // $friend_prize['now_can_lose_num'] = floor(($can_lose_num-$already_lose_num)*$lose_rate); // $friend_prize['lose_rate'] = $lose_rate; // // $tmp_arr = []; // //查询好友的奖励 // $tmp_arr['friend_prize'] = $friend_prize; // $list = array_merge($list, $tmp_arr); //} } return Tools::set_ok('ok',$friends); }); } /** * desc:随机奖励 */ private function random_prop($key=''){ $count = Db::table(TabConf::$fa_gameprop) ->count('id'); $id = mt_rand(1,$count); $p = Db::table(TabConf::$fa_gameprop)->where('id',$id)->find(); if(empty($p)){ $id = mt_rand(1,$count); $p = Db::table(TabConf::$fa_gameprop)->where('id',$id)->find(); } if(empty($p)){ throw new Exception('道具获取失败'); } return $key?$p[$key]:$p; } /** * desc:(偷取)领取好友离线奖励(领取多少根据后台配置领取比例而定),偷取后发邮件给用户 * * api/users/offlineprizegot * 参数: * friend_openid 好友 * * author:wh */ function offlinePrizeGot(){ return Mmodel::catchTransJson(function (){ $friend_openid = input('friend_openid'); if(empty($friend_openid)){ return Tools::set_fail('friend_openid 必须'); } //可偷取的奖励部分每次允许偷取比例配置 $lose_rate = SundryConfig::val('offline_prize_can_lose_per_times_lose_rate'); $sql = " select a.* from fa_user_offline_prize a left join fa_user_offline_prize_got_record b on a.id = b.user_offline_prizeid where a.openid='{$friend_openid}' and b.user_offline_prizeid is null; "; //查询好友的离线奖励 $prize_lists = Db::query($sql); $got_prize_arr = []; foreach ($prize_lists as $prize){ $gameprop_id = $prize['gameprop_id']; //计算本次可领取奖励 $num = floor($prize['can_lose_num'] * $lose_rate); if($num<=0){ //偷取数量为0 $got_prize_arr[]=[ 'num'=>0, 'gameprop_id'=>0 ]; continue; } //查询用户已有道具 $usergameprop = Db::table(TabConf::$fa_usergameprop) ->where('openid',api_user_openid()) ->where('gameprop_id',$gameprop_id) ->find(); //偷取时更新奖励 if($usergameprop){ //更新用户道具数量 Db::table(TabConf::$fa_usergameprop) ->where('openid',api_user_openid()) ->where('gameprop_id',$gameprop_id) ->setInc('num',$num); }else{ //查询道具 $gameprop = Db::table(TabConf::$fa_gameprop) ->where('id',$prize['gameprop_id']) ->find(); //新增用户道具 Db::table(TabConf::$fa_usergameprop) ->data([ 'gameproptype_id'=>$gameprop['gameproptype_id'], 'name'=>$gameprop['name'], 'image'=>$gameprop['image'], 'openid'=>api_user_openid(), 'num'=>$num, 'gameprop_id'=>$gameprop_id ]) ->insert(); } //偷取时,增加已偷取数量 Db::table(TabConf::$fa_user_offline_prize) ->where('id',$prize['id']) ->setInc('already_lose_num',$num); //写入(偷取)领取记录 Db::table(TabConf::$fa_user_offline_prize_got_record) ->data([ 'openid'=>api_user_openid(), 'friend_openid'=>$friend_openid, 'num'=>$num, 'gameprop_id'=>$gameprop_id, 'user_offline_prizeid'=>$prize['id'],//记录id ]) ->insert(); $got_prize_arr[]=[ 'num'=>$num, 'gameprop_id'=>$gameprop_id ]; } //添加一封邮件(不是真实的邮件,可以理解为消息) Db::table(TabConf::$fa_user_email) ->data([ 'addresser_openid'=>api_user_openid(), 'addressee_openid'=>$friend_openid,//收件人 'title'=>'好友偷取奖励', 'content'=>'您的奖励已被好友偷取啦!', ]) ->insert(); return Tools::set_ok('ok',$got_prize_arr); }); } /** * 查询自己的离线奖励 * * 离线奖励:从用户下线时刻开始,每3个小时奖励一瓶随机等级的肥料,只取整数,不四舍五入。离线时长除以3取整数。 * 比如:离线 0-2.9 个小时 不奖励 离线 3-5.9 个小时 奖励 1瓶 离线 6-8.9 个小时 奖励 2瓶 * * api/users/getselfofflineprize */ function getSelfOfflinePrize(){ return Mmodel::catchJson(function (){ $lists = Db::table(TabConf::$fa_user_offline_prize) ->where('openid',api_user_openid()) ->order('id asc')//客户端要取最早的那个时间 ->select(); if(empty($lists)){ return Tools::set_res(220,'没有离线奖励'); } //可偷取的奖励部分每次允许偷取比例配置 $lose_rate = SundryConfig::val('offline_prize_can_lose_per_times_lose_rate'); $lists_data = []; foreach ($lists as $list){ if($list['self_got_num']==0){ continue;//领取过的数据,不返回 } $record = Db::table(TabConf::$fa_user_offline_prize_got_record) ->where('openid',api_user_openid())//当前登陆人 ->where('user_offline_prizeid',$list['id']) ->find(); if(empty($record)){//为空说明未偷取 $lists_data[] = array_merge($list, ['now_can_lose_num'=>floor($list['can_lose_num']*$lose_rate),'lose_rate'=>$lose_rate]); }else{ $lists_data[] = array_merge($list, ['now_can_lose_num'=>0]); } } return Tools::set_ok('ok',$lists_data); }); } /** * desc:领取自己的离线奖励(一次性领取所有离线奖励,不能分批次领取,没有部分领取一说) * api/users/receiveSelfOfflinePrize * 参数: * is_double 是否双倍奖励 1 一倍,2 二倍 * author:wh */ function receiveSelfOfflinePrize(){ return Mmodel::catchTransJson(function (){ //查询我的离线奖励 $prize_lists = Db::table(TabConf::$fa_user_offline_prize) ->where('openid',api_user_openid()) ->lock(true)//锁住 ->select(); $got_prize_arr = []; //是否双倍奖励 1 一倍,2 二倍 $is_double = input('is_double',1); foreach ($prize_lists as $item){ //查询领取记录 $offline_prize_got_record = Db::table(TabConf::$fa_user_offline_prize_got_record) ->where('openid',api_user_openid()) ->where('user_offline_prizeid',$item['id']) ->find(); if($offline_prize_got_record){ continue;//领取过的数据,不能再次领取 } //道具id $gameprop_id = $item['gameprop_id']; //自己保底所得数量+可被偷取的数量-已被偷取的数量 $prize_all_num = $item['self_got_num'] + $item['can_lose_num'] - $item['already_lose_num']; //乘以倍数 $num = $prize_all_num * $is_double; //查询道具 $gameprop = Db::table(TabConf::$fa_gameprop) ->where('id',$gameprop_id) ->find(); if(empty($gameprop)){ //道具不应该不存在 continue; //return Tools::set_fail('道具不存在'); } //写入领取记录 Db::table(TabConf::$fa_user_offline_prize_got_record) ->data([ 'openid'=>api_user_openid(), 'num'=>$num, 'gameprop_id'=>$gameprop_id, 'is_double'=>$is_double, 'user_offline_prizeid'=>$item['id'], ]) ->insert(); //查询用户已有道具 $usergameprop = Db::table(TabConf::$fa_usergameprop) ->where('openid',api_user_openid()) ->where('gameprop_id',$gameprop_id) ->find(); if($usergameprop){ //更新道具数量 Db::table(TabConf::$fa_usergameprop) ->where('openid',api_user_openid()) ->where('gameprop_id',$gameprop_id) ->setInc('num',$num); }else{ //新增道具 Db::table(TabConf::$fa_usergameprop) ->data([ 'gameproptype_id'=>$gameprop['gameproptype_id'], 'name'=>$gameprop['name'], 'image'=>$gameprop['image'], 'openid'=>api_user_openid(), 'num'=>$num, 'gameprop_id'=>$gameprop_id ]) ->insert(); } Db::table(TabConf::$fa_user_offline_prize) ->where('id',$item['id']) ->data([ 'self_got_num'=>0, 'can_lose_num'=>0, ]) ->update(); $got_prize_arr[]=[ 'num'=>$num, 'gameprop_id'=>$gameprop_id ]; } //领取之后删除离线奖励表 UserOfflinePrizeLogic::deletedPrize(api_user_openid()); return Tools::set_ok('领取成功',$got_prize_arr); }); } /** * desc:查询我的好友列表 * * api/users/getMyFriends * * author:wh */ function getMyFriends(){ return Mmodel::catchJson(function (){ $lists = Db::table(TabConf::$fa_gamefriend) ->where('openid',api_user_openid()) ->select(); return Tools::set_ok('ok',$lists); }); } /** * desc:添加好友 * * api/users/addFriend * 参数: * friend_openid 好友openid * 注意:如果好友在线,会向好友发送申请消息 * author:wh */ function addFriend(){ return Mmodel::catchJson(function (){ $friend_openid = input('friend_openid'); if(empty($friend_openid)){ return Tools::set_fail('请输入好友openid'); } $user_friend = Db::table(TabConf::$fa_users) ->where('openid',$friend_openid) ->find(); if(empty($user_friend)){ return Tools::set_fail('好友不存在'); } $uf = Db::table(TabConf::$fa_gamefriend) ->where('openid',api_user_openid()) ->where('friend_openid',$friend_openid) ->find(); if($uf){ return Tools::set_fail('不能添加自己和自己的好友'); } if($friend_openid == api_user_openid()){ return Tools::set_fail('不能添加自己'); } $data = [ 'openid'=>api_user_openid(), 'headimage'=>api_user_info('headimage'), 'nickname'=>api_user_info('nickname'), 'friend_openid'=>$friend_openid, 'friend_nickname'=>$user_friend['nickname'] ]; //如果已经申请则不再申请 $apply_record = Db::table(TabConf::$fa_friend_apply_record) ->where('openid',api_user_openid()) ->where('friend_openid',$friend_openid) ->find(); if($apply_record){ return Tools::set_fail('你已申请过该好友'); } Db::table(TabConf::$fa_friend_apply_record) ->data($data) ->insert(); //如果好友在线,则发送添加好友申请 if($user_friend['clientid']){ $json = BaseWssApi::json_wss('new-friend-apply', '有新的好友申请'); Gateway::sendToClient($user_friend['clientid'], json_encode($json, JSON_UNESCAPED_UNICODE)); } return Tools::set_ok('申请已发送'); }); } /** * desc:查询我的好友申请列表 * * api/users/getFriendApplyList * author:wh */ function getFriendApplyList(){ return Mmodel::catchJson(function (){ $friend_apply_record = Db::table(TabConf::$fa_friend_apply_record) ->where('friend_openid',api_user_openid()) ->select(); return Tools::set_ok('ok',$friend_apply_record); }); } /** * 同意好友申请 * api/users/agreeFriendApply * 参数: * friend_openid 好友openid */ function agreeFriendApply(){ return Mmodel::catchTransJson(function (){ $friend_openid = input('friend_openid'); if(empty($friend_openid)){ return Tools::set_fail('请输入好友openid'); } $user_friend = Db::table(TabConf::$fa_users) ->where('openid',$friend_openid) ->find(); if(empty($user_friend)){ return Tools::set_fail('好友不存在.'); } //好友已存在 $uf = Db::table(TabConf::$fa_gamefriend) ->where('openid',api_user_openid()) ->where('friend_openid',$friend_openid) ->find(); if($uf){ return Tools::set_fail('好友已存在'); } //添加陌生人为好友 Db::table(TabConf::$fa_gamefriend) ->data([ 'openid'=>api_user_openid(), 'nickname'=>api_user_info('nickname'), 'friend_openid'=>$friend_openid, 'friend_nickname'=>$user_friend['nickname'], 'friend_image'=>$user_friend['headimage'], ]) ->insert(); //把自己添加为陌生人的好友 Db::table(TabConf::$fa_gamefriend) ->data([ 'openid'=>$friend_openid, 'nickname'=>$user_friend['nickname'], 'friend_openid'=>api_user_openid(), 'friend_nickname'=>api_user_info('nickname'), 'friend_image'=>api_user_info('headimage'), ]) ->insert(); //删除好友申请记录 Db::table(TabConf::$fa_friend_apply_record) ->where('openid',$friend_openid) //->where('friend_openid',$friend_openid) ->delete(); return Tools::set_ok('ok'); }); } /** * 拒绝好友申请 * * api/users/refuseFriendApply * 参数: * friend_openid 好友openid */ function refuseFriendApply(){ return Mmodel::catchTransJson(function (){ $friend_openid = input('friend_openid'); if(empty($friend_openid)){ return Tools::set_fail('请输入好友openid'); } $users = Db::table(TabConf::$fa_users) ->where('openid',$friend_openid) ->find(); if(empty($users)){ return Tools::set_fail('用户不存在'); } //删除好友申请记录 Db::table(TabConf::$fa_friend_apply_record) ->where('openid',$friend_openid) //->where('friend_openid',$friend_openid) ->delete(); return Tools::set_ok('ok'); }); } /** * desc:增加金币,直接存用户信息里 * author:wh * 参数: * coins 金币数量 */ function addCoins(){ return Mmodel::catchTransJson(function (){ $coins = input('coins'); if(empty($coins)){ return Tools::set_fail('请输入金币'); } Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->setInc('coins',$coins); Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->setInc('all_coins',$coins);//累计金币 return Tools::set_ok('ok'); }); } /** * desc:消耗金币 * author:wh * 参数: * coins 金币数量 */ function cutCoins(){ return Mmodel::catchJson(function (){ $coins = input('coins'); if(empty($coins)){ return Tools::set_fail('请输入金币'); } Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->setDec('coins',$coins); return Tools::set_ok('ok'); }); } /** * 消耗金币增加体力(消耗金币增加体力次数减一) * 参数:无 * api/users/cutCoinsAddStrength */ function cutCoinsAddStrength(){ return Mmodel::catchTransJson(function (){ //消耗金币增加体力的金币数值配置 $cut_n_coins_add_power = SundryConfig::val('cut_n_coins_add_power'); $user = Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->lock(true) ->find(); if($user['coin_power_times'] <= 0){ return Tools::set_fail('金币增加体力次数不足'); } if($user['coins'] < $cut_n_coins_add_power){ return Tools::set_fail('金币不足'); } //消耗金币 Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->setDec('coins',$cut_n_coins_add_power); //增加体力 Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->setInc('power',1); //减少金币增加体力次数 Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->where('coin_power_times','>',0) ->setDec('coin_power_times',1); return Tools::set_ok('ok'); }); } /** * 看广告增加体力 (看广告增加体力次数减一) * 参数:无 * api/users/lookAdAddPower */ function lookAdAddPower(){ return Mmodel::catchTransJson(function (){ $user = Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->lock(true) ->find(); if($user['ad_power_times'] <= 0){ return Tools::set_fail('看广告增加体力次数不足'); } //增加体力 Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->setInc('power',1); // Db::table(TabConf::$fa_users) ->where('openid',api_user_openid()) ->where('ad_power_times','>',0) ->setDec('ad_power_times',1); return Tools::set_ok('ok'); }); } }