home · contact · privacy
Improve SSL negotation.
[plomrogue2-experiments] / new2 / rogue_chat_curses.py
index ee2cae8f5abad5682ef5fa7e17a7cf15e8cfdf4a..c8a17c888388dcfb9317896a7d830ac2bd00b9cf 100755 (executable)
@@ -39,8 +39,12 @@ class PlomSocketClient(PlomSocket):
         self.socket.close()
 
     def run(self):
+        import ssl
         try:
             for msg in self.recv():
+                if msg == 'NEED_SSL':
+                    self.socket = ssl.wrap_socket(self.socket)
+                    continue
                 self.recv_handler(msg)
         except BrokenSocketConnection:
             pass  # we assume socket will be known as dead by now
@@ -139,8 +143,13 @@ def cmd_ANNOTATION(game, position, msg):
         game.tui.do_refresh = True
 cmd_ANNOTATION.argtypes = 'yx_tuple:nonneg string'
 
+def cmd_PONG(game):
+    pass
+cmd_PONG.argtypes = ''
+
 class Game(GameBase):
     commands = {'LOGIN_OK': cmd_LOGIN_OK,
+                'PONG': cmd_PONG,
                 'CHAT': cmd_CHAT,
                 'PLAYER_ID': cmd_PLAYER_ID,
                 'TURN': cmd_TURN,
@@ -296,6 +305,7 @@ class TUI:
 
     def loop(self, stdscr):
         import time
+        import datetime
 
         def safe_addstr(y, x, line):
             if y < self.size.y - 1 or x + len(line) < self.size.x:
@@ -492,7 +502,13 @@ class TUI:
         self.input_ = ''
         input_prompt = '> '
         connect()
+        last_ping = datetime.datetime.now()
+        interval = datetime.timedelta(seconds=30)
         while True:
+            now = datetime.datetime.now()
+            if now - last_ping > interval:
+                self.send('PING')
+                last_ping = now
             if self.do_refresh:
                 draw_screen()
                 self.do_refresh = False
@@ -594,4 +610,4 @@ class TUI:
                 self.send('TASK:WRITE ' + key)
                 self.switch_mode('play')
 
-TUI('127.0.0.1:5000')
+TUI('localhost:5000')