luckydraw.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. <?php
  2. defined('IN_WEB') or die('Include Error!');
  3. class ModelLuckydraw{
  4. public $config = [];
  5. public function getUserLuckyValue($uid){
  6. $key = okeys::LuckyValue($uid);
  7. $value = oo::commonOprRedis('usercache')->get($key);
  8. if(!empty($value)){
  9. return intval($value);
  10. }
  11. $tb = otable::gh_gameserver($uid);
  12. $sql= "SELECT luckydraw FROM {$tb} WHERE mid={$uid} LIMIT 1";
  13. $ret= oo::commonOprDb('ghgames')->getOne($sql,MYSQLI_ASSOC);
  14. $value = intval($ret['luckydraw']);
  15. oo::commonOprRedis('usercache')->setex($key,$value,oo::redisRandomExpire(3*24*60*60));
  16. return $value;
  17. }
  18. public function updateUserLuckyValue($uid,$num){
  19. $tb = otable::gh_gameserver($uid);
  20. $sql= "UPDATE {$tb} SET `luckydraw`='{$num}' WHERE mid='{$uid}' limit 1";
  21. oo::commonOprDb('ghgames')->query($sql);
  22. oo::commonOprRedis('usercache')->delete(okeys::LuckyValue($uid));
  23. }
  24. public function getProConfig($pro = '',$vip = false){
  25. $hashKey = $pro.intval($vip);
  26. $cacheKey = okeys::LuckyProConfig();
  27. $cache = oo::commonOprRedis('Config')->hGet($cacheKey,$hashKey);
  28. if(!empty($cache)){
  29. return json_decode($cache,true);
  30. }
  31. $tb = otable::LuckyProConfig();
  32. if($pro === ''){
  33. $sql= "SELECT * FROM {$tb}";
  34. $ret= oo::commonOprDb('config')->getAll($sql,MYSQLI_ASSOC);
  35. foreach ($ret as $key=>$row){
  36. $ret[$key]['pro'] = json_decode($row['pro'],true);
  37. $ret[$key]['vippro'] = json_decode($row['vippro'],true);
  38. }
  39. oo::commonOprRedis('Config')->hSet($cacheKey,$hashKey,json_encode($ret,JSON_NUMERIC_CHECK));
  40. oo::commonOprRedis('Config')->expire($cacheKey,oo::redisRandomExpire(oo::weekDeadline()));
  41. return $ret;
  42. }else{
  43. $sql= "SELECT * FROM {$tb} WHERE lucky>={$pro} ORDER BY lucky LIMIT 1";
  44. $ret= oo::commonOprDb('config')->getOne($sql,MYSQLI_ASSOC);
  45. if($vip){
  46. $pro = json_decode($ret['vippro'],true);
  47. }else{
  48. $pro = json_decode($ret['pro'],true);
  49. }
  50. oo::commonOprRedis('Config')->hSet($cacheKey,$hashKey,json_encode($pro,JSON_NUMERIC_CHECK));
  51. oo::commonOprRedis('Config')->expire($cacheKey,oo::redisRandomExpire(oo::weekDeadline()));
  52. return $pro;
  53. }
  54. }
  55. public function getConfig($id = '',$vip = false, $newVersion = false){
  56. $hashKey = $id.intval($vip).intval($newVersion);
  57. $cacheKey = okeys::LuckyConfig();
  58. $cache = oo::commonOprRedis('Config')->hGet($cacheKey,$hashKey);
  59. if(!empty($cache)){
  60. return json_decode($cache,true);
  61. }
  62. $tb = otable::LuckyConfig($newVersion);
  63. if($id === ''){
  64. $sql= "SELECT * FROM {$tb}";
  65. $ret= oo::commonOprDb('config')->getAll($sql,MYSQLI_ASSOC);
  66. foreach ($ret as $key=>$row){
  67. $ret[$key]['reward'] = json_decode($row['reward'],true);
  68. $ret[$key]['vipreward'] = json_decode($row['vipreward'],true);
  69. }
  70. oo::commonOprRedis('Config')->hSet($cacheKey,$hashKey,json_encode($ret,JSON_NUMERIC_CHECK));
  71. oo::commonOprRedis('Config')->expire($cacheKey,oo::redisRandomExpire(oo::weekDeadline()));
  72. return $ret;
  73. }else {
  74. $sql= "SELECT * FROM {$tb} WHERE id={$id} LIMIT 1";
  75. $ret= oo::commonOprDb('config')->getOne($sql,MYSQLI_ASSOC);
  76. $this->config[$id] = $ret;
  77. if($vip){
  78. $reward = json_decode($ret['vipreward'],true);
  79. }else{
  80. $reward = json_decode($ret['reward'],true);
  81. }
  82. oo::commonOprRedis('Config')->hSet($cacheKey,$hashKey,json_encode($reward,JSON_NUMERIC_CHECK));
  83. oo::commonOprRedis('Config')->expire($cacheKey,oo::redisRandomExpire(oo::weekDeadline()));
  84. return $reward;
  85. }
  86. }
  87. public function getSort($id,$vip,$version){
  88. $config = $this->getConfig("",$vip,$version);
  89. $config = array_column($config,null,'id');
  90. return max($config[$id]['sort'] - 1,0);
  91. }
  92. public function action($uid,&$data = []){
  93. $luckyValue = self::getUserLuckyValue($uid);
  94. $version = oo::commonOprModel('user')->getUserVersion($uid);
  95. $vip = false;
  96. //1.8.5区分普通vip和订阅vip
  97. if(oo::commonOprModel('newvip')->checkNewVip($uid)){
  98. $vip = true;
  99. $proConfig = self::getProConfig($luckyValue,true);
  100. $prokey = oo::commonOprModel('slot')->get_rand($proConfig,true);
  101. if(oo::compareVersion($version,'1.7.3')){
  102. $reward = self::getConfig($prokey,true,true);
  103. }else{
  104. $reward = self::getConfig($prokey,true);
  105. }
  106. }else{
  107. $proConfig = self::getProConfig($luckyValue);
  108. $prokey = oo::commonOprModel('slot')->get_rand($proConfig,true);
  109. if(oo::compareVersion($version,'1.7.3')){
  110. $reward = self::getConfig($prokey,false,true);
  111. }else{
  112. $reward = self::getConfig($prokey);
  113. }
  114. }
  115. self::updateUserProgress($uid,1);
  116. $data = self::reward($uid,$reward);
  117. if($prokey == count($proConfig) - 1){
  118. self::updateUserLuckyValue($uid,0);
  119. }else{
  120. self::updateUserLuckyValue($uid,max(0,$luckyValue+1));
  121. }
  122. /**
  123. * 通行证任务8
  124. */
  125. oo::commonOprModel('activitynew')->addTrafficPermitNum($uid,8);
  126. oo::commonOprModel('currency')->participation($uid, 'luckydraw', 1); //夺宝活动参与率统计
  127. return self::getSort($prokey,$vip,true);
  128. }
  129. public function reward($uid,$reward){
  130. if(isset($reward['propsId'])){
  131. $reward['id'] = $reward['propsId'];
  132. }
  133. switch ($reward['type']){
  134. case 1: //金币
  135. $coinsArray = [201=>"coins01",202=>"coins02",203=>"coins03",204=>"coins04",205=>"coins05",206=>"coins06"];
  136. if(isset($reward['gid'])){
  137. $num = oo::commonOprModel('goods')->getGoodCoins($uid,$coinsArray[$reward['gid']]);
  138. }else{
  139. $num = oo::commonOprModel('goods')->getGoodCoins($uid,$coinsArray[$reward['id']]);
  140. }
  141. oo::commonOprModel('member')->optProperty($uid,['money'=>$num],'+',40,'幸运夺宝');
  142. return $num;
  143. break;
  144. case 2: //体力
  145. oo::commonOprModel('member')->optProperty($uid,['spins'=>$reward['num']],'+',40,'幸运夺宝');
  146. break;
  147. case 3: //宝箱
  148. if(in_array($reward['id'],[19,20,21,29,30])){
  149. //直接发放小丑宝箱
  150. $data = oo::commonOprModel('props')->rewardChest($uid,$reward['id']);
  151. return $data;
  152. }else{
  153. oo::commonOprModel('props')->addUserProps($uid,$reward['id'],$reward['num'],0,40);
  154. }
  155. break;
  156. case 4: //活动收集
  157. break;
  158. case 5: //宠物相关
  159. oo::commonOprModel('props')->addUserProps($uid,$reward['id'],$reward['num'],0,40);
  160. break;
  161. case 6: //祈福
  162. if($reward['id'] == 1){
  163. oo::commonOprModel('props')->addUserProps($uid,5,$reward['num'],0,40);
  164. }else if($reward['id'] == 2){
  165. oo::commonOprModel('props')->addUserProps($uid,6,$reward['num'],0,40);
  166. }
  167. break;
  168. case 7: //vip
  169. $userInfo = oo::commonOprModel('member')->getUserInfo($uid);
  170. if($userInfo['vip_expire'] > time()){
  171. $expire = $userInfo['svip_expire'] + 3*24*60*60;
  172. }else{
  173. $expire = time() + 3*24*60*60;
  174. }
  175. $updateInfo['svip'] = 1;
  176. $updateInfo['svip_expire'] = $expire;
  177. oo::commonOprModel('member')->getUserInfo($uid, NULL, TRUE,$updateInfo);
  178. break;
  179. case 8: //大礼包
  180. $data = [];
  181. for($i=0;$i<$reward['num'];$i++){
  182. foreach($reward['data'] as $k => $row){
  183. $temp = self::reward($uid,$row);
  184. $data[$k]['data'] = $temp;
  185. $data[$k]['propsId'] = $row['id'];
  186. }
  187. }
  188. return $data;
  189. break;
  190. case 9: //消耗品
  191. if($reward['id'] == 1){
  192. oo::commonOprModel('props')->addUserProps($uid,7,$reward['num'],0,40);
  193. }else{
  194. oo::commonOprModel('props')->addUserProps($uid,$reward['id'],$reward['num'],0,40);
  195. }
  196. break;
  197. case 10: //钻石
  198. oo::commonOprModel('member')->optProperty($uid,['diamond'=>$reward['num']],'+',40,'幸运夺宝');
  199. break;
  200. case 11: //卡片:小丑卡/随机金卡
  201. $data = oo::commonOprModel('member')->sendReward($uid,$reward['id'],$reward['num'],40,'幸运夺宝');
  202. if($reward['id'] == 18){
  203. return time()+86400;
  204. }else if($reward['id'] == 13){
  205. $data = $data[0];
  206. }
  207. return $data;
  208. default:
  209. return false;
  210. }
  211. return $reward['num'];
  212. }
  213. public function getProgressConfig($newVersion = false){
  214. $hashKey = intval($newVersion);
  215. $cacheKey = okeys::LuckyProgressConfig();
  216. $cache = oo::commonOprRedis('Config')->hGet($cacheKey,$hashKey);
  217. if(!empty($cache)){
  218. return json_decode($cache,true);
  219. }
  220. $tb = otable::LuckyProgressConfig($newVersion);
  221. $sql= "SELECT * FROM {$tb}";
  222. $ret= oo::commonOprDb('config')->getAll($sql,MYSQLI_ASSOC);
  223. $progress = [];
  224. foreach ($ret as $row){
  225. $progress[$row['progress']] = json_decode($row['reward'],true);
  226. }
  227. oo::commonOprRedis('Config')->hSet($cacheKey,$hashKey,json_encode($progress,JSON_NUMERIC_CHECK));
  228. oo::commonOprRedis('Config')->expire($cacheKey,oo::redisRandomExpire(oo::weekDeadline()));
  229. return $progress;
  230. }
  231. public function getRewardProgress($uid,$progress){
  232. return intval(oo::commonOprRedis('usercache')->get(okeys::LuckuRewardProgress($uid,$progress)));
  233. }
  234. public function updateRewardProgress($uid,$progress){
  235. return oo::commonOprRedis('usercache')->setex(okeys::LuckuRewardProgress($uid,$progress),1,oo::weekDeadline());
  236. }
  237. public function getUserProgress($uid){
  238. return intval(oo::commonOprRedis('usercache')->get(okeys::LuckyProgress($uid)));
  239. }
  240. public function updateUserProgress($uid,$num){
  241. $res = intval(oo::commonOprRedis('usercache')->incrBy(okeys::LuckyProgress($uid),$num));
  242. oo::commonOprRedis('usercache')->expire(okeys::LuckyProgress($uid),oo::redisRandomExpire(oo::weekDeadline()));
  243. return $res;
  244. }
  245. public function rewardProgress($uid,$progress){
  246. $userProgress = self::getUserProgress($uid);
  247. $version = oo::commonOprModel('user')->getUserVersion($uid);
  248. if(oo::compareVersion($version,'1.7.3')){
  249. $progressConfig = self::getProgressConfig(true);
  250. }else{
  251. $progressConfig = self::getProgressConfig();
  252. }
  253. $progressIsReward = self::getRewardProgress($uid,$progress);
  254. if($progressIsReward){
  255. return oo::response(-2,[],'进度已领奖');
  256. }
  257. foreach ($progressConfig as $key=>$row){
  258. if($key == $progress){
  259. if($key > $userProgress){
  260. return oo::response(-3,[],'进度未达标');
  261. }else{
  262. $data = [];
  263. foreach ($row as $k => $reward){
  264. $data[$k]['data'] = self::reward($uid,$reward);
  265. $data[$k]['progresId'] = $progress;
  266. }
  267. self::updateRewardProgress($uid,$key);
  268. if(oo::compareVersion($version,'1.7.3')){
  269. return oo::response(1,$data);
  270. }else{
  271. return oo::response(1,$row);
  272. }
  273. }
  274. }
  275. }
  276. return oo::response(-4,'','全领取完了');
  277. }
  278. /**
  279. * 钻石夺宝
  280. * @param $uid
  281. * @param $num
  282. * @return string
  283. * Created by: Owen
  284. * Created on: 2020/11/23 18:31
  285. */
  286. public function luckyDrawByDiamond($uid,$num){
  287. $diamondPrice = [
  288. 1 => 59,
  289. 5 => 200,
  290. ];
  291. $actionDiamond = $diamondPrice[$num];
  292. if(empty($actionDiamond)){
  293. return oo::response(errorCode::LUCKYDRAWBYDIAMOND_CONFIG_ERROR);
  294. }
  295. $userInfo = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  296. if($userInfo['diamond'] < $actionDiamond){
  297. return oo::response(errorCode::DIAMOND_NOT_ENOUGH,[],'钻石不足');
  298. }
  299. $ret = oo::commonOprModel('member')->optProperty($uid,array('diamond'=>$actionDiamond),'-',403,"购买-夺宝");
  300. oo::commonOprModel('currency')->participation($uid, 'luckydraw', 1); //夺宝活动参与率统计
  301. if($ret){
  302. $data = [];
  303. for ($i=0;$i<$num;$i++){
  304. $temp = [];
  305. $data[$i]['index'] = $this->action($uid,$temp);
  306. $data[$i]['data'] = $temp;
  307. }
  308. return oo::response(errorCode::SUCCESS,$data);
  309. }
  310. return oo::response(errorCode::DIAMOND_NOT_ENOUGH,[],'钻石不足');
  311. }
  312. }
  313. ?>