Antiflood simple ... mais puissant

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 940 fois - Téléchargée 33 fois

Contenu du snippet

Il s'agit ici d'une base d'antiflood (le noyau quoi) permettant d'être utilisée très facilement n'importe où. C'est à dire que vous pouvez à la fois vous en servir pour vous et pour votre bot fait en socket.

>> Ce script est fait uniquement en hash tables et surtout sans aucuns timers !

Sommaire :
En haut : Des explications théoriques bien rébarbatives.
Au milieu : Le code source (2 aliases de 12 lignes en tout) suivit d'un exemple d'utilisation.
En bas : Aide sur les deux fonctions.

Prenons un anti-flood au hazard et reglons le sur 5 messages toutes les 10 secondes maximum, maintenant à l'aide d'un script effectuons la manipulation suivante :

A t=0 : on envois 1 message => l'anti-flood demarre un timer, il me reste 9 message max.
A t=4,5~4,9 : on envois 9 messages => plus que 0 message ! Je passe tout juste.
A t=5 : le timer s'arrête, j'ai envoyé 10 messages ; je suis sous la barre donc l'anti-flood me supprime de sa base de données.
A t=5,1~5,5 : on envois 10 messages (l'anti-flood démarre un nouveau timer : il me reste 0 message, c'est juste mais ca passe)

Vous constaterez que bien qu'ayant envoyé pas moins de 19 messages en 1 seule seconde la majorité des anti-flood vous laissent passer. D'où tout l'interêt de mémoriser la date d'apparition de chaque message de chaque utilisateur (dans la limite du temps imparti : 10 secondes).

Recommandations d'usages :

Ne faites pas plusieurs tables de hachages si vous utilisez ce script de plusieurs façons à la fois ! En effet vu la facon dont celles-ci fonctionnent, ce genre d'utilisation est leur spécialité, vous pouvez la grossir autant que vous voulez sans ralentir le script. Augmentez juste en conséquance l'intervalle possible de clé (Que j'ai appelé <taille htable> et qui est utilisé dans hmake) et pensez aussi a maintenir des identifiant <ident> différent d'une version à l'autre pour éviter les collisions. Pour obtenir des identifiants différents à coup sûr, vous pouvez précéder chaque occurance d'une lettre unique "p" pour votre antiflood perso, "b" pour celui du bot, etc.

Je n'ai pas vérifié mais il me semble que vous pouvez modifier les paramêtres <nbr msg> et <secs> en cours de route sans (trop de :p) dégâts (vérifiez par vous-même avant si vous comptez modifier fréquement ces paramêtres).

Source / Exemple :


; Voici le code source :
antiflood.ontext {
 if $0 < 6 { echo 4 -s * Erreur : "/antiflood.ontext <ident> <nbr msg> <secs> <nom htable> <taille htable> <fct onflood>" utilisée avec : $1- | halt }
 if (!$hget($4)) .hmake $4-5
 var %ctime $ctime, %data $hget($4,$1), %dern $gettok(%data $+ ,$calc($2 - 1),32)
 if (%dern == $null) { hadd -u $+ $3 $4 $1 %ctime %data }
 elseif ($calc(%dern + $3 - %ctime) <= 0) { hadd -u $+ $3 $4 $1 %ctime $gettok(%data $+ ,1- $+ $calc($2 - 2),32) }
 else { $6- }
}
antiflood.onnick {
 if $0 != 4 { echo 4 -s * Erreur : "/antiflood.onnick <ident> <newident> <secs> <nom htable>" utilisée avec : $1- | halt }
 if ($hget($4)) && ($hget($4,$1)) { hadd -u $+ $3-4 $2 $ifmatch | hdel $4 $1 }
}

; Voici l'exemple :
on *:text:*:#:/antiflood.ontext $nick $+ @ $+ $cid $+ # 5 3 antiflood 10 kick # $nick Pas de flood !
on *:nick:{
 var %i $comchan(nick,0)
 while (%i > 0) {
   antiflood.onnick $nick $+ @ $+ $cid $+ $comchan($nick, $+ %i) $newnick $+ @ $+ $cid $+ $comchan($nick, $+ %i) 3 antiflood
   dec %i
} }

Conclusion :


Remarque - Vous pouvez obtenir de l'aide sur les deux fonctions utilisées en les tapant sans paramêtre :
/antiflood.ontext
/antiflood.onnick

Explications concernant l'exemple :
Etant donné que notre exemple traite chaque canal à part, il est nécessaire que le "onnick" s'applique à chaque canal que vous avez en commun avec la personne. Notez que l'on utilise $cid pour éviter le cas où vous auriez le même server/canal ouvert par deux connections (ou plus).

Décomposition des paramêtres dans la fonction /antiflood.ontext :
<ident> = $nick $+ @ $+ $cid $+ # ; Ceci permet que le script traite chaque canal et chaque network différament (cf. explications)
<nbr msg> = 5 ; Nombre de message que l'on peut dire ....
<secs> = 3 ; .... sur le nombre de secondes.
<nom htable> = antiflood
<taille htable> = 10 ; cf. Dans l'aide à "hash table", c'est le N de hmake
<fct onflood> = kick # $nick Pas de flood ! ; commande à executer en cas de flood, pensez à mettre un alias perso pour faire plusieurs commandes.

Décomposition des paramêtres dans la fonction /antiflood.onnick :
<ident> = $nick $+ @ $+ $cid $+ $comchan($nick, $+ %i) ; ancien identifiant de la personne pour chaque canal
<newident> = $newnick $+ @ $+ $cid $+ $comchan($nick, $+ %i) ; nouvel identifiant de la personne la aussi pour chaque canal
<secs> = 3 ; idem que tout a l'heure
<nom htable> = antiflood ; idem que tout a l'heure

Note de fin : Notez que ce script peut s'utiliser pour contrôler la fréquence de n'importe quel système de flux de donnée si l'intégrité ou/et l'ordre ne sont pas importants (on peut en effet à la place du kick mettre un système de timer qui relance la commande un peu plus tard).

A voir également

Ajouter un commentaire

Commentaires

cs_lebaronrouge
Messages postés
289
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
14 février 2009
-
Il serait interessant de pouvoir activer les fonctions en cascade , a savoir : si X avertissements = kick , et si X kicks = kickban X durée
cs_lebaronrouge
Messages postés
289
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
14 février 2009
-
oui ca m'interesse car j'ai un bot mirc qui fait office de barman avec toute une liste de commandes pour servir les users selon ce qu'ils tapent sur le canal et le barman leurs sert , le probleme c'est que je galere un peu a faire en sorte que mon barman ne parte pas en excess flood car il gere aussi la moderation de mon chan ( antiflood antii pub anti insulte auto voice etc)
cs_Melnofil
Messages postés
77
Date d'inscription
dimanche 23 juin 2002
Statut
Membre
Dernière intervention
1 février 2008
-
C'est pas un script pour s'empecher soit-même de flooder c un script pour réagir aux flood des autres personnes du channal.
Tiens a propos j'ai fait un système d'anti-flood personnel comme tu dis pour un bot si ca peut interesser des gens je peut le poster.
cs_Frecky
Messages postés
85
Date d'inscription
lundi 18 février 2002
Statut
Membre
Dernière intervention
20 novembre 2005
-
J'espere que ta pas oublier la queue list ?!
Si tu en n'utiluse pas, tu va Excess Flooder c'est sur quand y va avoir un vrai flood.

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.