~habnabit/infobat/chatty

« back to all changes in this revision

Viewing changes to infobat/irc.py

  • Committer: Aaron Gallagher
  • Date: 2010-03-06 08:16:56 UTC
  • Revision ID: habnabit@gmail.com-20100306081656-njes9oug5nf8jb9o
Adding in a thing to guarantee ops easily on a channel.

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
    pass
35
35
 
36
36
class Infobat(ampirc.IrcChildBase):
 
37
    datastore_properties = ['is_opped', 'outstandingPings', 'identified']
37
38
    identified = False
38
 
    pool = None
39
39
    outstandingPings = 0
40
40
 
41
41
    sourceURL = 'https://code.launchpad.net/~pound-python/infobat/infobob'
54
54
        self.countdown = self.max_countdown
55
55
        self.startTimer('dbsync', 30)
56
56
        self.startTimer('pastebinPing', 60*60*3)
 
57
        self.is_opped = set()
 
58
        self._op_deferreds = {}
57
59
 
58
60
    def signedOn(self):
59
61
        nickserv_pw = conf.get('irc', 'nickserv_pw')
63
65
            self.join(conf.get('irc', 'channels'))
64
66
        self.startTimer('serverPing', 60)
65
67
 
 
68
    def protocolReady(self):
 
69
        self._op_deferreds = dict.fromkeys(self.is_opped, defer.succeed(None))
 
70
 
 
71
    def ensureOps(self, channel):
 
72
        if self._op_deferreds.get(channel) is None:
 
73
            self._op_deferreds[channel] = defer.Deferred()
 
74
            self.msg('ChanServ', 'op %s' % channel)
 
75
        return self._op_deferreds[channel]
 
76
 
66
77
    def ampircTimer_serverPing(self):
67
78
        if self.outstandingPings > 5:
68
79
            self.transport.loseConnection()
182
193
                    result = user + ', ' + result
183
194
                self.msg(target, result)
184
195
 
 
196
    # Thanks for nothing, twisted. modeChanged sucks so hard.
 
197
    def irc_MODE(self, prefix, params):
 
198
        user, channel, modes, args = prefix, params[0], params[1], params[2:]
 
199
        setting = True
 
200
        for c in modes:
 
201
            if c == '+':
 
202
                setting = True
 
203
            elif c == '-':
 
204
                setting = False
 
205
            else:
 
206
                arg = None
 
207
                if self._modeAcceptsArg.get(c, (False, False))[not setting]:
 
208
                    arg = args.pop(0)
 
209
                self.modeChanged(user, channel, setting, c, arg)
 
210
        if args:
 
211
            log.msg('Too many args (%s) received for %s. If one or more '
 
212
                'modes are supposed to accept an arg and they are not in '
 
213
                '_modeAcceptsArg, add them.' % (' '.join(args), modes))
 
214
 
 
215
    def modeChanged(self, user, channel, set, mode, arg):
 
216
        if mode == 'o' and arg == self.nickname:
 
217
            was_opped = channel in self.is_opped
 
218
            is_opped = set
 
219
            if is_opped and not was_opped:
 
220
                self.is_opped.add(channel)
 
221
                self._op_deferreds.setdefault(channel, defer.Deferred()
 
222
                    ).callback(None)
 
223
                self.startTimer('deopSelf', 60*5, alsoRunImmediately=False)
 
224
            elif not is_opped and was_opped:
 
225
                self.is_opped.remove(channel)
 
226
                self._op_deferreds.pop(channel, None)
 
227
                self.stopTimer('deopSelf')
 
228
            # XXX: Ugly hack since is_opped is mutable.
 
229
            self.is_opped = self.is_opped
 
230
 
 
231
    def ampircTimer_deopSelf(self):
 
232
        for channel in self.is_opped:
 
233
            self.mode(channel, False, 'o', user=self.nickname)
 
234
 
185
235
    @defer.inlineCallbacks
186
236
    def do_lol(self, nick):
187
237
        offenses = yield self.dbpool.add_lol(nick)