Merge remote-tracking branch 'supybot/master' into merge-supybot

Conflicts:
	INSTALL
	plugins/Misc/plugin.py
	plugins/Seen/test.py
	setup.py
	src/commands.py
	src/version.py
This commit is contained in:
Valentin Lorentz 2014-04-05 22:54:51 +02:00
commit 8885a813c5
7 changed files with 117 additions and 22 deletions

1
.mailmap Normal file
View File

@ -0,0 +1 @@
James McCoy <jamessan@users.sourceforge.net>

80
INSTALL Normal file
View File

@ -0,0 +1,80 @@
Common
First things first: Supybot *requires* at least Python 2.6 and
setuptools. There ain't no getting around it. You can get Python from
http://www.python.org/ and setuptools from
https://pypi.python.org/pypi/setuptools.
Recommended Software
PySQLite -- Version 1.x
Twisted -- Version 1.2.0 or greater
For more information and help on how to use Supybot, checkout
the documents under docs/ (especially GETTING_STARTED and
CONFIGURATION).
So what do you do? That depends on which operating system you're
running. We've split this document up to address the different
methods, so find the section for your operating system and continue
from there.
UNIX/Linux/BSD
If you're installing Python using your distributor's packages, you may
need a python-dev package installed, too. If you don't have a
'/usr/lib/python2.x/distutils' directory or
'/usr/lib/python2.x/config/Makefile' (assuming '/usr/lib/python2.x' is
where your Python libs are installed), then you will need a python-dev
package.
After you extract Supybot and cd into the supybot directory just
created, you'll want to run (as root) 'python setup.py install'. This
will install Supybot globally. If you need to install locally for
whatever reason, see the notes at the end of this section. You'll then
have several new programs installed where Python scripts are normally
installed on your system ('/usr/bin' or '/usr/local/bin' are common on
UNIX systems). The two that might be of particular interest to you, the
new user, are 'supybot' and 'supybot-wizard'. The former, 'supybot', is
the script to run an actual bot; the latter, 'supybot-wizard', is an
in-depth wizard that provides a nice user interface for creating a
registry file for your bot.
Local Install
You can install Supybot in a local directory by using the '--user'
option when running 'setup.py'. E.g., 'python setup.py install
--user' to install into your home directory. You'll now have
a $HOME/.local/bin directory containing Supybot programs ('supybot',
'supybot-wizard', etc.) and a $HOME/.local/lib directory containing the
Supybot libraries.
Windows
**Note**: If you are using an IPV6 connection, you will not be able
to run Supybot under Windows (unless Python has fixed things). Current
versions of Python for Windows are *not* built with IPV6 support. This
isn't expected to be fixed until Python 2.4, at the earliest.
Now that you have Python installed, open up a command prompt. The
easiest way to do this is to open the run dialog (Programs -> run) and
type "cmd" (for Windows 2000/XP/2003) or "command" (for Windows 9x). In
order to reduce the amount of typing you need to do, I suggest adding
Python's directory to your path. If you installed Python using the
default settings, you would then do the following in the command prompt
(otherwise change the path to match your settings)::
set PATH=C:\Python2x\;%PATH%
You should now be able to type 'python' to start the Python
interpreter. Exit by pressing CTRL-Z and then Return. Now that that's
setup, you'll want to cd into the directory that was created when you
unzipped Supybot; I'll assume you unzipped it to 'C:\Supybot' for these
instructions. From 'C:\Supybot', run 'python setup.py install'. This
will install Supybot under 'C:\Python2x\'. You will now have several new
programs installed in 'C:\Python2x\Scripts\'. The two that might be of
particular interest to you, the new user, are 'supybot' and 'supybot-wizard'.
The former, 'supybot', is the script to run an actual bot; the latter,
'supybot-wizard', is an in-depth wizard that provides a nice user interface for
creating a registry file for your bot.

View File

@ -1,6 +1,6 @@
### ###
# Copyright (c) 2002-2004, Jeremiah Fincher # Copyright (c) 2002-2004, Jeremiah Fincher
# Copyright (c) 2010-2011, James McCoy # Copyright (c) 2010-2011, 2013, James McCoy
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without

View File

@ -1,5 +1,6 @@
### ###
# Copyright (c) 2002-2004, Jeremiah Fincher # Copyright (c) 2002-2004, Jeremiah Fincher
# Copyright (c) 2013, James McCoy
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
@ -63,6 +64,16 @@ class ChannelDBTestCase(ChannelPluginTestCase):
with conf.supybot.plugins.seen.showLastMessage.context(False): with conf.supybot.plugins.seen.showLastMessage.context(False):
self.assertRegexp('seen any %s' % self.nick, self.assertRegexp('seen any %s' % self.nick,
'^%s was last seen[^:]*' % self.nick) '^%s was last seen[^:]*' % self.nick)
orig = conf.supybot.protocols.irc.strictRfc()
try:
for state in (True, False):
conf.supybot.protocols.irc.strictRfc.setValue(state)
for wildcard in self.wildcardTest:
self.assertRegexp('seen any %s' % wildcard,
'^%s was last seen' % self.nick)
self.assertRegexp('seen any bar*', '^I haven\'t seen anyone matching')
finally:
conf.supybot.protocols.irc.strictRfc.setValue(orig)
def testSeen(self): def testSeen(self):
self.irc.feedMsg(ircmsgs.join(self.channel, self.irc.nick, self.irc.feedMsg(ircmsgs.join(self.channel, self.irc.nick,
@ -76,10 +87,16 @@ class ChannelDBTestCase(ChannelPluginTestCase):
self.assertRegexp('seen user %s' % self.nick, self.assertRegexp('seen user %s' % self.nick,
'^%s was last seen' % self.nick) '^%s was last seen' % self.nick)
self.assertNotError('config plugins.Seen.minimumNonWildcard 0') self.assertNotError('config plugins.Seen.minimumNonWildcard 0')
for wildcard in self.wildcardTest: orig = conf.supybot.protocols.irc.strictRfc()
self.assertRegexp('seen %s' % wildcard, try:
'^%s was last seen' % self.nick) for state in (True, False):
self.assertRegexp('seen bar*', '^I haven\'t seen anyone matching') conf.supybot.protocols.irc.strictRfc.setValue(state)
for wildcard in self.wildcardTest:
self.assertRegexp('seen %s' % wildcard,
'^%s was last seen' % self.nick)
self.assertRegexp('seen bar*', '^I haven\'t seen anyone matching')
finally:
conf.supybot.protocols.irc.strictRfc.setValue(orig)
def testSeenNoUser(self): def testSeenNoUser(self):
self.irc.feedMsg(ircmsgs.join(self.channel, self.irc.nick, self.irc.feedMsg(ircmsgs.join(self.channel, self.irc.nick,

View File

@ -212,7 +212,8 @@ setup(
url='https://github.com/ProgVal/Limnoria', url='https://github.com/ProgVal/Limnoria',
author_email='progval+limnoria@progval.net', author_email='progval+limnoria@progval.net',
download_url='http://builds.progval.net/limnoria/', download_url='http://builds.progval.net/limnoria/',
description='A modified version of Supybot (an IRC bot)', description='A modified version of Supybot (an IRC bot and framework)',
platforms=['linux', 'linux2', 'win32', 'cygwin', 'darwin'],
long_description=normalizeWhitespace("""A robust, full-featured Python IRC long_description=normalizeWhitespace("""A robust, full-featured Python IRC
bot with a clean and flexible plugin API. Equipped with a complete ACL bot with a clean and flexible plugin API. Equipped with a complete ACL
system for specifying user permissions with as much as per-command system for specifying user permissions with as much as per-command

View File

@ -335,17 +335,16 @@ def getNetworkIrc(irc, msg, args, state, errorIfNoMatch=False):
else: else:
state.args.append(irc) state.args.append(irc)
<<<<<<< HEAD
def getHaveVoice(irc, msg, args, state, action=_('do that')): def getHaveVoice(irc, msg, args, state, action=_('do that')):
if not state.channel: getChannel(irc, msg, args, state)
getChannel(irc, msg, args, state)
if state.channel not in irc.state.channels: if state.channel not in irc.state.channels:
state.error(_('I\'m not even in %s.') % state.channel, Raise=True) state.error(_('I\'m not even in %s.') % state.channel, Raise=True)
if not irc.state.channels[state.channel].isVoice(irc.nick): if not irc.state.channels[state.channel].isVoice(irc.nick):
state.error(_('I need to be voiced to %s.') % action, Raise=True) state.error(_('I need to be voiced to %s.') % action, Raise=True)
def getHaveVoicePlus(irc, msg, args, state, action=_('do that')): def getHaveVoicePlus(irc, msg, args, state, action=_('do that')):
if not state.channel: getChannel(irc, msg, args, state)
getChannel(irc, msg, args, state)
if state.channel not in irc.state.channels: if state.channel not in irc.state.channels:
state.error(_('I\'m not even in %s.') % state.channel, Raise=True) state.error(_('I\'m not even in %s.') % state.channel, Raise=True)
if not irc.state.channels[state.channel].isVoicePlus(irc.nick): if not irc.state.channels[state.channel].isVoicePlus(irc.nick):
@ -354,16 +353,14 @@ def getHaveVoicePlus(irc, msg, args, state, action=_('do that')):
Raise=True) Raise=True)
def getHaveHalfop(irc, msg, args, state, action=_('do that')): def getHaveHalfop(irc, msg, args, state, action=_('do that')):
if not state.channel: getChannel(irc, msg, args, state)
getChannel(irc, msg, args, state)
if state.channel not in irc.state.channels: if state.channel not in irc.state.channels:
state.error(_('I\'m not even in %s.') % state.channel, Raise=True) state.error(_('I\'m not even in %s.') % state.channel, Raise=True)
if not irc.state.channels[state.channel].isHalfop(irc.nick): if not irc.state.channels[state.channel].isHalfop(irc.nick):
state.error(_('I need to be halfopped to %s.') % action, Raise=True) state.error(_('I need to be halfopped to %s.') % action, Raise=True)
def getHaveHalfopPlus(irc, msg, args, state, action=_('do that')): def getHaveHalfopPlus(irc, msg, args, state, action=_('do that')):
if not state.channel: getChannel(irc, msg, args, state)
getChannel(irc, msg, args, state)
if state.channel not in irc.state.channels: if state.channel not in irc.state.channels:
state.error(_('I\'m not even in %s.') % state.channel, Raise=True) state.error(_('I\'m not even in %s.') % state.channel, Raise=True)
if not irc.state.channels[state.channel].isHalfopPlus(irc.nick): if not irc.state.channels[state.channel].isHalfopPlus(irc.nick):
@ -372,8 +369,7 @@ def getHaveHalfopPlus(irc, msg, args, state, action=_('do that')):
Raise=True) Raise=True)
def getHaveOp(irc, msg, args, state, action=_('do that')): def getHaveOp(irc, msg, args, state, action=_('do that')):
if not state.channel: getChannel(irc, msg, args, state)
getChannel(irc, msg, args, state)
if state.channel not in irc.state.channels: if state.channel not in irc.state.channels:
state.error(_('I\'m not even in %s.') % state.channel, Raise=True) state.error(_('I\'m not even in %s.') % state.channel, Raise=True)
if not irc.state.channels[state.channel].isOp(irc.nick): if not irc.state.channels[state.channel].isOp(irc.nick):
@ -400,8 +396,7 @@ def getHostmask(irc, msg, args, state):
def getBanmask(irc, msg, args, state): def getBanmask(irc, msg, args, state):
getHostmask(irc, msg, args, state) getHostmask(irc, msg, args, state)
if not state.channel: getChannel(irc, msg, args, state)
getChannel(irc, msg, args, state)
channel = state.channel channel = state.channel
banmaskstyle = conf.supybot.protocols.irc.banmask banmaskstyle = conf.supybot.protocols.irc.banmask
state.args[-1] = banmaskstyle.makeBanmask(state.args[-1]) state.args[-1] = banmaskstyle.makeBanmask(state.args[-1])
@ -477,6 +472,8 @@ def getSeenNick(irc, msg, args, state, errmsg=None):
state.error(errmsg, Raise=True) state.error(errmsg, Raise=True)
def getChannel(irc, msg, args, state): def getChannel(irc, msg, args, state):
if state.channel:
return
if args and irc.isChannel(args[0]): if args and irc.isChannel(args[0]):
channel = args.pop(0) channel = args.pop(0)
elif irc.isChannel(msg.args[0]): elif irc.isChannel(msg.args[0]):
@ -508,8 +505,7 @@ def getChannelDb(irc, msg, args, state, **kwargs):
state.args.append(channel) state.args.append(channel)
def inChannel(irc, msg, args, state): def inChannel(irc, msg, args, state):
if not state.channel: getChannel(irc, msg, args, state)
getChannel(irc, msg, args, state)
if state.channel not in irc.state.channels: if state.channel not in irc.state.channels:
state.error(_('I\'m not in %s.') % state.channel, Raise=True) state.error(_('I\'m not in %s.') % state.channel, Raise=True)
@ -564,8 +560,7 @@ def getChannelOrGlobal(irc, msg, args, state):
state.args.append(channel) state.args.append(channel)
def checkChannelCapability(irc, msg, args, state, cap): def checkChannelCapability(irc, msg, args, state, cap):
if not state.channel: getChannel(irc, msg, args, state)
getChannel(irc, msg, args, state)
cap = ircdb.canonicalCapability(cap) cap = ircdb.canonicalCapability(cap)
cap = ircdb.makeChannelCapability(state.channel, cap) cap = ircdb.makeChannelCapability(state.channel, cap)
if not ircdb.checkCapability(msg.prefix, cap): if not ircdb.checkCapability(msg.prefix, cap):

1
src/version.py Normal file
View File

@ -0,0 +1 @@
version = '0.83.4.1+limnoria 2014.03.10'