IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Twisted IRC, Deferred error. Après avoir récupéré l'erreur,que faire?


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Amateur Informatique
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Amateur Informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Points : 19
    Points
    19
    Par défaut Twisted IRC, Deferred error. Après avoir récupéré l'erreur,que faire?
    Bonjour à vous,

    Il y a quelques années, j'avais créer un petit bot irc, pour pouvoir me connecter sur 4 serveurs en même temps. C'étais avec la bibliothèque <import irclib> qui aujourd'hui est rendu <pypeul>
    Donc, plus rien fonctionne aujourd'hui.

    Je me suis dit, tant qu'à recommencer, aussi bien prendre un autre, comme twisted.

    J'ai été capable de tout créer, sauf les exceptions.

    -Nickname already in use,
    -Connection failed, refused by other side,
    -Connection Failed, timeout
    ... etc.

    Je vais prendre l'Example de la documentation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    from twisted.words.protocols import irc
    from twisted.internet import defer, endpoints, protocol, reactor, task
    from twisted.python import log
    from twisted.internet.endpoints import TCP4ClientEndpoint 
    from txsocksx.client import SOCKS5ClientEndpoint
     
    list_server = ['se.quakenet.org', 'us.undernet.org', 'unaddress_qui_marche_pas', 'unautre.com']
     
    class MomBot(irc.IRCClient):
        def _get_nickname(self):
            return self.factory.nickname
        nickname = property(_get_nickname)
     
        def signedOn(self):
            self.join(self.factory.channel)
            print "Signed on as %s." % (self.nickname,)
     
        def joined(self, channel):
            print "Joined %s." % (channel,)
     
        def privmsg(self, user, channel, message):
            print message
     
    class MomBotFactory(protocol.ClientFactory):
        protocol = MomBot
     
        def __init__(self, channel, nickname):
            self.channel = channel
            self.nickname = nickname
     
        def clientConnectionLost(self, connector, reason):
            print "Lost connection (%s), reconnecting." % (reason,)
            connector.connect()
     
        def clientConnectionFailed(self, connector, reason):
            print "Could not connect: %s" % (reason,)
     
    def connIRC(irc_server, irc_port, channel, nickname):
     
        puttyEndPoint = TCP4ClientEndpoint(reactor, irc_server, irc_port)
        d = puttyEndPoint.connect(MomBotFactory('#' + channel, nickname))
        d.addCallbacks(printCall, printErr)
     
    def printCall(*args, **kwargs):
        print args, kwargs
        print 'Response received'
     
    def printErr(failure):
        print type(failure.value), failure
        if failure.value == 'ConnectionRefusedError':
          print'Connection refuse... re-essaie dans 15secondes.'
          #Comment re-essayer?
          #time.sleep(15)
          #main()
     
        if failure.value == 'NicknameAlreadyInUse':
          #Chager de nickname et recommencer..
     
    if __name__ == '__main__':
      for e in list_server:
        print'Connection vers: %s' % (e)
     
        connIRC(e, 6667, 'channelABC', 'mynickname')
      #Ici comment récupérer l'information..
      reactor.run()
    Comment, attraper les erreurs et dire au reactor de recommencer.

    J'ai essayé avec des try: except:

    J'ai essayer de créer un func:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def main(server, port, channel, nickname):
      connIRC(server, port, channel, nickname)
     
    #Que je mit dans la func:  printErr()
    Quelqu'un pourrait m'expliquer ou me donner un petit example

    Dans la documentation, il récupère l'erreur mais je vois pas ce qu'ils font avec..

    Au début j'essayais en mettant reactor.run() pour chaque connection, mais j'ai vue que la LOOP, sert qu'une fois.

    J'espère avoir été précis,

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par nolimitech Voir le message
    Quelqu'un pourrait m'expliquer ou me donner un petit example

    Dans la documentation, il récupère l'erreur mais je vois pas ce qu'ils font avec..

    Au début j'essayais en mettant reactor.run() pour chaque connection, mais j'ai vue que la LOOP, sert qu'une fois.
    Il faudrait apprendre à chercher sur le ouèbe! Un petit tuto. qui montre comment fonctionne tout çà (et il y en a plein d'autres aussi bien faits).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Amateur Informatique
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Amateur Informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Points : 19
    Points
    19
    Par défaut merci
    Salut et merci,

    c'est exactement ce tutoriel que j'ai regarder...
    j'écris pas dans les forums sans avoir chercher.!! J'aurais 100 fois plus de questions !!!

    Je ne vois que des RAISES et des RETURNS

    Je connais les erreurs, je les attrapes.. CA C'EST OK..
    et après?
    Je veux pas savoir qu'elle erreurs je reçois, mais que faire si j'ai tel erreur...

    http://twistedmatrix.com/documents/c...wto/defer.html

    Unless you explicitly raise an error in an except block, the Exception is caught and stops propagating, and normal execution continues. The same thing happens with errbacks: unless you explicitly return a Failure or (re-)raise an exception, the error stops propagating, and normal callbacks continue executing from that point (using the value returned from the errback). If the errback does return a Failure or raise an exception, then that is passed to the next errback, and so on.
    Si le reactor.run() continue l'Execution normale, après un Timeout ou Connection refused
    Dois-je arrêter le reactor ( reactor.stop() )
    Pour lui dire de recommencer dans 15secondes si c'est un Timeout...

    Ou le Error Handle ( Deferred ) soutiens cela sans arrêter la boucle? Si oui comment?
    Créer une fonction?

    JE suis bloquer, simplement parce qu'obtiens des erreurs ( que j'attrape, que je connais ) mais twisted semble pas stopper l'exécution, ni recommencer après X temps.

    Sur le tuto, une fois l'Erreur attrapé, j'ai le choix en raise l'erreur, ou l'imprimer ( print ),
    mais ca me dit pas si la boucle recommencer à zéro,
    -si elle attend quelque chose...
    -si elle va recommencer dans X secondes...

    Merci de votre aide

  4. #4
    Membre à l'essai
    Homme Profil pro
    Amateur Informatique
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Amateur Informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Surement moi qui comprend pas ou j'explique mal le problème, je sais pas.

    J'ai donner un example, mais mon script comporte 8400 lignes.

    Donc, c'étais un petit example.

    Merci à tous.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par nolimitech Voir le message
    Si le reactor.run() continue l'Execution normale, après un Timeout ou Connection refused
    Dois-je arrêter le reactor ( reactor.stop() )
    Pour lui dire de recommencer dans 15secondes si c'est un Timeout...
    Si vous arrêtez le reactor, l'application s'arrête.
    Vous ne pouvez que soumettre des "callbacks" qui vont s'exécuter dès que possible ou après un délai avec task.deferLater ou callLater. voir le howto
    note: si vous voulez des exemples de mise en œuvre de ces fonctionnalités là vous avez les mots clés...


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre à l'essai
    Homme Profil pro
    Amateur Informatique
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Amateur Informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Points : 19
    Points
    19
    Par défaut Merci encore.
    Je viens de trouver le problème.

    C'est lorsqu'on l'ont fait appel au deferred.

    le clientConnectionFailed et clientConnectionLost méthode ne sera jamais appelé

    Donc, chaque fois que je me connect, il me dit ok, mais j'ai rien à faire.
    Donc, il se disconnect.

    http://stackoverflow.com/questions/1...d-with-twisted

    Il est 'OverRide' par le deferred

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    from twisted.words.protocols import irc
    from twisted.internet import defer, endpoints, protocol, reactor, task
    from twisted.python import log
    from twisted.internet.endpoints import TCP4ClientEndpoint, connectProtocol
    from txsocksx.client import SOCKS5ClientEndpoint
    from twisted.internet.protocol import ClientFactory, ReconnectingClientFactory
     
    class MomBot(irc.IRCClient):
        def _get_nickname(self):
            return self.factory.nickname
        nickname = property(_get_nickname)
     
        def signedOn(self):
            self.join(self.factory.channel)
            print "Signed on as %s." % (self.nickname,)
     
        def joined(self, channel):
            print "Joined %s." % (channel,)
     
        def privmsg(self, user, channel, message):
            print message
     
    class MomBotFactory(protocol.ClientFactory):
        protocol = MomBot
     
        def __init__(self, channel, nickname):
            self.channel = channel
            self.nickname = nickname
     
        def clientConnectionLost(self, connector, reason):
            print "Lost connection (%s), reconnecting." % (reason,)
            connector.connect()
     
        def clientConnectionFailed(self, connector, reason):
            print "Could not connect: %s" % (reason,)
     
    def connIRC(proxy_ip, proxy_port, irc_server, irc_port, channel, nickname):
        """J'utlise mon ip dans le proxy pour créer une erreur de connection
        Sinon, c'est rare que mon vrai ip, ne se connectera pas, donc,
        sortira presque jamais d'erreur"""
     
        puttyEndPoint = TCP4ClientEndpoint(reactor, proxy_ip, proxy_port)
        ircEndpoint = SOCKS5ClientEndpoint(irc_server, irc_port, puttyEndPoint)
        d = ircEndpoint.connect(MomBotFactory('#' + channel, nickname))
        d.addCallbacks(printCall, printErr)
     
    def printCall(*args, **kwargs):
        print args, kwargs
        print 'Response received'
     
    def printErr(failure):
        print type(failure.value), failure
        print'Tryingto get another one...'
     
    if __name__ == '__main__':
        connIRC('127.0.0.1', 1080, 'se.freenode.org', 6667, 'mychannelABC', 'mynicknameBOT')
    Tous les erreurs que j'obtenais, c'étais simplement à cause de cela.

    Merci pour les mot-clés.

    Maintenant, me reste qu'à trouver comment puis-je moi aussi lui re-dire de reprendre MomBotFactory()


    Merci pour tout.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PrestaShop] 500 Server Error sur un serveur local après avoir déjà travaillé dessus
    Par Propel dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 14/01/2015, 16h10
  2. Gparted, je pense avoir supprimé la MBR que faire ?
    Par te8teur dans le forum Windows 7
    Réponses: 4
    Dernier message: 08/11/2011, 14h09
  3. Réponses: 1
    Dernier message: 09/04/2011, 10h42
  4. Continuer un traitement après avoir relevé une erreur
    Par Naruto_kun dans le forum PL/SQL
    Réponses: 1
    Dernier message: 20/01/2010, 14h08
  5. Réponses: 14
    Dernier message: 22/05/2009, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo