2010-06-29 16 views
5

Tôi đang trong quá trình thử nghiệm một chút với các thư viện được xoắn cho máy chủ/máy khách IRC. Tôi đã tìm thấy một vài ví dụ tốt về cách thực hiện một ứng dụng khách IRC nhưng dường như tìm thấy bất cứ điều gì tốt về phía máy chủ của sự vật. Ai có thể cung cấp một số cái nhìn sâu sắc vào làm thế nào để tạo ra một máy chủ IRC cơ bản trong xoắn?Ví dụ tốt về máy chủ IRC xoắn?

Chỉnh sửa: Điều gì về việc tạo ra điều này? Tôi có đi đúng hướng không?

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

Khi tôi cố gắng tham gia kênh, tôi không bao giờ có thể. Tôi đã nhận được một lỗi liên quan đến việc không có một handler cho một lệnh, vì vậy tôi đã viết lên các phương pháp irc_USER và irc_NICK nhưng chỉ đơn thuần là loại bỏ lỗi, nó không giải quyết được vấn đề không kết nối/không hoạt động.

Trả lời

8

Có lẽ một cái gì đó như thế này?

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

Nếu bạn muốn xem cách này được thực hiện, xem twisted/words/tap.py

twisted.words.protocols.irc.IRC là một thực hiện rất cơ bản của chỉ những phần phân tích của một máy chủ IRC. Nó thực hiện không có logic máy chủ thực tế như kênh, chế độ, tin nhắn, vv Bạn có thể xây dựng một máy chủ trên đó, nhưng bạn phải xây dựng gần như toàn bộ điều. Đây chính xác là mã được gọi bởi twistd words. Bạn có thể tham khảo cách triển khai của nó để xem ví dụ thành công về mã mà câu hỏi của bạn hướng đến.

+0

Vì vậy, bạn đang nói rằng tôi đang đi đúng hướng, nhưng tôi sẽ cần phải tiếp tục thêm các tính năng/phương pháp để hỗ trợ giao thức đầy đủ? Hoặc nó sẽ là tốt hơn để bắt đầu từ đầu và không sử dụng words.protocols.irc.IRC và chỉ sử dụng words.Service? Tôi hơi bối rối là tại sao có twisted.service và sau đó twisted.irc sau đó? Cái nào phù hợp để làm việc? – themaestro

+0

Mục đích của twisted.words.service là bạn có thể căn cứ một máy chủ IRC trên đó. Có thể có một khoảng cách giữa ý định và thực tế; đây là một phần của Twisted không được sử dụng rộng rãi. Điều đó không có nghĩa là twisted.words.service sẽ không hoạt động cho bạn, vì điều đó phụ thuộc vào chính xác mục tiêu của bạn là gì. Đối với lý do tại sao có cả hai twisted.words.protocols.irc.IRC và twisted.words.service, thật dễ dàng - trước đây được sử dụng làm cơ sở cho việc thực hiện sau này. –

0

Tôi bắt gặp cuốn sách này có mã sau đây sẽ chạy đầy đủ trên máy chủ từ xoắn và cho phép bạn tạo kênh, v.v. Đây là mã từ sách.

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

Cuốn sách: http://books.google.com/books?id=_g5UNxWUKsMC&printsec=frontcover#v=onepage Đến trang 119 và bạn sẽ tìm thấy nó mô tả. Mua sách, đó là một cuốn sách hay.

0

Nếu bạn muốn có một máy chủ IRC xoắn 'vô danh' đơn giản, điều này về cơ bản là cách dễ nhất để đi về nó:

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) 

Sau đó bạn có thể thực hiện điều này từ Twistd với twistd -nol- -y irc_server.py.

Các bit phức tạp như được đề cập trong các câu trả lời khác là các thông điệp khác nhau trên đối tượng giao thức xoắn có kỳ vọng về đầu vào/trả về của chúng, vì vậy bạn sẽ phải đi đến tài liệu mô-đun và đôi khi mã nguồn để tìm ra những gì cần ở đó.