API REST Discut.Biz
Webmaster ? Affiche en direct sur ton site les infos d’un salon IRC (topic, utilisateurs, modes…) ou les stats réseau.
L’API REST (MagIRC & Anope) renvoie du JSON simple à consommer pour tes widgets, blocs et dashboards.
Toutes les réponses sont au format JSON. Utilise le proxy PHP ci-dessous si ton site bloque les requêtes cross-domain (CORS).
Exemples rapides
1) Infos d’un salon (JSON)
https://network.discut.biz/rest/service.php/channels/%23accueil2) Utilisateurs connectés d’un salon (JSON)
https://network.discut.biz/rest/service.php/channels/%23accueil/users{
"channel": "#Accueil",
"users": "4",
"topic": "Bienvenue dans le Salon d'accueil de Discut.Biz",
"topic_author": "Cris",
"modes": "nPrt"
}Widget JS : compteur d’utilisateurs
Affiche en live le nombre d’utilisateurs présents sur #Accueil :
#Accueil — … utilisateur(s) connectés
<script>
fetch('https://network.discut.biz/rest/service.php/channels/%23accueil')
.then(r => r.json())
.then(data => {
document.getElementById('accueilCount').textContent = data.users || '0';
})
.catch(() => {
document.getElementById('accueilCount').textContent = 'N/A';
});
</script>Proxy PHP (anti-CORS + cache)
Crée un fichier proxy-irc.php à la racine de ton site. Ce proxy whiteliste les endpoints, ajoute un cache simple (60s) et renvoie du JSON.
<?php
// proxy-irc.php
header('Content-Type: application/json; charset=utf-8');
// --- config ---
$base = 'https://network.discut.biz/rest/service.php/';
$allowed = [
'channels/%23accueil',
'channels/%23accueil/users',
// Ajoutez ici vos salons autorisés :
// 'channels/%23quizz',
// 'channels/%23quizz/users',
];
// --- param ---
$endpoint = isset($_GET['endpoint']) ? trim($_GET['endpoint']) : '';
if (!in_array($endpoint, $allowed, true)) {
http_response_code(400);
echo json_encode(['error' => 'Endpoint non autorisé']);
exit;
}
// --- cache (60s) ---
$cacheDir = __DIR__ . '/cache-api';
if (!is_dir($cacheDir)) { @mkdir($cacheDir, 0755, true); }
$cacheFile = $cacheDir . '/' . md5($endpoint) . '.json';
$ttl = 60;
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $ttl)) {
readfile($cacheFile);
exit;
}
// --- fetch distant ---
$url = $base . $endpoint;
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_USERAGENT => 'DiscutProxy/1.0',
]);
$res = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$err = curl_error($ch);
curl_close($ch);
if ($code !== 200 || $res === false) {
http_response_code(502);
echo json_encode(['error' => 'Source indisponible', 'detail' => $err]);
exit;
}
// --- sauvegarde cache ---
file_put_contents($cacheFile, $res);
echo $res;Utilisation du proxy
<script>
// Infos du salon #Accueil via proxy local
fetch('/proxy-irc.php?endpoint=channels/%23accueil')
.then(r => r.json())
.then(d => {
console.log('Topic:', d.topic);
console.log('Utilisateurs:', d.users);
});
</script>Widget “Topic” prêt à l’emploi
Chargement du topic…
<script>
(async () => {
const res = await fetch('/proxy-irc.php?endpoint=channels/%23accueil');
const d = await res.json();
const el = document.getElementById('topicCard');
el.innerHTML = `
<div style="font-weight:700;margin-bottom:6px">#Accueil</div>
<div style="opacity:.95">${(d.topic || '—')}</div>
<div style="margin-top:6px;font-size:12px;opacity:.85">
Utilisateurs: <strong>${d.users || 0}</strong> — Modes: <code>${d.modes || '-'}</code>
</div>`;
})();
</script>Besoin d’un widget sur-mesure ?
On peut t’aider à créer : “qui est connecté”, compteur global réseau, tuile “salon en vedette”, bannière live, etc.