begin process at 2008 05 17 08:58:42
1 173 931 membres
61 nouveaux aujourd'hui
13 973 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BOT GARDIEN DE CHAN AVEC MODULES RÉGLABLES (ANTI-TAKEOVER, FLOOD, PUB, RETOUR DE PUB, ...)


Information sur la source

Catégorie :Bots Niveau : Initié Date de création : 21/04/2004 Date de mise à jour : 28/10/2005 12:48:03 Vu : 14 524

Note :
9 / 10 - par 3 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

Description

Edit : ce bot n'existe plus, car je n'ai plus de serveur.
Si vous voulez télécharger un bot du même type, avec plus de fonctionnalités et mieux codé, c'est ici : http://www.ircfr.com/code.aspx?id=33469
Je laisse tout de même la description :

Ce bot était hébergé 23h59/24 sur le serveur Quakenet, par moi-même, et pouvait-être fourni à d'autres chans (20 max).

Ce bot est donc personnalisable, on peut facilement activer ou desactiver des modules (au nombre de 10 : anti-clones, anti-flood, anti-pub, anti-TakeOver, anti-kick, retour de pub, auto-voice, bitch mode, anti-changemode, anti-changetopic)

En plus des modules, on peut rajouter des messages personnalisés (!recrut, !site, !membres, !serveur, en plus d'une phrase qui peut se rajouter à celle du retour de pub).

Il peut également se souvenir de trois topics (celui actuel, un sauvegardé, et un forcé).
Il comprends également les msg du type : /msg [A] op #chan, voice, ou invite.

Ce bot est encore composé de petites stats concernant ses actions sur le chan, ainsi qu'un système de chanlev semblable au Q de Quakenet.

Chaques informations sont stockées dans des fichiers .ini.
Si le bot est ban, il revient à l'aide de Q ou L (donc flag +ao).

De plus, j'ai créé un script pour gérer le plus facilement possible ce bot sur votre chan, à l'aide d'une boîte de dialogue, contenant toute l'aide nécessaire sur ce script et sur les fonctions du bot. (voir screen)

Le [A] vous reconnait selon votre auth Qnet, et donc ne peut pas vous confondre avec une autre personne, a moins que vous vous êtes fait voler votre auth ... :)

L'échange est pratiquement gratuit, je ne demande que quelques performs, ainsi que si possible une petite pub.


Je ne mets pas le code du bot ici (tant d'heures de travail pour le donner à des personnes que je ne connais pas, désolé, mais je n'aime pas :). D'autant plus que je veux garder le nick actuel, et que l'ont passerait encore une fois trop de temps à expliquer comment tout configurer). Mais je voudrai juste avoir vos avis concernant ce bot, ainsi que pourquoi pas quelques conseils.

Le code est une partie du script fourni avec le bot sur votre chan. C'est tout simplement des stats concernant le nombre de personnes que vous controlez. Avec mon script, j'arrive à rassembler toutes les caractéristiques des bots (mIRC secondaires), pour faire les mêmes stats mais enles comptant tous. Ca ne flood personne, car les infos sont communiquées par fichier texte :)

Source

  • alias pouvoir { power.calc | say 12,1[ 0Canaux où je suis OP : 12 $+ %opchans $+ 11/12 $+ %total.chan 0( $+ $calc(%opchans * 100 / %total.chan) $+ % $+ ) 11::0 Personnes que je contrôle : 12 $+ %peons $+ 11/12 $+ %total.pers 0 $+ ( $+ $calc(%peons * 100 / %total.pers) $+ % $+ ) 12] }
  • alias power { power.calc | say 12,1[ 0Chans where I am opped : 12 $+ %opchans $+ 11/12 $+ %total.chan 0( $+ $calc(%opchans * 100 / %total.chan) $+ % $+ ) 11::0 Number of persons under my domination : 12 $+ %peons $+ 11/12 $+ %total.pers 0 $+ ( $+ $calc(%peons * 100 / %total.pers) $+ % $+ ) 12] }
  • alias power.calc {
  • set -u0 %peons 0
  • set -u0 %opchans 0
  • set -u0 %total.chan 0
  • set -u0 %total.pers 0
  • :loop
  • if ($calc(%total.chan +1) > $chan(0)) { return }
  • inc %total.chan
  • if ($me ison $chan(%total.chan)) {
  • set %total.pers $calc(%total.pers + $nick($chan(%total.chan),0))
  • }
  • if ($me isop $chan(%total.chan)) {
  • set %peons $calc(%peons + $nick($chan(%total.chan),0))
  • inc %opchans
  • }
  • goto loop
  • }
alias pouvoir { power.calc | say 12,1[ 0Canaux où je suis OP : 12 $+ %opchans $+ 11/12 $+ %total.chan 0( $+ $calc(%opchans * 100 / %total.chan) $+ % $+ ) 11::0 Personnes que je contrôle : 12 $+ %peons $+ 11/12 $+ %total.pers 0 $+ ( $+ $calc(%peons * 100 / %total.pers) $+ % $+ ) 12] }

alias power { power.calc | say 12,1[ 0Chans where I am opped : 12 $+ %opchans $+ 11/12 $+ %total.chan 0( $+ $calc(%opchans * 100 / %total.chan) $+ % $+ ) 11::0 Number of persons under my domination : 12 $+ %peons $+ 11/12 $+ %total.pers 0 $+ ( $+ $calc(%peons * 100 / %total.pers) $+ % $+ ) 12] }

alias power.calc {
  set -u0 %peons 0
  set -u0 %opchans 0
  set -u0 %total.chan 0
  set -u0 %total.pers 0
  :loop
  if ($calc(%total.chan +1) > $chan(0)) { return }
inc %total.chan
  if ($me ison $chan(%total.chan)) {
    set %total.pers $calc(%total.pers + $nick($chan(%total.chan),0))
  }
  if ($me isop $chan(%total.chan)) {
    set %peons $calc(%peons + $nick($chan(%total.chan),0))
    inc %opchans
  } 
  goto loop
}

Conclusion

Ce bot n'existe plus. Si vous en voulez un meilleur bot réalisant d'avantage de fonctions, c'est ici : http://www.ircfr.com/code.aspx?id=33469
28 octobre 2005 12:48:03 :
Mise à jour de l'état du bot (n'existe plus) - http://www.ircfr.com/code.aspx?id=33469 pour un meilleur bot :)
  • signaler à un administrateur
    Commentaire de juki_webmaster le 21/04/2004 21:05:56

    Agréable cette communauté !
    Dommage que je ne vais jamais sur quakenet.
    Tu garde la source du robot c'est ton choix,mais faudrais qu'ont puise bien le personnaliser.
    Sinon sa ma l'aire trés bien.

  • signaler à un administrateur
    Commentaire de Kerrigan le 23/04/2004 00:28:31

    Mais pourquoi tu postes pas le bot ? cet alias tout le monde peut le faire alors que visiblement tu sais faire mieux que ça. c'est a n'y rien comprendre.

    En plus je suis très intéressé par ton antikick et ton anti takeover, je suis très dubitatif a leur sujet pour ne rien te cacher.

    Tout ce qu'on demande ici c'est voir de belle chose. Plein de newbie postent des source minables et toi ben :

    "tant d'heures de travail pour le donner à des personnes que je ne connais pas, désolé, mais je n'aime pas :)"

    faut pas venir ici si tu le prends comme ça :D
    bonne continuation.

  • signaler à un administrateur
    Commentaire de RCA ArKanis le 23/04/2004 11:12:50

    Ce que je ne veux pas, c'est poster tout le bot, mais rien ne m'empeche de coller des choses que vous recherchez dedans :)

    Mon système pour ne whois qu'une fois :
    ON *:TEXT:*:?:{
      set %commande $1-
      if ($readini(Auth-Keep.ini,$nick) == $null) { .timerwhois -h 1 50 whois $nick }
    }
    raw 330:*:{
      set %auth.nick $3
      set -u0 %t $2
      writeini -n Auth-Keep.ini Auth %t %auth.nick
    ; $2 est le nick, et $3 l'auth
    ; Je ne sais pas si cela marche autre part que sur Quakenet
      writeini -n SVG-Auth-Keep.ini Auth %t %auth.nick
      commande.suite %commande
    }

    alias commande.suite {
    ; Ici vous mettez ce que vous voulez en faire de l'auth
    }



    ;Autre remote : mettre des flags (+ ou - amnovg)
    ;(toujours sur Quakenet, l'équivalent des flags de L et Q)

    ;Format de ce qui arrive en chanlev :
    ; $1 = nick de la personne qui met le flag
    ; $2 = Message (sans importance)
    ; $3 = chanlev (sans importance)
    ; $4 = Chan où le flag vas être mis
    ; $5 = Auth auquel rajouter le flag
    ; $6 = Flag

    alias chanlev {
      set %nick $1
      set %chan $4
      set %auth $5
      set %auth $replace(%auth,$chr(35), )
      set %flag $6
      unset %a | unset %m | unset %n | unset %o | unset %v | unset %g | unset %b
      set %temp.chan %chan
      set %temp.nick %auth
      set %temp.flag $flag.nick
      if (($findtok(%flag,-,0,32) > 1) || ($findtok(%flag,+,0,32) > 1)) { flood %nick | .notice %nick 12,1[ 0Too much signs (-/+) 12] | return }
    ; flood $nick : c'est un anti-flood du bot => trop de commandes envoyé par nick, et il est ignore
      if (($left(%flag,1) != +) && ($left(%flag,1) != -)) { flood %nick | .notice %nick 12,1[ 0Invalid flag specified. Valid flags are: + or - amnovgb 12] | unset %whois | return }
      flag.control.h
      unset %s
      if ($left(%flag,1) == +) { set %s + | tokenize 43 %flag | if (- isin $1-) { tokenize 45 $1- } }
      if ($left(%flag,1) == -) { set %s - | tokenize 45 %flag | if (+ isin $1-) { tokenize 43 $1- } }
      if (%s == $null) { return }
    ; Il compare dans les lignes qui suivent le nouveau à l'ancien flag, pour garder des flags qu'il ne faut pas enlever
      set %h $1
      flag.control
      if (%s == +) { set %s - | goto hehe }
      if (%s == -) { set %s + | goto hehe }
      :hehe
      set %h $2
      if (%h == $null) { unset %temp2 | goto fin }
      flag.control
      :fin
      set %temp $null
      if (%a == 1) { set %temp %temp $+ a }
      if (%m == 1) { set %temp %temp $+ m }
      if (%n == 1) { set %temp %temp $+ n }
      if (%o == 1) { set %temp %temp $+ o }
      if (%v == 1) { set %temp %temp $+ v }
      if (%g == 1) { set %temp %temp $+ g }
      if (%b == 1) { set %temp %temp $+ b }
      flood %nick
      unset %whois
      unset %whois2
      if (%temp != $null) {
    ; Il écrit ici le flag dans un fichier.ini : $chan.ini
        writeini -n [ [ $replace(%chan,*,1002) ] $+ ] .ini Flag $replace(%auth,$chr(35), ) %temp
      }
      if (%temp == $null) {
        remini [ [ $replace(%chan,*,1002) ] $+ ] .ini Flag $replace(%auth,$chr(35), )
      }
      .notice %nick 12,1[ 0Done. 12]
    }

    alias flag.control {
      if (%s == +) {
        if (a isin %h) { set %a 1 }
        if (m isin %h) { set %m 1 }
        if (n isin %h) { set %n 1 }
        if (o isin %h) { set %o 1 }
        if (v isin %h) { set %v 1 }
        if (g isin %h) { set %g 1 }
        if (b isin %h) { set %b 1 }
      }
      if (%s == -) {
        if (a isin %h) { set %a 0 }
        if (m isin %h) { set %m 0 }
        if (n isin %h) { set %n 0 }
        if (o isin %h) { set %o 0 }
        if (v isin %h) { set %v 0 }
        if (g isin %h) { set %g 0 }
        if (b isin %h) { set %b 0 }
      }
    }

    alias flag.control.h {
      set %h %temp.flag
      if (a isin %h) { set %a 1 }
      if (m isin %h) { set %m 1 }
      if (n isin %h) { set %n 1 }
      if (o isin %h) { set %o 1 }
      if (v isin %h) { set %v 1 }
      if (g isin %h) { set %g 1 }
      if (b isin %h) { set %b 1 }
    }

    alias flag.nick {
      if ((%temp.chan == $null) || (%temp.nick == $null)) { return }
      return $readini([ [ $replace(%temp.chan,*,1002) ] $+ ] .ini , Flag , %temp.nick)
    }

    ; Tout ceci est assez mal rédigé, mais ca marche, alors j'ai pas cherché à modifier


    ;L'anti-kick est tout simplement un kick/ban du gars qui a kické, excepté si il est owner du bot (impossible d'empecher un kick, donc "anti" a seulement été choisi pour mieux comprendre à quoi ça sert).

    ;Anti-Takeover (encore un fois ne peut être totalement sûr à 100% : si le TOer est owner du L ou Q). Il consiste a bannir si il y a trop de kicks, et a revenir si il est ban.


    ON *:KICK:#:{
    if ($me !isop $chan) { return }
        if ($readini([ [ $replace($chan,*,1002) ] $+ ] .ini,Kickeur,$address(nick,3)) == $null) { set %kickeur 0 }
        else { set %kickeur $readini([ [ $replace($chan,*,1002) ] $+ ] .ini,Kickeur,$address($nick,3)) }
        inc %kickeur
        writeini -n [ [ $replace($chan,*,1002) ] $+ ] .ini Kickeur $address($nick,3) %kickeur
        .timerkick. $+ $1 1 30 remini [ [ $replace($chan,*,1002) ] $+ ] .ini Kickeur $address($nick,3)
        if (%kickeur >= 3) { b $chan $nick 12,1[ 0No Mass Kick on this channel ! 12] }
    }
    alias b {
      if ($2 !ison $chan) { return }
      mode $1 -o+b $2 $address($2,3) | kick $1 $2 $3-
    }

    ;Et pour revenir :

    raw 471:*:{ if ($me !ison $2) { set %temp $2 | retrouver.chan $2 } }
    raw 473:*:{ if ($me !ison $2) { set %temp $2 | retrouver.chan $2 } }
    raw 474:*:{ if ($me !ison $2) { set %temp $2 | retrouver.chan $2 } }
    raw 475:*:{ if ($me !ison $2) { set %temp $2 | retrouver.chan $2 } }
    raw 477:*:{ if ($me !ison $2) { set %temp $2 | retrouver.chan $2 } }

    alias retrouver.chan {
      set %temp.chan $1
      if ($operateur.trouver == L) { .timerrecover. $+ $1 1 3 msg L recover $1 | .timerchanlev 1 1 msg L chanlev $1 %mon.kickeur -amo | .timerrecover1. $+ $1 -h 1 3500 msg L invite $1 }
      if ($operateur.trouver == Q) { .timerdeopall. $+ $1 1 2 msg Q deopall $1 | .timerchanlev 1 1 msg Q chanlev $1 %mon.kickeur -amo | .timerclear. $+ $1 1 5 msg Q clearchan $1 | timerunban. $+ $1 1 7 msg Q unbanall $1 | timerrejoin. $+ $1 1 10 msg Q invite $1 }
      if ($exists([ [ $replace($1,*,1002) ] $+ ] .ini)) { kick.inc $1 }
    }

    ON *:JOIN:#:{
    if ($nick != $me) { return }
      if (Q ison $chan) { writeini -n [ [ $replace(%temp.chan,*,1002) ] $+ ] .ini Config Bot Q }
      if (L ison $chan) { writeini -n [ [ $replace(%temp.chan,*,1002) ] $+ ] .ini Config Bot L }
    }


    ; J'admet que c'est pas très clair tout ceci, mais au moins j'ai donné ce que tu m'as demandé. J'ai sûrement oublié quelques petites condtions à supprimer, donc je ne pense pas qu'un simple copier/coller suffise pour que tout ceci marche :)

    ++ hf

  • signaler à un administrateur
    Commentaire de Kerrigan le 25/04/2004 03:02:39

    c'est pas mal mais ça merite une petite cure d'optimisation.

    if ($me !ison $2) { set %temp $2 | retrouver.chan $2 }
    transforme ça en alias pour factoriser et ne pas répéter de ligne, ça a plus de style. (et ya moins de caractere donc c plus rapide (je crois ) )

    cette alais la merite un ptit changement tu me diras si c possible
    alias flag.control.h {
    set %h %temp.flag
      if (a isin %h) { set %a 1 }
    ;je copie pas le reste
    }

    pourquoi pas :
    alias flag.control.h {
      if (a isin %temp.flag) { set %a 1 }
    ;idem pour le reste
    }

    le  "== $null" ne sert a rien
    ON *:TEXT:*:?:{
      set %commande $1-
      if (!$readini(Auth-Keep.ini,$nick)) { .timerwhois -h 1 50 whois $nick }
    }

    ceci :
    $readini([ [ $replace($chan,*,1002) ] $+ ] .ini,Kickeur,$address($nick,3))

    devient :
    $readini($+($replace($chan,*,1002),.ini),Kickeur,$address($nick,3))
    tu  n'as pas besoin des crochets d'évaluations

    pareil pour :
    writeini -n [ [ $replace(%temp.chan,*,1002) ] $+ ] .ini Config Bot Q

    qui devient :
    writeini -n $+($replace(%temp.chan,*,1002),.ini) Config Bot Q

    petite modif pour diminuer le nombre de char et optimiser le code :
    alias flag.nick {
      if (%temp.chan ) && (%temp.nick ) {
      return $readini($+($replace(%temp.chan,*,1002),.ini),Flag,%temp.nick)
    }

      set %nick $1
      set %chan $4
      set %auth $5
      set %auth $replace(%auth,$chr(35), )
      set %flag $6

    a la suite c un usage abusif des variables. Allege le code avec des tokkens c'est plus stylé et je trouve que c'est mieux meme si ça tue le cerveau parfois. ( en plus tu les utilises (les tokkens) dans ton code tu n'as aucune excuse lol )

    une derniere chose tu nous montre que tu sais utiliser les fichier ini mais tu satures ton fichier de variable ... utilise un autre fichier ini pour stocker tes variables ... MAIS, tu pourrais me dire que ça serait lent ?! hey bien passe aux hastables c'est presque pareil que les fichier ini.

    je ne suis pas convaincu de la nécéssité de tes "==" dans tes conditions ( if ) enlevé les caratere en "trop" c'est rendre un code plus rapide il parait , tu devrais gagner un quart de sezieme de milième de seconde mais c'est deja ça ;)

    $operateur.trouver ... soit je sais pas lire ce qui n'est pas improbable soit il n'est nul part dans ton code :(

    donc pour conclure , les choses a retenir :

    if ( %truc = $null ) { } devient if (!%truc ) { }
    if ( %truc != $null ) { } devient if (%truc ) { }

    les crocher d'évaluations ne sont en générale utile que dans des syntaxe du type :

    %truc- [ $+ [ %itr ] ] (j'apelle ça une indirection comment t'apel ça toi ?)
    pour les $replace ... ils ne servent a rien, pense a $+(,) ça fait gagner de la place

    Et honnetement je n'aurais pas passer du temps a "corriger" ta source si ça ne me plaisait pas a la base. C'est du bon travail. Mais je veux voir le bot entier moi !!!!!!!!!! lol comme ça on pourra avancer dans ton code en lui donnant une sacrée cure d'optimisation !! il sera plus rapide plus fonctionel et j'en passe ...

    T sur la bonne voie ne t'arretes pas !

  • signaler à un administrateur
    Commentaire de RCA ArKanis le 25/04/2004 11:26:33

    alias operateur.trouver { return $readini($+(%temp,*,1002),.ini,Config,Bot) }
    :p

    Merci beaucoup pour toutes ces corrections (qui viennent du fait que je ne lise aucun livre sur les méthodes, je ne fais que de regarder "comment font les autres", et j'essaye d'améliorer.

    Pour la source entière du bot, je ne peux toujours pas la donner, car j'ai également toujours peur que l'on modifie la source (dont l'auteur), et que ce gars deviennent hyper populaire à grâce à ce remote (on sait jamais :p). Et de plus, je ne pense pas être le seul à avoir fait un bot dans ce type, et si je donne toute la source au public, ca risque de les géner (vous remarquerez que j'ai toujours de bonnes excuses :p). Moi-même, quand je modifie une source d'un autre, je mets toujours de qui je l'ai pris (ou de où), et me mets : modify by ArKanis (c'est le cas de mon 2eme remote sur ce site : journal + météo)

    Je ne pense pas que tu sois comme ceux que je viens de décrire, donc si tu y tiens vraiment, je pourrai te passer tout le bot (pourvu qu'il ne devienne pas public).


    M'enfin donc, merci beaucoup pour tout tes conseils, je m'en vais l'optimiser de suite :)

  • signaler à un administrateur
    Commentaire de Kerrigan le 25/04/2004 12:39:52

    Se faire rippé c'est un risque a prendre mais ça ne doit surtout pas t'empecher de poster ici. Tant pis pour les ripper eux ne valent rien moi aussi je sais faire un c/c et soit sur que personne ne deviendras populaire en utilisant ta source meme modifier.

    Tout le monde a deja vu que tu en parles ici et si qqun essai de te copier ça se vera et comme d'hab il sera puni par un magnifique 1/10 assortit de la vindicte de tous les scripteurs du site !!!!!

    Si tu as besoin d'autre conseil pour avancer dans ton bot tu peux toujours me faire signe.

  • signaler à un administrateur
    Commentaire de z_Murf le 16/02/2005 17:31:31

    kestion : pk tu met des on / off et pas des checkbox ?

  • signaler à un administrateur
    Commentaire de neo66 le 30/04/2005 21:05:41

    salut,
    if ($operateur.trouver == Q) { .timerdeopall. $+ $1 1 2 msg Q deopall $1 | .timerchanlev 1 1 msg Q chanlev $1 %mon.kickeur -amo | .timerclear. $+ $1 1 5 msg Q clearchan $1 | timerunban. $+ $1 1 7 msg Q unbanall $1 | timerrejoin. $+ $1 1 10 msg Q invite $1 }

    perso j'utilise ca:
      if (%bot == Q) {
        msg Q chanlev %chan %nick -amovt+b
        .timer 1 1 msg Q recover %chan
        .timer 1 1 msg Q ban %chan %host
        .timer 1 2 $iif($me !ison %chan, msg Q invite %chan)
        .timer 1 4 $iif($me !ison %chan, join %chan)
        .timer 1 5 $iif($me !isop %chan, msg Q op %chan)
        .timer 1 6 $iif(%nick ison %chan, recover.reply %nick %chan %host %raison, mode %chan +b %host)
      }

  • signaler à un administrateur
    Commentaire de RCA ArKanis le 01/05/2005 12:30:14

    ça évite qu'il y ait trop de flood, oui pourquoi pas
    ce bot est assez vieux, il faudrait que je le refasse entièrement :) sauf que j'ai pas beaucoup de temps :/
    je vais changer ça de suite, merci

  • signaler à un administrateur
    Commentaire de RCA ArKanis le 01/05/2005 12:31:53

    je ne met pas de checkbox parce que les données sont sur le bot, non sur ton script.
    Pour que les check box soient correctes, il faut vérifier sur le bot, et donc ça complique à ce niveau.
    Et puis il y a un bouton "ShowMod" qui te dit l'état de tous les modules, donc ça revient au même

  • signaler à un administrateur
    Commentaire de DevilsBlack le 18/07/2005 20:56:29

    Bah! sérieusement... Taurais du mettre le bot pour télécharger! Cé vrment plate :o(

  • signaler à un administrateur
    Commentaire de RCA ArKanis le 18/07/2005 22:47:20

    j'ai refait un bot de ce genre, mais avec 14 modules, 1 an et quelques mois après celui présenté ici.
    Je peux te dire qu'on apprend pas mal en 1 an et quelques mois :p
    Tu peux héberger toi même le bot (donc je "donne" la source)
    Le "problème", c'est qu'il faut mon addon (téléchargeable sur http://scripts.arkanis.info, partie de droite à lire), pour ensuite télécharger le bot du nom de BotWar (alias /botwar, ça DL tous les fichiers requis), pour enfin télécharger l'addon de protection pour BotWar :D
    BotWar est un bot Newseur, VIP, et Gardien, ... il fait pas mal de choses donc
    Je verrai si un jour je faciliterai le téléchargement ... :)
    Il fonctionne sur Quakenet uniquement (il gère L et Q)
    Si tu veux plus d'informations ou de l'aide, réponds à ce message ^^

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Boutique

Boutique de goodies CodeS-SourceS