Python的IRC (Internet Relay Chat) 协议库
项目描述
全功能的Python IRC库。
概述
此库为Python提供了IRC协议的低级实现。它提供了一个事件驱动的IRC客户端框架。它对基本IRC协议、CTCP和DCC连接的支持相当全面。
为了了解如何制作IRC客户端,最好首先阅读IRC规范。
客户端功能
IRC客户端框架的主要功能包括:
IRC协议的抽象。
处理多个同时的IRC服务器连接。
透明处理服务器的PONG响应。
通过调用IRC连接对象的方法向IRC服务器发送消息。
来自IRC服务器的消息触发事件,这些事件可以通过事件处理器捕获。
提供多种从和向IRC服务器读写的方法:您可以使用内部
可以通过事件循环注册函数,以便在指定时间执行。
正确解码CTCP标签(希望如此);我没有看到其他处理CTCP规范细微之处的IRC客户端实现。
包括一种简单的、单服务器、面向对象的IRC客户端类,该类将事件分派到实例方法。
DCC连接支持。
当前限制
IRC协议在抽象中过于突出。
数据不会异步写入服务器(以及DCC对等方),即如果TCP缓冲区满,write()可能会阻塞。
像大多数项目一样,文档不够完善……
DCC尚未在基于asyncio的版本中实现
遗憾的是,这个库的文档并没有像我期望的那样详尽。我认为最好的入门方式是阅读和理解包含在发行版中的示例程序irccat。
以下模块可能值得关注
irc.client
这个库本身。阅读代码以及注释和文档字符串,以了解其功能。请在自己的风险下使用它,并阅读源代码,卢克!
irc.client_aio
具有上述库的所有功能,但使用Python 3的本地asyncio库作为核心事件循环。接口/API在其他方面与irc.client中的类功能相同
irc.bot
一个IRC机器人实现。
irc.server
一个基本的IRC服务器实现。适用于测试,但不是作为生产服务。
使用python -m irc.server调用服务器。
示例
脚本目录中的示例脚本
irccat
一个如何使用IRC客户端的简单示例。irccat从标准输入读取文本,并将其写入指定的用户或IRC服务器上的频道。
irccat2
与上面相同,但使用SimpleIRCClient类。
aio_irccat
与上面相同,但使用AioReactor中的基于asyncio的事件循环,而不是基于select()的Reactor。
aio_irccat2
与上面相同,但使用AioSimpleIRCClient类。
servermap
另一个简单示例。servermap连接到IRC服务器,找出网络中的其他IRC服务器,并打印它们的互连树形图。
testbot
一个示例机器人,它使用irc.bot中的SingleServerIRCBot类。机器人进入一个频道,并监听私聊消息或频道流量中的命令。它还接受DCC邀请,并回显发送的DCC聊天消息。
dccreceive
通过DCC接收文件。
dccsend
通过DCC发送文件。
注意:如果您在Unix命令行上运行示例之一,您需要转义频道中的#符号。例如,使用\\#test或"#test"而不是#test。
事件调度
该库包括默认的事件调度器irc.schedule.DefaultScheduler,但此调度器可以用任何其他调度器替换。例如,要使用schedule包,将其包含在依赖项中,并将其安装到IRC库中,如下所示
- class ScheduleScheduler(irc.schedule.IScheduler)
- def execute_every(self, period, func)
schedule.every(period).do(func)
- def execute_at(self, when, func)
schedule.at(when).do(func)
- def execute_after(self, delay, func)
raise NotImplementedError(“Not supported”)
- def run_pending(self)
schedule.run_pending()
irc.client.Reactor.scheduler_class = ScheduleScheduler
输入解码
默认情况下,IRC库尝试将所有传入流解码为UTF-8,尽管IRC规范规定不应期望任何特定的编码。由于在一般情况下假定UTF-8并不合理,因此IRC库通过自定义ServerConnection类来提供自定义解码输入的选项。在ServerConnection上的buffer_class属性决定了用于从输入流缓冲行的哪个类,使用jaraco.stream中的buffer模块。默认情况下它是buffer.DecodingLineBuffer,但可以重新分配为另一个类,遵循buffer.LineBuffer的接口。可以通过覆盖类属性为所有ServerConnection实例分配buffer_class属性。
例如
from jaraco.stream import buffer
irc.client.ServerConnection.buffer_class = buffer.LenientDecodingLineBuffer
LenientDecodingLineBuffer尝试UTF-8,但会回退到latin-1,这将避免所有情况下的UnicodeDecodeError(但如果IRC用户使用另一种编码,可能会产生意外的行为)。
可以在每个实例的基础上覆盖缓冲区(只要在建立连接之前覆盖)
server = irc.client.Reactor().server()
server.buffer_class = buffer.LenientDecodingLineBuffer
server.connect()
或者,一些客户端可能仍然希望使用不同的编码来解码输入。要将所有输入解码为latin-1(它会解码任何输入),请使用以下方法
irc.client.ServerConnection.buffer_class.encoding = "latin-1"
或者解码到UTF-8,但对于无法识别的字节序列使用替换字符
irc.client.ServerConnection.buffer_class.errors = "replace"
或者,简单地忽略所有无法解码的输入
class IgnoreErrorsBuffer(buffer.DecodingLineBuffer):
def handle_exception(self):
pass
irc.client.ServerConnection.buffer_class = IgnoreErrorsBuffer
库需要文本来进行消息处理,因此必须使用解码缓冲区。客户端必须使用上述技术之一来解码输入为文本。
备注和联系方式
祝您使用愉快。
维护者:Jason R. Coombs <jaraco@jaraco.com>
原作者:Joel Rosdahl <joel@rosdahl.net>
版权 © 1999-2002 Joel Rosdahl 版权 © 2011-2016 Jason R. Coombs 版权 © 2009 Ferry Boender
企业版
作为Tidelift订阅的一部分提供。
该项目和数千个其他软件包的维护者正在与Tidelift合作,提供一项企业订阅,涵盖您使用的所有开源软件。
了解更多.
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
构建分发
irc-20.5.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8ddbfd19f71204ceceba7b7c72724b15b3fa87bab5e81e45a75bef736a1a3c76 |
|
MD5 | 7be2d8bec815a2e5693bfbc6ba4f54ad |
|
BLAKE2b-256 | 0dc05b875df761bfbf51482bab7ddb4b9f9968327bc08801f5ac9599ab451824 |
irc-20.5.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 712c6065c41ceaf75c874d623b02edaa5e6c7d605532da81c52d39629a8e9fd0 |
|
MD5 | 4f68ae011608eaa4d47379bee2d8fb57 |
|
BLAKE2b-256 | 117093034515cfc18e2020146f889c82abb38a01c7d77b50bc033f91bc5c12b9 |