home · contact · privacy
Put admin stuff into dedicated admin mode.
[plomrogue2] / rogue_chat_curses.py
index 2362d99f8dd29a5030f44d62777c78637e8d4a27..3cd5914c217f2ea4a710413f587292592f63fc7f 100755 (executable)
@@ -67,9 +67,13 @@ mode_helps = {
         'short': 'map edit password',
         'long': 'This mode allows you to change the password that you send to authorize yourself for editing password-protected map tiles.  Hit return to confirm and leave.'
     },
-    'admin': {
+    'admin_enter': {
         'short': 'become admin',
         'long': 'This mode allows you to become admin if you know an admin password.'
+    },
+    'admin': {
+        'short': 'admin',
+        'long': 'This mode allows you access to actions limited to administrators.'
     }
 }
 
@@ -128,6 +132,13 @@ def cmd_LOGIN_OK(game):
     game.tui.log_msg('@ welcome')
 cmd_LOGIN_OK.argtypes = ''
 
+def cmd_ADMIN_OK(game):
+    game.tui.is_admin = True
+    game.tui.log_msg('@ you now have admin rights')
+    game.tui.switch_mode('admin')
+    game.tui.do_refresh = True
+cmd_ADMIN_OK.argtypes = ''
+
 def cmd_CHAT(game, msg):
     game.tui.log_msg('# ' + msg)
     game.tui.do_refresh = True
@@ -253,6 +264,7 @@ class Game(GameBase):
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
         self.register_command(cmd_LOGIN_OK)
+        self.register_command(cmd_ADMIN_OK)
         self.register_command(cmd_PONG)
         self.register_command(cmd_CHAT)
         self.register_command(cmd_PLAYER_ID)
@@ -331,7 +343,8 @@ class Mode:
         return False
 
 class TUI:
-    mode_admin = Mode('admin', has_input_prompt=True)
+    mode_admin_enter = Mode('admin_enter', has_input_prompt=True)
+    mode_admin = Mode('admin')
     mode_play = Mode('play')
     mode_study = Mode('study', shows_info=True)
     mode_edit = Mode('edit', is_single_char_entry=True)
@@ -346,17 +359,19 @@ class TUI:
     mode_login = Mode('login', has_input_prompt=True, is_intro=True)
     mode_post_login_wait = Mode('post_login_wait', is_intro=True)
     mode_password = Mode('password', has_input_prompt=True)
+    is_admin = False
 
     def __init__(self, host):
         import os
         import json
         self.mode_play.available_modes = ["chat", "study", "edit",
                                           "annotate", "portal",
-                                          "password", "admin",
-                                          "control_pw_type",
-                                          "control_tile_type"]
-        self.mode_study.available_modes = ["chat", "play"]
-        self.mode_control_tile_draw.available_modes = ["play"]
+                                          "password", "admin_enter"]
+        self.mode_study.available_modes = ["chat", "play", "admin_enter"]
+        self.mode_admin.available_modes = ["chat", "play", "study",
+                                           "control_pw_type",
+                                           "control_tile_type"]
+        self.mode_control_tile_draw.available_modes = ["admin"]
         self.host = host
         self.game = Game()
         self.game.tui = self
@@ -376,7 +391,7 @@ class TUI:
             'switch_to_portal': 'T',
             'switch_to_study': '?',
             'switch_to_edit': 'm',
-            'switch_to_admin': 'A',
+            'switch_to_admin_enter': 'A',
             'switch_to_control_pw_type': 'C',
             'switch_to_control_tile_type': 'Q',
             'flatten': 'F',
@@ -481,6 +496,8 @@ class TUI:
 
     def switch_mode(self, mode_name):
         self.map_mode = 'terrain'
+        if mode_name == 'admin_enter' and self.is_admin:
+            mode_name = 'admin'
         self.mode = getattr(self, 'mode_' + mode_name)
         if self.mode.shows_info or self.mode.name == 'control_tile_draw':
             player = self.game.get_thing(self.game.player_id)
@@ -499,7 +516,7 @@ class TUI:
                 self.send('LOGIN ' + quote(self.login_name))
             else:
                 self.log_msg('@ enter username')
-        elif self.mode.name == 'admin':
+        elif self.mode.name == 'admin_enter':
             self.log_msg('@ enter admin password:')
         elif self.mode.name == 'control_pw_pw':
             self.log_msg('@ enter tile control password for "%s":' % self.tile_control_char)
@@ -716,6 +733,7 @@ class TUI:
                 content += '/nick NAME – re-name yourself to NAME\n'
                 content += '/%s or /play – switch to play mode\n' % self.keys['switch_to_play']
                 content += '/%s or /study – switch to study mode\n' % self.keys['switch_to_study']
+                content += '/%s or /admin – switch to admin mode\n' % self.keys['switch_to_admin_enter']
             content += self.mode.list_available_modes(self)
             for i in range(self.size.y):
                 safe_addstr(i,
@@ -810,14 +828,14 @@ class TUI:
                 else:
                     self.send('SET_MAP_CONTROL_PASSWORD ' + quote(self.tile_control_char) + ' ' + quote(self.input_))
                     self.input_ = ""
-                self.switch_mode('play')
+                self.switch_mode('admin')
             elif self.mode.name == 'password' and key == '\n':
                 if self.input_ == '':
                     self.input_ = ' '
                 self.password = self.input_
                 self.input_ = ""
                 self.switch_mode('play')
-            elif self.mode.name == 'admin' and key == '\n':
+            elif self.mode.name == 'admin_enter' and key == '\n':
                 self.send('BECOME_ADMIN ' + quote(self.input_))
                 self.input_ = ""
                 self.switch_mode('play')
@@ -829,6 +847,8 @@ class TUI:
                         self.switch_mode('play')
                     elif self.input_ in {'/' + self.keys['switch_to_study'], '/study'}:
                         self.switch_mode('study')
+                    elif self.input_ in {'/' + self.keys['switch_to_admin_enter'], '/admin'}:
+                        self.switch_mode('admin_enter')
                     elif self.input_.startswith('/nick'):
                         tokens = self.input_.split(maxsplit=1)
                         if len(tokens) == 2:
@@ -900,6 +920,9 @@ class TUI:
                     continue
                 elif key in self.movement_keys:
                     move_explorer(self.movement_keys[key])
+            elif self.mode.name == 'admin':
+                if self.mode.mode_switch_on_key(self, key):
+                    continue
 
 if len(sys.argv) != 2:
     raise ArgError('wrong number of arguments, need game host')