feat(chat): три уровня счётчиков + письмо-тревога о суточном потолке

Защита денег для публичного чата (лендинг открыт всему интернету,
каждый ответ бота ~0,44 руб): пауза 2 сек между репликами, лимит
вопросов в час (гость 20 / вошедший 60), потолок реплик на разговор
(40), лимит по IP в час (60) и общий суточный потолок ответов (1500)
с одноразовым письмом-тревогой владельцу при пробитии. Отказ всегда
вежливый — клиент получает текст, а не молчание.
This commit is contained in:
Дмитрий
2026-07-13 07:29:47 +03:00
parent b4c4900635
commit 09b980f5ac
6 changed files with 242 additions and 0 deletions
@@ -7,6 +7,7 @@ namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Jobs\Bot\ProcessChatMessageJob;
use App\Models\BotDialog;
use App\Services\Bot\ChatRateLimiter;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@@ -33,6 +34,13 @@ class ChatController extends Controller
$userId = Auth::id();
$refusal = app(ChatRateLimiter::class)
->check($data['chat_id'], (string) $request->ip(), $userId !== null);
if ($refusal !== null) {
return response()->json(['message' => $refusal], 429);
}
$row = BotDialog::create([
'chat_id' => $data['chat_id'],
'direction' => 'in',