Stocker le temps grace à time.clock() dans une variable ?!
Bonjour, je me permets une nouvelle fois de faire appel à vos lumiéres et à votre aide.
Mon problème est le suivant:
Je travail actuellement sur un Bot irc , (le programme en lui même importe peu ...), je voudrais que celui ci est capable d'interagir avec les évènements serveurs comme un l'entrée d'un utilisateur enfin c'est un detail .
Aucune connaissance du protocole irc n'est réquise pour mon probléme.
Je souhaiterais en gros pouvoir "détecter" l'entrée des l'utilisateur à savoir si par exemple il y a plus de trois entrées (join) en moins de 10 secondes celui ci n'est pas voicé ou kicker enfin la méthode importe peu ici c'est la détection et la gestion du timing qui me pose probléme.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
temps = 0
while true :
.
.
.
.
if data.find ( 'JOIN' ) != -1: #detection de l'entrée d'un utilisateur
print temps
if ( temps != 0 and (time.clock() < temps + 10)): #
nbrjoin = 0 #on ne rentre jamais ici ici car la condition n'est j'amais vrai : (
else :
nbrjoin = nbrjoin + 1
if nbrjoin > 3:
irc.send('PRIVMSG #salon:Join trop important probabilite de clones\n') #c'est toujours vrai au bout de 4 join : (
else:
nick = data.split ( '!' ) [ 0 ].replace ( ':', '' ) #récupération de son pseudonyme
irc.send ( 'MODE #salon +v ' + nick + '\n' ) #on donne la parole à l'utilisateur
temps=time.clock() |
On peut facilement envisager une utilisation de cette boucle dans une autre utilisation .
Mon probléme est simple , je pense qu'il vient de time.clock() , lorsque je stock time.clock() dans une variable (temps), il stock le temps processeur à l'instant T et non de maniére dynamique en continuant de compter comme je le voudrais pour pouvoir faire ma comparaison dans le premier IF.
Lorsque que je fais un print temps dans ma boucle il me renvoie toujours une valeur comprise entre 0.15 ou 0.16 .
Y'a t il moyen de pouvoir stocker le temps de maniére dynamique ? que celui ci continue de s'incrémenter même dans une variable ? Par dictionnaire ou liste je ne sais pas ou grace au thread ? .. Ou peu être que je n'utilise pas la bonne méthode de gestion du temps (je pense à time() par exemple.)
J'ai penché une bonne partie de la nuit sur ce soucis sans voir comme résoudre ce soucis de gestion du temps .... :aie:
TOUTES les idées sont évidement les bienvenues peu être que je cherche encore midi à quatorze heures.
Je vous remercie d'avance pour vos réponses.
Désolé pour le retard ...
Hello Parp1 et encore merci pour ta réponse , et désolé pour ma réponse fort tardive ...
J'ai pas mal avancé sur le sujet depuis et le problème venait effectivement d'une mauvaise utilisation de time (mon algo était tout naze d'ailleurs ..) time.time() comme tu me le conseillais est beaucoup plus approprié (celui ci renvoie le temps universel en seconde) il suffisait donc de comparer deux temps en secondes à chaque join est le tours est joué ... (je dis ça mais bon ...)
Voilà je code le morceau d'algo ici (attention c'est pas digeste du tout je code un peu avec mes pieds :x )
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| if data.find ( 'JOIN :'+chan ) !=-1:
nbrjoin = nbrjoin + 1
print nbrjoin
jtemps[nbrjoin]= time.time()
try :
if jtemps[(nbrjoin)] - jtemps[(nbrjoin - 1)] < 10 :
irc.send('PRIVMSG '+chan+' : Probabilité de clones.\n')
irc.send('KICK '+chan+' '+nick+' : Probabilité de clones.\n')
except:
print '.\n'
nickjoin[nbrjoin] = nick
print nickjoin[nbrjoin]
hostjoin[nbrjoin] = fullhost
print hostjoin[nbrjoin]
if nbrjoin == 3 :
if (hostjoin[nbrjoin] == hostjoin[(nbrjoin-1)] == hostjoin[(nbrjoin-2)] ) !=-1 :
irc.send ('MODE '+chan+' +b '+hostjoin[nbrjoin]+'\n')
for i in nickjoin.itervalues():
if ( nickjoin[nbrjoin] != nickjoin[(nbrjoin - 1)] != nickjoin[(nbrjoin - 2)] ) !=-1 :
irc.send ('KICK '+chan+' '+i+': Mass Join\n')
if ( jtemps[nbrjoin] - jtemps[nbrjoin - 2] ) < 10 : #gestion du temps mininum entre 3 join (secondes).
irc.send('PRIVMSG '+chan+' :Join trop important probabilite de clones\n')
irc.send('KICK '+chan+' '+nick+' : Clones.\n')
nbrjoin = 0
elif nbrjoin < 3 : #en dessous 3 join on voice normalement
irc.send ( 'MODE '+chan+' +v ' + nick + '\n' )
else:
irc.send ( 'MODE '+chan+' +v ' + nick + '\n')
try :
if jtemps[(nbrjoin)] - jtemps[(nbrjoin - 1)] > 20: #si plus de X secondes entre 2 join on RAZ le compteur de join a 0
nbrjoin = 0
print "Remise du compteur de join à 0"
except:
print 'Une erreur est intervenu' |
Voilà ce morceau de code fonctionne parfaitement (enfin je crois) vu que je n'ai jamais eu à subir d'attaque. il me semblait tout de même que ça accusait le coup si il y avait trop de join (ça laguait fort !)
D'ailleurs je propose l'intégralité du code de mon bot IRC Full Python à qui veut , je souhaite lui coller l'étiquette GPL d'ailleurs .
Celui ci marche parfaitement , il sait se connecter sur un serveur, s'authentifier , voicer en automatique , réponds a des commandes irc , kicker , banir etc ... bref tout les fonctions classique d'un bot mais en Python (et c'est rudement mieux qu'un eggdrop ;p ), je n'ai plus vraiment le temps de l'améliorer et j'ai d'autre projet sur le feu ...
J'aimerais beaucoup que ce projet déjà avancé trouve une/des personne(s) motivées pour le continuer
Pour les personnes intéressées me contacter : )