Domanda

Qual è il modo migliore per analizzare i messaggi ricevuti da un server IRC con Python secondo l'RFC? Voglio semplicemente una sorta di lista / qualunque cosa, ad esempio:

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

diventa questo:

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

E così via?

(Edit: Voglio analizzare i messaggi IRC in Generale , non solo di PRIVMSG)

È stato utile?

Soluzione

http://twistedmatrix.com/

Purtroppo sto fuori dal tempo, forse qualcun altro posso incollarlo qui per voi.

Modifica

Beh, io sono tornato, e stranamente nessuno ha incollato ancora così qui è:

http://twistedmatrix.com/trac/ Browser / trunk / contorto / parole / protocolli / 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!']) 

Questa funzione ricalca l'EBNF descritto nella RFC IRC.

Altri suggerimenti

È possibile farlo con un semplice elenco di comprensione se il formato è sempre così.

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

Risultato:

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

Non si desidera solo per analizzare IRC messaggi, in generale, o vuoi semplicemente analizzare PRIVMSGs? Tuttavia ho un'implementazione per questo.

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 si desidera mantenere a un basso livello di violazione al sistema che secondo la risposta ritorto di Unknown, ma prima penso che si dovrebbe dare uno sguardo al molto recentemente annunciato Yardbird che è un bel strato di richiesta di analisi sulla parte superiore di twisted. Esso consente di utilizzare qualcosa di simile a Django URL dispacciamento per la gestione dei messaggi IRC con un vantaggio collaterale di avere il Django ORM a disposizione per le risposte che generano, ecc.

Lo so che non è Python, ma per un normale approccio di espressione basata a questo problema, si potrebbe dare un'occhiata a POE :: :: Filtro IRCD , che gestisce il protocollo server IRC (vedi POE :: :: Filtro IRC :: Compat per il protocollo client integrazioni) di analisi per Perl di POE :: :: Componente quadro IRC .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top