-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathrepsys.py
65 lines (51 loc) · 1.94 KB
/
repsys.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import json
import operator
import os.path
REPFILE = "data/reps.txt"
class ReputationSystem(object):
__slots__ = ('reps', 'ignorelist', 'cached', 'repfile')
def __init__(self, repfile=REPFILE):
self.reps = {}
self.ignorelist = set()
self.repfile = os.path.normpath(repfile)
self.load(repfile)
self.filter()
def dump(self):
self.filter()
fi = open(self.repfile, "w")
json.dump(self.reps, fi, sort_keys=True, indent=4, separators=(',', ': '))
fi.close()
def load(self, repfile=REPFILE):
if not os.path.exists(repfile):
self.reps = {}
self.dump()
return
fi = open(self.repfile)
self.reps = json.load(fi)
fi.close()
def get(self, name):
return self.reps.get(name, 0)
def set(self, name, val):
self.reps[name] = int(val)
def apply(self, changer):
self.reps[changer.getUser()] = changer.perform(self.reps.get(changer.getUser(),0))
def clear(self, name):
self.reps.pop(name.strip(), None)
def filter(self):
self.reps = {key: val for key, val in self.reps.items() if val != 0}
def report(self, force=False):
self.filter()
sorted_reps = sorted(self.reps.iteritems(),
key=operator.itemgetter(1),
reverse=True)
highest = sorted_reps[:5]
lowest = sorted_reps[-5:]
return "Top reps: {0}\nBottom reps: {1}".format(
", ".join("{0}: {1}".format(name.encode('unicode-escape'), score) for name, score in sorted_reps[:5]),
", ".join("{0}: {1}".format(name.encode('unicode-escape'), score) for name, score in sorted_reps[-5:]))
def tell(self, name):
self.filter()
return "Rep for {0}: {1}".format(name.encode('unicode-escape'), self.get(name))
def all(self):
self.filter()
return "All reps: {0}".format(self.reps)