dirk
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:Django to IRC bridge
====
Dirk
====

Dirk, a bastardization of "Django + IRC", is, perhaps obviously, a bridge
between Django and IRC.

Dirk is very much a work-in-progress at this point. Use with caution.


Motivating Example
==================

A long-running Celery task currently requires active monitoring for progress
updates. It would be great if we could get those updates dumped into IRC so we
didn't have to pay such close attention to it!


Architecture
============

The current intersection of the sets of Python Redis clients and Python IRC
client libraries is awful. Ideally, and hopefully eventually, dirk will be
simpler to use.

Dirk is built on Rasputin_, a tool to abstract away multilanguage message
passing via a backend like Redis. On the Django side, you will need to run the
``rasputind`` daemon. You will also need to run a node.js process. These should
probably be on the same machine, as of right now. This allows your Python
processes to send messages via Rasputin (using Redis or other backends) to
node.js, which then echos them into IRC. Or you can initiate messages in IRC
and set up tools to get responses from Django.


Installation
============

Kind of complicated right now. I'm sorry.


Requirements
------------

* Django
* Rasputin_
* Node.js
* Redis


Installing
----------

Add ``rasputin`` and ``dirk`` to ``INSTALLED_APPS``.

Install dirk_ somewhere on the system with NPM. From source, you can do::

    $ git clone https://github.com/jsocol/dirk
    $ cd dirk
    $ npm install .

Installing it globally (``npm install -g dirk``) might be easier.


Configuring
-----------

Configure the Rasputin backend as documented.

Set up ``DIRK_CHANNEL_MAP`` in your Django settings. It's a dict where the keys
are dirk channels (basically any string you want) and the values are lists of
IRC channels, something like::

    DIRK_CHANNEL_MAP = {
        'reindex': ['#sumodev'],
        'new_question': ['#sumo'],
    }


Running
-------

You'll need to run two daemons. Neither (at the moment) daemonizes, so you'll
need to use supervisor_ or screen, or some other trick.

Django::

    $ ./manage.py rasputind

Node (globally installed)::

    $ dirkbot -p /path/to/python -m /path/to/manage.py


Broadcasting
============

To send an unprompted message to IRC, just use the fun ``dirk.say`` command!

::

    from dirk import dirk

    dirk.say('somechannel', 'Hello, world!')

Dirk will send the message via Rasputin to the IRC bot which will, based on the
``DIRK_CHANNEL_MAP`` setting, announce the message in the correct IRC channels.
Boom, simple!

An example might be a status for a long-running process, or a notification from
a cron job, or some rare and special event, like your millionth user
registration.


Receiving and Responding
========================

*NB: Incomplete and Unimplemented*

To make the dirk IRC bot respond with useful information, you'll need to
register a handler for a given command. These will be autodiscovered if they
are in ``dirk_command`` modules of apps in your ``INSTALLED_APPS``.

For example, assuming ``myapp`` is in ``INSTALLED_APPS``, you might have::

    # myapp/dirk_command.py
    from dirk import dirk

    @dirk.register('ping')
    def ping(*args, **kwargs):
        return 'pong!'

*NB: I have no idea what args or kwargs might be passed to these yet.*

Now, when you restart ``rasputind`` and go back to IRC, you can say to the dirk
bot::

     dirkbot: ping
     james: pong!

Or you can ``/msg`` the dirk bot::

    to dirkbot: ping
    from dirkbot: pong!


TODO
====

There's still quite a lot to do. Grep 'TODO' and you'll see.


.. _Rasputin: http://rasputinproject.org
.. _supervisor: http://supervisord.org/
.. _dirk: https://github.com/jsocol/dirk

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。