aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorCerapter <cerap@protonmail.com>2018-09-15 02:33:18 +0200
committerCerapter <cerap@protonmail.com>2018-09-15 02:33:18 +0200
commitfcd8f5b5abb2329aded120007319d581908c8a69 (patch)
tree5a3530435821555b51555768725bde1e267bd9a0 /server
parent86f91ba3e862b683becbc2d35539bc06a636c925 (diff)
Areas can now be spectatable, too.
- Makes it so that people can join, but can't type IC unless invited. - The CM can set it with `/area_spectate`.
Diffstat (limited to 'server')
-rw-r--r--server/area_manager.py30
-rw-r--r--server/client_manager.py9
-rw-r--r--server/commands.py24
-rw-r--r--server/tsuserver.py6
4 files changed, 49 insertions, 20 deletions
diff --git a/server/area_manager.py b/server/area_manager.py
index 23c43397..d8e60d0b 100644
--- a/server/area_manager.py
+++ b/server/area_manager.py
@@ -22,6 +22,7 @@ import yaml
from server.exceptions import AreaError
from server.evidence import EvidenceList
+from enum import Enum
class AreaManager:
@@ -63,13 +64,18 @@ class AreaManager:
self.evidence_list.append(Evidence("weeeeeew", "desc3", "3.png"))
"""
- self.is_locked = False
+ self.is_locked = self.Locked.FREE
self.blankposting_allowed = True
self.non_int_pres_only = non_int_pres_only
self.jukebox = jukebox
self.jukebox_votes = []
self.jukebox_prev_char_id = -1
+ class Locked(Enum):
+ FREE = 1,
+ SPECTATABLE = 2,
+ LOCKED = 3
+
def new_client(self, client):
self.clients.add(client)
self.server.area_manager.send_arup_players()
@@ -80,15 +86,29 @@ class AreaManager:
client.is_cm = False
self.owned = False
self.server.area_manager.send_arup_cms()
- if self.is_locked:
+ if self.is_locked != self.Locked.FREE:
self.unlock()
def unlock(self):
- self.is_locked = False
+ self.is_locked = self.Locked.FREE
self.blankposting_allowed = True
self.invite_list = {}
self.server.area_manager.send_arup_lock()
self.send_host_message('This area is open now.')
+
+ def spectator(self):
+ self.is_locked = self.Locked.SPECTATABLE
+ for i in self.clients:
+ self.invite_list[i.id] = None
+ self.server.area_manager.send_arup_lock()
+ self.send_host_message('This area is spectatable now.')
+
+ def lock(self):
+ self.is_locked = self.Locked.LOCKED
+ for i in self.clients:
+ self.invite_list[i.id] = None
+ self.server.area_manager.send_arup_lock()
+ self.send_host_message('This area is locked now.')
def is_char_available(self, char_id):
return char_id not in [x.char_id for x in self.clients]
@@ -215,7 +235,7 @@ class AreaManager:
def can_send_message(self, client):
- if self.is_locked and not client.is_mod and not client.id in self.invite_list:
+ if self.is_locked != self.Locked.FREE and not client.is_mod and not client.id in self.invite_list:
client.send_host_message('This is a locked area - ask the CM to speak.')
return False
return (time.time() * 1000.0 - self.next_message_time) > 0
@@ -366,5 +386,5 @@ class AreaManager:
def send_arup_lock(self):
lock_list = [3]
for area in self.areas:
- lock_list.append(area.is_locked)
+ lock_list.append(area.is_locked.name)
self.server.send_arup(lock_list)
diff --git a/server/client_manager.py b/server/client_manager.py
index 5e6825bb..617bb69c 100644
--- a/server/client_manager.py
+++ b/server/client_manager.py
@@ -182,9 +182,10 @@ class ClientManager:
def change_area(self, area):
if self.area == area:
raise ClientError('User already in specified area.')
- if area.is_locked and not self.is_mod and not self.id in area.invite_list:
- #self.send_host_message('This area is locked - you will be unable to send messages ICly.')
+ if area.is_locked == area.Locked.LOCKED and not self.is_mod and not self.id in area.invite_list:
raise ClientError("That area is locked!")
+ if area.is_locked == area.Locked.SPECTATABLE and not self.is_mod and not self.id in area.invite_list:
+ self.send_host_message('This area is spectatable, but not free - you will be unable to send messages ICly unless invited.')
if self.area.jukebox:
self.area.remove_jukebox_vote(self, True)
@@ -215,13 +216,13 @@ class ClientManager:
def send_area_list(self):
msg = '=== Areas ==='
- lock = {True: '[LOCKED]', False: ''}
for i, area in enumerate(self.server.area_manager.areas):
owner = 'FREE'
if area.owned:
for client in [x for x in area.clients if x.is_cm]:
owner = 'CM: {}'.format(client.get_char_name())
break
+ lock = {area.Locked.FREE: '', area.Locked.SPECTATABLE: '[SPECTATABLE]', area.Locked.LOCKED: '[LOCKED]'}
msg += '\r\nArea {}: {} (users: {}) [{}][{}]{}'.format(area.abbreviation, area.name, len(area.clients), area.status, owner, lock[area.is_locked])
if self.area == area:
msg += ' [*]'
@@ -236,7 +237,7 @@ class ClientManager:
info += '=== {} ==='.format(area.name)
info += '\r\n'
- lock = {True: '[LOCKED]', False: ''}
+ lock = {area.Locked.FREE: '', area.Locked.SPECTATABLE: '[SPECTATABLE]', area.Locked.LOCKED: '[LOCKED]'}
info += '[{}]: [{} users][{}]{}'.format(area.abbreviation, len(area.clients), area.status, lock[area.is_locked])
sorted_clients = []
diff --git a/server/commands.py b/server/commands.py
index 925eac38..c84d8b7b 100644
--- a/server/commands.py
+++ b/server/commands.py
@@ -697,7 +697,7 @@ def ooc_cmd_uncm(client, arg):
client.is_cm = False
client.area.owned = False
client.area.blankposting_allowed = True
- if client.area.is_locked:
+ if client.area.is_locked != client.area.Locked.FREE:
client.area.unlock()
client.server.area_manager.send_arup_cms()
client.area.send_host_message('{} is no longer CM in this area.'.format(client.get_char_name()))
@@ -714,20 +714,28 @@ def ooc_cmd_area_lock(client, arg):
if not client.area.locking_allowed:
client.send_host_message('Area locking is disabled in this area.')
return
- if client.area.is_locked:
+ if client.area.is_locked == client.area.Locked.LOCKED:
client.send_host_message('Area is already locked.')
if client.is_cm:
- client.area.is_locked = True
- client.server.area_manager.send_arup_lock()
- client.area.send_host_message('Area is locked.')
- for i in client.area.clients:
- client.area.invite_list[i.id] = None
+ client.area.lock()
return
else:
raise ClientError('Only CM can lock the area.')
+
+def ooc_cmd_area_spectate(client, arg):
+ if not client.area.locking_allowed:
+ client.send_host_message('Area locking is disabled in this area.')
+ return
+ if client.area.is_locked == client.area.Locked.SPECTATABLE:
+ client.send_host_message('Area is already spectatable.')
+ if client.is_cm:
+ client.area.spectator()
+ return
+ else:
+ raise ClientError('Only CM can make the area spectatable.')
def ooc_cmd_area_unlock(client, arg):
- if not client.area.is_locked:
+ if client.area.is_locked == client.area.Locked.FREE:
raise ClientError('Area is already unlocked.')
if not client.is_cm:
raise ClientError('Only CM can unlock area.')
diff --git a/server/tsuserver.py b/server/tsuserver.py
index 8f5bf859..7ef4f5e0 100644
--- a/server/tsuserver.py
+++ b/server/tsuserver.py
@@ -268,7 +268,7 @@ class TsuServer3:
CM:
ARUP#2##<area1_cm: string>##<area2_cm: string>#...
Lockedness:
- ARUP#3##<area1_l: bool>##<area2_l: bool>#...
+ ARUP#3##<area1_l: string>##<area2_l: string>#...
"""
if len(args) < 2:
@@ -277,13 +277,13 @@ class TsuServer3:
if args[0] not in (0,1,2,3):
return
- if args[0] in (0, 3):
+ if args[0] == 0:
for part_arg in args[1:]:
try:
sanitised = int(part_arg)
except:
return
- elif args[0] in (1, 2):
+ elif args[0] in (1, 2, 3):
for part_arg in args[1:]:
try:
sanitised = str(part_arg)