$type,
'message' => $message
];
}
/**
* Récupérer et effacer un message flash de la session
*
* @return array|null Message flash ou null
*/
function get_flash_message() {
if (isset($_SESSION['flash_message'])) {
$message = $_SESSION['flash_message'];
unset($_SESSION['flash_message']);
return $message;
}
return null;
}
/**
* Afficher un message flash s'il existe
*/
function display_flash_message() {
$flash = get_flash_message();
if ($flash) {
$type = $flash['type'];
$message = $flash['message'];
// Convertir le type en classe Bootstrap
$class = 'alert-info';
if ($type === 'error') {
$class = 'alert-danger';
} elseif ($type === 'success') {
$class = 'alert-success';
} elseif ($type === 'warning') {
$class = 'alert-warning';
}
echo "
";
echo secure_output($message);
echo "";
echo "
";
}
}
/**
* Formater une date relative (aujourd'hui, hier, il y a X jours)
*
* @param string $date Date au format ISO ou timestamp
* @return string Date relative formatée
*/
function format_relative_date($date) {
if (is_numeric($date)) {
$timestamp = $date;
} else {
$timestamp = strtotime($date);
}
$now = time();
$diff = $now - $timestamp;
$day_diff = floor($diff / 86400);
if ($day_diff == 0) {
return "Aujourd'hui";
} else if ($day_diff == 1) {
return "Hier";
} else if ($day_diff < 7) {
return "Il y a $day_diff jours";
} else {
return date('d/m/Y', $timestamp);
}
}
/**
* Compter les quêtes pour un monstre
*
* @param int $monster_id ID du monstre
* @param string|null $crown_type Type de couronne (null pour toutes)
* @return int Nombre de quêtes
*/
function count_quests_for_monster($monster_id, $crown_type = null) {
$db = get_db_connection();
if ($crown_type === null) {
$stmt = $db->prepare('SELECT COUNT(*) as count FROM quests WHERE monster_id = :monster_id');
$stmt->bindParam(':monster_id', $monster_id, PDO::PARAM_INT);
} else {
$stmt = $db->prepare('SELECT COUNT(*) as count FROM quests WHERE monster_id = :monster_id AND crown_type = :crown_type');
$stmt->bindParam(':monster_id', $monster_id, PDO::PARAM_INT);
$stmt->bindParam(':crown_type', $crown_type);
}
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
return $result['count'];
}
/**
* Générer les statistiques globales
*
* @return array Tableau de statistiques
*/
function get_site_statistics() {
$db = get_db_connection();
// Compter les monstres
$stmt = $db->query('SELECT COUNT(*) as count FROM monsters');
$monsters_count = $stmt->fetch(PDO::FETCH_ASSOC)['count'];
// Récupérer les statistiques de quêtes
$quests_stats = count_quests_by_crown_type();
return [
'total_monsters' => $monsters_count,
'total_quests' => $quests_stats['total_quests'],
'small_crown_quests' => $quests_stats['small_crown_quests'],
'large_crown_quests' => $quests_stats['large_crown_quests']
];
}
/**
* Vérifier si une URL d'image est valide
*
* @param string $url URL de l'image
* @return bool L'URL est-elle valide
*/
function is_valid_image_url($url) {
// Vérifier si l'URL commence par le dossier d'images
if (strpos($url, 'assets/img/') !== 0) {
return false;
}
// Vérifier l'extension de l'image
$valid_extensions = ['jpg', 'jpeg', 'png', 'gif'];
$extension = strtolower(pathinfo($url, PATHINFO_EXTENSION));
return in_array($extension, $valid_extensions);
}