aboutsummaryrefslogtreecommitdiff
path: root/IRCBot.py
diff options
context:
space:
mode:
authorGravatar jesopo2018-08-28 14:36:16 +0100
committerGravatar jesopo2018-08-28 14:36:16 +0100
commitef16817ad56d04107725afef66b66289f347d246 (patch)
tree366dac33569993c5db962ade01e32a47d337f0f0 /IRCBot.py
parentMade "you need to be authenticated" message more helpful (diff)
signature
Switch to time.monotonic for comparisons, only send data at most once every .5
seconds and only send max 512 bytes at a time
Diffstat (limited to 'IRCBot.py')
-rw-r--r--IRCBot.py26
1 files changed, 23 insertions, 3 deletions
diff --git a/IRCBot.py b/IRCBot.py
index 7d15cd4d..df8dce83 100644
--- a/IRCBot.py
+++ b/IRCBot.py
@@ -65,13 +65,33 @@ class Bot(object):
if not next or time_left < next:
next = time_left
- return next if not next == None and next <= 30 else 30;
+ if next == None:
+ return None
+ if next < 0:
+ return 0
+ return next
def call_timers(self):
for timer in self.timers[:]:
if timer.due():
timer.call()
if timer.done():
self.timer_setting_remove(timer)
+ def next_write(self):
+ next = None
+ for server in self.servers.values():
+ timeout = server.send_timeout()
+ if not next or timeout < next:
+ next = timeout
+ if next == None:
+ return None
+ if next < 0:
+ return 0
+ return next
+
+ def get_poll_timeout(self):
+ next_timer = self.next_timer() or 30
+ next_write = self.next_write() or 30
+ return min(next_timer, next_write)
def register_read(self, server):
self.poll.modify(server.fileno(), select.EPOLLIN)
@@ -82,7 +102,7 @@ class Bot(object):
select.EPOLLIN|select.EPOLLOUT)
def since_last_read(self, server):
- return None if not server.last_read else time.time(
+ return None if not server.last_read else time.monotonic(
)-server.last_read
def disconnect(self, server):
@@ -115,7 +135,7 @@ class Bot(object):
def run(self):
while self.running:
self.lock.acquire()
- events = self.poll.poll(self.next_timer())
+ events = self.poll.poll(self.get_poll_timeout())
self.call_timers()
for fd, event in events:
if fd in self.servers: