home · contact · privacy
Refactor player session code.
[plomrogue2] / plomrogue / commands.py
index 249e1ab5e91d50a91a51ff940ba572936baf1cef..603e0d32414c5eb8fa756633123d2434f014f499 100644 (file)
@@ -41,14 +41,14 @@ def cmd_ALL(game, msg, connection_id):
             lowered_msg += c
         return lowered_msg
 
-    if not connection_id in game.sessions:
+    speaker = game.get_player(connection_id)
+    if not speaker:
         raise GameError('need to be logged in for this')
-    speaker = game.get_thing(game.sessions[connection_id])
     largest_audible_distance = 20
     dijkstra_map = DijkstraMap(game.maps, speaker.position,
                                largest_audible_distance, game.get_map)
     for c_id in game.sessions:
-        listener = game.get_thing(game.sessions[c_id])
+        listener = game.get_player(c_id)
         target_yx = dijkstra_map.target_yx(*listener.position, True)
         if not target_yx:
             continue
@@ -68,14 +68,14 @@ cmd_ALL.argtypes = 'string'
 def cmd_LOGIN(game, nick, connection_id):
     for t in [t for t in game.things if t.type_ == 'Player' and t.name == nick]:
         raise GameError('name already in use')
-    if connection_id in game.sessions:
+    if game.get_player(connection_id):
         raise GameError('cannot log in twice')
     t = game.thing_types['Player'](game)
     t.position = (YX(0,0),
                   YX(game.map_geometry.size.y // 2, game.map_geometry.size.x // 2))
     game.things += [t]  # TODO refactor into Thing.__init__?
     t.player_char = game.get_next_player_char()
-    game.sessions[connection_id] = t.id_
+    game.sessions[connection_id] = {'thing_id': t.id_}
     game.io.send('LOGIN_OK', connection_id)
     t.name = nick
     game.io.send('CHAT ' + quote(t.name + ' entered the map.'))
@@ -86,10 +86,9 @@ cmd_LOGIN.argtypes = 'string'
 def cmd_NICK(game, nick, connection_id):
     for t in [t for t in game.things if t.type_ == 'Player' and t.name == nick]:
         raise GameError('name already in use')
-    if not connection_id in game.sessions:
+    t = game.get_player(connection_id)
+    if not t:
         raise GameError('can only rename when already logged in')
-    t_id = game.sessions[connection_id]
-    t = game.get_thing(t_id)
     old_nick = t.name
     t.name = nick
     game.io.send('CHAT ' + quote(old_nick + ' renamed themselves to ' + nick))
@@ -124,7 +123,7 @@ def cmd_TURN(game, n):
 cmd_TURN.argtypes = 'int:nonneg'
 
 def cmd_ANNOTATE(game, yx, msg, pw, connection_id):
-    player = game.get_thing(game.sessions[connection_id])
+    player = game.get_player(connection_id)
     big_yx, little_yx = player.fov_stencil.source_yxyx(yx)
     if not player.fov_test(big_yx, little_yx):
         raise GameError('cannot annotate tile outside field of view')
@@ -142,7 +141,7 @@ def cmd_ANNOTATE(game, yx, msg, pw, connection_id):
 cmd_ANNOTATE.argtypes = 'yx_tuple:nonneg string string'
 
 def cmd_PORTAL(game, yx, msg, pw, connection_id):
-    player = game.get_thing(game.sessions[connection_id])
+    player = game.get_player(connection_id)
     big_yx, little_yx = player.fov_stencil.source_yxyx(yx)
     if not player.fov_test(big_yx, little_yx):
         raise GameError('cannot edit portal on tile outside field of view')
@@ -174,7 +173,7 @@ def cmd_GOD_PORTAL(game, big_yx, little_yx, msg):
 cmd_GOD_PORTAL.argtypes = 'yx_tuple yx_tuple:nonneg string'
 
 def cmd_GET_ANNOTATION(game, yx, connection_id):
-    player = game.get_thing(game.sessions[connection_id])
+    player = game.get_player(connection_id)
     big_yx, little_yx = player.fov_stencil.source_yxyx(yx)
     annotation = '(unknown)';
     if player.fov_test(big_yx, little_yx):