import time import threading import irctk import random class Bot(threading.Thread): host = 'tolkien.freenode.net' port = 6697 ssl = True password = None def __init__(self, channel, threads, queue, name, rate, per): threading.Thread.__init__(self) self.threads = threads self.queue = queue self.name = name self.channel = channel # following for rate limiting: self.rate = rate self.per = per self.last_check = time.time() self.allowance = rate self.log('starting up') self.ready = False self.client = irctk.Client(nickname=name, ident=name, realname=name, password=Bot.password) self.client.delegate = self self.client.connect(Bot.host, Bot.port, use_tls=Bot.ssl) def irc_raw(self, client, line): try: self.log('IRC: ' + line) except: self.log('failed to log') #pass def log(self, line): print "{} [{}] {}".format(time.strftime('%H:%M'), self.name, line) def irc_registered(self, client): self.log('joining ' + self.channel) channel = client.add_channel(self.channel) channel.join() def irc_channel_join(self, client, nick, channel): if str(nick) == str(client.get_nickname()): self.log('im ready :)') self.ready = True def can_send(self): current = time.time() time_passed = current - self.last_check; self.last_check = current self.allowance += time_passed * (self.rate / self.per) if self.allowance > self.rate: self.allowance = self.rate if self.allowance > 1.0: self.allowance -= 1.0 return True return False def run(self): self.log('run() called') while True: waiting = True while waiting: for thread in self.threads: if not thread.ready: waiting = True break else: waiting = False time.sleep(random.random()) # start flushing the queue while self.can_send(): try: line = self.queue.popleft() self.client.send_line( 'PRIVMSG ' + self.channel + ' :' + line ) time.sleep(0.25) except IndexError: # end of queue self.log('done working') self.client.quit('bye bye') return time.sleep(0.1)