Хороший пример витого IRC-сервера? - PullRequest
5 голосов
/ 29 июня 2010

Я немного экспериментирую с витыми библиотеками для IRC-серверов / клиентов. Я нашел несколько хороших примеров того, как реализовать клиент IRC, но, похоже, нашел что-то хорошее на стороне сервера. Кто-нибудь может дать некоторое представление о том, как создать базовый сервер IRC в витой?

Редактировать: А как насчет этого? Я иду в правильном направлении здесь?

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

Когда я пытаюсь присоединиться к каналу, я никогда не могу. Я получал ошибку, связанную с отсутствием обработчика для команды, поэтому я написал методы irc_USER и irc_NICK, но это просто избавило от ошибки, это не решило проблему не соединения / не работы.

Ответы [ 3 ]

8 голосов
/ 29 июня 2010

Может, как-то так?

exarkun@boson:/tmp/irc-server$ cat > passwd
alice:secret
bob:19820522
exarkun@boson:/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>

Если вы хотите увидеть, как это реализовано, см. twisted / words / tap.py

twisted.words.protocols.irc.IRC - это базовая реализация только частей синтаксического анализа IRC-сервера. Он не реализует никакой реальной серверной логики, такой как каналы, режимы, сообщения и т. Д. Вы можете построить сервер на нем, но вам нужно построить почти все. Это именно то, что делает код, вызванный twistd words. Вы можете обратиться к его реализации, чтобы увидеть успешный пример того, к чему стремится код в вашем вопросе.

0 голосов
/ 24 июня 2015

Если вам нужен простой «анонимный» витой IRC-сервер, это, по сути, самый простой способ сделать это:

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)

Затем вы можете выполнить это из twistd с помощью twistd -nol- -y irc_server.py.

Хитрость, о которой говорилось в других ответах, состоит в том, что различные сообщения в объекте витого протокола имеют ожидания при вводе / возврате, поэтому вам придется обратиться к документации модуля, а иногда и к исходному коду, чтобы выяснить, что нужно там.

0 голосов
/ 26 октября 2014

Я наткнулся на эту книгу, в которой есть следующий код, который будет запускать полный текст на сервере твист-слов и позволит вам создавать каналы и т. Д. Вот код из книги.1004 *http://books.google.com/books?id=_g5UNxWUKsMC&printsec=frontcover#v=onepage Перейдите на страницу 119, и вы найдете ее описание.Купи книгу, она хорошая.

...