diff --git a/app/Helpers/ModuleHelper.php b/app/Helpers/ModuleHelper.php index d12f3f5..21f89b2 100755 --- a/app/Helpers/ModuleHelper.php +++ b/app/Helpers/ModuleHelper.php @@ -7,38 +7,45 @@ use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Session; class ModuleHelper { public static function useConnection($moduleName, $serverId = null): void { - if(empty($serverId) && empty(Session::get($moduleName.'_server'))){ - $setting = ModuleServerSetting::where('module_name', $moduleName)->where('active', 1)->first(); - Session::put($moduleName.'_server', $setting->id); - } else { - if(!empty($serverId)){ - $serverId = Crypt::decrypt($serverId); - Session::put($moduleName.'_server',$serverId); + try { + if (empty($serverId) && empty(Session::get($moduleName . '_server'))) { + $setting = ModuleServerSetting::where('module_name', $moduleName)->where('active', 1)->first(); + Session::put($moduleName . '_server', $setting->id); + } else { + if (!empty($serverId)) { + $serverId = Crypt::decrypt($serverId); + Session::put($moduleName . '_server', $serverId); + } + $setting = ModuleServerSetting::where('module_name', $moduleName) + ->where('active', 1) + ->where('id', Session::get($moduleName . '_server')) + ->first(); } - $setting = ModuleServerSetting::where('module_name', $moduleName) - ->where('active', 1) - ->where('id', Session::get($moduleName.'_server')) - ->first(); + Config::set('database.connections.mysqlranks', [ + 'driver' => 'mysql', + 'host' => $setting->db_host, + 'database' => $setting->db_name, + 'username' => $setting->db_user, + 'password' => $setting->db_pass, + 'port' => $setting->port, + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'strict' => true, + 'engine' => null, + ]); + } catch (\Exception $e) { + Log::error('module.error ' . $e->getMessage()); + echo '
Module DB settings not found. To fix this, go to .env file search RANKS, disable the ranks module, then go to Settings tab > Modules and add new DB settings, and re-enable the module.
'; + die(); } - Config::set('database.connections.mysqlranks', [ - 'driver' => 'mysql', - 'host' => $setting->db_host, - 'database' => $setting->db_name, - 'username' => $setting->db_user, - 'password' => $setting->db_pass, - 'port' => $setting->port, - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', - 'strict' => true, - 'engine' => null, - ]); DB::setDefaultConnection('mysqlranks'); } diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 02755a7..272a0e7 100755 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -7,6 +7,7 @@ use App\Helpers\PermissionsHelper; use App\Models\K4Ranks\Ranks; use App\Models\K4Ranks\ZenithPlayerStorage; +use App\Models\ModuleServerSetting; use App\Models\SaAdmin; use App\Models\SaBan; use App\Models\SaMute; @@ -24,7 +25,7 @@ public function check() { return view('requirement'); } - public function home() + public function home(Request $request) { $updates = []; $activeBans = null; @@ -43,9 +44,14 @@ public function home() $updates = $this->checkUpdates(); } $topPlayersData = []; + $servers = []; if(env('RANKS') == 'Enabled') { + $serverId = $request->query('server_id'); + ModuleHelper::useConnection('Ranks', $serverId); + $servers = ModuleServerSetting::all(); $topPlayersData = $this->getTop5Players(); } + return view('admin.dashboard', compact( 'totalBans', @@ -57,7 +63,8 @@ public function home() 'activeBans', 'activeMutes', 'totalActiveBans', - 'totalActiveMutes' + 'totalActiveMutes', + 'servers' ) ); } @@ -105,8 +112,6 @@ private function checkUpdates() public function getTop5Players() { - ModuleHelper::useConnection('Ranks'); - // Get the flag to determine whether to use old or new logic $useOldLogic = env('K4LegacySupport', 'no') == 'yes' ? true : false; diff --git a/app/Http/Controllers/K4Ranks/RanksController.php b/app/Http/Controllers/K4Ranks/RanksController.php index 958d3d5..6c2097d 100755 --- a/app/Http/Controllers/K4Ranks/RanksController.php +++ b/app/Http/Controllers/K4Ranks/RanksController.php @@ -188,7 +188,9 @@ public function viewProfile(Request $request, $steam_id, $server_id) { // Check if the image exists, if not, use a default image $weapon->image_url = File::exists(public_path($imagePath)) ? asset($imagePath) - : asset('images/weapons/weapon_elite.png'); + : (stripos($weapon->weapon, 'knife') !== false + ? asset('images/weapons/weapon_knife_css.png') + : asset('images/weapons/weapon_elite.png')); return $weapon; }); diff --git a/app/Http/Controllers/ModuleServerSettingsController.php b/app/Http/Controllers/ModuleServerSettingsController.php index 2598698..b6437a5 100755 --- a/app/Http/Controllers/ModuleServerSettingsController.php +++ b/app/Http/Controllers/ModuleServerSettingsController.php @@ -3,6 +3,7 @@ use App\Models\ModuleServerSetting; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Session; class ModuleServerSettingsController extends Controller { @@ -67,8 +68,8 @@ public function update(Request $request, $id) public function destroy($id) { $setting = ModuleServerSetting::findOrFail($id); + Session::forget('Ranks_server'); $setting->delete(); - return redirect()->route('module-server-settings.index')->with('success', 'Server settings deleted successfully.'); } } diff --git a/package-lock.json b/package-lock.json index b2b472c..8144841 100755 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "datatables.net-dt": "^2.0.2", "datatables.net-fixedcolumns": "^5.0.0", "datatables.net-responsive": "^3.0.2", + "dayjs": "^1.11.13", "sass": "^1.55.0" }, "devDependencies": { @@ -223,6 +224,12 @@ "jquery": ">=1.7" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", diff --git a/package.json b/package.json index 2de874d..3d9a188 100755 --- a/package.json +++ b/package.json @@ -12,12 +12,13 @@ "vite": "^3.0.0" }, "dependencies": { - "bootstrap": "^5.2.1", - "sass": "^1.55.0", "@types/datatables.net": "^1.10.28", "@types/jquery": "^3.5.29", - "datatables.net-responsive": "^3.0.2", + "bootstrap": "^5.2.1", "datatables.net-dt": "^2.0.2", - "datatables.net-fixedcolumns": "^5.0.0" + "datatables.net-fixedcolumns": "^5.0.0", + "datatables.net-responsive": "^3.0.2", + "dayjs": "^1.11.13", + "sass": "^1.55.0" } } diff --git a/resources/js/bans/bans.ts b/resources/js/bans/bans.ts index af33174..793926b 100755 --- a/resources/js/bans/bans.ts +++ b/resources/js/bans/bans.ts @@ -49,6 +49,7 @@ function loadBans() { } else if (progress === 100) { progressBarClass = 'bg-success'; } + progress = isNaN(progress) ? 100 : progress; return `
diff --git a/resources/js/mutes/mutes.ts b/resources/js/mutes/mutes.ts index 14f3e5f..2109306 100755 --- a/resources/js/mutes/mutes.ts +++ b/resources/js/mutes/mutes.ts @@ -51,6 +51,7 @@ function loadMutes() { else if (progress == 100) { progressBarClass = 'bg-success'; } + progress = isNaN(progress) ? 100 : progress; return `
= 1) { - return `${intervalCount} ${interval}${intervalCount > 1 ? 's' : ''} ago`; - } - } - return 'Just now'; + const createdDate = dayjs.tz(created, timeZone); + + const currentDate = dayjs().tz(timeZone); + // Calculate the difference between currentDate and createdDate in human-readable form + const timeDifference = currentDate.diff(createdDate); + + return createdDate.from(currentDate); } export function calculateProgress(created: string, ends: string): number { - const createdDate = new Date(created); - const endsDate = new Date(ends); - const currentDate = new Date(); - - // Convert current date time to UTC - const currentUTCDate = new Date( - Date.UTC( - currentDate.getUTCFullYear(), - currentDate.getUTCMonth(), - currentDate.getUTCDate(), - currentDate.getUTCHours(), - currentDate.getUTCMinutes(), - currentDate.getUTCSeconds(), - currentDate.getUTCMilliseconds() - ) - ); - - const totalTime = endsDate.getTime() - createdDate.getTime(); - const elapsedTime = currentUTCDate.getTime() - createdDate.getTime(); - - let progress = (elapsedTime / totalTime) * 100; - - // Ensure progress doesn't exceed 100% or go below 0% - progress = Math.min(100, Math.max(0, progress)); - - return progress; + try { + + const format = 'YYYY-MM-DD HH:mm:ss'; + + const createdDate = dayjs.tz(created, format, timeZone); + const endsDate = dayjs.tz(ends, format, timeZone); + const currentDate = dayjs().tz(timeZone); + + // Validate the date strings to make sure they are valid + if (!createdDate.isValid() || !endsDate.isValid()) { + return "NA"; + } + + // Calculate total time between creation and end + const totalTime = endsDate.diff(createdDate); // Difference in milliseconds + + // Prevent division by zero or invalid total time + if (totalTime <= 0) { + return "NA"; + } + + // Calculate elapsed time from creation to current date + const elapsedTime = currentDate.diff(createdDate); + + // Calculate progress as a percentage + let progress = (elapsedTime / totalTime) * 100; + + // Ensure progress is a valid number and doesn't exceed 100% or go below 0% + progress = Math.min(100, Math.max(0, isNaN(progress) ? "NA" : progress)); + return Number(progress.toFixed(2)); + } catch (e) { + return "NA"; + } } export function showLoader(loaderId = 'loader') { diff --git a/resources/scss/dark/assets/main.scss b/resources/scss/dark/assets/main.scss index 8cff46b..bef4707 100755 --- a/resources/scss/dark/assets/main.scss +++ b/resources/scss/dark/assets/main.scss @@ -5012,3 +5012,18 @@ body.layout-dark #sidebar ul.menu-categories li.menu ul.submenu>li a:before { .dashboard-rank .rank-profile { margin-top: -14px; } + +.rank-servers.dashboard #serverSelect { + width: 315px; + margin: 6px; + height: 48px; + margin-top: 4px; +} + +.rank-servers.dashboard label { + font-size: 15px; + line-height: 35px; + color: #888ea8; + letter-spacing: 0px; + display: inline-block; +} diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php index 6397c48..30cca0a 100755 --- a/resources/views/admin/dashboard.blade.php +++ b/resources/views/admin/dashboard.blade.php @@ -132,6 +132,18 @@ {{ __('dashboard.topPlayers') }} 5 {{ __('dashboard.of') }} {{$topPlayersData['totalPlayers']}} {{ __('dashboard.players') }}
+
+ + +
@@ -281,6 +293,13 @@ function showModal(){ const recentMutesUrl = '{!! env('VITE_SITE_DIR') !!}/mutes'; const playerActionUrl = '{!! env('VITE_SITE_DIR') !!}/players/action'; const ranksListUrl = '{!! env('VITE_SITE_DIR') !!}/list/ranks'; + + window.addEventListener("load", (event) => { + $('#serverSelect').change(function () { + const serverId = $(this).val(); + window.location.href = '{{ url()->current() }}' + '?server_id=' + serverId; + }); + }); diff --git a/resources/views/components/base-layout.blade.php b/resources/views/components/base-layout.blade.php index f1fc102..477fa36 100755 --- a/resources/views/components/base-layout.blade.php +++ b/resources/views/components/base-layout.blade.php @@ -111,6 +111,9 @@ +