mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-11-02 17:29:22 +01:00
Create MegaHAL plugin
This commit is contained in:
parent
f613eb0f45
commit
07710b47ce
1
plugins/MegaHAL/README.txt
Normal file
1
plugins/MegaHAL/README.txt
Normal file
@ -0,0 +1 @@
|
||||
Insert a description of your plugin here, with any notes, etc. about using it.
|
66
plugins/MegaHAL/__init__.py
Normal file
66
plugins/MegaHAL/__init__.py
Normal file
@ -0,0 +1,66 @@
|
||||
###
|
||||
# Copyright (c) 2010, Valentin Lorentz
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions, and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions, and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the author of this software nor the name of
|
||||
# contributors to this software may be used to endorse or promote products
|
||||
# derived from this software without specific prior written consent.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
###
|
||||
|
||||
"""
|
||||
This plugins provides a MegaHAL integration for Supybot.
|
||||
MegaHAL must be installed ('apt-get install megahal' on Debian)
|
||||
"""
|
||||
|
||||
import supybot
|
||||
import supybot.world as world
|
||||
|
||||
# Use this for the version of this plugin. You may wish to put a CVS keyword
|
||||
# in here if you're keeping the plugin in CVS or some similar system.
|
||||
__version__ = ""
|
||||
|
||||
# XXX Replace this with an appropriate author or supybot.Author instance.
|
||||
__author__ = supybot.authors.unknown
|
||||
|
||||
# This is a dictionary mapping supybot.Author instances to lists of
|
||||
# contributions.
|
||||
__contributors__ = {}
|
||||
|
||||
# This is a url where the most recent plugin package can be downloaded.
|
||||
__url__ = '' # 'http://supybot.com/Members/yourname/MegaHAL/download'
|
||||
|
||||
import config
|
||||
import plugin
|
||||
reload(plugin) # In case we're being reloaded.
|
||||
# Add more reloads here if you add third-party modules and want them to be
|
||||
# reloaded when this plugin is reloaded. Don't forget to import them as well!
|
||||
|
||||
if world.testing:
|
||||
import test
|
||||
|
||||
Class = plugin.Class
|
||||
configure = config.configure
|
||||
|
||||
|
||||
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
|
72
plugins/MegaHAL/config.py
Normal file
72
plugins/MegaHAL/config.py
Normal file
@ -0,0 +1,72 @@
|
||||
###
|
||||
# Copyright (c) 2010, Valentin Lorentz
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions, and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions, and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the author of this software nor the name of
|
||||
# contributors to this software may be used to endorse or promote products
|
||||
# derived from this software without specific prior written consent.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
###
|
||||
|
||||
import supybot.conf as conf
|
||||
import supybot.registry as registry
|
||||
try:
|
||||
from supybot.i18n import PluginInternationalization
|
||||
from supybot.i18n import internationalizeDocstring
|
||||
_ = PluginInternationalization('MegaHAL')
|
||||
except:
|
||||
_ = lambda x:x
|
||||
internationalizeDocstring = lambda x:x
|
||||
|
||||
def configure(advanced):
|
||||
# This will be called by supybot to configure this module. advanced is
|
||||
# a bool that specifies whether the user identified himself as an advanced
|
||||
# user or not. You should effect your configuration by manipulating the
|
||||
# registry as appropriate.
|
||||
from supybot.questions import expect, anything, something, yn
|
||||
conf.registerPlugin('MegaHAL', True)
|
||||
|
||||
|
||||
MegaHAL = conf.registerPlugin('MegaHAL')
|
||||
# This is where your configuration variables (if any) should go. For example:
|
||||
# conf.registerGlobalValue(MegaHAL, 'someConfigVariableName',
|
||||
# registry.Boolean(False, """Help for someConfigVariableName."""))
|
||||
|
||||
conf.registerGroup(MegaHAL, 'learn')
|
||||
conf.registerGlobalValue(MegaHAL.learn, 'commands',
|
||||
registry.Boolean(False, _("""Determines whether the bot answers to messages
|
||||
beginning by a non-alphanumeric char.""")))
|
||||
conf.registerGroup(MegaHAL, 'answer')
|
||||
conf.registerChannelValue(MegaHAL.answer, 'commands',
|
||||
registry.Boolean(False, _("""Determines whether messages beginning by a
|
||||
non-alphanumeric char are learned.""")))
|
||||
conf.registerChannelValue(MegaHAL.answer, 'probability',
|
||||
registry.Integer(10, _("""Determines the percent of messages the bot will
|
||||
answer (zero is recommended if you have a tiny database).""")))
|
||||
conf.registerChannelValue(MegaHAL.answer, 'probabilityWhenAddressed',
|
||||
registry.Integer(100, _("""Determines the percent of messages adressed to
|
||||
the bot the bot will answer.""")))
|
||||
|
||||
|
||||
|
||||
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
|
137
plugins/MegaHAL/plugin.py
Normal file
137
plugins/MegaHAL/plugin.py
Normal file
@ -0,0 +1,137 @@
|
||||
###
|
||||
# Copyright (c) 2010, Valentin Lorentz
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions, and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions, and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the author of this software nor the name of
|
||||
# contributors to this software may be used to endorse or promote products
|
||||
# derived from this software without specific prior written consent.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
###
|
||||
|
||||
import re
|
||||
import sys
|
||||
import ctypes
|
||||
import random
|
||||
from cStringIO import StringIO
|
||||
import mh_python as megahal
|
||||
import supybot.utils as utils
|
||||
from supybot.commands import *
|
||||
import supybot.plugins as plugins
|
||||
import supybot.ircutils as ircutils
|
||||
import supybot.callbacks as callbacks
|
||||
|
||||
try:
|
||||
from supybot.i18n import PluginInternationalization
|
||||
from supybot.i18n import internationalizeDocstring
|
||||
_ = PluginInternationalization('MegaHAL')
|
||||
except:
|
||||
# This are useless function that's allow to run the plugin on a bot
|
||||
# without the i18n plugin
|
||||
_ = lambda x:x
|
||||
internationalizeDocstring = lambda x:x
|
||||
|
||||
class MegaHAL(callbacks.Plugin):
|
||||
"""This plugins provides a MegaHAL integration for Supybot.
|
||||
MegaHAL must be installed ('apt-get install megahal' on Debian)"""
|
||||
callAfter = ['MoobotFactoids', 'Factoids', 'Infobot']
|
||||
callBefore = ['Dunno']
|
||||
|
||||
def __init__(self, irc):
|
||||
self.__parent = super(MegaHAL, self)
|
||||
self.__parent.__init__(irc)
|
||||
# UTILISER UN CHANGEMENT DE RÉPERTOIRE DE TRAVAIL !
|
||||
stdout = sys.stdout
|
||||
sys.stdout = StringIO() # Don't display MegaHAL welcome message twice
|
||||
megahal.initbrain()
|
||||
sys.stdout = stdout
|
||||
|
||||
random.seed()
|
||||
|
||||
_dontKnow = [
|
||||
'I don\'t know enough to answer you yet!',
|
||||
'I am utterly speechless!',
|
||||
'I forgot what I was going to say!'
|
||||
]
|
||||
_translations = {
|
||||
'I don\'t know enough to answer you yet!':
|
||||
_('I don\'t know enough to answer you yet!'),
|
||||
'I am utterly speechless!':
|
||||
_('I am utterly speechless!'),
|
||||
'I forgot what I was going to say!':
|
||||
_('I forgot what I was going to say!'),
|
||||
}
|
||||
|
||||
def _response(self, msg, prb, reply):
|
||||
if random.randint(0, 100) < prb:
|
||||
response = megahal.doreply(msg)
|
||||
if self._translations.has_key(response):
|
||||
response = self._translations[response]
|
||||
reply(response)
|
||||
else:
|
||||
megahal.learn(msg)
|
||||
|
||||
def doPrivmsg(self, irc, msg):
|
||||
message = msg.args[1]
|
||||
probability = self.registryValue('answer.probability')
|
||||
|
||||
answer = False
|
||||
learn = False
|
||||
|
||||
if message.startswith(irc.nick) or re.match('\W.*', message):
|
||||
# Managed by invalidCommand
|
||||
return
|
||||
|
||||
print repr(message)
|
||||
if answer:
|
||||
self._response(message,
|
||||
self.registryValue('answer.probability'),
|
||||
irc.reply)
|
||||
elif learn:
|
||||
megahal.learn(message)
|
||||
|
||||
def invalidCommand(self, irc, msg, tokens):
|
||||
message = msg.args[1]
|
||||
usedToStartWithNick = False
|
||||
if message.startswith(message):
|
||||
parsed = re.match('(.+ |\W)?(?P<message>\w.*)', message)
|
||||
message = parsed.group('message')
|
||||
usedToStartWithNick = True
|
||||
if self.registryValue('answer.commands') or usedToStartWithNick:
|
||||
self._response(message,
|
||||
self.registryValue('answer.probabilityWhenAdressed'),
|
||||
irc.reply)
|
||||
elif self.registryValue('learn.commands'):
|
||||
megahal.learn(message)
|
||||
|
||||
@internationalizeDocstring
|
||||
def cleanup(self, irc, msg, args):
|
||||
"""takes no argument
|
||||
|
||||
Saves MegaHAL brain to disk."""
|
||||
megahal.cleanup()
|
||||
irc.replySuccess()
|
||||
|
||||
Class = MegaHAL
|
||||
|
||||
|
||||
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:
|
43
plugins/MegaHAL/test.py
Normal file
43
plugins/MegaHAL/test.py
Normal file
@ -0,0 +1,43 @@
|
||||
###
|
||||
# Copyright (c) 2010, Valentin Lorentz
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions, and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions, and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the author of this software nor the name of
|
||||
# contributors to this software may be used to endorse or promote products
|
||||
# derived from this software without specific prior written consent.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
###
|
||||
|
||||
from supybot.test import *
|
||||
|
||||
class MegaHALTestCase(PluginTestCase):
|
||||
plugins = ('MegaHAL',)
|
||||
|
||||
def testCleanup(self):
|
||||
self.assertNotError('cleanup')
|
||||
|
||||
def testAnswer(self):
|
||||
self.assertNotError('foo')
|
||||
|
||||
|
||||
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
|
Loading…
Reference in New Issue
Block a user