/** * Chat page — live chat viewer with message sending. */ function ChatPage(params, container) { var address = Rcon.getAddress() || ''; var html = '
' + '
Loading…
' + '
' + '' + '
' + '
'; container.innerHTML = html; var outputEl = document.getElementById('chat-output'); var inputEl = document.getElementById('chat-input'); var firstMessage = true; function addMessage(msg) { if (firstMessage) { outputEl.innerHTML = ''; outputEl.classList.remove('text-white-50'); firstMessage = false; } var div = document.createElement('div'); var t = new Date((msg.Time || 0) * 1000); var timeStr = t.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); var ts = document.createElement('span'); ts.style.cssText = 'min-width:60px;display:inline-block;'; ts.textContent = timeStr; div.appendChild(ts); var ns = document.createElement('span'); ns.style.cssText = 'min-width:130px;display:inline-block;text-align:right;'; var a = document.createElement('a'); a.href = '#/' + address + '/player/' + (msg.UserId || ''); a.textContent = stripHtml(msg.Username || '') + ' :'; ns.appendChild(a); div.appendChild(ns); var ms = document.createElement('span'); ms.style.display = 'inline-block'; ms.textContent = stripHtml(msg.Message || ''); div.appendChild(ms); outputEl.appendChild(div); if (isScrolledToBottom(outputEl)) outputEl.scrollTop = outputEl.scrollHeight; } function onSubmit() { var cmd = inputEl.value.trim(); if (!cmd) return; Rcon.command('say ' + cmd, 1); inputEl.value = ''; } function onMessage(msg) { if (msg.Type !== 'Chat') return; addMessage(JSON.parse(msg.Message)); } function fetchHistory() { Rcon.request('chat.tail 512', function (response) { var messages = JSON.parse(response.Message); for (var i = 0; i < messages.length; i++) addMessage(messages[i]); outputEl.scrollTop = outputEl.scrollHeight; }); } document.getElementById('chat-form').addEventListener('submit', function (e) { e.preventDefault(); onSubmit(); }); Rcon.on('message', onMessage); if (Rcon.isConnected()) fetchHistory(); else { var _c = function () { fetchHistory(); Rcon.off('connected', _c); }; Rcon.on('connected', _c); } return function cleanup() { Rcon.off('message', onMessage); }; }