2009-05-25 James Vega * Version 0.83.4.1! * Fixed a bug in Factoids where the help could not be retrieved for any command. * Fixed a bug where Plugin.list wouldn't list any aliases/RSS feeds from the Alias/RSS plugins. * Updated Google to ensure the third-party json module (different API than simplejson) isn't loaded. Based on a patch from Ricky Zhou. * Updated Channel.nicks so it doesn't reply with nicks from secret channels outside of that channel. * Updated Channel.{op,halfop,voice,deop,dehalfop,devoice} commands so they respect the server's "max mode changes per message" setting. * Updated utils.str.nItems to accept long as well as int. Thanks to Ricky Zhou for the patch. 2009-05-18 James Vega * Version 0.83.4! * Fixed a bug where we were attempting to tag a non-existent IrcMsg. * Fixed a bug where the Web plugin was not catching the correct exception. * Fixed a bug where the Protector plugin was attempting to use a non-existent variable. * Added verbiage to supybot.log.level indicating that it doesn't control the logging level for stdout and pointing out the correct config variable. * Added a new rank command to the ChannelStats plugin. * Added a new remove command to the Later plugin. * Added new azn and uniud commands to the Filter plugin. * Fixed a bug in the Socket driver that could cause it to continually attempt to reconnect to a server which is unavailable. * Fixed a bug in supybot-wizard that would cause it to abort if the user chose to use SSL. * Fixed the haveOp context to call getChannel if it wasn't already called. * Fixed a bug in supybot-test where the entire test run would end if one plugin couldn't be loaded. * Updated the httpUrl context to prepend 'http://' if that would result in a valid HTTP URL. A noticeable benefit is that users can now call "@title slashdot.org" instead of requiring the user to call "@title http://slashdot.org". * Fixed Supybot to be compatible with Python 2.6 * Added a note to Owner.defaultplugin's help to point out supybot.commands.defaultPlugin.importantPlugins, which affects which plugins have priorities over ambiguous command names. * Rewrote the Google plugin to use the new AJAX API since Google hasn't been giving out new keys for the SOAP API. * Added a new translate command to the Google plugin. * Fixed a copy/paste error in the help for User.capabilities. * Updated Web.title to give a more appropriate message if the URL definitely has no title. * Fixed irc.reply so prefixNick is not used when action=True. * Implemented the command flood prevention, controlled by supybot.abuse.flood.command.*, thanks to a patch from nebajoth. * Added utils/crypt.py to provide a uniform interface to the Python crypt functionality regardless of the Python version being used. * Fixed the urlRe and httpUrlRe regexes in utils/web.py to be more correct about what they match. They now match according to RFCs 1034 and 1738. * Updated getSyntax to allow the syntax string to be specified, similar to getHelp. * Updated getCommandHelp to respect supybot.reply.showSimpleSyntax. * Updated Factoids.getCommandHelp to respect supybot.reply.showSimpleSyntax. * Fixed a bug where getCommandMethod would return methods that weren't actually commands. This was exposed by adding a die Alias. * Removed supybot.plugins.Channel.banmask in favor of a general config variable, supybot.protocols.irc.banmask. * Updated AutoMode to respect supybot.protocols.irc.banmask when banning. * Updated Channel.ignore.add and Channel.ban.add to respect supybot.protocols.irc.banmask. * Fixed Channel.kban so that it will fall back to an exact hostmask instead of refusing to ban the user when the banmask would also match the bot's hostmask. * Added the ability to disable ChannelLogger's logging on a per-channel basis. * Fixed Config so it will respond with an error when the set, get, or default commands are called on config groups that don't have values. * Added a new config variable, supybot.plugins.AutoMode.owner, which can be used to prevent AutoMode behavior from applying to the owner(s) (since the owner has all capabilities). * Fixed the regex parsing in utils/str.py to correctly handle multiple backslashes before the search/replace separator. * Renamed supybot.plugins.Google.safeSearch to supybot.plugins.Google.searchFilter since the behavior and valid values changed as part of the switch to the AJAX API. * Updated RSS.announce to have list, add, and remove sub-commands instead of the old option-parsing interface. * Added a new config variable, supybot.plugins.ShrinkUrl.shrinkSnarfer.showDomain, which controls whether the shrinkSnarfer displays the domain of the original URL along with the shrunken URL. * Updated the default value for supybot.plugins.ChannelLogger.filenameTimestamp so it sorts chronologically. * Updated Misc.last to prevent users from retrieving messages from channels they aren't in or from private channels when they're in another channel. * Fixed supybot.directories.plugins so the directory Supybot is installed to is not included. This change makes the config file work across Python upgrades without user-intervention. * Updated Config.config to show both the global and channel-specific value (if it exists) of the variable. * Fixed Google.calc to work around a change in Google's HTML. This change should be more resilient to future HTML changes. * Fixed a bug where User.set.password could not be used if your current hostmask wasn't recognized. * Fixed a bug in Limiter where the limit could be set to fewer than the current number of users in the channel. * Updated String to give a more useful message when decoding a base64 string fails. * Updated User.hostmask.add to require it be called in private since a password may be given as part of the command. * Updated BadWords to only strip the formatting of messages which have a bad word in them. * Fixed a bug in the supybot script where it would continue to run even if it was unable to create the pidFile. This could cause multiple instances of supybot to run simultaneously if using supybot-botchk were being used to keep supybot running. * Updated plugins.DB to return a fake database check when generating documentation. This allows the user to generate docs without having the required database plugins installed. * Updated supybot-plugin-doc to be able to generate reStructuredText. * Removed the Insult plugin. * Added the Dunno plugin, which can be taught responses to use in place of the normal invalid command response. * Added the Success plugin, which can be taught responses to use in place of the normal operation succeeded response. * Updated the data file for Math's convert command. 2007-10-22 James Vega * Version 0.83.3! * Added the BadWords plugin from supybot-plugins and updated the plugin to allow kicking of people who use defined BadWords. * Added support for different log levels on stdout vs the log file. * Fixed a bug where the bot always reacted to invalid command floods even if supybot.abuse.flood.command.invalid indicated not to. (Closes: #1716878) * Fixed a bug where the RSS plugin would lower-case URLs, thus making them impossible to retrieve. (Closes: #1666786) * Fixed ircmsgs.prettyPrint to handle unrecognized commands. (Closes: #1630963) * Fixed a bug in the Services plugin where the bot would continuously send Ghost commands. * Fixed Google.calc to handle a change in Google's HTML. * Fixed a bug where Plugin.list was listing functions which weren't valid commands. * Fixed RSS's handling of encodings to eliminate some ascii conversion errors. * Updated the rssparser using plugins with the renamed and newer feedparser 4.1 in order to properly handle Bugzilla RSS feeds. * Updated PLUGIN_TUTORIAL to specify that the user needs to import Python's random module. * Updated the Web plugin so it uses HTMLParser over sgmllib's parser since sgmllib's enters an infinite loop on invalid input. * Updated getHelp() so callers can pass in the help string. This is used in the Factoids plugin to dynamically generate a help string based on a config value. * Updated questions.py so bolding is handled better. User input, default values, and defined choices are no longer bolded. * Updated String.len to use wrap(). This greatly simplifies the command and introduces better argument handling. * Updated a few uses of sre to use re if the bot is running under Python 2.5. * Fixed test cases for mircColor and sorted (thanks dcraven). * Updated assertAction's error message to give useful information about what went wrong. 2006-07-23 James Vega * Version 0.83.2! (A long overdue bugfix release) * Added ADVANCED_PLUGIN_CONFIG, ADVANCED_PLUGIN_TESTING, CAPABILITIES, USING_UTILS, USING_WRAP, STYLE, and PLUGIN_TUTORIAL docs. * Updated the Services plugin such that it will not spam GHOST commands faster than once every 60 seconds (or as set by supybot.plugins.Services.ghostDelay). * Updated the Seen plugin so that performing @seen with a leading wildcard will not result in duplicate nicks in the response. * Updated RSS to handle the feed's advertised character encoding in more of its commands. * Updated "Channel.ban list" to show how long until the ban expires. * Fixed the bug where addressed karma adjustments would cause the bot to crash. * Fixed Alias.lock and Alias.unlock to work properly now that the alias functions are no longer attributes of the Alias plugin. * Fixed a Windows-specific NameError in log.py. * Fixed Config.help to actually perform the string substitution of the given config name. * Replace Twisted with Socket as the default network driver. * Added an --ssl option to Network.connect. * Added a question about SSL network connections in supybot-wizard. * Added recognition of UnrealIRCd's protected users and channelowners as ops. * Updated URL.last to perform a case-insensitive search. * Updated the Author class so it performs the email munging. This prevents munging occurring for punctuation in a person's name. * Updated ircutils' color handling to specify a default foreground color of white if only a background color is specified. * Updated registry.StringWithSpaceOnRight to accept the empty string. * Updated registry.StringSurroundedBySpaces to be a single space if given an empty string. * Updated utils.str.format to recognize digits before the '.' in %f formatting. * Stop explicitly setting a umask. Instead we'll just obey the user's umask. 2005-09-01 James Vega * Version 0.83.1! * Fixed a bug in Owner where plugins would not be automatically loaded unless the bot was connected to more than one network. 2005-08-30 James Vega * Version 0.83.0! * Updated the Services plugin to realize it is identified when NickServ says that the bot is already identified. * Updated Network.whois so that +s channels are only returned when in that channel. * Updated RSS.info to retrieve the proper information from rssparser's results. * Updated the RSS plugin to encode the headlines in the proper charset, if the feed specifies an encoding. * Fixed a bug in Todo.todo when negative priorities are used. * Fixed a bug in Web where the entire title was not correctly parsed from the web page. * Fixed a bug in Web where the title was correctly parsed, but a later parsing problem caused the command to not reply with the title. * Fixed a bug in Misc.last where the last message in a channel was skipped when the command was not called in that channel. * Fixed a bug in Channel.ban remove and Channel.ignore remove when there were no bans or ignores. * Fixed a bug in User.hostmask list when there are no registered hostmasks. * Changed the prefixName keyword argument to prefixNick. * Updated the socket handling to properly detect when an IPV6 connection should be made. * Updated irclib to handle IRCds (like IRCNet) which send a MAXLIST-style value for the MAXBAN 005 key. * Updated the plugin loading to happen during __init__ instead of when receiving the 001 message. This allows the bot to connect to networks that require a CTCP response on connect. * Updated the SIGHUP handler to reload the ignoresdb. * Fixed a bug in ircutils.isNick so that it no longer allows nicks to start with a hyphen. * Fixed a bug in the first spec which would cause an error to be raised if the first converter failed. 2005-05-30 James Vega * Version 0.83.0rc3! * Updated Topic such that it can undo the first topic change performed in a channel. * Removed -O and -OO options for scripts/supybot. * Removed password hashing options for scripts/supybot-adduser. * Fixed a bug where RSS.remove wasn't removing the feed from conf.supybot.plugins.RSS.feeds. * Fixed a bug in Topic.set where setting the first topic would change the entire topic. * Fixed an AttributeError in the Ctcp plugin. * Fixed a problem where Supybot would attempt to connect to a network it was already connected to. * Fixed a problem where a command with the same name as its plugin had to be invoked as "plugin command". * Fixed an exception when irc.reply was called with a non-string argument. * Fixed an ImportError in Twisted driver when OpenSSL wasn't available. * Updated Socket driver to fix some longstanding issues. * Added supybot.drivers.maxReconnectWait, which determines the maximum amount of time the bot will wait before attempting to reconnect to an IRC server. * Added utils.python.Synchronized metaclass to ensure synchronized access to class methods. * Moved utils.changeFunctionName to utils.python.changeFunctionName. 2005-05-12 James Vega * Version 0.83.0rc2! * Added News, Unix, and Insult plugins which were missing in the previous RC. * Updated Misc.list to show the full configuration variable name when the plugin has no commands. * Fixed an HtmlParseError exception in Web's title command and titleSnarfer. * Fixed an ImportError exception when calling Todo.todo with no arguments. * Fixed a bug where Channel.{enable,disable} would throw an exception if only a command names was specified. * Added utils.str.ordinal (patch from genjamin AT gmail DOT com). 2005-05-02 James Vega * Version 0.83.0rc1! * Added supybot-botchk script. This script can be run from a cron job to make sure your Supybot restarts when the computer it runs on is rebooted, and can make sure the bot restarts if it ever crashes (which it shouldn't). It also allows restarting the bot without shelling out to the box it runs on; if you quit the bot, it'll automatically restart. * Added supybot-plugin-doc script, which generates documentation for a plugin. * Added SSL server support for the Twisted driver. * Added Web plugin, which contains most of the commands that were in the (formerly included) Http plugin. * Added Reply plugin, which contains several commands that were in the Misc and Utilities plugins. * Added Games plugin, which contains several commands that were in the (formerly included) Fun plugin. * Added String plugin, which contains several commands that were also in the formerly included Fun plugin. * Added Topic.fit, which adds a new topic to the end of the channel topic, removing topics at the beginning as necessary to squeeze the new topic in. * Added Seen.any, which reports the last time a person was seen at all, rather than just the last time a person said something in a PRIVMSG. * Added Web.fetch, which replies with the text of the given URL. This might be useful in combination with Utilities.re command, for pseudo-parsing URLs within aliases. * Added Note.next to retrieve the next unread note (patch from Sune Foldager. Come back, Sune!). * Updated User.capabilities always to respond in private (for owner users) and to prevent non-owner-users from retrieving other user's capabilities. * Updated Relay.{join,part} so they require the admin capability. * Updated Plugin.contributors to pull author/contributor information from the plugin in addition to the authors already hard-coded in Supybot. * Added conf.supybot.protocols.irc.queuing.rateLimit.join to throttle how fast Supybot joins channels. * Added conf.supybot.plugins.Herald.requireCapability, which specifies the capability a user needs to affect another user's herald. * Added conf.supybot.plugins.ShrinkUrl.bold, which specifies whether the plugin should use bold in its responses. * Renamed conf.supybot.plugins.Herald.throttleTime to conf.supybot.plugins.Herald.throttle. * Renamed conf.supybot.plugins.Herald.throttleTimeAfterPart to conf.supybot.plugins.Herald.throttle.afterPart. * Renamed the general log file (misc.log) to messages.log. * Renamed Google.metagoogle to Google.meta. * Renamed conf.supybot.protocols.irc.queueDuplicateMessages to conf.supybot.protocols.irc.queuing.duplicates. * Updated Alias.add so that alias names can coincide with plugin names. * Added netsplit throttling to Herald. Now if only we could do that to Relay... * Changed Todo's db format to a single flatfile db per user. * Fixed a bug where the nickInChannel converter would add the channel to the args list. * Fixed some exceptions in RSS. * Fixed a problem with RSS not properly escaping feed names. * Fixed supybot.utils.str parsing of regular expression separators other than / (patch from gcbirzan). * Fixed Owner.enable so that commands can actually be re-enabled. * Fixed Bug #1190350, incorrect extraction of a website's title. * Added various functions to supybot.utils.file (touch, writeLine, readLines, chunks). * Renamed the 'regexps' attribute in callbacks.PluginRegexp (formerly callbacks.PrivmsgCommandAndRegexp) to unaddressedRegexps to callbacks.PluginRegexp so as to complement addressedRegexps. * Removed the extra argument to utils.str.pluralize which specified whether or not to pluralize the string. * Changed the order of the arguments to utils.str.nItems. 2005-01-16 James Vega * Version 0.80.0! * Updated Babelfish to include Dutch, Greek, Russian, and traditional Chinese as supported languages. * Updated RSS.rss to obey supybot.reply.oneToOne. * Updated registry.py to specify which registry value has an improper docstring. * Fixed a bug in Ebay.auction, the "Current bid" regexp needed to be updated. 2005-01-12 James Vega * Version 0.80.0rc3! * Updated the Geekquote snarfer to snarf qdb.us' links. * Fixed a bug in Infobot, mis-typed registry value. * Fixed Network.connect to actually use the supplied password. * Fixed supybot.databases.plugins.channelSpecific.getChannelLink() to return the proper channel link instead of returning the given channel. 2005-01-11 James Vega * Version 0.80.0rc2! * Implemented Observer.remove, which disables and removes the observer from all channels. * Added supybot.databases.channelSpecific.link.allow to determine whether a channel allows other channels to link to its database. * Added supybot.plugins.BadWords.stripFormatting, which determines whether the bot will strip any formatting before filtering bad words. * Added supybot.plugins.Markov.ignoreBotCommands, which determines whether the Markov plugin will learn commands given to the bot. * Added a Network.driver command, which reports the current driver being used. * Added an Infobot.update command, which allows the user to import an existing Infobot factpack. * Added a Topic.replace command, which replaces the given topic with a new topic. * Added a Note.search command, which allows the user to search for notes they have sent or received. * Added supybot.databases.channelSpecific.getChannelLink(), which returns a channel based on how channels link to each other. * Added supybot.plugins.Channel.banmask which specifies the default method of generating Channel.kban's banmask. * Renamed supybot.databases.plugins.channelSpecific.channel to supybot.databases.plugins.channelSpecific.link. * Updated RSS.announce such that it adds the arguments to the current list of announced feeds instead of overwriting the current list. * Update the Google groupsSnarfer to work with Google's beta groups website. * Updated Network.disconnect to announce that the disconnection attempt has started. * Updated Debian.bug to handle website changes. * Updated Observer.{add,remove} to require the Admin capability. * Updated Infobot so that it actually works reasonably well; removed the deprecation. * Updated Sourceforge to handle changes in the website. * Updated UrbanDict to handle changes in the website. * Updated plugins.getChannel and plugins.makeChannelFilename to properly handle the new channelSpecific database setup. * Fixed a bug with ShrinkUrl.ln; the url needed to be urlquoted before being passed off to ln-s.net. * Fixed some database conversion bugs in fundbConvert.py. * Fixed a bug in socketDrivers where reconnection attempts would always occur immediately, thus continually blocking the bot. * Fixed an exception in registry.OnlySomeString's error method; the parent method doesn't accept an argument. * Fixed a bug in RSS where announcing the same feed in multiple channels would cause improper displaying of the new feeds. 2004-12-22 Jeremy Fincher * Version 0.80.0pre6! * Added a Topic.separator command, which replaces the current separator with a new separator, changing the topic to reflect the change. * Changed the supybot.user configuration variable so that if it isn't configured, the user will stay up-to-date with the current version of the bot. To take advantage of this, set your supybot.user configuration variable to "" * Removed the supybot.databases.users.hash configuration variable, so all bots hash by default. * Fixed a bug with AutoMode's auto-banning feature; a variable was misspelled. * Fixed a bug with ChannelValues picking up children that aren't channels. * Fixed Misc.apropos not to be case-sensitive. * Fixed bug in User.register; it works now. 2004-12-20 Jeremy Fincher * Version 0.80.0pre5! * Added a "shuffle" command to the Utilities plugin, which shuffles its arguments. Useful in combination with Utilities.last, which returns the last argument it's given, in combination with Utilities.apply, in order to pick a random string (think aliases). * Added supybot.plugins.Relay.noticeNonPrivmsgs, for making the relay plugin use NOTICEs rather than PRIVMSGs to relay non-PRIVMSG messages to a channel. This often affects tab coloring in IRC clients and thus makes it so that relay messages color the tabs like the actual messages would have. * Numerous bug fixes. Many, many bugs fixed. Oodles and oodles of bugs have been fixed. Myriad bugs fixed. Get the idea? :) 2004-12-17 James Vega * Version 0.80.0pre4! * supybot.databases.plugins.channelSpecific.channel is now a channelValue so that individual channels can decide to link their databases. * Deprecated asyncoreDrivers. Use twistedDrivers or socketDrivers instead. * Moved {eval,exec} from Owner.py to Debug.py in the sandbox. * Numerous bug fixes. 2004-09-30 Jeremy Fincher * Version 0.80.0pre3! * Deprecated FunDB, added two new plugins, Lart and Praise, to handle the same features individually for larts and praises. There is a script in tools/ that will convert from a FunDB to a lart or praise database. * Deprecated the Infobot plugin, in expectation of a rewrite. * Deprecated the Quotes plugin, since we don't know anyone who seriously uses it. Let us know if you do use it, because it may be removed in a future version. * Added Karma.{dump,load} for dumping and subsequently loading the Karma database. * Changed the News database implementation to a flatfile database. * Removed the tinyurl shrinking code from the URL plugin and put it in the ShrinkUrl plugin, and added the ability to use ln-s.net as different URL shrinker as well. * Added an outFilter to the ShrinkUrl plugin that will shrink any outgoing URL that is longer than the minimum length. * Added a Freenode plugin as proof-of-concept; the bot can now use CAPAB IDENTIFY-MSG to ignore users that aren't identified. * Added the ability for the Seen plugin to match nicks with wildcards. * Added a showLinks configuration option to the RSS plugin to show links during announcements (and another such variable for non-announcements). * Added the spellit, hebrew, and shrink filters to the Filter plugin. * Added the ability to log to separate directories to ChannelLogger. * Added the option to Lookup.add to add lookups that don't reply with the key. * Added "at" and "until" commands to the Time plugin; they're not perfect, and they don't parse nearly enough times, but they're somewhat tolerable for now. * Added a Sourceforge.stats command. * Added single-letter commands to the Words plugin when a hangman game is active. * Added supybot.plugins.Services.disabledNetworks, to disable the Services plugin specific networks. * Added supybot.protocols.irc.vhost, for binding to a vhost before connecting. * Added supybot.reply.format.time.elapsed.short, offering now a "short" formatting for elapsed times. * Added supybot.commands.quotes, for configuring which quotes can be used to quote arguments to commands. * Added supybot.databases.plugins.channelSpecific.channel, specifying the "default channel" for non-channel-specific databases to use. * Moved the supybot.humanTimestampFormat configuration variable to supybot.reply.format.time. * Added a configuration variable determining the maximum length of replies internally, so they can't suck up as much CPU as they would otherwise. * Added a configuration variable determining the maximum nesting depth allowed, so exceedingly nested commands will be stopped before they're executed. * Added configuration variables concerning the formats used by the central and plugin logging facilities. * Added a configuration variable determining the quote characters used by the bot to quote literal strings. * Added support for line-wrapping the registry configuration file. * Moved supybot.reply.{brackets,pipeSyntax} to supybot.commands.nested. * Fixed a longstanding bug with the bot "forgetting" channel-specific configuration variables if they weren't exercised during the duration of the bot's uptime. * Fixed renames so they're finally persistent. * Fixed a bug having to do with Note and unsent notes. * Fixed several bugs in the interaction of Infobot with other plugins. * Added commands.wrap, the new method for wrapping commands and handling type validation errors consistently throughout the bot. * Upgraded many of the outside projects we include to their newest versions. 2004-09-17 James Vega * Version 0.80.0pre2! * Added supybot.plugins.Google.colorfulSnarfer, which determines whether the word 'google' in the bot's output will be made colorful (like Google's logo). * Added the Time plugin, to hold all of our Time related commands. * Added max() and min() to Math.calc. * Added Unix.pid, which allows the Owner to retrieve the pid of the bot's process. * Added supybot.plugins.Sourceforge.enableSpecificTrackerCommands, which enables the rfe, bug, and patch commands. * Added Topic.topic, which returns the current topic of the channel. * Updated conf.Databases to use a more sane database ordering and include anydbm. * Updated various plugins to use our new-style database abstraction. Plugin databases using this new-style will be named Plugin.dbtype.db. 2004-09-12 Jeremy Fincher * Version 0.80.0pre1! * Added the facility to supporting several different database implementations in a plugin, allowing the user to specify which databases are supported as well as in what order of preference. * Added the Insult plugin, for colorful, creative insults. * Added the UrbanDict plugin, for defining words based on UrbanDictionary.com. * Added the Observer plugin, for watching a channel for regexps and running commands when the bot sees such regexps. * Moved Http.geekquote to a new Geekquote plugin, added a command for using qdb.us, and added a snarfer. * Added a SuperIgnore plugin, a good example of an inFilter and a way to completely, totally ignore people. * Changed the name of the Network plugin to Internet. * Added a new Network plugin, and moved some commands from Owner, Misc, and Relay to it. * Added CTCP flood protection. * Added a supybot.plugins.Karma.allowUnaddressedKarma configuration variable, for allowing karma increments/decrements similar to Infobot. * Added supybot.reply.whenAddressedBy.nicks, to allow users to specify a list of nicks to which the bot will respond as if they were its own nick. * Added the ability to support multiple-word karma increments/decrements. * Changed Owner.rename to be handled persistently; now renames work across restarts of the bot or reloads of a plugin. * Changed Misc.last to include a timestamp for when the message was sent. * Added the Channel.alert command, to send all currently connected ops on a channel a message. * Changed the MoobotFactoids plugin to allow commands to be nested in factoids definitions and searches. * Removed the futurama command in favor of adding a futurama.supyfact file to supybot-data. * Improved the Http.kernel command, showing more kernel types. * Added a new contributors command and a way of storing contributors and their contributions in a plugin. * Changed the name of Anonymous.action to Anonymous.do, to be more consistent with "say" and other bots (MozBot, iirc). * Added the ability for channel bans and ignores and global ignores to have expiration times. * Added invalid command flood protection. * Changed RSS' headlines output to bold the separators in order to make it easier to distinguish the headlines. * Added a --no-network option to supybot-wizard. * Added several attributes to IrcMsg objects as they pass through the bot; currently we tag them with receivedAt, receivedBy, and receivedOn. * Added RichReplyMethods.errorInvalid, a nice helper method for sending errors about invalid values. * Changed the --nonetwork and --noplugins options to test/test.py to --no-network and --no-plugins. * Changed plugins.makeChannelFilename, swapping the order of the channel and filename arguments and making the channel optional. * Changed the first argument to callbacks.Privmsg.callCommand to be a name rather than a method, for greater justice. * Added a new mechanism for ordering plugins (subclasses of callbacks.Privmsg) which is much more flexible than a simple priority system. 2004-09-06 James Vega * Version 0.79.9999! * Added stripFormatting option to ChannelLogger plugin, which determines whether non-printable formatting characters are logged. * Added Sourceforge.patches command to complement the current bugs and rfes commands. * Added abs() to Math.calc. * Improved the interface for Config.list. Now groups and values are listed, with groups being denoted by a leading @. * Improved Config.config such that the user can specify the entire config variable name (conf.supybot....). * Fixed a bug where ChannelLogger wouldn't log ignored nicks. * Fixed an incorrect path in INSTALL. * Fixed some missing imports in Unix's configure method. * Fixed a bug where an owner could publically retrieve a private configuration variable. * Fixed an exception when trying to remove non-existent Heralds. * Fixed an exception in RSS.getHeadlines. * Fixed a couple bugs in Poll, when retrieving the Poll id. * Fixed a problem with trying to use socket.inet_pton under Windows; Python doesn't build their Win32 port with IPV6 support, so we have to brute-force IPV6 detection. * Fixed a few bugs with how Infobot handled the SQLite db. * Fixed others/convertcore.py so that liter-based units are properly capitalized (L not l) and use 1000 as the conversion rate for MB, KB, etc. since MiB, KiB, etc. are also known units. * Fixed a bug where Infobot would confirm an unaddressed factoid definition. * Fixed a problem where Google.stats didn't keep track of all searches. 2004-08-31 Jeremy Fincher * Version 0.79.999! * Added the ability to send long fortunes line-by-line rather than all in one (or several) messages; it will do this if supybot.reply.oneToOne is set to False. * Added many configuration variables to the Unix plugin, allowing configurable commands and options to those commands. * Changed the output of Config.list to show groups with a preceding @, rather than use the --groups option. * Changed the Google.stats (formerly Google.info) command to be persistent, using the registry to record old values for the number of searches made and the number of seconds Google has spent searching for the bot. * Added module __revision__ logging to our exception logs, for more information in bug reports. * Fixed a bug with asyncoreDrivers' handling of reconnects; it would not reconnect when commanded to if it had reconnected before. * Fixed several bugs where the bot was testing nicks for equivalence without first normalizing them, leading to some false negatives. * Fixed a bug with the handling of supybot.reply.withNoticeWhenPrivate so all private messages really are replied to with a notice. * Fixed Http.geekquote to match the current bash.org layout. Also, made sure all ids are valid ids before requesting a quote (apparently bash.org is returning a certain quote for all invalid ids). * Fixed a bad regular expression in the Ebay plugin which could cause the bot to suck up 100% CPU for a signficant (perhaps practically infinite) amount of time. * Fixed a bug where the bot would sometimes reconnect to a network after being told to disconnect. * Fixed an uncaught exception in Owner.connect when the user forgets the network name 2004-08-30 Jeremy Fincher * Version 0.79.99! We're getting asymptotically closer to 0.80.0! * Added Anonymous.action, to anonymously perform actions in a specified channel. * Added a Karma.clear, so channel ops can clear the karma for a given name. * Added a Topic.redo, to redo the last undo. * Added supybot.protocols.irc.umodes, to allow the bot to set user modes upon connecting to a network. * Fixed numerous bugs involved with disconnecting, reconnecting, and using multiple networks. * Fixed a bug that would prevent the bot from quitting except via multiple Ctrl-Cs. * Fixed some mis-interaction between the Karma plugin and the Infobot plugin. * Fixed RSS's announcements. * Fixed bug in Later whereby no more than one message could be queued for a nick. * Fixed Services.configure, as well as several bugs in Services which sometimes prevented the bot from identifying. * Fixed bugs in the Poll module that caused the list and poll commands not to work. * Fixed the ebay snarfer. * Fixed exception raised by some CTCP messages when the URL plugin was loaded. * Fixed Debian.version. * Fixed Amazon's use of unicode. 2004-08-27 Jeremy Fincher * Version 0.79.9! * Added Infobot, a plugin to emulate Infobot. * Added Anonymous, a plugin for anonymously saying things to a channel. * Added Tail, a plugin which will tail logfiles and send the new lines to a configurable list of targets. * Added NickCapture, a plugin which tries to recapture a nick that's being used by someone else, both by watching for QUITs with that nick and by checking via ISON for that nick. * Changed the behavior of "seen" with the --user switch instead to be a separated command, Seen.user. * Changed the behavior of "seen" with no arguments instead to be a separate command, Seen.last. * Moved the connect and disconnect commands from the Relay plugin to the Owner plugin, so a Supybot can be on multiple networks without ever loading the Relay plugin. * Added relay bot detection to the Relay plugin. Now, rather than get involved in a loop with another relay bot, a Supybot will (if it has ops) rain down its wrath upon the offender. * Added supybot.plugins.Quotes.requireRegistration, which determines whether a user need be registered to add Quotes to the Quotes database. * Added supybot.plugins.RSS.showLinks, which determines whether the bot will show links to the RSS headlines along with the normally displayed titles. * Removed supybot.reply.withPrivateNotice and split it into two separate configuration variables, supybot.reply.withNotice and supybot.reply.inPrivate. * Added supybot.log.stdout.wrap, to allow optional (defaulting to True) wrapping of stdout logs. * Added supybot.databases.plugins.channelSpecific, a value that determines whether the database used for channel-based plugins will be a channel-specific database or a global database. This value, ironically enough, is channel-specific -- channels can each individually decide to be "part of the Borg" or to "be their own channel." The default, of course, is for databases to be channel-specific. * Changed the way channel databases are handled; instead of generating #channel- files, instead we create a subdirectory of the data directory named #channel, and then stick all the files in there. It's a much cleaner way to do things, in our opinion. * Added several configuration variables to the Status plugin to determine how verbose the cpu command is. These are, of course, channel-specific. * Added a configuration variable to the Dunno plugin, supybot.plugins.Dunno.prefixNick, which determines whether the bot will prefix the nick of the user giving an invalid command to its "dunno" response. Formerly, it never would; the default for this variable, however, is True, because that's how the rest of Supybot works. * Added Owner.rename, a command for renaming commands in other plugins. * Added Config.channel, for getting/setting channel configuration variables. * Fixed the problem with channels with dots or colons in them raising exceptions whenever the registry was accessed. * Changed Fun.eightball to provide a similar answer for a question asked multiple times. * Changed Fun.roulette to use a 6-barrel revolver. * Changed Bugzilla to use the registry, rather than a custom flatfile database format. * Added the KeepAlive plugin, to send useless keepalive messages to someone every some period. It's mostly just because we noticed that MozBot had one, and we couldn't allow ourselves to be outdone. * Changed the URL plugin to use flatfiles rather than SQLite database. Also reduced the functionality of the last command by removing some options that no one ever really used, and removed the random command (who uses that anyway?) * Changed the Words plugin not to use SQLite. We lose the anagram command, but crossword and hangman become much easier to use, since all the user has to do is put a words file in data/words. * Changed the Relay plugin to rely only on the registry, allowing it to start and join all networks and channels with no user/owner interaction at all. Also, removed the Relay.say and Relay.reconnect commands, since both can be accomplished easily using the Relay.command command in combination with Owner.reconnect and Anonymous.say commands. * Added supybot.reply.withNoticeWhenPrivate, to make the bot reply with a notice when it privately messages a user -- this generally means that the user's client won't open a query window, which may be nice. Do note that users can override this setting via the user registry variable of the same name. * Added supybot.nick.alternates, which allows a list of alternate nicks to try, in order, if the primary nick (supybot.nick) is taken. Also added a nick-perturbation function that will change supybot.nick if there are no alternates or if they're all taken as well. As a result, removed supybot.nickmods. * Changed ChannelLogger to log channels to logs/ChannelLogger, rather than simply logs. * Added the ChannelRelay plugin, to relay messages between two channels. This might be useful for people who want to forward CVS update messages from one channel (such as #commits) to another. * Added Channel.mode, to set modes in the channel, Channel.limit, to set the channel limit, Channel.moderate and Channel.unmoderate, to set +m and -m, respectively, and Channel.key to set or unset the channel keyword. * Added a new plugin, Format, which offers several commands for formatting strings on IRC. Moved several commands from to it from the Utilities plugin. * Improved the functionality of RSS.announce. Calling it with no arguments now lists the currently announced feeds. Removing feeds is done by specifying the --remove option. * Added a reconnect command to the Owner plugin. * Added aol and rainbow filters to the Filter plugin. * Added Nickometer plugin, a translation of Infobot's Nickometer. * Added multiple recipient support for notes. * Added BadWords.list, to list the bad words currently being censored by the bot. * Changed Misc.help to allow plugins to specify their own help, and added help for several of the more confusing plugins. * Added Dunno.stats, to return the number of dunnos in the database. * Added the Currency plugin, to perform currency conversions. * Added conf.supybot.plugins.Karma.allowSelfRating, which determines whether users are allowed to adjust the karma of their current nick. * Added --nolimit option to Misc.last, which causes it to return all matches that are in the history. * Added conf.supybot.plugins.Herald.defaultHerald, which provides a default herald to use for unregistered users. Herald.default was also added as a friendly interface to managing the defaultHerald. * Added Weather.wunder, which uses wunderground.com to report the current weather status. * Changed supybot.defaultCapabilities to be a space-separated list rather than a comma-separated list. Also added a check to make sure -owner was in supybot.defaultCapabilities, and to require a command-line option to allow it not to be present. * Added Sourceforge.fight, which returns the list of specified projects and their bug/rfe count in sorted order, least to most. * Added Utilities.reply for replying to a person with text. Like echo, but it prepends the nick like the bot normally does. * Changed Utilities.success to accept an optional argument for text to be appended to the success message. * Changed User.{addhostmask,removehostmask,register,unregister} to allow owner users to do what they will with their users. You can now add hostmasks, remove hostmasks, register users, and unregister users willy-nilly. * Changed and moved several configuration variables. supybot.{throttleTime,maxHistoryLength,pingServer,pingInterval} all moved to supybot.protocols.irc; supybot.httpPeekSize moved to supybot.protocols.http; supybot.threadAllCommands moved to supybot.debug.threadAllCommands, and probably a few others I forgot to mention. * Added Http.zipinfo, which returns a veritable plethora of information about the supplied zip code. * Added a configuration variable for every plugin, "public", that determines whether the plugin is considered public (i.e., whether it will show up in the list command when the list command isn't given the --private option). * Added Misc.author, a command for finding out which author claims a particular plugin. * Added Topic configuration supybot.plugins.Topic.format template string allowing full customization of the Topic items. * Added Topic.lock and Topic.unlock, for locking and unlocking the topic (setting +t or -t, respectively) * Added Topic.restore, for restoring the topic to the last-sent topic. Useful for when people change your carefully crafted topic by means other than the bot. * Changed supybot.brackets so you can now provide the empty string, which means you cannot do nesting of commands. * Added Utilities.last, which replies with the last string given to it. This is useful for sequencing commands and then replying with the output of the last commnad. * Updated RSS.info to accept a feed name as well as a url. * Added a signal handler for SIGTERM, so you folks killing your bots uncleanly won't have as many bugs :) * Added a signal handler for SIGHUP that reloads the bot's various configuration files. * Added a new configuration variable, supybot.pidFile, which determines what file the bot should write its PID to. The default is not to write the PID file at all. * Added a comma argument to utils.commaAndify, which specifies the character to use in place of the comma. 2004-04-16 Jeremy Fincher * Version 0.77.2! * Fixed numerous bugs, high and low, big and small and in-between. Definitely worthy of a release. * Added supybot.plugins.ChannelLogger.includeNetworkName, so the logs aren't strangified when relaying between channels. * Added a --capability option to User.list, to allow people to list all the users possessing a certain capability. The main reason this was added is so jemfinch can tell who owns which Supybots on #supybot :) * Added Utilities.success, mostly for making aliases such that they can respond with success if no errors were encountered in any nested commands. * Changed the name of the new filter, colorstrip, to be stripcolor. Better now than after it was highly established :) * Added configuration variables supybot.plugins.Services.NickServ.password (which replaces the old supybot.plugins.Services.password) for specifying the NickServ password, as well as supybot.plugins.Services.ChanServ.{op,halfop,voice}, which determine what the bot should request of ChanServ when it identifies or joins a channel. These latter variables are, of course, channel variables. * Added configuration variable supybot.plugins.Babelfish.languages (which replaces the old supybot.plugins.Babelfish.disabledLanguages) for specifying which languages will be translated/spoken. * Fixed bug #863601, plugin BadWords fails on color codes. * Replaced Sourceforge.{rfe,bug} with Sourceforge.tracker, which can query any tracker type (not just RFEs and bugs) and responds with more information, a la trackerSnarfer. * Added supybot.log.individualPluginLogfiles, which determines whether plugin logs will be logged to their individual logfiles in addition to the misc.log logfile. * Added supybot.plugins.WordStats.ignoreQueries, which, when true, makes the bot ignore queries (and not increment its word statistics). * Added the LogToIrc plugin, for sending logs to an IRC channel or nick. Useful for traceback notification and whatnot. * Changed supybot.log.timestampFormat to specially handle the empty string -- if it's set to the empty string, it will log times in seconds-since-epoch format. * Added supybot.plugins.Weather.convert, which determines whether or not Weather.{weather,cnn,ham} will convert temperature to the configured temperatureUnit. * Changed User.setpassword not to require the to be correct if the requesting user has the owner capability (and isn't the owner himself). * Added ircutils.strip{Bold,Reverse,Underline,Formatting}, which will remove the specified formatting or all forms of formatting in the case of stripFormatting. 2004-04-09 Jeremy Fincher * Version 0.77.1! * Added supybot.reply.errorWithNotice to make the bot give its error messages in a notice. * Added Filter.colorstrip, an outfilter that strips all color codes from messages. * Added supybot.plugins.BadWords.{replaceMethod, nastyChars, simpleReplacement, requireWordBoundaries}; see the associated help strings to find out what they do. * Added supybot.plugins.Babelfish.disabledLanguages, to disable certain languages from being translated/spoken. * Added supybot.reply.maximumMores, to give users the ability to set the maximum number of "more" chunks replies will generate. * Added supybot.reply.truncate, to turn off the normal chunking of replies that later can be retrieved with the more command. Setting this variable to On means that no chunks will ever be created. * Added supybot.plugins.Enforcer.takeRevengeOnOps, which makes the bot even take revenge on #channel,ops who try to violate the channel configuration. Of course, such people can change the channel configuration to their bidding, but it's a decent protection against errant botscripts or something. * Added supybot.plugins.Channels.alwaysRejoin, to make the bot always rejoin when it's kicked. * Added supybot.databases.users.hash, allowing those running bots to specify the default hashed/unhashed state of user passwords in the config file. * Added Debian.bug, which retrieve bug info from Debian's BTS. * Changed Relay.names to Relay.nicks, to be consistent with Channel.nicks. * Added supybot.brackets, a configuration variable for specifying which set of matching brackets to use for nested commands. Valid values are [] (the default), {}, <>, and (). * Added a configuration variable to ChannelLogger, timestamp, which determines whether the bot will timestamp its logfiles. This is a channel-specific variable, of course. * Updated ChannelLogger not to log messages starting with [nolog], in order to allow private information to remain private. * Added a configuration variable to ChannelLogger, flushImmediately, to cause all channel logs to be flushed every time they're modified, for those people who like to read the logs through tail -f or something similar. * Updated WordStats to allow removing of tracked words. * Updated Seen.seen to accept no arguments and return the last message spoken by anyone. * Updated the Herald plugin to use the standard substitute until we get it updated to use commands as heralds instead of plain strings. * Updated echo to use the standard substitute on its reply. * Updated Network.whois so that it can now retrieve information on all domains. * Updated the Weather plugin to be retrieve weather from either hamweather.net or cnn.com. Also added supybot.plugins.Weather.{command,temperatureUnit} so that you can specify which command (Weather.cnn or Weather.ham) to use when Weather.weather is called and in which unit (C, F, K) to report the weather. * Updated standard replies (such as supybot.replies.success, etc.) to use the standard substitute (such as $nick, $who, $channel, etc.) in their text. * Fixed snarfers to respect lobotomies. * Fixed Admin.join not to add the channel to the supybot.channels registry entry if joining the channel wasn't successful. 2004-02-20 Jeremy Fincher * Version 0.77.0! * Changed the format of the user and channel databases to something much more readable and user-editable. Be sure, if you're upgrading, to run tools/ircdbConvert.py on your user and channel databases *BEFORE* installing the new version. * Updated almost every document we have, and added a GETTING_STARTED document. Yay! * Added several new options for Channel.kban: --exact, --nick, --user, --host, for more flexibility in determining what the banmask is. * Added a Scheduler plugin for scheduling events to occur at specific times. * Added a Herald plugin for announcing to the channel the arrival of certain users. * Changed the reply method of the irc object given to plugins not to require a msg object. * Added inter-factoid references for MoobotFactoids. Simply define a factoid as "see " (and nothing else) and it will automatically go pick up the value for that factoid and display it in its place. Sort of a "symlink" for MoobotFactoids. * Added the ability to reply to factoids without the "whatis" in the Factoids plugin. Now, you can use "@foo" instead of "@whatis foo". * Added --{from,to} and --sent options to Note.sent. * Changed Note.get to simply be "note". Instead of "note get 145", you should use "note 145". * Changed channel capabilities to use a comma to separate the channel from the capability instead of a period. This is because channels can include periods (but not commas) and since we now allow "plugin.command" capabilities, there's no way to know whether a given dot is separating the channel from the capability or the plugin from the command. * Removed Admin.setprefixchar, since it's unneeded with the new configuration. * Removed Status.bestuptime, since it was buggy and no one felt like maintaining it. * Added Http.cyborg, a fun little command for getting cyborg abbreviations for names. * Added Sourceforge.totalbugs and Sourceforge.totalrfes * Removed Owner.{set,unset} since they matter not. * Made the smileys and frowns configurable in ChannelDB. * Added a vast array of new configurables -- check out the various config commands in Configurable plugins to see. * Added better error reporting for Admin.join, explaining to the user if the bot can't join the channel. * Added a title-snarfer to the URL plugin. * Added Relay.command, a command for sending commands to the bot on a different network. * Added Bugzilla.search, a new command for searching a bugzilla installation * Added an INVITE handler in Admin, allowing users with the admin capability to INVITE the bot to a channel. There's also a config variable, alwaysJoinOnInvite, that will cause the bot to join a channel whenever someone invites it to a channel, not just users with the admin capability. * Added conf.requireChannelCommandsToBeSentInChannel for requiring all channel-related commands to be sent in the channel. * Added conf.followIdentificationThroughNickChanges for having the bot update user's identified hostmask when they change nicks. * Added conf.replyWhenNotAddressed, a configuration variable for having the bot always attempt to parse a message as a command. * Added conf.replyWhenAddressedByNick, a configuration variable for having the bot *not* respond when addressed by his nick. * Added conf.replyWithNickPrefix, a configuration variable for having the bot not prefix the nick of the person giving a command to the reply. * Changed all "zegrep" stuff to "zgrep -e" stuff, since zegrep is on fewer platforms than zgrep. 2003-12-12 Jeremy Fincher * Version 0.76.1! The birthday release! * Fixed a bug in irclib.py that could cause the bot to loop, connecting and disconnecting from the server because it didn't think the server responded to its PING. * Fixed a bug in the Services implementation that could cause the bot to continually loop, connecting and disconnecting from the server. * Fixed Misc.help to follow the same default plugin rules that the rest of the bot follows. * Added better error reporting to Admin.join, so the various error conditions that might make the bot incapable of joining a channel will be reported. * Updated RootWarner to be configurable, offering each channel the ability to define whether or not people who IRC as root will be warned, what that warning will be, and whether or not they should be kicked. * Added a configurable 'topic-sync' to the Relay plugin to determine whether the topics of the two channels should be kept synchronized. * Added Lookup.search for searching the various loaded lookups. * Added Topic.reorder, a new command for reordering the topics in a specific manner. * Added Topic.list, a new command for listing the topics in a channel (mostly in order to help out with Topic.reorder :)) * Added Http.extension, a new command to retrieve file extension information from filext.com. * Updated Todo.remove to allow removing multiple taskids * Updated Relay.whois to include a user's away status and identified state, if the server supports it. * Added utils.sorted, which does what list.sorted will do when 2.4 is released. * Added ircutils.isCtcp, for determining whether or not a message is a CTCP message. 2003-12-6 Jeremy Fincher * Version 0.76.0! * Added a "trusted" capability that defaults to off (-trusted) and is required for Utilities.re (with which it's possible to DoS the bot) and for the new Math.icalc (with which it is trivially possible to DoS the bot). * Added Math.icalc, a new command for doing integer arithmetic. It requires the "trusted" capability. * Added the Fun.ping command, because MozBot has it. * Added Note.unsend command, to allow users to "unsend" notes they've sent but whose recipient has not yet read. * Added Channel.{deop,devoice,dehalfop,kick}. * Added Http.size and Http.doctype and Http.headers to retrieve various meta-information on URLs. * Added a ranking to ChannelDB.wordstats. * Added Karma.most for determining various "mosts" in the Karma database. * Added User.list command to list registered users. * Added 'roulette' command to Fun plugin. * Added a Channel.lobotomies command to list the channels in which the bot is lobotomized. * Added a swap function to Math.rpn. * Changed the name of User.changeusername to User.changename. * Changed the logging infrastructure significantly; each plugin now has its own logger (and thus logfile), in addition to being logged in the main logfile. * Fixed bug in which the bot wouldn't rejoin channels after a reconnect. Thank the Lord for tcpkill :) * Fixed Http.freshmeat for projects with a space in their names. * Changed RSS so RSS feed commands may be added while the bot is running, and so added RSS feed commands are in the RSS plugin. * Changed Lookup so added lookups are added in the Lookup plugin itself so there's no dependency on Alias, and so loaded lookups can be seen via 'list Lookup'. * Fixed bug #850931 as well as several other minor bugs in Utilities.re. * Fixed bug #851254, Factoids.whatis didn't work on numeric keys. * Added the ability to turn on/off the showing of ids in FunDB excuse/insult/praise/lart. * Added the to= keyword argument to the various reply functions to you can specify a target to send the message to. * Changed socketDrivers to allow more time (10x more, to be exact) for connecting to the network than for the normal read. * Fixed a bug in Http.weather that would cause an ugly error message for a command like "weather hell". * Added the number of strings to the Fun.object output. * Fixed bug in RSS.configure; no aliases could be added. * Changed Alias.freeze to Alias.lock. * Fixed sorting in Status' uptime database. * Updated the Gameknot tests for expired games, and updated the Gameknot plugin to handle such links in its snarfer. * Added a 'server' attribute to Irc objects to unify the way to access such information. * Added revision command for finding out the revision of the files in a running bot; also added __revision__ strings so CVS would be happy to keep such information for us :) * Fixed bug #848475 -- bad error message from regexp-expecting commands. * Stopped listing the plugin dispatcher command in the list of commands for that plugin. * Fixed bug in Gameknot.gkstats when retrieving the stats for users who haven't yet played a game. * Added a numUsers() method to ircdb.UsersDB (ircdb.users). 2003-11-18 Jeremy Fincher * Changed commands so that plugins no longer have to make sure that their commands are unique within the bot. Ambiguous commands will reply with an error message and instruct the user to disambiguate the command by prefixing with the appropriate plugin name.. Many commands that formerly contained the plugin name (or a portion thereof) have had it removed, and many plugins have had their names changed so prefixing a command with the plugin name is less bulky. Rather than list each individual example, you can read the plugin documentation posted at ***TODO*** * Renamed numerous plugins: OwnerCommands became Owner, AdminCommands became Admin, ChannelCommands became Channel, MiscCommands became Misc, UserCommands became User, URLSnarfer became URL, Notes became Note, FunCommands became Fun, IMDB became Movies, and Aliases became Alias. * Made aliases persistent across reloads/bot restarts. You should probably change your botscripts not to add the aliases onStart, but (assuming those aliases don't change) it should still work fine. * Added the ability for users to specify that their passwords should be hashed on disk. * Added MoobotFactoids plugin for moobot-style factoids (which are meant to mimic blootbot-style factoids). People used to traditional IRC bot factoids plugins will probably find this plugin more to their taste than Factoids. * Added Ebay plugin for snarfing eBay URLs as well as getting info on certain auctions. * Added monitoring of occurrences of certain words on a per-user basis, adding two new commands to ChannelDB (addword and wordstats). * Added Bugzilla module for accessing various data in Bugzilla pages. * Added QuoteGrabs module which allows people to grab interesting quotes from other people and store them in the bot for later retrieval (also optionally have the bot randomly snarf quotes). * Added a "change" command to change factoid values in the Factoids plugin. * Added Dunno plugin as an optional replacement for the boring 'no such command' response. * Changed FundB to allow accessing excuses, larts, and praises by id. * Added substitutions for 'me' and 'my' in insult/praise/lart. * Added 'change' and 'old' commands for News. * Added ASPN Python Cookbook URL snarfer. * Moved karma out of ChannelDB and into its own Karma plugin. * Moved uptime-related commands to from FunDB to the Status plugin. * Renamed the Network.internic command to whois, since we can now fix ambiguity by prefixing the plugin name. * Removed the "googlesite" function. * Removed "dictserver" command in favor of using the Configurable framework with the Dict plugin instead. * Removed TwistedCommands plugin to the sandbox; the one command it provided (dict) is now better provided in the Dict plugin. * Removed the Moobot plugin (the commands were moved to the Fun plugin or dropped entirely). * Removed all example strings from plugins. To be replaced with an automated process later. * Converted several plugins to the new Configurable plugin type Plugins modified include Bugzilla, ChannelDB, Dict, Ebay, Enforcer, Gameknot, Google, Python, Relay, and URL (formerly URLSnarfer). * Changed ChannelDB database to use integer user ids instead of text usernames. * Changed Http.geekquote to use multiline geekquotes (and removed the option to do so, since it's now the default). * Added a --id switch to geekquote to pick a specific geekquote. * Changed most commands in News to require the 'news' capability. * Changed Relay.names output to show (and sort by) status in the channel. * Removed 'relaycolor' command in favor of Configurable framework. * Added total memory usage to 'cpustats' output for several *nix platforms. * Removed the total percentage of CPU time from 'cpustats'. Not only was it inaccurate, but we needed the room for memory stats. * Changed Topic.shuffle to ensure that the topic is actually shuffled. * Changed all commands which take an index (various Topic and Factoids commands) to index from 1 instead of 0. * Fixed several bugs in Unix.spell whereby the bot could be frozen. * Changed the name of the "bug" command in the AdminCommands plugin to "reportbug" instead. * Added QUIT stat-keeping to ChannelDB. * Removed the OwnerCommands.say command; it wasn't useful enough, and is so easily written that anyone can have it back if they want it. * Changed OwnerCommands.load (and reload) to be case-insensitive, so "load funcommands" works just as well as "load FunCommands". * Changed the keyword parameter "needed" to privmsgs.getArgs to be "required" instead. It just sounds better, works with "optional" better, and we won't get an opportunity later to change it. * Updated IrcObjectProxy.reply to allow a "notice" boolean keyword to determine whether or not to reply via a notice. * Added privmsgs.urlSnarfer, a wrapper around snarfer methods that handles both the threading and the limiting of replies so loops between two snarfing bots can't happen. * Added structures.PersistentDictionary for dictionaries that should be saved to a file in repr()ed form. * Added structures.TwoWayDictionary for dictionaries that should map keys to values and vice versa. * Added a curry function to fix.py for doing currying (if you don't know what it is, don't worry about it :)) * Added utils.depluralize to do the opposite of utils.pluralize. * Added utils.safeEval for safe evaluation of Python data structures (lists, dictionaries, tuples, numbers, strings, etc., but no operations on them). * Added utils.saltHash for handling the hashing of passwords with a salt. * Added plugins.standardSubstitute to do standard substitutions for things like $who, $nick, $channel, etc. * Added plugins.Configurable, a plugin mixin that allows easy specification and persistence of configurable data on a global and per-channel basis. * Fixed plugins.ChannelDBHandler (and added plugins.DBHandler) to be threadsafe, so threaded plugins could still use a database, and non-threaded database-using plugins could still receive the results of a threaded command. * Removed ircutils.privmsgPayload and ircutils.shrinkList, both of which existed prior to the addition of more, and aren't needed anymore. 2003-10-12 Jeremy Fincher * Version 0.73.1! * Fixed a bug in Math.{calc,rpn} where certain functions ("degrees" in particular) that didn't like complex arguments would fail on numbers on which they shouldn't. * Added an optional "key" argument to ChannelCommands.cycle. * Fixed bolding in supybot-wizard.py. * Fixed handling of the secure flag by ircdb.IrcUser.setAuth; previously it didn't prevent someone with an unmatched hostmask from identifying. * Fixed imports in the DCC plugin. * Fixed a bug where the bot would not reply to nick-addressed messages on a channel if his nick wasn't entirely lowercased. * Fixed the Relay plugin to relay topic changes; an oversight not caught earlier because supybot has for a long time managed our topics. * Fixed a bug in the Services plugin where the bot would ghost himself if his nick didn't match in case the nick given. * Added the ability for PrivmsgCommandAndRegexp to have regexps that are called *after* callbacks.addressed has been called on the message -- see ChannelDB.{increase,decrease}Karma for an example. * Fixed bug in supybot-wizard.py where plugins without configure functions would raise an uncaught exception. * Fixed debincoming to work since the removal of baseplugin; it was missing an import. * Fixed MiscCommands.doPrivmsg to send an IrcObjectProxyRegexp to the replyWhenNotCommand function. * Fixed debversion to display the correct output when no matching packages were found. * Fixed ChannelDB to import conf; karma didn't work otherwise. * Fixed a bug in the Enforcer plugin that would cause the bot to ban everyone from the channel whenever ChanServ deopped someone. * Changed the "whois" command in the Network plugin to "internic" instead. 2003-10-05 Jeremy Fincher * Version 0.73.0! * Added the News plugin, news handling for channels. * Changed the initial character of anti capabilities to '-' instead of '!'. '!' can be the initial character in a channel name, and so any command using getChannel and accepting a capability as its first argument (several in ChannelCommands) will have difficulties (the channel then *must* be specified since getChannel will consider !capability to be a channel name). Note that this means you'll need to either remove and re-create or edit your config files to change ! to - in capabilities. * Removed the "cvsup" command; it's been useless since we had a global install, and can only serve to confuse. * Added a "private" command to MiscCommands to allow users to specify that a response should be made in private. * Added a "secure" flag to user database records that *requires* that one of the user's hostmasks match if the user is to be recognized. This flag may be set with the "setsecure" command. * Added a convert command to the Math plugin. More conversions are necessary, if anyone's interested in doing it. The available units are available via the "units" command. * Fixed the pydoc command to allow access to standard Python modules that are shared libraries rather than pure Python code. * Added a "Python" plugin and moved FunCommands.{pydoc,zen} to it. * Fixed the supybot- scripts to use optparse so they now accept many command line options (but most importantly, the --help option :)) * Added a debincoming command to the Debian plugin; it searches the available packages at http://incoming.debian.org/ * Moved the "bug" command from MiscCommands to AdminCommands in order to prevent possible abuse. * Changed ChannelDB.seen to default to using nicks; a --user option can be passed to use the old behavior. Note that this means you'll have to update your ChannelDB database; use this SQL statement to do so: CREATE TABLE nick_seen ( name TEXT UNIQUE ON CONFLICT REPLACE, last_seen TIMESTAMP, last_msg TEXT );