Auto commit: 2026-02-17T17:08:28.722Z

This commit is contained in:
Flatlogic Bot 2026-02-17 17:08:28 +00:00
parent e4e4eb56af
commit e6625de8bb
3 changed files with 201 additions and 0 deletions

37
api/song_requests.php Normal file
View File

@ -0,0 +1,37 @@
<?php
header('Content-Type: application/json');
require_once __DIR__ . '/../db/config.php';
$method = $_SERVER['REQUEST_METHOD'];
$db = db();
if ($method === 'POST') {
$artist = trim($_POST['artist'] ?? '');
$song = trim($_POST['song'] ?? '');
$requester = trim($_POST['requester'] ?? 'Anónimo');
if (empty($artist) || empty($song)) {
echo json_encode(['success' => false, 'error' => 'Falta artista o canción']);
exit;
}
try {
$stmt = $db->prepare("INSERT INTO song_requests (artist, song, requester) VALUES (?, ?, ?)");
$stmt->execute([$artist, $song, $requester]);
echo json_encode(['success' => true]);
} catch (Exception $e) {
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
exit;
}
if ($method === 'GET') {
try {
$stmt = $db->query("SELECT * FROM song_requests ORDER BY created_at DESC LIMIT 10");
$requests = $stmt->fetchAll();
echo json_encode(['success' => true, 'requests' => $requests]);
} catch (Exception $e) {
echo json_encode(['success' => true, 'requests' => [], 'error' => $e->getMessage()]);
}
exit;
}

View File

@ -0,0 +1 @@
CREATE TABLE IF NOT EXISTS song_requests (id INT AUTO_INCREMENT PRIMARY KEY, artist VARCHAR(255) NOT NULL, song VARCHAR(255) NOT NULL, requester VARCHAR(100) DEFAULT 'Anónimo', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

163
index.php
View File

@ -977,6 +977,48 @@ $facebook_link = "https://www.facebook.com/profile.php?id=61587890927489";
font-size: 1.1rem;
}
}
/* Song Requests Styles */
.request-list {
display: flex;
flex-direction: column;
gap: 0.8rem;
max-height: 300px;
overflow-y: auto;
padding-right: 5px;
}
.request-item {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 0.8rem;
border-radius: 12px;
animation: fadeIn 0.5s ease;
}
.request-item .artist {
color: var(--primary-color);
font-weight: 800;
font-size: 0.8rem;
text-transform: uppercase;
}
.request-item .song {
font-weight: 600;
font-size: 0.95rem;
margin: 2px 0;
}
.request-item .requester {
font-size: 0.7rem;
opacity: 0.6;
font-style: italic;
}
.request-badge {
background: var(--primary-color);
color: white;
padding: 2px 6px;
border-radius: 4px;
font-size: 0.6rem;
font-weight: bold;
margin-right: 5px;
}
</style>
</head>
<body>
@ -1194,6 +1236,31 @@ $facebook_link = "https://www.facebook.com/profile.php?id=61587890927489";
<emoji-picker id="emoji-picker" style="display: none; position: absolute; bottom: 50px; left: 0; z-index: 1000; --num-columns: 6; --category-button-size: 1.5rem; width: 300px; height: 350px;"></emoji-picker>
</div>
</div>
<!-- Song Requests Live List -->
<div class="glass-card mt-4" style="margin-top: 1.5rem;">
<h3 style="font-size: 1.2rem; margin-bottom: 1rem; color: var(--accent-color);">
<i class="bi bi-music-note-beamed"></i> PETICIONES EN VIVO
</h3>
<div class="interaction-form" style="margin-bottom: 1.5rem; background: rgba(255,255,255,0.03); padding: 1rem; border-radius: 16px; border: 1px solid rgba(255,255,255,0.05);">
<div class="form-row">
<div class="form-group">
<label for="req-artist">ARTISTA</label>
<input type="text" id="req-artist" placeholder="Ej: Bad Bunny">
</div>
<div class="form-group">
<label for="req-song">CANCIÓN</label>
<input type="text" id="req-song" placeholder="Ej: Tití Me Preguntó">
</div>
</div>
<button onclick="submitSongRequest()" id="submit-req-btn" style="margin-top: 0.8rem; background: var(--primary-color); color: white; border: none; padding: 0.8rem; border-radius: 12px; font-weight: 700; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 0.5rem; width: 100%; transition: all 0.3s;">
<i class="bi bi-plus-circle-fill"></i> PEDIR CANCIÓN
</button>
</div>
<div id="song-requests-list" class="request-list">
<div style="opacity: 0.5; font-size: 0.85rem; text-align: center; padding: 2rem;">No hay peticiones recientes.</div>
</div>
</div>
</section>
</div>
@ -1754,6 +1821,102 @@ $facebook_link = "https://www.facebook.com/profile.php?id=61587890927489";
setInterval(updatePhotoCounter, 30000); // Check limit status every 30s
// --- End Chat Functionality ---
// --- Song Request Functionality ---
async function fetchSongRequests() {
try {
const response = await fetch('api/song_requests.php');
const result = await response.json();
if (result.success) {
const list = document.getElementById('song-requests-list');
if (result.requests.length === 0) {
list.innerHTML = '<div style="opacity: 0.5; font-size: 0.85rem; text-align: center; padding: 2rem;">No hay peticiones recientes.</div>';
return;
}
list.innerHTML = result.requests.map(req => `
<div class="request-item">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 5px;">
<span class="artist">${req.artist}</span>
<span style="font-size: 0.6rem; opacity: 0.4;">${new Date(req.created_at).toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})}</span>
</div>
<div class="song">${req.song}</div>
<div class="requester"><i class="bi bi-person-fill"></i> ${req.requester}</div>
</div>
`).join('');
}
} catch (error) {
console.error('Error fetching requests:', error);
}
}
async function submitSongRequest() {
const artistInput = document.getElementById('req-artist');
const songInput = document.getElementById('req-song');
const artist = artistInput.value.trim();
const song = songInput.value.trim();
const requester = document.getElementById('user-name').value.trim() || 'Anónimo';
if (!artist || !song) {
alert('Por favor, ingresa el artista y el nombre de la canción.');
if (!artist) artistInput.style.borderColor = '#ff4444';
if (!song) songInput.style.borderColor = '#ff4444';
return;
}
const btn = document.getElementById('submit-req-btn');
btn.disabled = true;
btn.innerHTML = '<i class="bi bi-hourglass-split"></i> ENVIANDO...';
try {
const formData = new FormData();
formData.append('artist', artist);
formData.append('song', song);
formData.append('requester', requester);
const response = await fetch('api/song_requests.php', {
method: 'POST',
body: formData
});
const result = await response.json();
if (result.success) {
artistInput.value = '';
songInput.value = '';
artistInput.style.borderColor = '';
songInput.style.borderColor = '';
fetchSongRequests();
// Small visual feedback
btn.innerHTML = '<i class="bi bi-check-circle-fill"></i> ¡PEDIDA!';
btn.style.backgroundColor = 'var(--accent-color)';
confetti({
particleCount: 50,
spread: 60,
origin: { y: 0.8 },
colors: ['#38bdf8', '#00e676']
});
setTimeout(() => {
btn.disabled = false;
btn.innerHTML = '<i class="bi bi-plus-circle-fill"></i> PEDIR CANCIÓN';
btn.style.backgroundColor = '';
}, 3000);
} else {
alert('Error: ' + (result.error || 'No se pudo enviar la petición'));
btn.disabled = false;
btn.innerHTML = '<i class="bi bi-plus-circle-fill"></i> PEDIR CANCIÓN';
}
} catch (error) {
console.error('Error submitting request:', error);
btn.disabled = false;
btn.innerHTML = '<i class="bi bi-plus-circle-fill"></i> PEDIR CANCIÓN';
}
}
// Initial fetch and poll for requests
fetchSongRequests();
setInterval(fetchSongRequests, 10000); // Update requests every 10s
// --- End Song Request Functionality ---
function openQRModal() {
const modal = document.getElementById('qr-modal');
modal.style.display = 'flex';