Allow client and server to import and export the
queue/waitingroom/recent
This commit is contained in:
parent
831985e597
commit
d2bca61ebd
4 changed files with 90 additions and 1 deletions
|
@ -45,6 +45,7 @@ from . import SYNG_VERSION, jsonencoder
|
||||||
from .entry import Entry
|
from .entry import Entry
|
||||||
from .sources import configure_sources, Source
|
from .sources import configure_sources, Source
|
||||||
from .log import logger
|
from .log import logger
|
||||||
|
from . import jsonencoder
|
||||||
|
|
||||||
|
|
||||||
class ConnectionState:
|
class ConnectionState:
|
||||||
|
@ -617,6 +618,43 @@ class Client:
|
||||||
logger.info("Removing room %s from server", self.state.config["room"])
|
logger.info("Removing room %s from server", self.state.config["room"])
|
||||||
await self.sio.emit("remove-room", {"room": self.state.config["room"]})
|
await self.sio.emit("remove-room", {"room": self.state.config["room"]})
|
||||||
|
|
||||||
|
def export_queue(self, filename: str) -> None:
|
||||||
|
"""
|
||||||
|
Export the current queue to a file.
|
||||||
|
|
||||||
|
:param filename: The name of the file to export the queue to.
|
||||||
|
:type filename: str
|
||||||
|
:rtype: None
|
||||||
|
"""
|
||||||
|
with open(filename, "w", encoding="utf8") as file:
|
||||||
|
jsonencoder.dump(
|
||||||
|
{
|
||||||
|
"queue": self.state.queue,
|
||||||
|
"waiting_room": self.state.waiting_room,
|
||||||
|
"recent": self.state.recent,
|
||||||
|
},
|
||||||
|
file,
|
||||||
|
indent=2,
|
||||||
|
ensure_ascii=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
async def import_queue(self, filename: str) -> None:
|
||||||
|
"""
|
||||||
|
Import a queue from a file.
|
||||||
|
|
||||||
|
:param filename: The name of the file to import the queue from.
|
||||||
|
:type filename: str
|
||||||
|
:rtype: None
|
||||||
|
"""
|
||||||
|
with open(filename, "r", encoding="utf8") as file:
|
||||||
|
data = jsonencoder.load(file)
|
||||||
|
queue = [Entry(**entry) for entry in data["queue"]]
|
||||||
|
waiting_room = [Entry(**entry) for entry in data["waiting_room"]]
|
||||||
|
recent = [Entry(**entry) for entry in data["recent"]]
|
||||||
|
await self.sio.emit(
|
||||||
|
"import-queue", {"queue": queue, "waiting_room": waiting_room, "recent": recent}
|
||||||
|
)
|
||||||
|
|
||||||
async def handle_room_removed(self, data: dict[str, Any]) -> None:
|
async def handle_room_removed(self, data: dict[str, Any]) -> None:
|
||||||
"""
|
"""
|
||||||
Handle the "room-removed" message.
|
Handle the "room-removed" message.
|
||||||
|
|
|
@ -34,10 +34,20 @@ class SyngEncoder(json.JSONEncoder):
|
||||||
|
|
||||||
|
|
||||||
def dumps(obj: Any, **kw: Any) -> str:
|
def dumps(obj: Any, **kw: Any) -> str:
|
||||||
"""Wrap around ``json.dump`` with the :py:class:`SyngEncoder`."""
|
"""Wrap around ``json.dumps`` with the :py:class:`SyngEncoder`."""
|
||||||
return json.dumps(obj, cls=SyngEncoder, **kw)
|
return json.dumps(obj, cls=SyngEncoder, **kw)
|
||||||
|
|
||||||
|
|
||||||
|
def dump(obj: Any, fp: Any, **kw: Any) -> None:
|
||||||
|
"""Forward everything to ``json.dump``."""
|
||||||
|
json.dump(obj, fp, cls=SyngEncoder, **kw)
|
||||||
|
|
||||||
|
|
||||||
def loads(string: str, **kw: Any) -> Any:
|
def loads(string: str, **kw: Any) -> Any:
|
||||||
"""Forward everything to ``json.loads``."""
|
"""Forward everything to ``json.loads``."""
|
||||||
return json.loads(string, **kw)
|
return json.loads(string, **kw)
|
||||||
|
|
||||||
|
|
||||||
|
def load(fp: Any, **kw: Any) -> Any:
|
||||||
|
"""Forward everything to ``json.load``."""
|
||||||
|
return json.load(fp, **kw)
|
||||||
|
|
|
@ -31,6 +31,17 @@ class Queue:
|
||||||
self.num_of_entries_sem = asyncio.Semaphore(len(self._queue))
|
self.num_of_entries_sem = asyncio.Semaphore(len(self._queue))
|
||||||
self.readlock = asyncio.Lock()
|
self.readlock = asyncio.Lock()
|
||||||
|
|
||||||
|
def extend(self, entries: Iterable[Entry]) -> None:
|
||||||
|
"""
|
||||||
|
Extend the queue with a list of entries and increase the semaphore.
|
||||||
|
|
||||||
|
:param entries: The entries to add
|
||||||
|
:type entries: Iterable[Entry]
|
||||||
|
:rtype: None
|
||||||
|
"""
|
||||||
|
for entry in entries:
|
||||||
|
self.append(entry)
|
||||||
|
|
||||||
def append(self, entry: Entry) -> None:
|
def append(self, entry: Entry) -> None:
|
||||||
"""
|
"""
|
||||||
Append an entry to the queue, increase the semaphore.
|
Append an entry to the queue, increase the semaphore.
|
||||||
|
|
|
@ -230,6 +230,7 @@ class Server:
|
||||||
self.sio.on("connect", self.handle_connect)
|
self.sio.on("connect", self.handle_connect)
|
||||||
self.sio.on("search", self.handle_search)
|
self.sio.on("search", self.handle_search)
|
||||||
self.sio.on("search-results", self.handle_search_results)
|
self.sio.on("search-results", self.handle_search_results)
|
||||||
|
self.sio.on("import-queue", self.handle_import_queue)
|
||||||
|
|
||||||
async def is_admin(self, state: State, sid: str) -> bool:
|
async def is_admin(self, state: State, sid: str) -> bool:
|
||||||
"""
|
"""
|
||||||
|
@ -963,6 +964,35 @@ class Server:
|
||||||
)
|
)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@admin
|
||||||
|
@with_state
|
||||||
|
async def handle_import_queue(self, state: State, sid: str, data: dict[str, Any]) -> None:
|
||||||
|
"""
|
||||||
|
Handle the "import-queue" message.
|
||||||
|
|
||||||
|
This will add entries to the queue and waiting room from the client.
|
||||||
|
|
||||||
|
The data dictionary should have the following keys:
|
||||||
|
- `queue`, a list of entries to import into the queue
|
||||||
|
- `waiting_room`, a list of entries to import into the waiting room
|
||||||
|
|
||||||
|
:param sid: The session id of the client sending this request
|
||||||
|
:type sid: str
|
||||||
|
:param data: A dictionary with the keys described above
|
||||||
|
:type data: dict[str, Any]
|
||||||
|
:rtype: None
|
||||||
|
"""
|
||||||
|
|
||||||
|
queue_entries = [Entry(**entry) for entry in data.get("queue", [])]
|
||||||
|
waiting_room_entries = [Entry(**entry) for entry in data.get("waiting_room", [])]
|
||||||
|
recent_entries = [Entry(**entry) for entry in data.get("recent", [])]
|
||||||
|
|
||||||
|
state.queue.extend(queue_entries)
|
||||||
|
state.waiting_room.extend(waiting_room_entries)
|
||||||
|
state.recent.extend(recent_entries)
|
||||||
|
|
||||||
|
await self.broadcast_state(state, sid=sid)
|
||||||
|
|
||||||
@admin
|
@admin
|
||||||
@with_state
|
@with_state
|
||||||
async def handle_remove_room(self, state: State, sid: str, data: dict[str, Any]) -> None:
|
async def handle_remove_room(self, state: State, sid: str, data: dict[str, Any]) -> None:
|
||||||
|
|
Loading…
Add table
Reference in a new issue