From f745db399088d916ac2e195f03fef83ca068a1be Mon Sep 17 00:00:00 2001 From: lkddi Date: Fri, 27 Feb 2026 01:14:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E9=AD=85=E5=8A=9B=E5=80=BC=EF=BC=88=E6=96=B9?= =?UTF-8?q?=E6=A1=88=20B=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 对指定用户发言时根据性别给魅力:异性 +2,同性 +1(后台可配) - Redis 每小时上限 20(后台可配 charm_hourly_limit) - 系统用户、对'大家'发言、悄悄话不触发 - 新增 sysparam:charm_cross_sex / charm_same_sex / charm_hourly_limit --- app/Http/Controllers/ChatController.php | 64 +++++++++++++++++++ .../2026_02_27_011200_seed_charm_sysparam.php | 51 +++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 database/migrations/2026_02_27_011200_seed_charm_sysparam.php diff --git a/app/Http/Controllers/ChatController.php b/app/Http/Controllers/ChatController.php index 33ff3f0..e11cfc8 100644 --- a/app/Http/Controllers/ChatController.php +++ b/app/Http/Controllers/ChatController.php @@ -135,6 +135,13 @@ class ChatController extends Controller $user->save(); } + // 7. 聊天给魅力值(仅对指定用户的非悄悄话公开发言有效) + $toUser = $data['to_user'] ?? '大家'; + $isSecret = $data['is_secret'] ?? false; + if ($toUser !== '大家' && ! $isSecret) { + $this->grantChatCharm($user, $toUser); + } + return response()->json(['status' => 'success']); } @@ -528,6 +535,63 @@ class ChatController extends Controller ]); } + /** + * 聊天获取魅力值(方案 B:每条消息触发,Redis 每小时上限控制) + * + * 异性聊天给更多魅力,同性少一些。 + * 系统用户(如 AI小助手)不触发魅力奖励。 + * 发送者和接收者都会获得对应魅力值。 + * + * @param mixed $sender 发送消息的用户模型 + * @param string $toUsername 接收消息的用户名 + */ + private function grantChatCharm(mixed $sender, string $toUsername): void + { + // 系统用户不参与魅力计算 + $systemNames = ['大家', '系统传音', '系统公告', '钓鱼播报', '星海小博士', 'AI小助手', '送花播报']; + if (in_array($toUsername, $systemNames)) { + return; + } + + // 查找接收者 + $receiver = User::where('username', $toUsername)->first(); + if (! $receiver) { + return; + } + + // 检查发送者每小时魅力上限(Redis 自动过期) + $capKey = "charm_cap:{$sender->username}:".date('YmdH'); + $hourlyLimit = (int) Sysparam::getValue('charm_hourly_limit', '20'); + $currentGained = (int) Redis::get($capKey); + if ($currentGained >= $hourlyLimit) { + return; // 已达本小时上限 + } + + // 根据性别关系计算魅力增量 + $senderSex = $sender->sex ?? ''; + $receiverSex = $receiver->sex ?? ''; + $isCrossSex = ($senderSex !== $receiverSex) && $senderSex !== '' && $receiverSex !== ''; + + $charmSame = (int) Sysparam::getValue('charm_same_sex', '1'); + $charmCross = (int) Sysparam::getValue('charm_cross_sex', '2'); + $charmGain = $isCrossSex ? $charmCross : $charmSame; + + // 不超过本小时剩余额度 + $remaining = $hourlyLimit - $currentGained; + $charmGain = min($charmGain, $remaining); + if ($charmGain <= 0) { + return; + } + + // 发送者获得魅力 + $sender->meili = ($sender->meili ?? 0) + $charmGain; + $sender->save(); + + // 更新 Redis 计数器(1 小时过期) + Redis::incrby($capKey, $charmGain); + Redis::expire($capKey, 3600); + } + /** * 解析奖励数值配置(支持固定值或范围格式) * diff --git a/database/migrations/2026_02_27_011200_seed_charm_sysparam.php b/database/migrations/2026_02_27_011200_seed_charm_sysparam.php new file mode 100644 index 0000000..bbff546 --- /dev/null +++ b/database/migrations/2026_02_27_011200_seed_charm_sysparam.php @@ -0,0 +1,51 @@ +insert([ + [ + 'varname' => 'charm_cross_sex', + 'varvalue' => '2', + 'guidetxt' => '异性聊天每条消息增加的魅力值(男→女 或 女→男)', + ], + [ + 'varname' => 'charm_same_sex', + 'varvalue' => '1', + 'guidetxt' => '同性聊天每条消息增加的魅力值(男→男 或 女→女)', + ], + [ + 'varname' => 'charm_hourly_limit', + 'varvalue' => '20', + 'guidetxt' => '每小时通过聊天获取的魅力值上限(防刷屏)', + ], + ]); + } + + /** + * 回滚:删除聊天魅力相关配置 + */ + public function down(): void + { + DB::table('sysparam') + ->whereIn('varname', ['charm_cross_sex', 'charm_same_sex', 'charm_hourly_limit']) + ->delete(); + } +};