
- moved Manual.txt into this directory - added a minimal example file meetingLocalConfig-example.py darcs-hash:20090707030516-82ea9-a3ec9c0b441e7a9e1bbcb63872427eeb2ec2a498.gz
547 lines
19 KiB
Plaintext
547 lines
19 KiB
Plaintext
====================================================
|
|
MeetBot, a supybot plugin for IRC meeting notetaking
|
|
====================================================
|
|
|
|
|
|
|
|
Introduction
|
|
============
|
|
|
|
MeetBot is a plugin to the IRC bot supybot to facilitate taking of
|
|
notes during IRC meetings. This allows you to better communicate with
|
|
your project or groups after the IRC meeting, as well as keep the
|
|
meeting more under control and on-topic.
|
|
|
|
This manual is for user and meeting chair reference. For installation
|
|
support, see ``README.txt``.
|
|
|
|
|
|
|
|
|
|
Tutorial
|
|
========
|
|
|
|
Let's go through, step by step, how a typical meeting might run::
|
|
|
|
< MrBeige> #startmeeting
|
|
|
|
We use the ``#startmeeting`` command to tell MeetBot to start the
|
|
meeting. The person who calls the command becomes the chair - having
|
|
the power to guide the meeting. However, by default MeetBot allows
|
|
other participants to enter most things into the logs, since inviting
|
|
contributions is generally a good thing.::
|
|
|
|
< MeetBot> Meeting started Wed Jun 17 05:00:49 2009 UTC. The chair
|
|
is MrBeige.
|
|
< MeetBot> Information about MeetBot at
|
|
http://wiki.debian.org/MeetBot , Useful Commands: #action
|
|
#agreed #halp #info #idea #link #topic.
|
|
|
|
MeetBot gives us a little bit of information about the meeting.::
|
|
|
|
< MrBeige> #topic should we release or not?
|
|
-!- MeetBot changed the topic of #meetbot-test to: should we release
|
|
or not?
|
|
|
|
We use the ``#topic`` command to tell MeetBot to move to the first
|
|
topic. MeetBot sets the topic in the channel to the topic which is
|
|
given on the line. Don't worry, the topic will be restored at the end
|
|
of the meeting.::
|
|
|
|
< MrBeige> #info we have two major blocking bugs: the character set
|
|
conversion, and the segfaults heisenbug in the save
|
|
routine.
|
|
|
|
When there is important things said, we don't want them to be lost in
|
|
the irclogs. Thus, we use the ``#info`` command to make a note of
|
|
it in the meeting minutes. It is also highlighted in the irclogs
|
|
which MeetBot takes.::
|
|
|
|
< MrBeige> #agreed we give one week to fix these (no other changes
|
|
accepted), and then release
|
|
|
|
We also have the ``#agreed`` command to use. This can only be used by
|
|
the chairs of the meeting, and should (obviously) be used to document
|
|
agreement. The rest of the line goes into the minutes as the thing
|
|
agreed on.::
|
|
|
|
< MrBeige> #action MrGreen and MrMauve work together to fix the bugs
|
|
< MrBeige> #action MrBeige releases when done
|
|
|
|
We have the ``#action`` command. This one is works just like the last
|
|
two, but has one extra feature: at the end of the meeting, it makes a
|
|
list of "Action Items", useful for being sure things get taken care
|
|
of. But there is more: it also makes a list of action items sorted by
|
|
*nick*. This can be used to easily see what is assigned to you. In
|
|
order for an item to be sorted by a nick, that nick has got to say
|
|
something during the meeting (but also see the ``#nick`` command), and
|
|
you have to use their nick exactly (use tab completion!).::
|
|
|
|
< MrBeige> #topic goals for release after next
|
|
-!- MeetBot changed the topic of #meetbot-test to: goals for release
|
|
after next
|
|
|
|
Moving on to the next topic...::
|
|
|
|
...
|
|
< MrBeige> #info make it better
|
|
...
|
|
< MrBeige> #info release faster
|
|
...
|
|
|
|
Record some of the important items from this section.::
|
|
|
|
< MrBeige> #endmeeting
|
|
|
|
Hit the ``#endmeeting`` command. The meeting ends, and logs and
|
|
minutes are saved::
|
|
|
|
-!- MeetBot changed the topic of #meetbot-test to: General
|
|
discussion of MeetBot
|
|
< MeetBot> Meeting ended Wed Jun 17 05:03:45 2009 UTC. Information
|
|
about MeetBot at http://wiki.debian.org/MeetBot .
|
|
< MeetBot> Minutes: http://rkd.zgib.net/meetbot/meetbot-test/meetbot-test.html
|
|
< MeetBot> Log: http://rkd.zgib.net/meetbot/meetbot-test/meetbot-test.log.html
|
|
|
|
MeetBot conveniently tells us where all of the logs are stored. You
|
|
can look at the `logs`_ and `minutes`_ online.
|
|
|
|
.. _logs: http://rkd
|
|
.. _minutes: http://rkd
|
|
|
|
|
|
|
|
|
|
Commands
|
|
========
|
|
|
|
All commands are case-insensitive, and use the ``#`` prefix
|
|
character. Not all commands have output. This might be confusing,
|
|
because you don't know if it's been acted on or not. However, this is
|
|
a conscious design decision to try to keep out of the way and not
|
|
distract from the real people. If something goes wrong, you can
|
|
adjust and have MeetBot re-process the logs later.
|
|
|
|
#startmeeting
|
|
Starts a meeting. The calling nick becomes the chair. If any text
|
|
is given on the rest of the line, this becomes the meeting topic,
|
|
see ``#meetingtopic`` above.
|
|
|
|
#endmeeting
|
|
End a meeting, save logs, restore previous topic, give links to
|
|
logs. You know the drill. (Chairs only.)
|
|
|
|
#topic
|
|
Set the current topic of discussion. MeetBot changes the topic in
|
|
the channel (saving the original topic to be restored at the end of
|
|
the meeting). (Chairs only.)
|
|
|
|
#agreed (alias #agree)
|
|
Mark something as agreed on. The rest of the line is the details.
|
|
(Chairs only.)
|
|
|
|
#chair and #unchair
|
|
Add new chairs to the meeting. The rest of the line is a list of
|
|
nicks, separated by commas and/or spaces. The nick which started
|
|
the meeting is the ``owner`` and can't be de-chaired. The command
|
|
replies with a list of the current chairs, for verification (Chairs
|
|
only.) Example::
|
|
|
|
< MrBeige> #chair MrGreen MsAlizarin
|
|
< MeetBot> Current chairs are: MsAlizarin MrBeige MrGreen
|
|
|
|
#action
|
|
|
|
Add an ``ACTION`` item to the minutes. Provide irc nicks of people
|
|
involved, and will be both a complete listing of action items, and a
|
|
listing of action items sorted by nick at the end of the meeting.
|
|
This is very useful for making sure this gets done. Example::
|
|
|
|
< MrBeige> #action MrGreen will read the entire Internet to
|
|
determine why the hive cluster is under attack.
|
|
|
|
If MrGreen has said something during the meeting, this will be
|
|
automatically assigned to him.
|
|
|
|
#info
|
|
Add an ``INFO`` item to the minutes. Example::
|
|
|
|
< MrBeige> #info We need to spawn more overlords before the next
|
|
release.
|
|
|
|
#link
|
|
Add a link to the minutes. The URL must be the first thing on the
|
|
line, separated by a space from the rest of the line, and it will be
|
|
properly hyperlinked. This command is automatically detected if the line
|
|
starts with http:, https:, mailto:, and some other common protocols
|
|
defined in the ``UrlProtocols`` configuration variable. Examples::
|
|
|
|
< MrBeige> #link http://wiki.debian.org/MeetBot/ is the main page
|
|
< MrBeige> http://wiki.debian.org/MeetBot/ is the main page
|
|
|
|
Both of these two examples are equivalent, and will hyperlink
|
|
properly. The first example below won't hyperlink properly, the
|
|
second one won't be automatically detected::
|
|
|
|
< MrBeige> #link the main page is http://wiki.debian.org/MeetBot/
|
|
< MrBeige> the main page is http://wiki.debian.org/MeetBot/
|
|
|
|
|
|
|
|
|
|
Less-used Commands
|
|
==================
|
|
|
|
#meetingtopic
|
|
Sets the "meeting topic". This will always appear in the topic in
|
|
the channel, even as the #topic changes. The format of the IRCtopic
|
|
is "<topic> (Meeting Topic: <meeting topic>)". (Chairs only.)
|
|
|
|
#commands
|
|
List recognized supybot commands. This is the actual "help" command.
|
|
|
|
#idea
|
|
Add an ``IDEA`` to the minutes.
|
|
|
|
#help (alias #halp)
|
|
Add a ``HELP`` item to the minutes. Confusingly, this does *not* give
|
|
supybot help. See #commands.
|
|
|
|
#accepted (alias #accept)
|
|
Mark something as accepted. The rest of the line is the details.
|
|
(Chairs only.)
|
|
|
|
#rejected (alias #reject)
|
|
Mark something as rejected. The rest of the line is the details.
|
|
(Chairs only.)
|
|
|
|
#save
|
|
Write out the logs right now. (Chairs only.)
|
|
|
|
#nick
|
|
Make a nick be recognized by supybot, even though it hasn't said
|
|
anything. This is only useful in order to make a list of action
|
|
items be grouped by this nick at the end of the meeting.
|
|
|
|
#undo
|
|
Remove the last item from the meeting minutes. Only applies to
|
|
commands which appear in the final output.
|
|
|
|
#restrictlogs
|
|
When logs are saved, remove the permissions specified in the
|
|
configuration variable ``RestrictPerm``. (Chairs only.)
|
|
|
|
#lurk and #unlurk
|
|
When ``lurk`` is set, MeetBot will only passively listen and take
|
|
notes (and save the notes), not reply or change the topic This is
|
|
useful for when you don't want disruptions during the meeting.
|
|
(Chairs only.)
|
|
|
|
#meetingname
|
|
Provide a friendly name which can be used as a variable in the
|
|
filename patterns. For example, you can set
|
|
filenamePattern = '%(channel)s/%%Y/%(meetingname)s.%%F-%%H.%%M'
|
|
to allow #meetingname to categorize multiple types of meeting
|
|
occurring in one channel.
|
|
|
|
All spaces are removed from the rest of the line and the string is
|
|
converted to lowercase. If ``meetingname`` is not provided, it
|
|
defaults to ``channel``. (Chairs only.)
|
|
|
|
|
|
|
|
Supybot Admin Commands
|
|
======================
|
|
|
|
These commands are for the bot owners to manage all meetings served by
|
|
their bot. The expected use of these commands is when the bot is on
|
|
many channels as a public service, and the bot owner sometimes needs
|
|
to be able to monitor and adjust the overall situation, even if she is
|
|
not the chair of a meeting.
|
|
|
|
All of these are regular supybot commands (as opposed to the commands
|
|
above). That means that the supybot capability system applies, and
|
|
they can be given either in any channel, either by direct address
|
|
(``BotName: <command> <args> ...``) or with the bot prefix character
|
|
(e.g. ``@<commandname> <args> ...``).
|
|
|
|
These are restricted to anyone with the ``admin`` capability on the
|
|
bot.
|
|
|
|
``listmeetings``
|
|
List all meetings.
|
|
|
|
``savemeetings``
|
|
Saves all active meetings on all channels and all networks.
|
|
|
|
``addchair <channel> <network> <nick>``
|
|
Forcibly adds this nick as a chair on the giver channel on the given
|
|
network, if a meeting is active there.
|
|
|
|
``deletemeeting <channel> <network> <saveit=True>``
|
|
Delete a meeting from the cache. If save is given, save the meeting
|
|
first. The default value of ``save`` is True. This is useful for
|
|
when MeetBot becomes broken and is unable to properly save a
|
|
meeting, rendering the ``#endmeeting`` command non-functional.
|
|
|
|
|
|
|
|
Hints on how to run an effective meeting
|
|
========================================
|
|
|
|
*Please contribute to this section!*
|
|
|
|
* Have an agenda. Think about the agenda beforehand, so that
|
|
attendees are not tempted to jump ahead and discuss future items.
|
|
This will make it very hard to follow.
|
|
* *Liberally* use the ``#action`` command, making sure to include the
|
|
nick of the person responsible. It will produce an easy-to-scan
|
|
list of things to do, as well as a sorted-by-nick version. This
|
|
will make these things more likely to get done.
|
|
* In the same spirit, liberally use ``#info`` on important pieces of
|
|
data. If you think you'll want to refer to it again, ``#info``
|
|
it. Assigning someone to watch the meeting to ``#info`` other
|
|
people's lines (if they forget) usually pays off.
|
|
* Don't be afraid to tell attendees to wait for a future topic to
|
|
discuss something.
|
|
* Delegate where possible and have those interested discuss the
|
|
details after the meeting, where applicable. No need to take
|
|
everyone's time if not everyone needs to decide. (This only
|
|
applies to some types of meetings)
|
|
* Sometimes one chair to manage the topic at hand, and one chair to
|
|
manage all people who are going off-topic, can help.
|
|
|
|
|
|
|
|
|
|
Configuration
|
|
=============
|
|
|
|
Configuration is done by creating a file ``meetingLocalConfig.py`` in
|
|
the plugin directory, or somewhere in your PYTHONPATH. It works by
|
|
(automatically, not user-visible) subclassing the Config class.
|
|
|
|
Here is a minimal usage example. You need at *least* this much to
|
|
make it run. Put this in ``meetingLocalConfig.py`` before you first
|
|
start supybot::
|
|
|
|
Class Config(object):
|
|
# These two are **required**:
|
|
logFileDir = '/home/richard/meetbot/'
|
|
logUrlPrefix = 'http://rkd.zgib.net/meetbot/'
|
|
|
|
Two other more commonly used options are::
|
|
|
|
filenamePattern = '%(channel)s/%%Y/%(channel)s.%%F-%%H.%%M'
|
|
MeetBotInfoURL = 'http://some_other_side.tld'
|
|
|
|
Place all of the configuration variables inside of the class
|
|
body like this.
|
|
|
|
``meetingLocalConfig.py`` is a complete execution, and causes a
|
|
subclass of the main Config object. Thus, you can do some advanced
|
|
(or just crazy) things like add a new meeting command, meeting
|
|
agenda item type, or more. Not all of these are documented here.
|
|
|
|
To reload a configuration in a running supybot, you can just reload
|
|
the plugin in supybot --- the module is reloaded. Specifically,
|
|
``/msg YourBotName reload MeetBot``.
|
|
|
|
|
|
|
|
Supybot-based Config
|
|
--------------------
|
|
|
|
In addition to the normal ``meetingLocalConfig.py`` based
|
|
configuration, there is a mode where the supybot registry system can
|
|
be used to set the values of some configuration variables. To enable
|
|
this system, first the
|
|
``supybot.plugins.MeetBot.enableSupybotBasedConfig`` variable must be
|
|
set to True. Then the MeetBot plugin must be reloaded::
|
|
|
|
/msg YourBot config supybot.plugins.MeetBot.enableSupybotBasedConfig True
|
|
/msg YourBot reload MeetBot
|
|
|
|
Now you can list the values available for configuration (the list
|
|
below may not be up to date)::
|
|
|
|
/msg YourBot config list supybot.plugins.MeetBot
|
|
----> #endMeetingMessage, #filenamePattern, #input_codec,
|
|
#logFileDir, #logUrlPrefix, #MeetBotInfoURL, #output_codec,
|
|
#pygmentizeStyle, #specialChannelFilenamePattern,
|
|
#startMeetingMessage, #timeZone, #usefulCommands,
|
|
enableSupybotBasedConfig, and public
|
|
|
|
Setting a value for a variable::
|
|
|
|
/msg YourBot config supybot.plugins.MeetBot.logUrlPrefix ...
|
|
... http://meetings.yoursite.net/
|
|
|
|
|
|
At present, not all variables are exported to supybot. All string
|
|
variables are, as well certain other variables for which a wrapper has
|
|
been written. If a variable doesn't appear in the supybot registry,
|
|
it can't be set via the registry.
|
|
|
|
If you want to disable supybot-based config for security reasons, set
|
|
``dontBotConfig`` to True in your custom configuration class in
|
|
``meetingLocalConfig.py``.
|
|
|
|
|
|
|
|
Required or Important Configuration
|
|
-----------------------------------
|
|
|
|
These variables are set either in ``meetingLocalConfig.py`` (in the
|
|
``Config`` class) or in the supybot registry.
|
|
|
|
``logFileDir``
|
|
The filesystem directory in which the meeting outputs are stored.
|
|
**Required** or supybot can't save properly.
|
|
|
|
``logUrlPrefix``
|
|
The URL corresponding to ``logFileDir``. This is prepended to
|
|
filenames when giving end-of-meeting links in the channel.
|
|
**Required** or supybot's URLs will be wrong.
|
|
|
|
``filenamePattern``
|
|
This defaults to ``'%(channel)s/%%Y/%(channel)s.%%F-%%H.%%M'``,
|
|
and is the pattern used for replacements to identify the name of
|
|
the file basename (including possible sub-directories) in which to
|
|
store the meeting output files. This is the suffix to
|
|
``logFileDir`` and ``logUrlPrefix``.
|
|
|
|
Variables available for replacement using ``%(name)s`` include:
|
|
``channel``, ``meetingname``. Double percent signs (e.g.: ``%%Y``
|
|
are time formats, from ``time.strftime``.
|
|
|
|
This filename does *not* include extensions. Those are found from
|
|
the writers, via the variable ``writer_map``.
|
|
|
|
Putting these all together, a set of variables could be:
|
|
1) ``logFileDir = /srv/www/meetings/``
|
|
2) ``%(channel)s/%%Y/%(channel)s.%%F-%%H.%%M``
|
|
3) (extensions come from ``writers_map``)
|
|
|
|
``MeetBotInfoURL``
|
|
This is a URL given in beginning and ending messages and minutes
|
|
files as a "go here for more information" link.
|
|
|
|
|
|
|
|
Other Config Variables
|
|
----------------------
|
|
|
|
These variables are set either in ``meetingLocalConfig.py`` (in the
|
|
``Config`` class) or in the supybot registry.
|
|
|
|
``RestrictPerm``
|
|
An int listing which permissions to remove when using the
|
|
``#restrictlogs`` command. It is best to use the python ``stat``
|
|
module to set it::
|
|
|
|
RestrictPerm = stat.S_IRWXO|stat.S_IRWXG
|
|
|
|
``specialChannels`` and ``specialChannelFilenamePattern``
|
|
When you are doing MeetBot testing, you would rather not have
|
|
nonstop different filenames each time you do a test meeting.
|
|
If a channel is in ``specialChannels``, it will use
|
|
``specialChannelFilenamePattern`` instead of ``filenamePattern``
|
|
when storing logs. ``specialChannels`` is a tuple listing channel
|
|
names. Example: the defaults are ``("#meetbot-test",
|
|
"#meetbot-test2")`` and ``'%(channel)s/%(channel)s'`` (note that
|
|
there is no time-dependence in the name).
|
|
|
|
``UrlProtocols``
|
|
Tuple of protocols to use to automatically detect link. Example:
|
|
the default tuple is ``('http:', 'https:', 'irc:', 'ftp:',
|
|
'mailto:', 'ssh:')``.
|
|
|
|
``command_RE``
|
|
How commands are detected. See code.
|
|
|
|
``pygmentizeStyle``
|
|
Style for the Pygments module to use to colorize the IRC logs.
|
|
The default is ``"friendly"``.
|
|
|
|
``timeZone``
|
|
Timezone used in the bot. Note: This will not yet work on a
|
|
per-channel basis. The default is ``"UTC"``
|
|
|
|
``startMeetingMessage``
|
|
|
|
``endMeetingMessage``
|
|
Message printed at the beginning/end of the meetings. Some
|
|
``%(name)s`` replacements are available: ``chair``, ``starttime``,
|
|
``timeZone``, ``endtime``, ``MeetBotInfoURL``, ``urlBasename``.
|
|
|
|
``input_codec``
|
|
|
|
``output_codec``
|
|
Input and output character set encodings.
|
|
|
|
``writer_map``
|
|
A python dictionary listing what output formats will be used to
|
|
write our final results to a file, along with extensions to use.
|
|
For example::
|
|
|
|
writer_map = {
|
|
'.log.html':writers.HTMLlog(),
|
|
'.html': writers.HTML(),
|
|
'.txt': writers.RST(),
|
|
#'.rst.html':writers.HTMLfromRST(),
|
|
}
|
|
|
|
|
|
|
|
Advanced Configuration
|
|
----------------------
|
|
|
|
This gives a few examples of things you can do via
|
|
``meetingLocalConfig.py``. Most people probably won't need these
|
|
things, and they aren't thoroughly explained here.
|
|
|
|
You can make a per-channel config::
|
|
|
|
class Config(object):
|
|
def init(self):
|
|
if self.M.channel == '#some-channel':
|
|
self.logFileDir = '/some/directory'
|
|
else:
|
|
self.logFileDir = '/some/other/directory'
|
|
|
|
|
|
The display styles (in html writers) can be modified also, by using
|
|
the starthtml and endhtml attributes (put this in
|
|
meetingLocalConfig.py::
|
|
|
|
import items
|
|
items.Agreed.starthtml = '<font color="red">'
|
|
items.Agreed.endhtml = '</font>'
|
|
|
|
|
|
Adding a new custom command via ``meetingLocalConfig.py``. This
|
|
likely won't make sense unless you examine the code a bit::
|
|
|
|
class Config(object):
|
|
def init(self):
|
|
def do_party(self, nick, time_, **kwargs):
|
|
self.reply("We're having a party in this code!")
|
|
self.reply(("Owner, Chairs: %s %s"%(
|
|
self.owner,sorted(self.chairs.keys()))))
|
|
self.M.do_party = types.MethodType(
|
|
do_party, self.M, self.M.__class__)
|
|
|
|
|
|
Make a command alias. Make ``#weagree`` an alias for ``#agreed``::
|
|
|
|
class Config(object):
|
|
def init(self):
|
|
self.M.do_weagree = self.M.do_agreed
|
|
|
|
|
|
Help and Support
|
|
================
|
|
|
|
The channel ``#meetbot`` on irc.oftc.net is the best place to go.
|