Python et d'analyse syntaxique des messages IRC
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)
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 .