telnet_retro_chat/libs/room_manager.py
2025-02-19 11:18:33 +01:00

87 lines
2.6 KiB
Python

from pathlib import Path
import json
class Room:
def __init__(self, name, description=""):
self.name = name
self.description = description
self.users = set() # Set of addr tuples
def add_user(self, addr):
self.users.add(addr)
def remove_user(self, addr):
self.users.discard(addr)
class RoomManager:
def __init__(self):
self.rooms = {} # {name: Room}
self.user_rooms = {} # {addr: room_name}
self.rooms_file = Path("data/rooms.json")
self._load_rooms()
def _load_rooms(self):
if self.rooms_file.exists():
with open(self.rooms_file) as f:
rooms_data = json.load(f)
for name, data in rooms_data.items():
self.rooms[name] = Room(name, data.get("description", ""))
else:
# Create default lounge
self.rooms_file.parent.mkdir(exist_ok=True)
self.rooms["lounge"] = Room("lounge", "The default chat room")
self._save_rooms()
def _save_rooms(self):
rooms_data = {
name: {"description": room.description} for name, room in self.rooms.items()
}
with open(self.rooms_file, "w") as f:
json.dump(rooms_data, f, indent=2)
def create_room(self, name, description=""):
if name.lower() in self.rooms:
return False
self.rooms[name.lower()] = Room(name, description)
self._save_rooms()
return True
def join_room(self, addr, room_name):
"""Join a chat room."""
room_name = room_name.lower()
if room_name not in self.rooms:
return False
# Get old room for notification
old_room = None
if addr in self.user_rooms:
old_room_name = self.user_rooms[addr]
old_room = self.rooms[old_room_name]
# Remove from current room
self.leave_current_room(addr)
# Add to new room
self.rooms[room_name].add_user(addr)
self.user_rooms[addr] = room_name
return True
def leave_current_room(self, addr):
if addr in self.user_rooms:
current_room = self.rooms[self.user_rooms[addr]]
current_room.remove_user(addr)
del self.user_rooms[addr]
def get_room_users(self, room_name):
room = self.rooms.get(room_name.lower())
return room.users if room else set()
def get_user_room(self, addr):
return self.user_rooms.get(addr, "lounge")
def list_rooms(self):
return {name: room.description for name, room in self.rooms.items()}