Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/Events/ChatMessageSent.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public function __construct(ChatMessage $chatMessage)
$this->message = [
'id' => $chatMessage->id,
'content' => $chatMessage->content,
'reply_to_id' => $chatMessage->reply_to_id,
'reply_to_content' => $chatMessage->reply_to_content,
'created_at' => $chatMessage->created_at->toIso8601String(),
'user' => [
'id' => $chatMessage->user->id,
Expand Down
49 changes: 49 additions & 0 deletions app/Events/ChatSettingsUpdated.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

namespace App\Events;

use App\Models\AppSetting;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class ChatSettingsUpdated implements ShouldBroadcastNow
{
use Dispatchable, InteractsWithSockets, SerializesModels;

public array $settings;

/**
* Create a new event instance.
*/
public function __construct()
{
$this->settings = [
'enabled' => (bool) AppSetting::get('global_chat_enabled', true),
'audience' => AppSetting::get('global_chat_audience', 'verified_members'),
'disabled_reason' => (string) AppSetting::get('global_chat_disabled_reason', ''),
'cooldown_seconds' => (int) AppSetting::get('global_chat_cooldown_seconds', 30),
'max_messages' => (int) AppSetting::get('global_chat_max_messages', 200),
'max_length' => (int) AppSetting::get('global_chat_max_length', 280),
];
}

/**
* Get the channels the event should broadcast on.
*
* @return array<int, Channel>
*/
public function broadcastOn(): array
{
return [
new Channel('global-chat'),
];
}

public function broadcastAs(): string
{
return 'settings.updated';
}
}
92 changes: 90 additions & 2 deletions app/Http/Controllers/Admin/ChatSettingsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,105 @@
use App\Http\Controllers\Controller;
use App\Models\AppSetting;
use App\Models\ChatMessage;
use App\Models\ChatReport;
use Illuminate\Http\Request;
use Inertia\Inertia;

class ChatSettingsController extends Controller
{
public function edit()
{
$bannedWords = AppSetting::get('global_chat_banned_words', '');
$bannedWordsText = is_array($bannedWords) ? implode(', ', $bannedWords) : (string) $bannedWords;

return Inertia::render('admin/ChatSettings', [
'settings' => [
'enabled' => (bool) AppSetting::get('global_chat_enabled', true),
'audience' => AppSetting::get('global_chat_audience', 'verified_members'),
'disabled_reason' => (string) AppSetting::get('global_chat_disabled_reason', ''),
'cooldown_seconds' => (int) AppSetting::get('global_chat_cooldown_seconds', 30),
'max_messages' => (int) AppSetting::get('global_chat_max_messages', 200),
'max_length' => (int) AppSetting::get('global_chat_max_length', 280),
'profanity_filter_enabled' => (bool) AppSetting::get('global_chat_profanity_filter_enabled', true),
'banned_words' => $bannedWordsText,
],
'totalMessages' => ChatMessage::count(),
'recentMessagesCount' => ChatMessage::where('created_at', '>=', now()->subHours(24))->count(),
'pendingReportsCount' => ChatReport::where('status', 'pending')->count(),
]);
}

public function reports()
{
$reports = ChatReport::with(['reporter:id,name,username', 'reportedUser:id,name,username,chat_banned_until'])
->latest('id')
->take(100)
->get()
->map(fn ($report) => [
'id' => $report->id,
'reporter_id' => $report->reporter_id,
'reporter' => $report->reporter ? [
'id' => $report->reporter->id,
'name' => $report->reporter->name,
'username' => $report->reporter->username,
] : null,
'reported_user_id' => $report->reported_user_id,
'reported_user_name' => $report->reported_user_name,
'reported_user_username' => $report->reported_user_username,
'reported_user' => $report->reportedUser ? [
'id' => $report->reportedUser->id,
'name' => $report->reportedUser->name,
'username' => $report->reportedUser->username,
'chat_banned_until' => $report->reportedUser->chat_banned_until?->toIso8601String(),
'is_chat_banned' => $report->reportedUser->isChatBanned(),
] : null,
'message_content' => $report->message_content,
'message_sent_at' => $report->message_sent_at?->toIso8601String(),
'reason' => $report->reason,
'status' => $report->status,
'created_at' => $report->created_at->toIso8601String(),
]);

return Inertia::render('admin/chat/Reports', [
'reports' => $reports,
'pendingCount' => ChatReport::where('status', 'pending')->count(),
'reviewedCount' => ChatReport::where('status', 'reviewed')->count(),
'dismissedCount' => ChatReport::where('status', 'dismissed')->count(),
]);
}

public function update(Request $request)
{
$validated = $request->validate([
'enabled' => ['required', 'boolean'],
'enabled' => ['nullable', 'boolean'],
'audience' => ['required', 'string', 'in:verified_members,all,disabled'],
'disabled_reason' => ['nullable', 'string', 'max:255'],
'cooldown_seconds' => ['required', 'integer', 'min:0', 'max:3600'],
'max_messages' => ['required', 'integer', 'min:20', 'max:1000'],
'max_length' => ['required', 'integer', 'min:50', 'max:1000'],
'profanity_filter_enabled' => ['required', 'boolean'],
'banned_words' => ['nullable', 'string'],
]);

AppSetting::set('global_chat_enabled', $validated['enabled'], 'boolean');
$isEnabled = $validated['audience'] !== 'disabled';
AppSetting::set('global_chat_enabled', $isEnabled, 'boolean');
AppSetting::set('global_chat_audience', $validated['audience'], 'string');
AppSetting::set('global_chat_disabled_reason', $validated['disabled_reason'] ?? '', 'string');
AppSetting::set('global_chat_cooldown_seconds', $validated['cooldown_seconds'], 'integer');
AppSetting::set('global_chat_max_messages', $validated['max_messages'], 'integer');
AppSetting::set('global_chat_max_length', $validated['max_length'], 'integer');
AppSetting::set('global_chat_profanity_filter_enabled', $validated['profanity_filter_enabled'], 'boolean');
AppSetting::set('global_chat_banned_words', $validated['banned_words'] ?? '', 'string');

// Immediately prune if current count exceeds new limit
ChatMessage::pruneOldMessages($validated['max_messages']);

// Broadcast settings update to global-chat channel
try {
broadcast(new \App\Events\ChatSettingsUpdated());
} catch (\Throwable $e) {
// Log without failing response
}

return back()->with('success', 'Global chat settings updated successfully.');
}
Expand All @@ -44,4 +114,22 @@ public function clearMessages()

return back()->with('success', 'All chat messages have been cleared.');
}

public function updateReportStatus(Request $request, ChatReport $report)
{
$validated = $request->validate([
'status' => ['required', 'string', 'in:pending,reviewed,dismissed'],
]);

$report->update(['status' => $validated['status']]);

return back()->with('success', 'Report status updated.');
}

public function deleteReport(ChatReport $report)
{
$report->delete();

return back()->with('success', 'Report deleted successfully.');
}
}
8 changes: 1 addition & 7 deletions app/Http/Controllers/Admin/DashboardController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\AppSetting;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
Expand All @@ -14,12 +13,7 @@ class DashboardController extends Controller
{
public function index()
{
return Inertia::render('admin/Dashboard', [
'chatSettings' => [
'enabled' => AppSetting::get('global_chat_enabled', true),
'audience' => AppSetting::get('global_chat_audience', 'verified_members'),
],
]);
return Inertia::render('admin/Dashboard');
}

public function analytics(Request $request)
Expand Down
Loading
Loading