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