class_name KeetRoom
extends Node
## Room management for keet-daemon.
## List, join, leave, create, and configure rooms.
signal rooms_loaded(rooms: Array)
signal room_joined(room_id: String)
signal room_left(room_id: String)
signal room_created(room_id: String)
signal members_loaded(room_id: String, members: Array)
signal invite_created(room_id: String, invite: String)
signal error_occurred(message: String)
var client: KeetUdsClient
## List all rooms.
func list_rooms(callback: Callable = Callable()) -> void:
_require_client()
client.call_rpc("rooms", {}, func(result, err):
if err != null:
error_occurred.emit("list_rooms: %s" % str(err))
return
var rooms: Array = result if result is Array else []
rooms_loaded.emit(rooms)
if callback.is_valid():
callback.call(rooms)
)
## Get info for a specific room.
func get_room(room_id: String, callback: Callable = Callable()) -> void:
_require_client()
client.call_rpc("room", {"roomId": room_id}, func(result, err):
if err != null:
error_occurred.emit("get_room: %s" % str(err))
return
if callback.is_valid():
callback.call(result)
)
## Create a new room.
func create_room(title: String, callback: Callable = Callable()) -> void:
_require_client()
client.call_rpc("room.create", {"title": title}, func(result, err):
if err != null:
error_occurred.emit("create_room: %s" % str(err))
return
# Daemon may return roomId as raw string or as {roomId: "..."}
var rid: String = ""
if result is String:
rid = result
elif result is Dictionary:
rid = result.get("roomId", "")
room_created.emit(rid)
if callback.is_valid():
callback.call(rid)
)
## Join a room by invite link or token.
func join_room(invite: String, callback: Callable = Callable()) -> void:
_require_client()
client.call_rpc("room.join", {"invite": invite}, func(result, err):
if err != null:
error_occurred.emit("join_room: %s" % str(err))
return
var rid: String = ""
if result is String:
rid = result
elif result is Dictionary:
rid = result.get("roomId", "")
room_joined.emit(rid)
if callback.is_valid():
callback.call(rid)
)
## Leave a room.
func leave_room(room_id: String, callback: Callable = Callable()) -> void:
_require_client()
client.call_rpc("room.leave", {"roomId": room_id}, func(result, err):
if err != null:
error_occurred.emit("leave_room: %s" % str(err))
return
room_left.emit(room_id)
if callback.is_valid():
callback.call(result)
)
## Purge a room (leave AND delete local data).
func purge_room(room_id: String, callback: Callable = Callable()) -> void:
_require_client()
client.call_rpc("room.purge", {"roomId": room_id}, func(result, err):
if err != null:
error_occurred.emit("purge_room: %s" % str(err))
return
room_left.emit(room_id)
if callback.is_valid():
callback.call(result)
)
## Get an invite token for a room.
func create_invite(room_id: String, callback: Callable = Callable()) -> void:
_require_client()
client.call_rpc("room.invite", {"roomId": room_id}, func(result, err):
if err != null:
error_occurred.emit("create_invite: %s" % str(err))
return
var token: String = ""
if result is Dictionary:
token = result.get("token", result.get("invite", ""))
elif result is String:
token = result
invite_created.emit(room_id, token)
if callback.is_valid():
callback.call(token)
)
## List members of a room.
func list_members(room_id: String, callback: Callable = Callable()) -> void:
_require_client()
client.call_rpc("members", {"roomId": room_id}, func(result, err):
if err != null:
error_occurred.emit("list_members: %s" % str(err))
return
var members: Array = result if result is Array else []
members_loaded.emit(room_id, members)
if callback.is_valid():
callback.call(members)
)
## The active identity's HOME room (keet-daemon home.get; docs/home-world-design.md
## §2): created by the daemon on first ask, the same room every time after.
## The callback gets {roomId, created} — or {error} on failure, ALWAYS called, so
## the caller can say why Home is unavailable instead of waiting forever. A
## HOME_ROOM_MISSING error means the identity's home room is gone; the daemon
## deliberately does not make another.
func get_home(callback: Callable = Callable()) -> void:
_require_client()
client.call_rpc("home.get", {}, func(result, err):
var out: Dictionary = {}
if err != null:
out = {"error": str(err)}
error_occurred.emit("get_home: %s" % str(err))
elif result is Dictionary and String(result.get("roomId", "")) != "":
out = result
else:
out = {"error": "home.get returned %s" % str(result)}
if callback.is_valid():
callback.call(out)
)
## Set room configuration (title, description, etc).
func set_config(room_id: String, key: String, value: Variant, callback: Callable = Callable()) -> void:
_require_client()
client.call_rpc("room.config.set", {"roomId": room_id, "key": key, "value": value}, func(result, err):
if err != null:
error_occurred.emit("set_config: %s" % str(err))
return
if callback.is_valid():
callback.call(result)
)
func _require_client() -> void:
if client == null:
push_error("KeetRoom: client not set. Assign a KeetUdsClient node.")