Question

Quelle est la meilleure façon d'analyser les messages reçus à partir d'un serveur IRC avec Python selon le RFC? Je veux simplement une sorte de liste / whatever, par exemple:

:test!~test@test.com PRIVMSG #channel :Hi!

devient ceci:

{ "sender" : "test!~test@test.com", "target" : "#channel", "message" : "Hi!" }

Et ainsi de suite?

(Edit: Je veux analyser les messages IRC Général , non seulement PRIVMSG de)

Était-ce utile?

La solution

Regardez la mise en œuvre de Twisted http://twistedmatrix.com/

Malheureusement, je suis hors du temps, peut-être quelqu'un d'autre peut le coller ici pour vous.

Modifier

Eh bien, je suis de retour, et étrangement personne n'a encore collé si elle est ici:

http://twistedmatrix.com/trac/ navigateur / trunk / torsadé / mots / protocoles / irc.py # 54

def parsemsg(s):
    """Breaks a message from an IRC server into its prefix, command, and arguments.
    """
    prefix = ''
    trailing = []
    if not s:
       raise IRCBadMessage("Empty line.")
    if s[0] == ':':
        prefix, s = s[1:].split(' ', 1)
    if s.find(' :') != -1:
        s, trailing = s.split(' :', 1)
        args = s.split()
        args.append(trailing)
    else:
        args = s.split()
    command = args.pop(0)
    return prefix, command, args

parsemsg(":test!~test@test.com PRIVMSG #channel :Hi!")
# ('test!~test@test.com', 'PRIVMSG', ['#channel', 'Hi!']) 

Cette fonction suit de près l'EBNF décrit dans le RFC IRC.

Autres conseils

Vous pouvez le faire avec une simple compréhension de la liste si le format est toujours comme ça.

keys = ['sender', 'type', 'target', 'message']
s = ":test!~test@test.com PRIVMSG #channel :Hi!"
dict((key, value.lstrip(':')) for key, value in zip(keys, s.split()))

Résultat:

{'message': 'Hi!', 'type': 'PRIVMSG', 'sender': 'test!~test@test.com', 'target': '#channel'}

Voulez-vous simplement pour analyser les messages IRC en général ou voulez-vous analyser juste PRIVMSGs? Cependant, j'ai une mise en œuvre pour cela.

def parse_message(s):
    prefix   = ''
    trailing = ''
    if s.startswith(':'):
        prefix, s = s[1:].split(' ', 1)
    if ' :' in s:
        s, trailing = s.split(' :', 1)
    args = s.split()
    return prefix, args.pop(0), args, trailing

Si vous voulez garder un piratage bas niveau I seconde la réponse Twisted par Unknown, mais d'abord je pense que vous devriez jeter un oeil à tout récemment annoncé Yardbird qui est une couche d'analyse syntaxique de la demande belle au-dessus de Twisted. Il vous permet d'utiliser quelque chose de similaire à l'URL Django dispatching pour la gestion des messages IRC avec un autre avantage d'avoir le Django ORM disponibles pour générer des réponses, etc.

Je sais que ce n'est pas Python, mais pour une approche fondée sur l'expression régulière à ce problème, vous pouvez jeter un oeil à POE :: Filtre :: IRCD , qui gère le protocole de serveur IRC (voir POE :: Filtre :: :: IRC Compat pour le protocole client ajouts) analyse syntaxique pour Perl POE :: composante cadre de l'IRC .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top