Pergunta

Qual é a melhor maneira de analisar as mensagens recebidas a partir de um servidor de IRC com Python acordo com a RFC? Eu simplesmente quero algum tipo de lista / whatever, por exemplo:

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

torna-se o seguinte:

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

E assim por diante?

(Edit: Eu quero mensagens de IRC de análise em Geral , e não apenas PRIVMSG de)

Foi útil?

Solução

Olhe para a implementação da torcida http://twistedmatrix.com/

Infelizmente eu estou fora de tempo, talvez alguém pode colá-lo aqui para você.

Editar

Bem, eu estou de volta, e estranhamente ninguém tenha colado ainda assim aqui está:

http://twistedmatrix.com/trac/ navegador / trunk / torcidos / palavras / protocolos / 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!']) 

Esta função estreitamente segue o EBNF descrito na RFC IRC.

Outras dicas

Você pode fazê-lo com uma lista simples compreensão se o formato é sempre assim.

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

Resultado:

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

Você só quer analisar mensagens de IRC, em geral, ou você quer PRIVMSGs apenas de análise? No entanto eu tenho uma aplicação para isso.

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

Se você quiser manter a um baixo nível de hackers I segundo a resposta torcida por Unknown, mas primeiro eu acho que você deveria dar uma olhada no anunciou muito recentemente Yardbird que é um pedido agradável analisar camada em cima da torcida. Ele permite que você usar algo semelhante para Django URL despachar para lidar com mensagens de IRC com um outro benefício de ter o Django ORM disponível para respostas geradoras, etc.

Eu sei que não é Python, mas para uma abordagem baseada em expressão regular para esse problema, você pode dar uma olhada em POE :: Filtro :: IRCD, qual protocolo servidor alças IRC (ver POE :: Filtro :: IRC :: Compat para o protocolo cliente adições) parsing para quadro de Perl POE :: Component :: IRC .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top