aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar jesopo2018-08-28 14:36:16 +0100
committerGravatar jesopo2018-08-28 14:36:16 +0100
commitef16817ad56d04107725afef66b66289f347d246 (patch)
tree366dac33569993c5db962ade01e32a47d337f0f0
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
-rw-r--r--IRCBot.py26
-rw-r--r--IRCLineHandler.py4
-rw-r--r--IRCServer.py14
3 files changed, 37 insertions, 7 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:
diff --git a/IRCLineHandler.py b/IRCLineHandler.py
index 38bf49a0..f67beb58 100644
--- a/IRCLineHandler.py
+++ b/IRCLineHandler.py
@@ -141,6 +141,9 @@ def handle_353(data):
channel.add_user(user)
for mode in modes:
channel.add_mode(mode, nickname)
+@handler(description="on-join user list has finished", default_event=True)
+def handle_366(data):
+ data.server.send_who(data.args[2])
@handler(description="on user joining channel")
def handle_JOIN(data):
@@ -161,7 +164,6 @@ def handle_JOIN(data):
del server.attempted_join[channel.name]
bot.events.on("self").on("join").call(channel=channel,
server=data.server)
- server.send_who(channel.name)
channel.send_mode()
@handler(description="on user parting channel")
diff --git a/IRCServer.py b/IRCServer.py
index ee280010..5575e680 100644
--- a/IRCServer.py
+++ b/IRCServer.py
@@ -30,6 +30,7 @@ class Server(object):
self.channel_modes = []
self.channel_types = []
self.last_read = None
+ self.last_send = None
self.attempted_join = {}
self.ping_sent = False
self.name = None
@@ -205,7 +206,7 @@ class Server(object):
decoded_lines.append(line)
if not decoded_lines:
self.disconnect()
- self.last_read = time.time()
+ self.last_read = time.monotonic()
self.ping_sent = False
return decoded_lines
def send(self, data):
@@ -217,9 +218,16 @@ class Server(object):
print(encoded.decode("utf8"))
def _send(self):
self.write_buffer = self.write_buffer[self.socket.send(
- self.write_buffer):]
+ self.write_buffer[:512]):]
+ self.last_send = time.monotonic()
def waiting_send(self):
- return bool(len(self.write_buffer))
+ return bool(len(self.write_buffer)) and self.send_timeout() == 0
+ def send_timeout(self):
+ if self.last_send == None:
+ return 0
+ timeout = (self.last_send)+0.5
+ timeout = timeout-time.monotonic()
+ return max(timeout, 0)
def send_user(self, username, realname):
self.send("USER %s - - :%s" % (username, realname))