2010-06-29 15 views
5

Sono in procinto di sperimentare un po 'con le librerie contorte per server/client IRC. Ho trovato alcuni buoni esempi di come implementare un client IRC ma sembra trovare qualcosa di buono sul lato server delle cose. Qualcuno potrebbe fornire alcune informazioni su come creare un server IRC di base in twisted?Buon esempio di server IRC contorto?

Modifica: Che ne dici di costruire fuori da questo? Sto andando nella giusta direzione qui?

from twisted.internet.protocol import ServerFactory 
from twisted.internet import reactor 
from twisted.words.protocols.irc import IRC 


class IRCServer(IRC): 
    def connectionMade(self): 
     print "client connected" 

    def handleCommand(self, command, prefix, params): 
     print "handle comm" 
     IRC.handleCommand(self, command, prefix, params) 

    def dataReceived(self, data): 
     print "data: %s" % data 
     IRC.dataReceived(self, data) 

    def irc_unknown(self, prefix, command, params): 
     print "%s, %s, %s, IRC UNKNOWN" % (prefix, command, params) 

    def irc_USER(self, prefix, params): 
     print "USER: %s, %s" % (prefix, params) 

    def irc_NICK(self, prefix, params): 
     print "NICK: %s, %s" % (prefix, params) 



class IRCServerFactory(ServerFactory): 
    protocol = IRCServer 

factory = IRCServerFactory() 
reactor.listenTCP(8002, factory) 
reactor.run() 

Quando provo ad entrare nel canale non riesco mai a farlo. Stavo ricevendo un errore relativo a non avere un gestore per un comando, quindi ho scritto i metodi irc_USER e irc_NICK ma questo si è semplicemente sbarazzato dell'errore, non ha risolto il problema di non connettersi/non funzionare.

risposta

8

Forse qualcosa del genere?

[email protected]:/tmp/irc-server$ cat > passwd 
alice:secret 
bob:19820522 
[email protected]:/tmp/irc-server$ twistd -n words --irc-port 6667 --auth file:passwd 
2010-06-29 11:51:26-0400 [-] Log opened. 
2010-06-29 11:51:26-0400 [-] twistd 10.0.0+r29436 (/usr/bin/python 2.6.4) starting up. 
2010-06-29 11:51:26-0400 [-] reactor class: twisted.internet.selectreactor.SelectReactor. 
2010-06-29 11:51:26-0400 [-] twisted.words.service.IRCFactory starting on 6667 
2010-06-29 11:51:26-0400 [-] Starting factory <twisted.words.service.IRCFactory instance at 0x9ddbf8c> 

Se vuoi vedere come questo è implementato, vedere twisted/words/tap.py

twisted.words.protocols.irc.IRC è un'implementazione di base di solo le parti di analisi di un server IRC. Non implementa alcuna reale logica del server come canali, modalità, messaggi, ecc. È possibile creare un server su di esso, ma è necessario costruire quasi tutto. Questo è esattamente ciò che fa il codice invocato da twistd words. Si consiglia di fare riferimento alla sua implementazione per vedere un esempio riuscito di ciò che il codice nella tua domanda sta mirando.

+0

Quindi stai dicendo che sto andando nella giusta direzione, ma dovrò continuare ad aggiungere funzionalità/metodi per supportare il protocollo completo? O sarebbe meglio iniziare da zero e non usare words.protocols.irc.IRC e utilizzare solo words.Service? Sono un po 'confuso sul motivo per cui vi è twisted.service e poi twisted.irc allora? Da quale è il corretto da cui lavorare? – themaestro

+0

L'intento di twisted.words.service è che è possibile basare su di esso un server IRC. Potrebbe esserci uno scarto tra l'intento e la realtà; questa è una parte di Twisted che non è estremamente utilizzata. Ciò non significa che twisted.words.service non funzionerà per te, dal momento che ciò dipende esattamente da quali sono i tuoi obiettivi. Per quanto riguarda il motivo per cui vi sono sia twisted.words.protocols.irc.IRC che twisted.words.service, è facile: il primo viene utilizzato come base per l'implementazione di quest'ultimo. –

0

Mi sono imbattuto in questo libro che ha il seguente codice che eseguirà un server di parole twistd completo e ti consentirà di creare canali ecc. Ecco il codice del libro.

from twisted.cred import checkers, portal 
from twisted.internet import reactor 
from twisted.words import service 

wordsRealm = service.InMemoryWordsRealm("example.com") 
wordsRealm.createGroupOnRequest = True 

checker = checkers.FilePasswordDB("authfile.txt") 
portal = portal.Portal(wordsRealm, [checker]) 

reactor.listenTCP(6667, service.IRCFactory(wordsRealm, portal)) 
reactor.run() 

Il libro: http://books.google.com/books?id=_g5UNxWUKsMC&printsec=frontcover#v=onepage Vai alla pagina 119 e troverete che è descrizione. Compra il libro, è buono.

0

Se si desidera un semplice 'anonymous' server IRC contorto, questo è fondamentalmente il modo più semplice per andare a questo proposito:

from twisted.application import internet, service 
from twisted.cred import checkers, portal, credentials 
from twisted.cred.checkers import ICredentialsChecker 
from twisted.internet import defer 
from twisted.words import service as wordsservice 
from zope.interface import implements 

wordsRealm = wordsservice.InMemoryWordsRealm("example.com") 
wordsRealm.createGroupOnRequest = True 
wordsRealm.createUserOnRequest = True 

class UserAnon: 
    implements(ICredentialsChecker) 
    credentialInterfaces = (credentials.IUsernamePassword, credentials.IUsernameHashedPassword) 

    def __init__(self): 
    pass 

    def addUser(self, username, password): 
    pass 

    def _cbPasswordMatch(self, matched, username): 
    return username 

    def requestAvatarId(self, credentials): 
    return defer.succeed(credentials.username) 

class IRCAnonymous(wordsservice.IRCUser): 
    def irc_NICK(self, prefix, params): 
    self.password = 'doesntmatter' 
    wordsservice.IRCUser.irc_NICK(self, prefix, params) 


checker = UserAnon() 
portal = portal.Portal(wordsRealm, [checker]) 

servicefactory = wordsservice.IRCFactory(wordsRealm, portal) 
servicefactory.protocol=IRCAnonymous 

application = service.Application("ircserver") 
ircservice = internet.TCPServer(6667, servicefactory) 
ircservice.setServiceParent(application) 

È quindi possibile eseguire questo da twistd con twistd -nol- -y irc_server.py.

Il bit complicato, come menzionato in altre risposte, è che i vari messaggi di messaggio sull'oggetto protocollo contorto hanno aspettative sui loro input/restituzioni, quindi dovrete andare alla documentazione del modulo, e talvolta al codice sorgente per capire cosa c'è bisogno lì.

Problemi correlati