update chat
Deploy / Deploy (push) Successful in 40s Details

This commit is contained in:
www-data 2025-03-27 09:59:15 -03:00
parent e28a164a5c
commit 756d2a98b2
3 changed files with 136 additions and 126 deletions

View File

@ -1,16 +1,10 @@
<table id="temporary-table" style="display: none;">
<tr>
<td>{{ include.user }}</td>
</tr>
</table>
<div class="live-container"> <div class="live-container">
<div class="player-container"> <div class="player-container">
<video <video
class="player" class="player"
data-dashjs-player data-dashjs-player
{% if page.user %} {% if page.user %}
url="https://cast.alice.ufsj.edu.br/dash/{{page.user}}.mpd" url="https://class.alice.ufsj.edu.br/dash/{{page.user}}.mpd"
{% endif %} {% endif %}
autoplay autoplay
controls controls
@ -18,7 +12,7 @@
></video> ></video>
<div class="player-off"> <div class="player-off">
<h1>Offlinee</h1> <h1>Offline</h1>
</div> </div>
</div> </div>
@ -30,158 +24,128 @@
</div> </div>
<div class="chat-views"> <div class="chat-views">
<i class="fa-solid fa-users"></i> <i class="fa-solid fa-users"></i>
<!-- <h4>679 pessoas online</h4> -->
</div> </div>
</div> </div>
<!-- Campo de nome do usuário -->
<div class="chat-username" style="margin-bottom: 10px;">
<label for="username-input">Seu nome:</label>
<input
type="text"
id="username-input"
placeholder="Escolha um nome (ou deixe em branco)"
style="width: 100%; padding: 5px; margin-top: 5px;"
/>
</div>
<div class="chat-lines"> <div class="chat-lines">
<div class="chat-line"> <!-- Mensagens serão adicionadas aqui via JavaScript -->
<!-- <p><span class="username">{msg.nome}:</span> {msg.mensagem}</p> -->
</div>
</div> </div>
<div class="chat-input"> <div class="chat-input">
<form on:submit|preventDefault={sendMessage} class="chat-input-form"> <form class="chat-input-form">
<input class="input chat-enter" placeholder="Converse com o chat aqui" bind:value={message} /> <input class="input chat-enter" placeholder="Converse com o chat aqui" />
<input type="submit" hidden /> <input type="submit" hidden />
</form> </form>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script src="/assets/js/dash.all.min.js"></script> <script src="/assets/js/dash.all.min.js"></script>
<script> <script>
// Obter a string de query da URL
const queryString = window.location.search; const queryString = window.location.search;
// Criar um objeto URLSearchParams com a string de query
const urlParams = new URLSearchParams(queryString); const urlParams = new URLSearchParams(queryString);
// =====================
// Player da live
// =====================
let streamUser;
{% if page.user %} {% if page.user %}
const user = "{{page.user}}"; streamUser = "{{page.user}}";
{% else %} {% else %}
const user = urlParams.get('user'); streamUser = urlParams.get('user');
{% endif %} {% endif %}
// Exemplo de como usar o valor if (!streamUser) {
console.log(user); // Isso vai exibir o valor do parâmetro 'user' streamUser = "default"; // fallback para evitar erro
}
console.log("Usuário da live:", streamUser);
const videoElement = document.querySelector('video'); const videoElement = document.querySelector('video');
const playerOffElement = document.querySelector('.player-off'); const playerOffElement = document.querySelector('.player-off');
const url = `https://cast.alice.ufsj.edu.br/dash/${user}.mpd`; const url = `https://class.alice.ufsj.edu.br/dash/${streamUser}.mpd`;
videoElement.src = url; videoElement.src = url;
fetch(url) fetch(url)
.then(response => { .then(response => {
if (response.ok) { if (response.ok) {
console.log("Arquivo existe."); console.log("Arquivo existe.");
playerOffElement.style.display = "none"; playerOffElement.style.display = "none";
} else { } else {
console.log("Arquivo não encontrado."); console.log("Arquivo não encontrado.");
// Coloque o código para ocultar o vídeo aqui
videoElement.style.opacity = "0"; videoElement.style.opacity = "0";
} }
}) });
// URL do servidor WebSocket
const socket = new WebSocket('wss://cast.alice.ufsj.edu.br/chat/chat');
socket.addEventListener('open', () => { // =====================
console.log('Conexão WebSocket aberta com sucesso!'); // Chat ao vivo
}); // =====================
// Adiciona um manipulador de eventos para lidar com a recepção de mensagens
socket.addEventListener('message', (event) => {
console.log('Mensagem recebida do servidor:', event.data);
});
// Adiciona um manipulador de eventos para lidar com o fechamento da conexão
socket.addEventListener('close', (event) => {
console.log('Conexão WebSocket fechada:', event.reason || 'Sem motivo específico');
});
// Adiciona um manipulador de eventos para lidar com erros
socket.addEventListener('error', (event) => {
console.error('Erro no WebSocket:', event);
});
const nomesAlice = [ const nomesAlice = [
'Alice', 'Chapeleiro Maluco', 'Coelho Branco', 'Rainha de Copas', 'Alice', 'Chapeleiro Maluco', 'Coelho Branco', 'Rainha de Copas',
'Gato de Cheshire', 'Lebre de Março', 'Lagarta', 'Dodo', 'Gato de Cheshire', 'Lebre de Março', 'Lagarta', 'Dodo',
'Tweedledee', 'Tweedledum', 'Rainha Vermelha', 'Rei de Copas', 'Tweedledee', 'Tweedledum', 'Rainha Vermelha', 'Rei de Copas'
'JotaChina', 'JotaJapão', 'JotaÍndia', 'JotaCoreia', 'JotaTailândia',
'JotaVietnã', 'JotaMalásia', 'JotaIndonésia', 'JotaFilipinas',
'JotaSingapura', 'JotaNepal', 'JotaCamboja', 'JotaMianmar',
'JotaLaos', 'JotaBangladesh', 'JotaSriLanka'
]; ];
function nomeAleatorio() { function nomeAleatorio() {
return nomesAlice[Math.floor(Math.random() * nomesAlice.length)]; return nomesAlice[Math.floor(Math.random() * nomesAlice.length)];
} }
// Variáveis para armazenar o nome do usuário e a mensagem
let username = nomeAleatorio(); let username = nomeAleatorio();
let message = '';
// Função que envia a mensagem function setCustomUsername() {
const customUsername = document.querySelector('#username-input').value.trim();
username = customUsername || nomeAleatorio();
}
const source = new EventSource(`php/chat/relay.php?user=${encodeURIComponent(streamUser)}`);
source.onmessage = function (event) {
const msg = JSON.parse(event.data);
addMessage(msg);
};
function sendMessage(event) { function sendMessage(event) {
event.preventDefault(); // Previne o comportamento padrão do formulário event.preventDefault();
// Cria um objeto com os dados da mensagem const message = document.querySelector('.chat-enter').value;
const msgData = { const msgData = {
nome: username, nome: username,
mensagem: message mensagem: message
}; };
// Envia a mensagem como uma string JSON fetch(`php/chat/send.php?user=${encodeURIComponent(streamUser)}`, {
socket.send(JSON.stringify(msgData)); method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'mensagem=' + encodeURIComponent(JSON.stringify(msgData))
});
// Limpa o campo de entrada de mensagem
document.querySelector('.chat-enter').value = ''; document.querySelector('.chat-enter').value = '';
} }
// Função que adiciona uma nova linha de mensagem ao chat
function addMessage(msg) { function addMessage(msg) {
console.log(msg);
const chatLines = document.querySelector('.chat-lines'); const chatLines = document.querySelector('.chat-lines');
// Cria o elemento da mensagem
const newMessage = document.createElement('div'); const newMessage = document.createElement('div');
newMessage.classList.add('chat-line'); newMessage.classList.add('chat-line');
newMessage.innerHTML = `<p><span class="username">${msg.nome}:</span> ${msg.mensagem}</p>`; newMessage.innerHTML = `<p><span class=\"username\">${msg.nome}:</span> ${msg.mensagem}</p>`;
// Adiciona a nova mensagem no final da lista de mensagens
chatLines.appendChild(newMessage); chatLines.appendChild(newMessage);
// Rola o chat para baixo para mostrar a nova mensagem
chatLines.scrollTop = chatLines.scrollHeight; chatLines.scrollTop = chatLines.scrollHeight;
} }
// Event listener para quando o WebSocket abrir a conexão document.querySelector('.chat-input-form').addEventListener('submit', sendMessage);
socket.addEventListener('open', () => { document.querySelector('#username-input').addEventListener('change', setCustomUsername);
console.log('Conectado ao servidor WebSocket');
});
// Event listener para quando uma mensagem é recebida do servidor
socket.addEventListener('message', event => {
// Parseia a mensagem recebida como JSON
const msg = JSON.parse(event.data);
// Adiciona a mensagem ao chat
addMessage(msg);
});
// Event listener para o envio de mensagem no formulário
document.querySelector('.chat-input-form').addEventListener('submit', event => {
// Captura o valor do input
message = document.querySelector('.chat-enter').value;
// Chama a função que envia a mensagem
sendMessage(event);
});
</script> </script>

35
php/chat/relay.php Normal file
View File

@ -0,0 +1,35 @@
<?php
if (!isset($_GET['user'])) {
http_response_code(400);
exit("Missing user");
}
$user = preg_replace('/[^a-zA-Z0-9_-]/', '', $_GET['user']);
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
header("Connection: keep-alive");
$tmp_file = sys_get_temp_dir() . "/relay_chat_{$user}.txt";
if (!file_exists($tmp_file)) {
file_put_contents($tmp_file, '');
}
$last_modif = 0;
while (true) {
clearstatcache();
$current_modif = filemtime($tmp_file);
if ($current_modif > $last_modif) {
$last_modif = $current_modif;
$data = file_get_contents($tmp_file);
echo "data: " . trim($data) . "\n\n";
ob_flush();
flush();
}
sleep(1);
}
?>

11
php/chat/send.php Normal file
View File

@ -0,0 +1,11 @@
<?php
if (isset($_POST['mensagem']) && isset($_GET['user'])) {
$mensagem = trim($_POST['mensagem']);
$user = preg_replace('/[^a-zA-Z0-9_-]/', '', $_GET['user']); // sanitiza o nome do usuário
if ($mensagem !== '') {
$tmp_file = sys_get_temp_dir() . "/relay_chat_{$user}.txt";
file_put_contents($tmp_file, $mensagem);
}
}
?>