Compteur de jours restants dans le topic d'un channel irc (à éxécuter avec cron)

0/5 (5 avis)

Snippet vu 9 736 fois - Téléchargée 21 fois

Contenu du snippet

Ce script met à jour le topic d'un chan IRC à chaque appel. Il permet de gérer la maj d'un compte à rebours.
La config se fait en haut du fichier.

Le script a été fait pour se connecter à QuakeNet. Pour un autre réseau, vous risquez de devoir retoucher le protocole ainsi que de remplacer le système d'auth.

Pour l'automatiser, vous devez appeler ce script depuis un démon cron on assimilé (ou http://www.webcron.org/)

Les sleep(x) servent à ne pas se faire bannir du serveur IRC pour "Excess Flood" (trop de données à la suite).

Le reste du topic est conservé ! Le script ne change que la partie "J-xxx" ou ne fait rien si cette partie n'existe pas.

Source / Exemple :


<?php

$user = "PhpPooler";
$nick = "gdz|GodzilanBot";
$chan = "#godzilan";

$q_user = "QuakenetUser";
$q_pass = "QuakenetPassword";

// Godzilan 3: 26 octobre 2007
$jour = 26;
$mois = 10;
$annee = 2007;

// FIN CONFIG

//euroserv.fr.quakenet.org:6667
// Timeout de 15s

if (!($fp = @fsockopen("euroserv.fr.quakenet.org", 6667, $errno, $errstr, 15)))
{
	die("Connect failed.");
}

function vide_buffer($s)
{
	$status["unread_bytes"] = 1;
	while($status["unread_bytes"])
	{
		fgetc($s);
		$status = socket_get_status($s);
	}

}

function cancel($s,$reason)
{
	fputs($s, "QUIT :Abort\r\n");
	sleep(1);
	die("Operation cancelled: ".$reason);
}

sleep(1);
vide_buffer($fp);
fputs($fp, "NICK ".$user."\r\n");
sleep(1);
while(fread($fp, 5)!="PING ");
$ping = trim(fread($fp, 11),"\r\n");
sleep(1);
fputs($fp, "PONG ".$ping."\r\n");
sleep(1);
fputs($fp, "USER ".$user." 0 0 :Elektordi's PHP Pooler\r\n");
sleep(3);
vide_buffer($fp);
fputs($fp, "NICK ".$nick."\r\n");
sleep(3);
while(fread($fp, 1)!="~");
vide_buffer($fp);
fputs($fp, "TOPIC ".$chan."\r\n");
sleep(1);
$data=fread($fp, 1024);
$p0 = strpos($data, "332");
if($p0===FALSE) cancel($fp,"Can't get topic !");

$p1 = strpos($data, ":",$p0);
$p2 = strpos($data, "\n",$p1);
$topic = rtrim(substr($data,$p1+1,$p2-$p1),"\r");

$topic0 = $topic;

$p1 = strpos($topic, "J-");
if($p1===FALSE) cancel($fp,"No 'J-' in topic !");

$p2 = strpos($topic, " ", $p1);

// compte à rebours
$le_jour = date("j");
$le_mois = date("n");
$l_annee = date("Y");
$duree_restante=round((mktime(0, 0, 0, $le_mois, $le_jour, $l_annee)-mktime(0, 0, 0, $mois, $jour, $annee))/(24*60*60));
if ($duree_restante<)
{
 $decompte_affiche = "J".$duree_restante;
}
else $decompte_affiche = "* Jour J *";

// affichage du compte à rebours

$topic = substr_replace($topic,$decompte_affiche,$p1,$p2-$p1);

if($topic==$topic0) cancel($fp,"Already up to date.");

sleep(1);
fputs($fp, "PRIVMSG Q@CServe.quakenet.org :AUTH ".$q_user." ".$q_pass."\r\n");
sleep(1);
fputs($fp, "JOIN ".$chan."\r\n");
sleep(1);
while(fread($fp, 2+strlen($nick))!="o ".$nick)
{
	while(fread($fp, 1)!="+");
}
sleep(1);
fputs($fp, "TOPIC ".$chan." :".$topic."\r\n");
sleep(1);
fputs($fp, "QUIT :Cron Job Done\r\n");

echo "Topic changed to: ".$topic;

?>

Conclusion :


Script codé en 2h chrono...
(Cela explique le protocole "bourrin")

Deux petits rappels avant que vous ne l'utilisiez:
- Très peu d'hébergeurs gratuits ouvrent le port 6667 (ou autre) en sortie !
- Par défaut, un script php arrète de s'éxécuter au bout de 30 secs !

A voir également

Ajouter un commentaire Commentaires
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 mars 2007 à 07:35
pourquoi ne pas faire une classe IRC ? ou au moins des fonctions comme envoyerPRIVMSG, connectIRC, envoyerNOTICE, lireIRC ect...
cs_Elektordi Messages postés 186 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 21 janvier 2008
12 mars 2007 à 19:23
Pour pouvoir écrire facilement des apostrophes !

Et pous les ".$var." ca date de quand j'utilisait des '...
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
12 mars 2007 à 19:13
Re!
Si tu connais, pk utiliser " " presque partout? :)

@++

R@f
cs_Elektordi Messages postés 186 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 21 janvier 2008
12 mars 2007 à 18:45
Salut

Pour la diff entre " et ', merci je connais ;)

Sinon c'est vrai que pour les nombres, par ex au debut, je vais mettre des entiers. Mais certains (comme 62) doivent rester en texte.

Quand au <?php, c'est vrai que j'ai du mal à m'y habituer !

Merci,

Elektordi
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
12 mars 2007 à 10:54
Salut!
Je te propose de zieuter: http://www.allpotes.ch/~rpg/faq.html#opti_guillemets qui te présentera les différences entre les guillemets simples ou doubles. De plus, lorsque tu travailles avec des entiers (lignes 11 à 13 par ex) tu devrais les laisser en entiers (calculs bcp plus rapides, ... ) plutot que de les passer en chaînes de caractères ( $var '1' --> chanîne de caractère : $var 1 --> entier ).

Sinon, tu devrais utiliser <?php plutôt que <? car ces derniers ne sont pas reconnus sur tous les serveurs... Voilà, :)

@++

R@f

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.