140 lines
4.8 KiB
PHP
140 lines
4.8 KiB
PHP
<?php
|
|
header('Content-Type: application/json');
|
|
require_once __DIR__ . '/../db/config.php';
|
|
|
|
$action = $_GET['action'] ?? '';
|
|
|
|
if ($action === 'list') {
|
|
try {
|
|
$stmt = db()->query("SELECT * FROM custom_emotes ORDER BY created_at DESC");
|
|
echo json_encode(['success' => true, 'emotes' => $stmt->fetchAll()]);
|
|
} catch (Exception $e) {
|
|
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
|
|
}
|
|
exit;
|
|
}
|
|
|
|
if ($action === 'upload' && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
if (!isset($_FILES['emote'])) {
|
|
echo json_encode(['success' => false, 'error' => 'Aucun fichier reçu (emote)']);
|
|
exit;
|
|
}
|
|
|
|
if ($_FILES['emote']['error'] !== UPLOAD_ERR_OK) {
|
|
$errorMsg = 'Erreur d\'upload PHP: ' . $_FILES['emote']['error'];
|
|
if ($_FILES['emote']['error'] === 1) $errorMsg = 'Fichier trop volumineux (limit PHP)';
|
|
if ($_FILES['emote']['error'] === 4) $errorMsg = 'Aucun fichier sélectionné';
|
|
echo json_encode(['success' => false, 'error' => $errorMsg]);
|
|
exit;
|
|
}
|
|
|
|
$name = preg_replace('/[^a-z0-9_]/', '', strtolower($_POST['name'] ?? 'emote'));
|
|
if (empty($name)) {
|
|
echo json_encode(['success' => false, 'error' => 'Nom invalide']);
|
|
exit;
|
|
}
|
|
|
|
$file = $_FILES['emote'];
|
|
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
|
|
if (!in_array(strtolower($ext), ['png', 'jpg', 'jpeg'])) {
|
|
echo json_encode(['success' => false, 'error' => 'Format non supporté (PNG uniquement recommandé)']);
|
|
exit;
|
|
}
|
|
|
|
$uploadDir = __DIR__ . '/../assets/images/custom_emotes/';
|
|
if (!is_dir($uploadDir)) {
|
|
mkdir($uploadDir, 0775, true);
|
|
}
|
|
|
|
$fileName = time() . '_' . $name . '.png';
|
|
$targetPath = $uploadDir . $fileName;
|
|
|
|
// Process image: Resize to 48x48
|
|
$srcImage = null;
|
|
if (strtolower($ext) === 'png') $srcImage = imagecreatefrompng($file['tmp_name']);
|
|
else if (in_array(strtolower($ext), ['jpg', 'jpeg'])) $srcImage = imagecreatefromjpeg($file['tmp_name']);
|
|
|
|
if (!$srcImage) {
|
|
echo json_encode(['success' => false, 'error' => 'Fichier image corrompu']);
|
|
exit;
|
|
}
|
|
|
|
$width = imagesx($srcImage);
|
|
$height = imagesy($srcImage);
|
|
$newSize = 48;
|
|
$dstImage = imagecreatetruecolor($newSize, $newSize);
|
|
|
|
// Transparency for PNG
|
|
imagealphablending($dstImage, false);
|
|
imagesavealpha($dstImage, true);
|
|
$transparent = imagecolorallocatealpha($dstImage, 255, 255, 255, 127);
|
|
imagefilledrectangle($dstImage, 0, 0, $newSize, $newSize, $transparent);
|
|
|
|
imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $newSize, $newSize, $width, $height);
|
|
imagepng($dstImage, $targetPath);
|
|
|
|
imagedestroy($srcImage);
|
|
imagedestroy($dstImage);
|
|
|
|
$relativePath = 'assets/images/custom_emotes/' . $fileName;
|
|
$code = ':' . $name . ':';
|
|
|
|
try {
|
|
$stmt = db()->prepare("INSERT INTO custom_emotes (name, path, code) VALUES (?, ?, ?)");
|
|
$stmt->execute([$name, $relativePath, $code]);
|
|
echo json_encode([
|
|
'success' => true,
|
|
'emote' => [
|
|
'id' => db()->lastInsertId(),
|
|
'name' => $name,
|
|
'path' => $relativePath,
|
|
'code' => $code
|
|
]
|
|
]);
|
|
} catch (Exception $e) {
|
|
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
|
|
}
|
|
exit;
|
|
}
|
|
|
|
if ($action === 'rename' && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$id = $_POST['id'] ?? 0;
|
|
$newName = preg_replace('/[^a-z0-9_]/', '', strtolower($_POST['name'] ?? ''));
|
|
if (empty($newName)) {
|
|
echo json_encode(['success' => false, 'error' => 'Nom invalide']);
|
|
exit;
|
|
}
|
|
|
|
try {
|
|
$code = ':' . $newName . ':';
|
|
$stmt = db()->prepare("UPDATE custom_emotes SET name = ?, code = ? WHERE id = ?");
|
|
$stmt->execute([$newName, $code, $id]);
|
|
echo json_encode(['success' => true, 'name' => $newName, 'code' => $code]);
|
|
} catch (Exception $e) {
|
|
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
|
|
}
|
|
exit;
|
|
}
|
|
|
|
if ($action === 'delete' && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$id = $_POST['id'] ?? 0;
|
|
try {
|
|
$stmt = db()->prepare("SELECT path FROM custom_emotes WHERE id = ?");
|
|
$stmt->execute([$id]);
|
|
$emote = $stmt->fetch();
|
|
if ($emote) {
|
|
$filePath = __DIR__ . '/../' . $emote['path'];
|
|
if (file_exists($filePath)) unlink($filePath);
|
|
|
|
$stmt = db()->prepare("DELETE FROM custom_emotes WHERE id = ?");
|
|
$stmt->execute([$id]);
|
|
echo json_encode(['success' => true]);
|
|
} else {
|
|
echo json_encode(['success' => false, 'error' => 'Emote non trouvée']);
|
|
}
|
|
} catch (Exception $e) {
|
|
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
|
|
}
|
|
exit;
|
|
}
|