remove our ReadOnly option, which was an ugly hack, and use PersistentCache instead
This commit is contained in:
@ -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."))
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user