• Stars
    star
    377
  • Rank 113,103 (Top 3 %)
  • Language
    Python
  • License
    MIT License
  • Created almost 9 years ago
  • Updated 12 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Full-featured Python IRC library for Python.

tests Ruff Code style: Black https://readthedocs.org/projects/python-irc/badge/?version=latest https://img.shields.io/badge/skeleton-2023-informational Join the chat at https://gitter.im/jaraco/irc https://tidelift.com/badges/github/jaraco/irc

Full-featured Python IRC library for Python.

Overview

This library provides a low-level implementation of the IRC protocol for Python. It provides an event-driven IRC client framework. It has a fairly thorough support for the basic IRC protocol, CTCP, and DCC connections.

In order to understand how to make an IRC client, it's best to read up first on the IRC specifications.

Client Features

The main features of the IRC client framework are:

  • Abstraction of the IRC protocol.
  • Handles multiple simultaneous IRC server connections.
  • Handles server PONGing transparently.
  • Messages to the IRC server are done by calling methods on an IRC connection object.
  • Messages from an IRC server triggers events, which can be caught by event handlers.
  • Multiple options for reading from and writing to an IRC server: you can use sockets in an internal select() loop OR use Python3's asyncio event loop
  • Functions can be registered to execute at specified times by the event-loop.
  • Decodes CTCP tagging correctly (hopefully); I haven't seen any other IRC client implementation that handles the CTCP specification subtleties.
  • A kind of simple, single-server, object-oriented IRC client class that dispatches events to instance methods is included.
  • DCC connection support.

Current limitations:

  • The IRC protocol shines through the abstraction a bit too much.
  • Data is not written asynchronously to the server (and DCC peers), i.e. the write() may block if the TCP buffers are stuffed.
  • Like most projects, documentation is lacking ...
  • DCC is not currently implemented in the asyncio-based version

Unfortunately, this library isn't as well-documented as I would like it to be. I think the best way to get started is to read and understand the example program irccat, which is included in the distribution.

The following modules might be of interest:

  • irc.client

    The library itself. Read the code along with comments and docstrings to get a grip of what it does. Use it at your own risk and read the source, Luke!

  • irc.client_aio

    All the functionality of the above library, but utilizing Python 3's native asyncio library for the core event loop. Interface/API is otherwise functionally identical to the classes in irc.client

  • irc.bot

    An IRC bot implementation.

  • irc.server

    A basic IRC server implementation. Suitable for testing, but not intended as a production service.

    Invoke the server with python -m irc.server.

Examples

Example scripts in the scripts directory:

  • irccat

    A simple example of how to use the IRC client. irccat reads text from stdin and writes it to a specified user or channel on an IRC server.

  • irccat2

    The same as above, but using the SimpleIRCClient class.

  • aio_irccat

    Same as above, but uses the asyncio-based event loop in AioReactor instead of the select() based Reactor.

  • aio_irccat2

    Same as above, but using the AioSimpleIRCClient class

  • servermap

    Another simple example. servermap connects to an IRC server, finds out what other IRC servers there are in the net and prints a tree-like map of their interconnections.

  • testbot

    An example bot that uses the SingleServerIRCBot class from irc.bot. The bot enters a channel and listens for commands in private messages or channel traffic. It also accepts DCC invitations and echos back sent DCC chat messages.

  • dccreceive

    Receives a file over DCC.

  • dccsend

    Sends a file over DCC.

NOTE: If you're running one of the examples on a unix command line, you need to escape the # symbol in the channel. For example, use \\#test or "#test" instead of #test.

Scheduling Events

The library includes a default event Scheduler as irc.schedule.DefaultScheduler, but this scheduler can be replaced with any other scheduler. For example, to use the schedule package, include it in your dependencies and install it into the IRC library as so:

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

Decoding Input

By default, the IRC library attempts to decode all incoming streams as UTF-8, even though the IRC spec stipulates that no specific encoding can be expected. Since assuming UTF-8 is not reasonable in the general case, the IRC library provides options to customize decoding of input by customizing the ServerConnection class. The buffer_class attribute on the ServerConnection determines which class is used for buffering lines from the input stream, using the buffer module in jaraco.stream. By default it is buffer.DecodingLineBuffer, but may be re-assigned with another class, following the interface of buffer.LineBuffer. The buffer_class attribute may be assigned for all instances of ServerConnection by overriding the class attribute.

For example:

from jaraco.stream import buffer

irc.client.ServerConnection.buffer_class = buffer.LenientDecodingLineBuffer

The LenientDecodingLineBuffer attempts UTF-8 but falls back to latin-1, which will avoid UnicodeDecodeError in all cases (but may produce unexpected behavior if an IRC user is using another encoding).

The buffer may be overridden on a per-instance basis (as long as it's overridden before the connection is established):

server = irc.client.Reactor().server()
server.buffer_class = buffer.LenientDecodingLineBuffer
server.connect()

Alternatively, some clients may still want to decode the input using a different encoding. To decode all input as latin-1 (which decodes any input), use the following:

irc.client.ServerConnection.buffer_class.encoding = "latin-1"

Or decode to UTF-8, but use a replacement character for unrecognized byte sequences:

irc.client.ServerConnection.buffer_class.errors = "replace"

Or, to simply ignore all input that cannot be decoded:

class IgnoreErrorsBuffer(buffer.DecodingLineBuffer):
    def handle_exception(self):
        pass


irc.client.ServerConnection.buffer_class = IgnoreErrorsBuffer

The library requires text for message processing, so a decoding buffer must be used. Clients must use one of the above techniques for decoding input to text.

Notes and Contact Info

Enjoy.

Maintainer: Jason R. Coombs <[email protected]>

Original Author: Joel Rosdahl <[email protected]>

Copyright © 1999-2002 Joel Rosdahl Copyright © 2011-2016 Jason R. Coombs Copyright © 2009 Ferry Boender

For Enterprise

Available as part of the Tidelift Subscription.

This project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.

Learn more.

More Repositories

1

keyring

Python
1,248
star
2

path

Object-oriented file system path manipulation
Python
1,103
star
3

inflect

Correctly generate plurals, ordinals, indefinite articles; convert numbers to words
Python
962
star
4

wolframalpha

Python
138
star
5

pip-run

pip-run - dynamic dependency loader for Python
Python
105
star
6

skeleton

A generic project skeleton for Python projects.
97
star
7

cssutils

Python
59
star
8

configparser

backport of configparser from Python 3
Python
47
star
9

zipp

Python
38
star
10

backports.functools_lru_cache

Python
37
star
11

svg.charts

SVG Charting Library for Python
Python
25
star
12

jaraco.windows

Python
24
star
13

cmdix

Fork of https://launchpad.net/pycoreutils
Python
22
star
14

keyrings.alt

Python
21
star
15

tempora

Python
19
star
16

jaraco.functools

Python
16
star
17

jaraco.text

Python
15
star
18

jaraco.clipboard

Python
14
star
19

jaraco.video

Python
13
star
20

jaraco.collections

Python
11
star
21

oathtool

Python
10
star
22

jaraco.nxt

Python
7
star
23

portend

Python
6
star
24

jaraco.abode

Python
6
star
25

jaraco.itertools

Python
6
star
26

jaraco.classes

Python
6
star
27

jaraco.mongodb

MongoDB Utilities including an oplog replay tool
Python
5
star
28

jaraco.docker

Python
5
star
29

xlsxcessive

Python
4
star
30

jaraco.crypto

Python
4
star
31

jaraco.packaging

Python
4
star
32

jaraco.context

Python
3
star
33

pywin32-ctypes

A limited subset of pywin32 re-implemented using ctypes
Python
3
star
34

pyevent

Automatically exported from code.google.com/p/pyevent
C
3
star
35

rst.linker

Python
3
star
36

jaraco.keyring

Python
3
star
37

paradocx

Python
3
star
38

jaraco.compat

2
star
39

freedompop

Python
2
star
40

jaraco.envs

Python
2
star
41

jaraco.media

Python
2
star
42

setuptools_svn

Python
2
star
43

backports.unittest_mock

Python
2
star
44

recapturedocs

Source for the Recapturedocs service
Python
2
star
45

backports.entry_points_selectable

Python
1
star
46

pytest-enabler

Python
1
star
47

jaraco.path

Python
1
star
48

jaraco.fabric

Python
1
star
49

keyrings.firefox

Python
1
star
50

jaraco.apt

Python
1
star
51

nspektr

Python
1
star
52

jaraco.vcs

Python
1
star
53

dropbox-index

Fork of http://code.google.com/p/kosciak-misc/wiki/DropboxIndex
Python
1
star
54

jaraco.develop

Python
1
star
55

jaraco.tidelift

HTML
1
star
56

transformers

Jupyter Notebook
1
star
57

http-okapi

HTML
1
star
58

multipy-tox

Dockerfile
1
star
59

jaraco.modb

Jupyter Notebook
1
star
60

jaraco.pmxbot

Python
1
star
61

pytest-perf

Python
1
star
62

jaraco.util

Python
1
star
63

singledispatch

Python
1
star
64

jaraco.services

Python
1
star
65

pipx-1539

1
star