]> jfr.im git - erebus.git/blobdiff - bot.py
adding tls support, import ssl and wrap
[erebus.git] / bot.py
diff --git a/bot.py b/bot.py
index 578caf2165e2cd974d0665fbbfd790e17af07b04..7713d836329e58bd58e6397fd74edcaac243c135 100644 (file)
--- a/bot.py
+++ b/bot.py
@@ -4,7 +4,7 @@
 # Erebus IRC bot - Author: John Runyon
 # "Bot" and "BotConnection" classes (handling a specific "arm")
 
-import socket, sys, time, threading, os, random
+import socket, sys, time, threading, os, random, struct
 from collections import deque
 
 if sys.version_info.major < 3:
@@ -106,6 +106,7 @@ class Bot(object):
                        'PRIVMSG': self._gotprivmsg,
                        '353': self._got353, #NAMES
                        '354': self._got354, #WHO
+                       '396': self._gotHiddenHost, # hidden host has been set
                        '433': self._got433, #nick in use
                        'JOIN': self._gotjoin,
                        'PART': self._gotpart,
@@ -159,8 +160,13 @@ class Bot(object):
                self.conn.send("MODE %s +x" % (pieces[2]))
                if self.authname is not None and self.authpass is not None:
                        self.conn.send("AUTH %s %s" % (self.authname, self.authpass))
-               for c in self.chans:
-                       self.join(c.name)
+               if not self.parent.cfg.getboolean('erebus', 'wait_for_hidden_host'):
+                       for c in self.chans:
+                               self.join(c.name)
+       def _gotHiddenHost(self, pieces):
+               if self.parent.cfg.getboolean('erebus', 'wait_for_hidden_host'):
+                       for c in self.chans:
+                               self.join(c.name)
        def _gotprivmsg(self, pieces):
                nick = pieces[0].split('!')[0][1:]
                user = self.parent.user(nick)
@@ -493,7 +499,16 @@ class BotConnection(object):
                self._nowrite = False
 
        def connect(self):
-               self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+               if self.parent.cfg.getboolean('erebus', 'tls'):
+                       import ssl
+                       undersocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+                       context = ssl.create_default_context()
+                       self.socket = context.wrap_socket(undersocket, self.server)
+               else:
+                       self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+               self.socket.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) # Does Python make SOL_TCP portable? Who knows, it's not documented, and it appears to come from the _socket C lib.
+               self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 0, 0))
+               self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
                self.socket.bind((self.bind, 0))
                self.socket.connect((self.server, self.port))
                return True