HeroDiscussProc.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. namespace loyalsoft;
  3. /**
  4. * 评价内容
  5. */
  6. class DiscussItem extends Object_ext {
  7. public $uid;
  8. public $name;
  9. public $msg;
  10. public $ts;
  11. public $praise;
  12. public $praised_uids;
  13. /**
  14. * @return int 重新计算此条评论的排行
  15. */
  16. public function Score() {
  17. return $this->ts + $this->praise * glc()->Hero_Discuss_Praise_weight;
  18. }
  19. }
  20. /**
  21. * 英雄评论模块
  22. * @version
  23. * 1.0.0 Created at 2017-3-24. by --gwang
  24. * @author gwang (mail@wanggangzero.cn)
  25. * @copyright ? 2017-3-24, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  26. */
  27. class HeroDiscussProc {
  28. /**
  29. * 每次请求返回的评论数量
  30. */
  31. const PageItemCount = 50;
  32. /**
  33. * [6317]发表评价
  34. * @param Req $req
  35. */
  36. static function Post($req) {
  37. $mem = $req->mem;
  38. $uid = $req->uid;
  39. $heroId = $req->paras[0]; # 英雄ID
  40. $content = $req->paras[1]; # 评价内容
  41. $item = new DiscussItem(array(# # 创建一条评论
  42. 'uid' => $uid,
  43. 'name' => $req->userInfo->game->name,
  44. 'msg' => $content,
  45. 'ts' => now(),
  46. 'praise' => 0, # # 赞
  47. 'praised_uids' => ArrayInit()
  48. ));
  49. if ($mem->hexists(MemKey_GameRun::HeroDiscusses_item_hash($heroId), $uid)) {
  50. $item = self::_GetDiscussItem($mem, $heroId, $uid);
  51. } else {
  52. self::_SaveDiscussItem($heroId, $uid, $item); # 保存评论
  53. $mem->zadd(MemKey_GameRun::HeroDiscusses_score_zset($heroId), #
  54. array($uid => $item->Score())); # # 写入排行数据
  55. }
  56. // todo: 添加总评论数量限制, 超过一定数量清理部分评论
  57. return Resp::ok(array("ret" => $item)); # 成功后返回评论内容,
  58. // ps.客户端可以对比返回的内容是否和发送的内容一致,不一致代表已经有过评论了,不可以再发布新评论, 这个设定有跟待策划商议.
  59. }
  60. /**
  61. * [6319] 删除评价
  62. * @param Req $req
  63. */
  64. static function DeletePost($req) {
  65. $uid = $req->uid;
  66. $heroId = $req->paras[0]; # 英雄ID
  67. $msg = "";
  68. if ($req->mem->hdel(MemKey_GameRun::HeroDiscusses_item_hash($heroId), $uid)) {
  69. $msg = "success";
  70. }
  71. return Resp::ok(array('ret' => $msg));
  72. }
  73. /**
  74. * [6320] 给英雄打分(同一个英雄只能打一次分)
  75. * @param Req $req
  76. */
  77. static function Score($req) {
  78. $uid = $req->uid;
  79. $heroId = $req->paras[0]; # 英雄ID
  80. $score = $req->paras [1]; # 打分值
  81. if ($score <= 0 || $score > 5) { # 参数非法
  82. return Resp::err(ErrCode::paras_err);
  83. }
  84. # 玩家数据,判断是否给此英雄打过分了
  85. $pubifno = $req->mem->get(MemKey_User::Union_PublicState_normal($uid));
  86. $scoredlist = $pubifno->scoredheros;
  87. if (is_null($scoredlist) || !is_array($scoredlist)) {
  88. $scoredlist = ArrayInit();
  89. }
  90. if (CommUtil::isInArray($scoredlist, $heroId)) {
  91. return Resp::ok(array('err' => 1, 'msg' => 'has scored!'));
  92. }
  93. // 添加打分数据,
  94. // 取英雄的打分数据 {cnt:xxx,totalscore:xxx}
  95. $heroscore = $req->mem->get(MemKey_GameRun::HeroDiscusses_userScore_normal($heroId));
  96. if (is_null($heroscore)) {
  97. $heroscore = ObjectInit();
  98. $heroscore->amt = 0;
  99. $heroscore->totalscore = 0;
  100. }
  101. $heroscore->amt += 1;
  102. $heroscore->totalscore += $score;
  103. $scoredlist[] = $heroId; # 玩家记录打分记录
  104. $pubifno->scoredheros = $scoredlist; # 回存数据
  105. $req->mem->set(MemKey_User::Union_PublicState_normal($uid), $pubifno);
  106. $req->mem->set(MemKey_GameRun::HeroDiscusses_userScore_normal($heroId), $heroscore);
  107. $newscore = $heroscore->amt > 0 ? $heroscore->totalscore / $heroscore->amt : 0;
  108. return Resp::ok(array('err' => 0, # # 返回
  109. 'score' => round($newscore, 2)));
  110. }
  111. /**
  112. * [6316]查看评价
  113. * @param Req $req
  114. */
  115. static function GetDiscusses($req) {
  116. $heroId = $req->paras[0]; # 英雄ID
  117. $start = $req->paras[1]; # 起始索引
  118. $indexs = $req->mem->zrange(MemKey_GameRun::HeroDiscusses_score_zset($heroId), #
  119. $start, $start + self::PageItemCount);
  120. $arr = $req->mem->hmget(MemKey_GameRun::HeroDiscusses_item_hash($heroId), $indexs);
  121. $heroscore = $req->mem->get(MemKey_GameRun::HeroDiscusses_userScore_normal($heroId));
  122. if (is_null($heroscore)) {
  123. $heroscore = ObjectInit();
  124. $heroscore->amt = 0;
  125. $heroscore->totalscore = 0;
  126. }
  127. $score = $heroscore->amt > 0 ? $heroscore->totalscore / $heroscore->amt : 0;
  128. return Resp::ok(array("ret" => $arr, 'score' => round($score, 2)));
  129. }
  130. /**
  131. * [6318]给评论点赞
  132. * @param Req $req
  133. */
  134. static function PriaseMsg($req) {
  135. $mem = $req->mem;
  136. $uid = $req->uid;
  137. $heroId = $req->paras[0]; # 英雄ID
  138. $discussId = $req->paras[1]; # 评论ID
  139. $msg = self::_GetDiscussItem($mem, $heroId, $discussId); # 取数据
  140. if (!$msg) {
  141. return Resp::ok(array("err" => -1)); # 评论不存在
  142. }
  143. if (isset($msg->praised_uids) && in_array($uid, $msg->praised_uids)) {
  144. return Resp::ok(array("err" => 1, # # 已赞过
  145. 'praise' => $msg->praise));
  146. }
  147. $msg->praise += 1; # 点赞
  148. $msg->praised_uids[] = $uid; # 添加点赞记录
  149. self ::_SaveDiscussItem($heroId, $discussId, $msg); # 回写数据
  150. $mem->zadd(MemKey_GameRun::HeroDiscusses_score_zset($heroId), #
  151. array($discussId => $msg->Score())); # 更新排名
  152. return Resp::ok(array("err" => 0, # # 返回最新的被赞数量
  153. 'praise' => $msg->praise));
  154. }
  155. // <editor-fold defaultstate="collapsed" desc="辅助函数">
  156. /**
  157. * 取评论
  158. * @param CRedisUtil $mem
  159. * @param string $heroId
  160. * @param string $discussId
  161. * @return DiscussItem Description
  162. */
  163. static private function _GetDiscussItem($mem, $heroId, $discussId) {
  164. $ret = $mem->hget(MemKey_GameRun::HeroDiscusses_item_hash($heroId), $discussId);
  165. if ($ret) {
  166. return new DiscussItem($ret);
  167. }
  168. return null;
  169. }
  170. /**
  171. * 回写评论
  172. * @param type $heroId
  173. * @param type $discussId
  174. * @param type $item
  175. */
  176. static private function _SaveDiscussItem($heroId, $discussId, $item) {
  177. gMem()->hset(MemKey_GameRun::HeroDiscusses_item_hash($heroId), $discussId, $item); // 回写数据
  178. }
  179. // </editor-fold>
  180. }