~domcleal/ibid/outrage

« back to all changes in this revision

Viewing changes to ibid/plugins/karma.py

  • Committer: Dominic Cleal
  • Date: 2011-01-16 15:03:57 UTC
  • Revision ID: dominic@computerkb.co.uk-20110116150357-4ouhibn2glvusmet
Improving karma regex to prevent matching 'ftw' and 'ftl' in other words

Show diffs side-by-side

added added

removed removed

Lines of Context:
51
51
        self.time = datetime.utcnow()
52
52
 
53
53
class Set(Processor):
54
 
    usage = u'<subject> (++|--|==|ftw|ftl) [[reason]]'
 
54
    usage = u'<subject>(++|--|==| ftw| ftl) [[reason]]'
55
55
    features = ('karma',)
56
56
 
57
57
    # Clashes with morse & math
61
61
 
62
62
    increase = ListOption('increase',
63
63
                          'Suffixes which indicate increased karma',
64
 
                          ('++', 'ftw'))
 
64
                          ('++', ' ftw'))
65
65
    decrease = ListOption('decrease', 'Suffixes which indicate decreased karma',
66
 
                          ('--', 'ftl'))
 
66
                          ('--', ' ftl'))
67
67
    neutral = ListOption('neutral', 'Suffixes which indicate neutral karma',
68
68
                         ('==',))
69
69
    reply = BoolOption('reply', 'Acknowledge karma changes', False)
77
77
        if self.addressed:
78
78
            matchpat = r'^(.+?)\s*(%s)\s*(?:[[{(]+\s*(.+?)\s*[\]})]+)?$'
79
79
        else:
80
 
            matchpat = r'(\S+)\s*(%s)'
 
80
            matchpat = r'(\S*\w\S*)(%s)(?:$|\s)'
 
81
 
 
82
        self.increase_reg = self.regex_tokens(self.increase)
 
83
        self.decrease_reg = self.regex_tokens(self.decrease)
 
84
        self.neutral_reg = self.regex_tokens(self.neutral)
81
85
 
82
86
        self.set.im_func.pattern = re.compile(
83
87
                matchpat % '|'.join(
84
 
                    re.escape(token) for token
85
 
                    in self.increase + self.decrease + self.neutral
 
88
                    self.increase_reg + self.decrease_reg + self.neutral_reg
86
89
                ), re.I)
87
90
 
 
91
    def regex_tokens(self, tokens):
 
92
        """ Turn configured tokens into regex versions """
 
93
        regtokens = []
 
94
        for token in tokens:
 
95
            stoken = token.lstrip()
 
96
            if token == stoken:
 
97
                token = "%s" % re.escape(token)
 
98
            else:
 
99
                # When whitespace is present, use \s+ instead
 
100
                token = "\s+%s" % re.escape(stoken)
 
101
            regtokens.append(token)
 
102
        return regtokens
 
103
 
 
104
    def match_operators(self, roperators, adjust):
 
105
        for reg in roperators:
 
106
            if re.match(reg, adjust):
 
107
                return True
 
108
        return False
 
109
 
88
110
    @handler
89
111
    @authorise(fallthrough=False)
90
112
    def set(self, event, subject, adjust, reason=None):
99
121
        if not karma:
100
122
            karma = Karma(subject)
101
123
 
102
 
        if adjust.lower() in self.increase:
 
124
        if self.match_operators(self.increase_reg, adjust.lower()):
103
125
            if subject.lower() == event.sender['nick'].lower():
104
126
                event.addresponse(u"You can't karma yourself!")
105
127
                return
106
128
            karma.changes += 1
107
129
            karma.value += 1
108
130
            change = u'Increased'
109
 
        elif adjust.lower() in self.decrease:
 
131
        elif self.match_operators(self.decrease_reg, adjust.lower()):
110
132
            karma.changes += 1
111
133
            karma.value -= 1
112
134
            change = u'Decreased'