Robots.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <?php
  2. namespace tw\lib\robot;
  3. use think\facade\Log;
  4. use tw\command\console;
  5. use tw\redis\RobotsInfoRds;
  6. /**
  7. * 手动指定 robot 用户资料
  8. *
  9. * robot 用户昵称头像要求固定,level, vip 可以不定期升级
  10. *
  11. */
  12. class Robots
  13. {
  14. // 昵称
  15. static public $nicknames = [
  16. "萌傻卿",
  17. "勇敢的小萝卜",
  18. "且听风铃",
  19. "我去叫彭于晏",
  20. "晚点相遇",
  21. "トキメク",
  22. "Coisini",
  23. "给你一口甜",
  24. "是小宝阿",
  25. "星河几重",
  26. "养了一个月亮",
  27. "白日梦我",
  28. "CD女王",
  29. "百事可爱",
  30. "一觉睡到小时候",
  31. "Pumpkin",
  32. "咋又饿了呢",
  33. "Kilig",
  34. "幸识",
  35. "433",
  36. "搬砖小土妞",
  37. "初遇",
  38. "睡了",
  39. "可口可爱",
  40. "咕噜叽叽",
  41. "whaoe",
  42. "超级消烦员",
  43. "萝莉啰嗦",
  44. "骑着蜗牛追导弹",
  45. "月亮邮递员",
  46. "小公举",
  47. "智慧女孩不要秃头",
  48. "清蒸肉肉",
  49. "联合国认证小可爱",
  50. "给糖就不闹",
  51. "激萌美少女李逵",
  52. "文件转输助手",
  53. "沙雕少女",
  54. "来了老弟",
  55. "我妈妈告诉我要欺负你们",
  56. "看瓜少年和猹",
  57. "超级凶傲呜",
  58. "拉风的鼻涕",
  59. "作业不多吗",
  60. "我是你爸爸",
  61. "很秀但没必要",
  62. "有关部门",
  63. "二三",
  64. "孙尚香",
  65. "芝士就是力量",
  66. "颈上鲜草莓",
  67. "你家小祖宗",
  68. "蟑螂恶霸",
  69. "胖大海",
  70. "蔡文姬腿堡",
  71. "美少女壮士",
  72. "萝卜蹲",
  73. "祖国老花朵",
  74. "脑子里有个泡",
  75. "萌够就回家",
  76. "怪力少女",
  77. "new bee",
  78. "你爸爸我",
  79. "铁锤妹妹",
  80. ]; // 64 N
  81. // 头像 base url
  82. static protected $HEADER_BASE_URL = 'http://twongstatic.shotshock.shop/headers/wechat/';
  83. /**
  84. * 头像,七牛保存,名称按 1-64 的 png 图片,所以可以生成 url
  85. */
  86. static public $headers = [];
  87. // robot 起始 ID
  88. static protected $ROBOT_BASE_ID = 44040001;
  89. /**
  90. * "uid" => 123,
  91. * "avatar" => "http://2.png",
  92. * "nickname" => "xxx",
  93. * "level" => 1,
  94. * "value" => 23.3,
  95. * "border" => 1,
  96. * "vip" => 2,
  97. */
  98. static public $robots = []; // N x 3 機器人
  99. /**
  100. * 构建机器人信息。
  101. *
  102. * 可重现:多次构建结果应一致
  103. *
  104. * TODO:结果存入 redis
  105. *
  106. * @return boolean
  107. */
  108. public static function build(): bool
  109. {
  110. self::_build_headers();
  111. if (
  112. count(self::$nicknames) != count(self::$headers) ||
  113. count(self::$nicknames) != 64
  114. ) {
  115. Log::error('nickname or headers has wrong numbers');
  116. return false;
  117. }
  118. // clear
  119. self::$robots = [];
  120. for ($i = 0; $i < 64; $i++) {
  121. $uid = self::$ROBOT_BASE_ID + $i;
  122. self::$robots[$uid] = [
  123. 'uid' => $uid,
  124. 'avatar' => self::$headers[$i],
  125. 'nickname' => self::$nicknames[$i],
  126. 'level' => tw_rand(1, 4),
  127. 'value' => 0,
  128. 'border' => 0,
  129. 'vip' => 0,
  130. ];
  131. } // for
  132. return true;
  133. }
  134. /**
  135. * 如果没有操作七牛中文件,不要修改本函数。
  136. *
  137. * 本函数不是用于生成,而是对已有资源的描述/信息提取。
  138. */
  139. protected static function _build_headers()
  140. {
  141. // clear
  142. self::$headers = [];
  143. for ($i = 1; $i <= 64; $i++) {
  144. self::$headers[] = self::$HEADER_BASE_URL . $i . '.png';
  145. }
  146. }
  147. /**
  148. * 把成員 robots 寫入 redis
  149. */
  150. public static function to_redis()
  151. {
  152. if (count(self::$robots) <= 0) {
  153. self::build();
  154. }
  155. foreach (self::$robots as $robot) {
  156. (new RobotsInfoRds)->hset(false, $robot['uid'], $robot);
  157. }
  158. }
  159. /**
  160. * 加载 redis 数据到 self::$robots
  161. */
  162. public static function from_redis()
  163. {
  164. $robots = (new RobotsInfoRds)->hget_all(false);
  165. foreach ($robots as $k => $v) {
  166. $robots[$k] = json_decode($v, true);
  167. }
  168. self::$robots = $robots;
  169. }
  170. /**
  171. * 下單,隨機選擇若幹機器人,模擬下單(增加 value 值)
  172. *
  173. * 排行時,簡單取出所有機器人數據,內存排序即可
  174. */
  175. public static function order()
  176. {
  177. if (!self::$robots) {
  178. self::from_redis();
  179. }
  180. // 下单人数
  181. $robot_num = tw_rand(0, count(self::$robots) / 2);
  182. for ($i = 0; $i < $robot_num; $i++) {
  183. // 下单人UID
  184. $index = tw_rand(0, count(self::$robots));
  185. $uid = self::$ROBOT_BASE_ID + $index;
  186. // 获利金额
  187. $value = tw_divf(tw_rand(500, 5000), 100.0, 2);
  188. // get - update - set
  189. $srobot = (new RobotsInfoRds)->hget(false, $uid);
  190. if (!$srobot) {
  191. console::log('not found: uid=' . $uid);
  192. }
  193. $robot = json_decode($srobot, true);
  194. $robot['value'] = tw_addf($robot['value'], $value, 2);
  195. (new RobotsInfoRds)->hset(false, $uid, $robot);
  196. }
  197. }
  198. /**
  199. * 重置所有機器人 value 字段
  200. */
  201. public static function reset()
  202. {
  203. return self::build();
  204. }
  205. /**
  206. * 根據 value 字段的前 n 個
  207. */
  208. public static function first_n_by_value(int $n): array
  209. {
  210. $robots = (new RobotsInfoRds)->hget_all(false);
  211. foreach ($robots as $uid => $robot) {
  212. $robots[$uid] = json_decode($robot, true);
  213. }
  214. usort($robots, function ($l, $r) {
  215. return $r['value'] <=> $l['value'];
  216. });
  217. return array_slice($robots, 0, $n);
  218. }
  219. }