So my question is, how would i get my bot to listen if there is a PING and if there\'s no ping in an interval of a minute, it will react as though the connection has been lo
There's no reason to do any fancy 'timeout' tricks as long as your connection is still up. If the length of the data returned from recv
is 0, the TCP connection has been closed.
data = irc.recv(4096)
if len(data) == 0:
# connection closed
pass
I suspect that recv() can also throw an exception if the connection is not terminated cleanly.
Edit:
I'm not sure what you're trying to accomplish. The IRC server will send you a PING
occasionally. If you don't respond with a PONG
, then the server will disconnect you. When the server disconnects you, then your recv()
call will return a 0-length string.
All you have to do is respond to PING
when you get it, and handle if the connection happens to close.
Your logic should look something like this:
keep_trying_to_connect = True
while keep_trying_to_connect:
# try to connect
irc = socket.socket()
# send NICK, USER, JOIN here
# now we're connected and authenticated start your recv() loop
while True:
data = irc.recv(4096)
if len(data) == 0:
# disconnected, break out of recv loop and try to reconnect
break
# otherwise, check what the data was, handling PING, PRIVMSG, etc.
Another thing to keep in mind is that you need to buffer any received data until you get a \r\n
sequence, you will not always get a exactly one complete message at the same time; you might get half of one, or three, or three and a half lines.