2010-06-29 10 views
5

Je suis en train d'expérimenter un peu avec les bibliothèques torsadées pour serveurs/clients IRC. J'ai trouvé quelques bons exemples de la façon d'implémenter un client IRC, mais semble trouver quelque chose de bon sur le côté serveur des choses. Quelqu'un pourrait-il donner un aperçu de la façon de créer un serveur IRC de base en tordu?Bon exemple de serveur IRC Twisted?

Éditer: Qu'en est-il de la construction de ce? Est-ce que je vais dans la bonne direction ici? Lorsque j'essaie de rejoindre le canal, je ne suis jamais capable de le faire. J'obtenais une erreur concernant le fait de ne pas avoir de gestionnaire pour une commande, donc j'ai écrit les méthodes irc_USER et irc_NICK mais cela s'est simplement débarrassé de l'erreur, cela n'a pas résolu le problème de ne pas se connecter/ne pas fonctionner.

Répondre

8

Peut-être quelque chose comme ça?

[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> 

Si vous souhaitez voir comment cela est mis en œuvre, voir twisted/words/tap.py

twisted.words.protocols.irc.IRC est une implémentation très basique de seulement les parties d'analyse syntaxique d'un serveur IRC. Il n'implémente aucune logique de serveur réelle telle que des canaux, des modes, des messages, etc. Vous pouvez construire un serveur dessus, mais vous devez construire presque tout. C'est précisément ce que fait le code twistd words. Vous pouvez vous référer à sa mise en œuvre pour voir un exemple réussi de ce que le code de votre question vise.

+0

Donc, dites-vous que je vais dans la bonne direction, mais je vais devoir continuer à ajouter des fonctionnalités/méthodes pour supporter le protocole complet? Ou serait-il préférable de commencer à partir de zéro et de ne pas utiliser words.protocols.irc.IRC et juste utiliser des mots.Service? Je suis un peu confus quant à pourquoi il y a twisted.service et ensuite twisted.irc alors? Lequel est le bon à partir duquel travailler? – themaestro

+0

Le but de twisted.words.service est que vous pouvez baser un serveur IRC dessus. Il peut y avoir un écart entre l'intention et la réalité; c'est une partie de Twisted qui n'est pas extrêmement utilisée. Cela ne signifie pas twisted.words.service ne fonctionnera pas pour vous, car cela dépend exactement de vos objectifs. Quant à savoir pourquoi il y a à la fois twisted.words.protocols.irc.IRC et twisted.words.service, c'est facile - le premier est utilisé comme base de la mise en œuvre de ce dernier. –

0

Je suis tombé sur ce livre qui a le code suivant qui va exécuter un plein sur le serveur de mots twistd et vous permettre de créer des canaux etc. Voici le code du livre.

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

Le livre: http://books.google.com/books?id=_g5UNxWUKsMC&printsec=frontcover#v=onepage Aller à la page 119 et vous trouverez sa description. Acheter le livre, c'est un bon livre.

0

Si vous voulez un simple « anonyme » serveur IRC tordu, cela est essentiellement la meilleure façon de s'y prendre:

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) 

Vous pouvez ensuite exécuter ce de twistd avec twistd -nol- -y irc_server.py. Le bit délicat comme mentionné dans les autres réponses est que les différents messages de message sur l'objet protocole tordu ont des attentes sur leurs entrées/retours, donc vous devrez aller à la documentation du module, et parfois le code source pour comprendre ce qui est nécessaire là-bas.