Pregunta

¿Cuál es la mejor manera de analizar los mensajes recibidos desde un servidor IRC con el pitón de acuerdo con el RFC? Simplemente quiero algún tipo de lista / lo que sea, por ejemplo:

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

se convierte en la siguiente:

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

Y así sucesivamente?

(Edit: Quiero analizar los mensajes de IRC en General , no sólo de PRIVMSG)

¿Fue útil?

Solución

http://twistedmatrix.com/

Desafortunadamente estoy fuera de tiempo, tal vez alguien más puede pegar aquí para usted.

Editar

Bueno, yo estoy de vuelta, y extrañamente nadie ha pegado todavía por lo que aquí es:

http://twistedmatrix.com/trac/ navegador / trunk / trenzado / palabras / protocolos / irc.py Nº 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!']) 

Esta función sigue de cerca la EBNF se describe en el RFC IRC.

Otros consejos

Puede hacerlo con una simple lista por comprensión si el formato es siempre así.

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()))

Resultados:

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

¿Sólo desea analizar los mensajes de IRC en general o quieres simplemente analizar PRIVMSGs? Sin embargo, tengo una aplicación para eso.

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 desea mantener a un bajo nivel de piratería Secundo la respuesta Twisted por desconocida, pero primero creo que deberías echar un vistazo a la muy reciente anuncio Yardbird que es un buen capa de petición de análisis sintáctico en la parte superior de Twisted. Se le permite usar algo similar a Django URL envío de mensajes para el manejo de IRC con un beneficio adicional de tener el ORM de Django disponible para la generación de respuestas, etc.

Yo sé que no es Python, pero para un enfoque basado en la expresión regular a este problema, que podría echar un vistazo a POE :: Filtro :: IRCD , que se ocupa de protocolo de servidor IRC (ver POE :: Filtro :: IRC :: Compat para el protocolo cliente adiciones) de análisis sintáctico para Perl de POE :: Componente :: marco IRC .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top