You've already forked Atomcms-edit
Initial commit
This commit is contained in:
+88
@@ -0,0 +1,88 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>{{ setting('hotel_name') }} - {{ __('Client') }}</title>
|
||||
|
||||
<script src="{{ asset('assets/js/jquery-latest.js') }}" type="text/javascript"></script>
|
||||
<script src="{{ asset('assets/js/jquery-ui.js') }}" type="text/javascript"></script>
|
||||
<script src="{{ asset('assets/js/flashclient.js') }}"></script>
|
||||
<script type="text/javascript" src="{{ asset('assets/js/swfobject.js') }}"></script>
|
||||
|
||||
<link rel="stylesheet" href="{{ asset('assets/css/clientnew.css') }}" type="text/css">
|
||||
<link rel="stylesheet" href="{{ asset('assets/css/no-flash.css') }}" type="text/css">
|
||||
|
||||
<script type="text/javascript">
|
||||
var flashvars = {
|
||||
"connection.info.host": "{{ config('habbo.flash.host') }}",
|
||||
"connection.info.port": "{{ config('habbo.flash.port') }}",
|
||||
"site.url": "",
|
||||
"url.prefix": "",
|
||||
"client.reload.url": "",
|
||||
"client.fatal.error.url": "",
|
||||
"client.connection.failed.url": "",
|
||||
"logout.url": "",
|
||||
"client.starting": "Please wait! Habbo is starting up.",
|
||||
"client.starting.revolving": "For science, you monster\/Loading funny message\u2026please wait.\/Would you like fries with that?\/Follow the yellow duck.\/Time is just an illusion.\/Are we there yet?!\/I like your t-shirt.\/Look left. Look right. Blink twice. Ta da!\/It\'s not you, it\'s me.\/Shhh! I\'m trying to think here.\/Loading pixel universe.",
|
||||
"client.notify.cross.domain": "1",
|
||||
"client.allow.cross.domain": "1",
|
||||
"flash.client.origin": "popup",
|
||||
"processlog.enabled": "0",
|
||||
"sso.ticket": "{{ $sso }}",
|
||||
"productdata.load.url": "{{ sprintf('%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.external_productdata')) }}",
|
||||
"furnidata.load.url": "{{ sprintf('%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.external_furnidata')) }}",
|
||||
"external.texts.txt": "{{ sprintf('%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.external_texts')) }}",
|
||||
"external.variables.txt": "{{ sprintf('%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.external_variables')) }}",
|
||||
"external.figurepartlist.txt": "{{ sprintf('%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.external_figuredata')) }}",
|
||||
"flash.dynamic.avatar.download.configuration": "{{ sprintf('%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.external_figuremap')) }}",
|
||||
"external.override.texts.txt": "{{ sprintf('%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.external_override_texts')) }}",
|
||||
"external.override.variables.txt": "{{ sprintf('%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.external_override_variables')) }}",
|
||||
"flash.client.url": "{{ sprintf('%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.production_folder')) }}/",
|
||||
};
|
||||
|
||||
window.FlashExternalInterface.disconnect = function() {
|
||||
window.location.href = "{{ route('me.show') }}";
|
||||
};
|
||||
|
||||
var params = {
|
||||
"base": "{{ sprintf('%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.production_folder')) }}/",
|
||||
"allowScriptAccess": "always",
|
||||
"menu": "false",
|
||||
"wmode": "opaque"
|
||||
};
|
||||
|
||||
swfobject.embedSWF(
|
||||
'{{ sprintf('%s/%s/%s/%s', config('habbo.site.site_url'), config('habbo.flash.swf_base_path'), config('habbo.flash.production_folder'), config('habbo.flash.habbo_swf')) }}',
|
||||
'client', '100%', '100%', '11.1.0', '{{ asset('assets/js/expressInstall.swf') }}', flashvars, params, null,
|
||||
null);
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="client">
|
||||
<habbo-client-error>
|
||||
<div class="client-error__background-frank">
|
||||
<div class="client-error__text-contents">
|
||||
<h1 class="client-error__title">{{ __('You are nearly in Habbo!') }}</h1>
|
||||
<p>{{ __('Click the yellow Hotel button below, then click on run flash` when prompted to. See you in the Hotel!') }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="client-error__hotel-button-div">
|
||||
<a href="https://www.adobe.com/go/getflashplayer" target="_blank" rel="noopener noreferrer"
|
||||
class="hotel-button">
|
||||
<span class="hotel-button__text">{{ __('Get flash') }}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</habbo-client-error>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
+532
@@ -0,0 +1,532 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<title>{{ setting('hotel_name') }} - Nitro</title>
|
||||
|
||||
<link href="https://fonts.googleapis.com/css2?family=Ubuntu+Condensed&display=swap" rel="stylesheet">
|
||||
|
||||
@vite(['resources/themes/' . setting('theme') . '/css/app.css', 'resources/themes/' . setting('theme') . '/js/app.js'], 'build')
|
||||
|
||||
@if(setting('button_enabled') == '1')
|
||||
<style>
|
||||
.cms-button {
|
||||
background-color: {{ setting('toolbar_primary_color', setting('button_primary_color', '#eeb425')) }} !important;
|
||||
background: {{ setting('toolbar_primary_color', setting('button_primary_color', '#eeb425')) }} !important;
|
||||
color: {{ setting('toolbar_text_color', setting('button_text_color', '#1a1a2e')) }} !important;
|
||||
border: {{ setting('button_border_width', '2') }}px solid {{ setting('toolbar_border_color', setting('button_border_color', '#cf9d15')) }} !important;
|
||||
border-radius: {{ setting('button_border_radius', '8') }}px !important;
|
||||
transition: {{ setting('button_transition', 'all') }} {{ setting('button_transition_duration', '300') }}ms !important;
|
||||
}
|
||||
.cms-button:hover {
|
||||
background-color: {{ setting('toolbar_hover_color', setting('button_hover_color', '#cf9d15')) }} !important;
|
||||
background: {{ setting('toolbar_hover_color', setting('button_hover_color', '#cf9d15')) }} !important;
|
||||
transform: scale({{ setting('button_hover_scale', '1.05') }});
|
||||
}
|
||||
.toolbar-btn.cms-button {
|
||||
padding: 8px !important;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: {{ setting('button_primary_color', '#eeb425') }} !important;
|
||||
background: {{ setting('button_primary_color', '#eeb425') }} !important;
|
||||
}
|
||||
.toolbar-btn.cms-button svg {
|
||||
stroke: {{ setting('button_text_color', '#1a1a2e') }} !important;
|
||||
}
|
||||
.toolbar-btn.cms-button:hover {
|
||||
background-color: {{ setting('button_hover_color', '#cf9d15') }} !important;
|
||||
background: {{ setting('button_hover_color', '#cf9d15') }} !important;
|
||||
}
|
||||
</style>
|
||||
@endif
|
||||
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* Toolbar Container */
|
||||
.toolbar {
|
||||
position: fixed;
|
||||
top: 16px;
|
||||
left: 16px;
|
||||
z-index: 9999;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
/* Standard Button Style - ALL buttons same size */
|
||||
.toolbar-btn {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 2px solid {{ setting('toolbar_border_color', setting('button_border_color', '#cf9d15')) }};
|
||||
border-radius: 6px;
|
||||
background: linear-gradient(135deg, {{ setting('toolbar_primary_color', setting('button_primary_color', '#eeb425')) }} 0%, {{ setting('toolbar_hover_color', setting('button_hover_color', '#cf9d15')) }} 100%);
|
||||
color: {{ setting('toolbar_text_color', setting('button_text_color', '#1a1a2e')) }};
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-decoration: none;
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
|
||||
transition: transform 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.toolbar-btn:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
/* Radio Bar - Same height as buttons */
|
||||
.radio-container {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 2px solid {{ setting('toolbar_border_color', setting('button_border_color', '#cf9d15')) }};
|
||||
border-radius: 6px;
|
||||
background: linear-gradient(135deg, {{ setting('toolbar_primary_color', setting('button_primary_color', '#eeb425')) }} 0%, {{ setting('toolbar_hover_color', setting('button_hover_color', '#cf9d15')) }} 100%);
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
|
||||
overflow: hidden;
|
||||
transition: width 0.3s ease;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.radio-container.expanded {
|
||||
width: 320px;
|
||||
}
|
||||
|
||||
.radio-toggle {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
min-width: 36px;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: {{ setting('button_text_color', '#1a1a2e') }};
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.radio-status-dot {
|
||||
position: absolute;
|
||||
top: 6px;
|
||||
right: 6px;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 50%;
|
||||
background: #10b981;
|
||||
animation: pulse 2s infinite;
|
||||
}
|
||||
|
||||
.radio-status-dot.live {
|
||||
background: #ef4444;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: 0.5; }
|
||||
}
|
||||
|
||||
.radio-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 0 8px;
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.radio-container.expanded .radio-content {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.radio-divider {
|
||||
width: 1px;
|
||||
height: 24px;
|
||||
background: rgba(26, 26, 46, 0.3);
|
||||
}
|
||||
|
||||
.radio-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.radio-dj-avatar {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid rgba(26, 26, 46, 0.3);
|
||||
background: rgba(26, 26, 46, 0.1);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.radio-dj-avatar img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.radio-dj-name {
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
color: #1a1a2e;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.radio-song {
|
||||
font-size: 9px;
|
||||
color: #1a1a2e;
|
||||
opacity: 0.85;
|
||||
}
|
||||
|
||||
.radio-control-btn {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background: #1a1a2e;
|
||||
color: #eeb425;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.radio-volume {
|
||||
width: 50px;
|
||||
height: 4px;
|
||||
background: rgba(26, 26, 46, 0.3);
|
||||
border-radius: 2px;
|
||||
appearance: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.radio-volume::-webkit-slider-thumb {
|
||||
appearance: none;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-radius: 50%;
|
||||
background: #1a1a2e;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.radio-listeners {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 3px;
|
||||
color: #1a1a2e;
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body class="overflow-hidden" id="nitro-client">
|
||||
{{-- Toolbar --}}
|
||||
<div class="toolbar">
|
||||
{{-- Home Button --}}
|
||||
<a href="{{ route('me.show') }}" class="toolbar-btn cms-button" data-turbolinks="false" title="Home">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path>
|
||||
<polyline points="9 22 9 12 15 12 15 22"></polyline>
|
||||
</svg>
|
||||
</a>
|
||||
|
||||
{{-- Reload Button --}}
|
||||
<button class="toolbar-btn cms-button" onclick="location.reload()" title="Herladen">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<polyline points="23 4 23 10 17 10"></polyline>
|
||||
<polyline points="1 20 1 14 7 14"></polyline>
|
||||
<path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path>
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
{{-- Fullscreen Button --}}
|
||||
<button class="toolbar-btn cms-button" onclick="toggleFullscreen()" title="Fullscreen">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"></path>
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
{{-- Online Count Button --}}
|
||||
<button class="toolbar-btn cms-button" title="Online gebruikers">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path>
|
||||
<circle cx="12" cy="7" r="4"></circle>
|
||||
</svg>
|
||||
<span id="onlineCount" style="margin-left: 4px; font-size: 11px; font-weight: 700;">0</span>
|
||||
</button>
|
||||
|
||||
{{-- Radio Player --}}
|
||||
<div id="radioContainer" class="radio-container">
|
||||
<button class="radio-toggle" onclick="toggleRadioBar()" title="Radio">
|
||||
<div class="radio-status-dot" id="radioStatus"></div>
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<path d="M9 18V5l12-2v13"></path>
|
||||
<circle cx="6" cy="18" r="3"></circle>
|
||||
<circle cx="18" cy="16" r="3"></circle>
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
<div class="radio-content">
|
||||
<div class="radio-divider"></div>
|
||||
|
||||
<div class="radio-info">
|
||||
<div class="radio-dj-avatar" id="radioDjAvatar">
|
||||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path>
|
||||
<circle cx="12" cy="7" r="4"></circle>
|
||||
</svg>
|
||||
</div>
|
||||
<div style="display: flex; flex-direction: column;">
|
||||
<span class="radio-dj-name" id="radioDj">{{ __('radio.music') }}</span>
|
||||
<span class="radio-song" id="radioSong">{{ __('radio.loading') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="radio-divider"></div>
|
||||
|
||||
<button class="radio-control-btn" onclick="toggleRadioPlay()" title="Play/Pause">
|
||||
<svg id="playIcon" width="12" height="12" viewBox="0 0 24 24" fill="currentColor">
|
||||
<polygon points="5 3 19 12 5 21 5 3"/>
|
||||
</svg>
|
||||
<svg id="pauseIcon" width="12" height="12" viewBox="0 0 24 24" fill="currentColor" class="hidden">
|
||||
<rect x="6" y="4" width="4" height="16"/>
|
||||
<rect x="14" y="4" width="4" height="16"/>
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
<div class="radio-divider"></div>
|
||||
|
||||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#1a1a2e" stroke-width="2">
|
||||
<polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"/>
|
||||
</svg>
|
||||
<input type="range" class="radio-volume" id="radioVolume" min="0" max="100" value="50" onchange="setRadioVolume(this.value)">
|
||||
|
||||
<div class="radio-divider"></div>
|
||||
|
||||
<div class="radio-listeners">
|
||||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#1a1a2e" stroke-width="2">
|
||||
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
|
||||
<circle cx="9" cy="7" r="4"/>
|
||||
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
|
||||
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
|
||||
</svg>
|
||||
<span id="radioListeners">0</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Nitro Client --}}
|
||||
@php
|
||||
$nitroUrl = sprintf('%s/index.html?sso=%s', setting('nitro_path'), $sso);
|
||||
$toolbarParams = [];
|
||||
// Toolbar with fallback to button colors (don't URL encode - # is valid in URLs)
|
||||
$toolbarParams[] = 'toolbar_primary=' . (setting('toolbar_primary_color') ?: setting('button_primary_color', '#eeb425'));
|
||||
$toolbarParams[] = 'toolbar_hover=' . (setting('toolbar_hover_color') ?: setting('button_hover_color', '#cf9d15'));
|
||||
$toolbarParams[] = 'toolbar_border=' . (setting('toolbar_border_color') ?: setting('button_border_color', '#cf9d15'));
|
||||
$toolbarParams[] = 'toolbar_text=' . (setting('toolbar_text_color') ?: setting('button_text_color', '#1a1a2e'));
|
||||
if(count($toolbarParams)) $nitroUrl .= '&' . implode('&', $toolbarParams);
|
||||
@endphp
|
||||
<iframe id="nitro" src="{{ $nitroUrl }}"
|
||||
class="absolute top-0 left-0 m-0 h-full w-full overflow-hidden border-none p-0"></iframe>
|
||||
|
||||
{{-- Disconnected Message --}}
|
||||
<div id="disconnected" class="hidden" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 10000;">
|
||||
<div style="position: absolute; width: 100%; height: 100%; background: rgba(0,0,0,0.7);"></div>
|
||||
<div style="position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; gap: 16px;">
|
||||
<h2 style="font-size: 24px; color: white;">{{ __('Verbinding verbroken') }}</h2>
|
||||
<div style="display: flex; gap: 16px;">
|
||||
<button onclick="location.reload()" style="padding: 12px 24px; background: #eeb425; border: 2px solid #cf9d15; border-radius: 6px; color: #1a1a2e; font-weight: 700; cursor: pointer;">
|
||||
{{ __('Herladen') }}
|
||||
</button>
|
||||
<a href="{{ route('me.show') }}" style="padding: 12px 24px; background: transparent; border: 2px solid #eeb425; border-radius: 6px; color: #eeb425; text-decoration: none; font-weight: 700;">
|
||||
{{ __('Terug') }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<audio id="radioAudio" preload="none"></audio>
|
||||
|
||||
<script>
|
||||
// Fullscreen
|
||||
function toggleFullscreen() {
|
||||
if (document.fullscreenElement) {
|
||||
document.exitFullscreen();
|
||||
} else {
|
||||
document.documentElement.requestFullscreen();
|
||||
}
|
||||
}
|
||||
|
||||
// Online count
|
||||
function updateOnlineCount() {
|
||||
fetch("{{ route('api.online-count') }}")
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
document.getElementById('onlineCount').textContent = data.data?.onlineCount || 0;
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
|
||||
setInterval(updateOnlineCount, 15000);
|
||||
updateOnlineCount();
|
||||
|
||||
// Radio
|
||||
let radioPlaying = false;
|
||||
let radioStreamUrl = null;
|
||||
let radioExpanded = false;
|
||||
const radioAudio = document.getElementById('radioAudio');
|
||||
|
||||
function toggleRadioBar() {
|
||||
const container = document.getElementById('radioContainer');
|
||||
radioExpanded = !radioExpanded;
|
||||
|
||||
if (radioExpanded) {
|
||||
container.classList.add('expanded');
|
||||
if (!radioStreamUrl) loadRadio();
|
||||
} else {
|
||||
container.classList.remove('expanded');
|
||||
}
|
||||
}
|
||||
|
||||
function loadRadio() {
|
||||
fetch("{{ route('api.radio.config') }}")
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
if (data.enabled && data.stream_url) {
|
||||
radioStreamUrl = data.stream_url;
|
||||
radioAudio.src = radioStreamUrl;
|
||||
document.getElementById('radioSong').textContent = 'Gereed';
|
||||
|
||||
fetch("{{ route('api.settings.radio.auto-play') }}")
|
||||
.then(r => r.json())
|
||||
.then(settings => {
|
||||
if (settings.auto_play) toggleRadioPlay();
|
||||
});
|
||||
} else {
|
||||
document.getElementById('radioSong').textContent = 'Offline';
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
document.getElementById('radioSong').textContent = 'Error';
|
||||
});
|
||||
}
|
||||
|
||||
function toggleRadioPlay() {
|
||||
if (!radioStreamUrl) {
|
||||
loadRadio();
|
||||
return;
|
||||
}
|
||||
|
||||
const playIcon = document.getElementById('playIcon');
|
||||
const pauseIcon = document.getElementById('pauseIcon');
|
||||
|
||||
if (radioPlaying) {
|
||||
radioAudio.pause();
|
||||
playIcon.classList.remove('hidden');
|
||||
pauseIcon.classList.add('hidden');
|
||||
radioPlaying = false;
|
||||
} else {
|
||||
radioAudio.volume = document.getElementById('radioVolume').value / 100;
|
||||
radioAudio.play()
|
||||
.then(() => {
|
||||
playIcon.classList.add('hidden');
|
||||
pauseIcon.classList.remove('hidden');
|
||||
radioPlaying = true;
|
||||
})
|
||||
.catch(() => {
|
||||
document.getElementById('radioSong').textContent = 'Fout';
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function setRadioVolume(val) {
|
||||
radioAudio.volume = val / 100;
|
||||
localStorage.setItem('radioVol', val);
|
||||
}
|
||||
|
||||
const savedVol = localStorage.getItem('radioVol');
|
||||
if (savedVol) {
|
||||
document.getElementById('radioVolume').value = savedVol;
|
||||
}
|
||||
|
||||
// Update radio info
|
||||
function updateRadioInfo() {
|
||||
if (!radioStreamUrl) return;
|
||||
|
||||
fetch("{{ route('api.radio.config') }}")
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
const defaultLook = '{{ setting("radio_default_avatar_figure", "hr-893-45.hd-180-2.ch-210-62.lg-285-62.sh-295-62.ha-1012-62.wa-2007-0") }}';
|
||||
const defaultName = '{{ setting("radio_default_dj_name", "Frank") }}';
|
||||
const avatarUrl = "{{ setting('avatar_imager') }}" + (data.dj?.look || defaultLook) + '&headonly=1';
|
||||
|
||||
const avatarEl = document.getElementById('radioDjAvatar');
|
||||
if (data.dj?.look) {
|
||||
avatarEl.innerHTML = '<img src="' + avatarUrl + '" alt="DJ">';
|
||||
} else {
|
||||
avatarEl.innerHTML = '<img src="' + avatarUrl + '" alt="' + defaultName + '">';
|
||||
}
|
||||
|
||||
const dj = data.dj ? (typeof data.dj === 'object' ? data.dj.username : data.dj) : defaultName;
|
||||
document.getElementById('radioDj').textContent = dj;
|
||||
|
||||
const status = document.getElementById('radioStatus');
|
||||
if (data.dj) {
|
||||
status.classList.add('live');
|
||||
} else {
|
||||
status.classList.remove('live');
|
||||
}
|
||||
})
|
||||
.catch(() => {});
|
||||
|
||||
fetch("{{ route('api.radio.now-playing') }}")
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
const song = data.song || data.title || (data.now_playing?.title) || 'Live';
|
||||
document.getElementById('radioSong').textContent = song;
|
||||
})
|
||||
.catch(() => {});
|
||||
|
||||
fetch("{{ route('api.radio.listeners') }}")
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
document.getElementById('radioListeners').textContent = data.count || '0';
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
|
||||
setInterval(updateRadioInfo, 10000);
|
||||
|
||||
// Init
|
||||
window.addEventListener('DOMContentLoaded', () => {
|
||||
loadRadio();
|
||||
updateRadioInfo();
|
||||
});
|
||||
</script>
|
||||
|
||||
<script src="{{ asset('assets/js/atom.js') }}"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Reference in New Issue
Block a user