diff --git a/plugins/Alias.py b/plugins/Alias.py index a05654e0c..4a246ad35 100644 --- a/plugins/Alias.py +++ b/plugins/Alias.py @@ -144,28 +144,78 @@ def makeNewAlias(name, alias): f = utils.changeFunctionName(f, name, doc) return f - +def preserveAlias(fd, alias, command, locked): + def write(s): + fd.write(s) + fd.write(os.linesep) + write('alias %s' % alias) + write(' command %s' % command) + write(' locked %s' % locked) + write('') + + +filename = os.path.join(conf.supybot.directories.conf(), 'aliases.conf') class Alias(callbacks.Privmsg): def __init__(self): callbacks.Privmsg.__init__(self) - filename = os.path.join(conf.supybot.directories.data(), 'Aliases.db') - # Schema: {name: [alias, locked]} - self.aliases = structures.PersistentDictionary(filename) + # Schema: {alias: [command, locked]} + aliases = {} + class AliasCreator(object): + aliasName = None + def __init__(self): + self.aliasCommand = None + self.aliasLocked = None + + def badCommand(self, command, rest, lineno): + raise ValueError, \ + 'Invalid command on line %s: %s' % (lineno, command) + + def alias(self, rest, lineno): + if self.aliasName is not None: + raise ValueError, \ + 'Unexpected alias command at line %s' % lineno + AliasCreator.aliasName = rest + + def command(self, rest, lineno): + if self.aliasName is None: + raise ValueError, \ + 'Unexpected alias configuration at line %s' % lineno + self.aliasCommand = rest + + def locked(self, rest, lineno): + if self.aliasName is None: + raise ValueError, \ + 'Unexpected alias configuration at line %s' % lineno + self.aliasLocked = rest + + def finish(self): + if self.aliasCommand is None: + raise ValueError, \ + 'Unexpected end of alias configuration at line %s' \ + % lineno + aliases[self.aliasName] = (self.aliasCommand, self.aliasLocked) + AliasCreator.aliasName = None + reader = unpreserve.Reader(AliasCreator) + reader.readFile(filename) def __call__(self, irc, msg): # Adding the aliases requires an Irc. So the first time we get called # with an Irc, we add our aliases and then delete ourselves :) - for (name, (alias, locked)) in self.aliases.items(): + for (alias, (command, locked)) in self.aliases.iteritems(): try: - self.addAlias(irc, name, alias, locked) + self.addAlias(irc, alias, command, locked) except Exception, e: self.log.exception('Exception when trying to add alias %s. ' 'Removing from the Alias database.' % name) del self.aliases[name] del self.__class__.__call__ + callbacks.Privmsg.__call__(self, irc, msg) def die(self): - self.aliases.close() + fd = file(filename, 'w') + for (alias, (command, locked)) in self.aliases.iteritems(): + preserveAlias(fd, alias, command, locked) + fd.close() def lock(self, irc, msg, args): """ diff --git a/tools/aliasConvert.py b/tools/aliasConvert.py new file mode 100755 index 000000000..e1eaca1cd --- /dev/null +++ b/tools/aliasConvert.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +### +# Copyright (c) 2004, Jeremiah Fincher +# 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. +### + +__revision__ = "$Id$" + +import os +import sys + +if len(sys.argv) < 2: + sys.stderr.write('Usage: %s ' % sys.argv[0]) + sys.stderr.write(os.linesep) + +filename = sys.argv[1] + +import supybot + +import structures + +if __name__ == '__main__': + d = structures.PersistentDictionary(filename) + L = d.items() + L.sort() + fd = file('aliases.conf', 'w') + def write(s): + fd.write(s) + fd.write(os.linesep) + for (alias, (command, frozen)) in L: + write('alias %s' % alias) + write(' command %s' % command) + write(' locked %s' % frozen) + write('') + fd.close() + print 'Conversion complete. Move this new aliases.conf to the same' + print 'directory as your users.conf and channels.conf files.' + + + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: +