feat(chat): три уровня счётчиков + письмо-тревога о суточном потолке
Защита денег для публичного чата (лендинг открыт всему интернету, каждый ответ бота ~0,44 руб): пауза 2 сек между репликами, лимит вопросов в час (гость 20 / вошедший 60), потолок реплик на разговор (40), лимит по IP в час (60) и общий суточный потолок ответов (1500) с одноразовым письмом-тревогой владельцу при пробитии. Отказ всегда вежливый — клиент получает текст, а не молчание.
This commit is contained in:
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user