remove our ReadOnly option, which was an ugly hack, and use PersistentCache instead

This commit is contained in:
Elián Hanisch 2010-04-02 18:32:19 -03:00
parent 9b0a5d4180
commit fd55f019e1
2 changed files with 7 additions and 27 deletions

View File

@ -23,26 +23,6 @@ class SpaceSeparatedListOfTypes(registry.SpaceSeparatedListOf):
Value = ValidTypes
# This little hack allows me to store last time bans were checked for review
# and guarantee that nobody will edit it.
# I'm using a registry option instead of the SQL db because this is much simpler.
class ReadOnlyValue(registry.Integer):
"""This is a read only option."""
def __init__(self, *args, **kwargs):
registry.Integer.__init__(self, *args, **kwargs)
self.value = None
def set(self, s):
try:
if not self.value:
self.setValue(int(s))
else:
raise ValueError
except ValueError:
#self.error() # commented, this causes a lot of trouble.
pass
def configure(advanced):
conf.registerPlugin('Bantracker', True)
@ -74,9 +54,6 @@ conf.registerChannelValue(Bantracker.commentRequest.forward, 'channels',
# temp config
conf.registerGlobalValue(Bantracker, 'reviewTime',
ReadOnlyValue(0,
"Timestamp used internally for identify bans that need review. Can't and shouldn't be edited."))
conf.registerGlobalValue(Bantracker, 'reviewAfterTime',
registry.Float(7,
"Days after which the bot will request for review a ban. Can be an integer or decimal value."))

View File

@ -170,6 +170,7 @@ def guessBanType(mask):
class PersistentCache(dict):
def __init__(self, filename):
self.filename = conf.supybot.directories.data.dirize(filename)
self.time = 0
def open(self):
import csv
@ -177,6 +178,7 @@ class PersistentCache(dict):
reader = csv.reader(open(self.filename, 'rb'))
except IOError:
return
self.time = int(reader.next()[1])
for row in reader:
host, value = self.deserialize(*row)
try:
@ -190,6 +192,7 @@ class PersistentCache(dict):
writer = csv.writer(open(self.filename, 'wb'))
except IOError:
return
writer.writerow(('time', str(int(self.time))))
for host, values in self.iteritems():
for v in values:
writer.writerow(self.serialize(host, v))
@ -238,11 +241,11 @@ class Bantracker(callbacks.Plugin):
self.db = None
self.get_bans(irc)
self.get_nicks(irc)
self.pendingReviews = PersistentCache('bt.reviews.db')
self.pendingReviews.open()
# add scheduled event for check bans that need review
schedule.addPeriodicEvent(self.reviewBans, 60*10,
name=self.name())
self.pendingReviews = PersistentCache('bt.reviews.db')
self.pendingReviews.open()
def get_nicks(self, irc):
self.hosts.clear()
@ -448,7 +451,7 @@ class Bantracker(callbacks.Plugin):
return
self.log.debug('Checking for bans that need review ...')
now = time.mktime(time.gmtime())
lastreview = self.registryValue('reviewTime')
lastreview = self.pendingReviews.time
bansite = self.registryValue('bansite')
if not lastreview:
# initialize last time reviewed timestamp
@ -501,7 +504,7 @@ class Bantracker(callbacks.Plugin):
elif banTime < reviewAfterTime:
# since we made sure bans are sorted by time, the bans left are more recent
break
self.setRegistryValue('reviewTime', now) # update last time reviewed
self.pendingReviews.time = now # update last time reviewed
except Exception, e:
# I need to catch exceptions as they are silenced
import traceback