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
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,
- 'CHAT': cmd_CHAT,
- 'PLAYER_ID': cmd_PLAYER_ID,
- 'TURN': cmd_TURN,
- 'THING_POS': cmd_THING_POS,
- 'THING_NAME': cmd_THING_NAME,
- 'MAP': cmd_MAP,
- 'PORTAL': cmd_PORTAL,
- 'ANNOTATION': cmd_ANNOTATION,
- 'GAME_STATE_COMPLETE': cmd_GAME_STATE_COMPLETE,
- 'ARGUMENT_ERROR': cmd_ARGUMENT_ERROR,
- 'GAME_ERROR': cmd_GAME_ERROR,
- 'PLAY_ERROR': cmd_PLAY_ERROR}
thing_type = ThingBase
turn_complete = False
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
+ self.register_command(cmd_LOGIN_OK)
+ self.register_command(cmd_PONG)
+ self.register_command(cmd_CHAT)
+ self.register_command(cmd_PLAYER_ID)
+ self.register_command(cmd_TURN)
+ self.register_command(cmd_THING_POS)
+ self.register_command(cmd_THING_NAME)
+ self.register_command(cmd_MAP)
+ self.register_command(cmd_PORTAL)
+ self.register_command(cmd_ANNOTATION)
+ self.register_command(cmd_GAME_STATE_COMPLETE)
+ self.register_command(cmd_ARGUMENT_ERROR)
+ self.register_command(cmd_GAME_ERROR)
+ self.register_command(cmd_PLAY_ERROR)
self.map_content = ''
self.player_id = -1
self.info_db = {}
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:
def draw_info():
if not self.game.turn_complete:
return
+ pos_i = self.explorer.y * self.game.map_geometry.size.x + self.explorer.x
+ info = 'TERRAIN: %s\n' % self.game.map_content[pos_i]
+ for t in self.game.things:
+ if t.position == self.explorer:
+ info += 'PLAYER @: %s\n' % t.name
if self.explorer in self.game.portals:
- info = 'PORTAL: ' + self.game.portals[self.explorer] + '\n'
+ info += 'PORTAL: ' + self.game.portals[self.explorer] + '\n'
else:
- info = 'PORTAL: (none)\n'
+ info += 'PORTAL: (none)\n'
if self.explorer in self.game.info_db:
info += 'ANNOTATION: ' + self.game.info_db[self.explorer]
else:
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
self.input_ = ""
elif self.mode == self.mode_chat and key == '\n':
if self.input_[0] == '/':
- if self.input_ in {'/P', '/play'}:
+ if self.input_ in {'/' + self.keys['switch_to_play'], '/play'}:
self.switch_mode('play')
- elif self.input_ in {'/?', '/study'}:
+ elif self.input_ in {'/' + self.keys['switch_to_study'], '/study'}:
self.switch_mode('study')
elif self.input_ == '/help':
self.help()
self.send('TASK:WRITE ' + key)
self.switch_mode('play')
-TUI('127.0.0.1:5000')
+TUI('localhost:5000')