API Statistiques IRC

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/%23accueil

2) Utilisateurs connectés d’un salon (JSON)

https://network.discut.biz/rest/service.php/channels/%23accueil/users
Extrait simplifié :
{
  "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.