Topic plugin: Add persistence support.

Topics now persist between restarts.

Rationale: Useful when reloading/restarting; previously the topics would
be just forgotten. Don't use database, as that would be an unnecessary
overkill and in any case not needed.

(Also, remove the unused `re' module import.)

Signed-off-by: James Vega <jamessan@users.sourceforge.net>
(cherry picked from commit 6520d1f282)

Signed-off-by: Daniel Folkinshteyn <nanotube@users.sourceforge.net>
This commit is contained in:
Štěpán Němec 2010-01-28 18:16:45 +01:00 committed by Daniel Folkinshteyn
parent fc1a049d3c
commit 51cabeea33
3 changed files with 48 additions and 5 deletions

View File

@ -42,7 +42,7 @@ __author__ = supybot.authors.jemfinch
# This is a dictionary mapping supybot.Author instances to lists of # This is a dictionary mapping supybot.Author instances to lists of
# contributions. # contributions.
__contributors__ = {} __contributors__ = { supybot.authors.stepnem: ['persistence support'] }
import config import config
import plugin import plugin

View File

@ -27,17 +27,22 @@
# POSSIBILITY OF SUCH DAMAGE. # POSSIBILITY OF SUCH DAMAGE.
### ###
import re import os
import random import random
import shutil
import tempfile
import cPickle as pickle
import supybot.conf as conf import supybot.conf as conf
import supybot.ircdb as ircdb
import supybot.utils as utils import supybot.utils as utils
import supybot.world as world
from supybot.commands import * from supybot.commands import *
import supybot.ircmsgs as ircmsgs import supybot.ircmsgs as ircmsgs
import supybot.plugins as plugins import supybot.plugins as plugins
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
import supybot.ircdb as ircdb
def canChangeTopic(irc, msg, args, state): def canChangeTopic(irc, msg, args, state):
assert not state.channel assert not state.channel
@ -96,6 +101,9 @@ addConverter('canChangeTopic', canChangeTopic)
def splitTopic(topic, separator): def splitTopic(topic, separator):
return filter(None, topic.split(separator)) return filter(None, topic.split(separator))
datadir = conf.supybot.directories.data()
filename = conf.supybot.directories.data.dirize('Topic.pickle')
class Topic(callbacks.Plugin): class Topic(callbacks.Plugin):
def __init__(self, irc): def __init__(self, irc):
self.__parent = super(Topic, self) self.__parent = super(Topic, self)
@ -104,6 +112,39 @@ class Topic(callbacks.Plugin):
self.redos = ircutils.IrcDict() self.redos = ircutils.IrcDict()
self.lastTopics = ircutils.IrcDict() self.lastTopics = ircutils.IrcDict()
self.watchingFor332 = ircutils.IrcSet() self.watchingFor332 = ircutils.IrcSet()
try:
pkl = open(filename, 'rb')
try:
self.undos = pickle.load(pkl)
self.redos = pickle.load(pkl)
self.lastTopics = pickle.load(pkl)
self.watchingFor332 = pickle.load(pkl)
except Exception, e:
self.log.debug('Unable to load pickled data: %s', e)
pkl.close()
except IOError, e:
self.log.debug('Unable to open pickle file: %s', e)
world.flushers.append(self._flush)
def die(self):
world.flushers.remove(self._flush)
self.__parent.die()
def _flush(self):
try:
pklfd, tempfn = tempfile.mkstemp(suffix='topic', dir=datadir)
pkl = os.fdopen(pklfd, 'wb')
try:
pickle.dump(self.undos, pkl)
pickle.dump(self.redos, pkl)
pickle.dump(self.lastTopics, pkl)
pickle.dump(self.watchingFor332, pkl)
except Exception, e:
self.log.warning('Unable to store pickled data: %s', e)
pkl.close()
shutil.move(tempfn, filename)
except (IOError, shutil.Error), e:
self.log.warning('File error: %s', e)
def _splitTopic(self, topic, channel): def _splitTopic(self, topic, channel):
separator = self.registryValue('separator', channel) separator = self.registryValue('separator', channel)

View File

@ -1,3 +1,4 @@
# coding: utf-8
### ###
# Copyright (c) 2002-2005, Jeremiah Fincher # Copyright (c) 2002-2005, Jeremiah Fincher
# All rights reserved. # All rights reserved.
@ -56,6 +57,7 @@ class authors(object): # This is basically a bag.
bwp = Author('Brett Phipps', 'bwp', 'phippsb@gmail.com') bwp = Author('Brett Phipps', 'bwp', 'phippsb@gmail.com')
bear = Author('Mike Taylor', 'bear', 'bear@code-bear.com') bear = Author('Mike Taylor', 'bear', 'bear@code-bear.com')
grantbow = Author('Grant Bowman', 'Grantbow', 'grantbow@grantbow.com') grantbow = Author('Grant Bowman', 'Grantbow', 'grantbow@grantbow.com')
stepnem = Author('Štěpán Němec', 'stepnem', 'stepnem@gmail.com')
unknown = Author('Unknown author', 'unknown', 'unknown@supybot.org') unknown = Author('Unknown author', 'unknown', 'unknown@supybot.org')
# Let's be somewhat safe about this. # Let's be somewhat safe about this.