OverviewFilesCommitsIssuesDocsReleasesPeers

godot-keet / addons / keet_social / keet_room.gd

244 lines · gd ref:
class_name KeetRoom
extends Node
## Room management for keet-daemon via UDS.
## 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


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)
	)


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)
	)


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
		var rid: String = ""
		if result is String:
			rid = result
		elif result is Dictionary:
			rid = result.get("roomId", result.get("id", ""))
		room_created.emit(rid)
		if callback.is_valid():
			callback.call(result)
	)


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", result.get("id", ""))
		room_joined.emit(rid)
		if callback.is_valid():
			callback.call(result)
	)


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)
	)


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)
	)


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)
	)


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)
	)


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 get_config(room_id: String, callback: Callable = Callable()) -> void:
	_require_client()
	client.call_rpc("room.config", {"roomId": room_id}, func(result, err):
		if err != null:
			error_occurred.emit("get_config: %s" % str(err))
			return
		if callback.is_valid():
			callback.call(result if result is Dictionary else {})
	)


func change_role(room_id: String, member_id: String, role: int, callback: Callable = Callable()) -> void:
	_require_client()
	client.call_rpc("members.role", {"roomId": room_id, "memberId": member_id, "role": role}, func(result, err):
		if err != null:
			error_occurred.emit("change_role: %s" % str(err))
			return
		if callback.is_valid():
			callback.call(result)
	)


func mute_member(room_id: String, member_id: String, callback: Callable = Callable()) -> void:
	_require_client()
	client.call_rpc("mute", {"roomId": room_id, "memberId": member_id}, func(result, err):
		if err != null:
			error_occurred.emit("mute_member: %s" % str(err))
			return
		if callback.is_valid():
			callback.call(result)
	)


func unmute_member(room_id: String, member_id: String, callback: Callable = Callable()) -> void:
	_require_client()
	client.call_rpc("unmute", {"roomId": room_id, "memberId": member_id}, func(result, err):
		if err != null:
			error_occurred.emit("unmute_member: %s" % str(err))
			return
		if callback.is_valid():
			callback.call(result)
	)


func kick_member(room_id: String, member_id: String, callback: Callable = Callable()) -> void:
	_require_client()
	client.call_rpc("kick", {"roomId": room_id, "memberId": member_id}, func(result, err):
		if err != null:
			error_occurred.emit("kick_member: %s" % str(err))
			return
		if callback.is_valid():
			callback.call(result)
	)


func get_preferences(room_id: String, callback: Callable = Callable()) -> void:
	_require_client()
	client.call_rpc("room.preferences", {"roomId": room_id}, func(result, err):
		if err != null:
			error_occurred.emit("get_preferences: %s" % str(err))
			return
		if callback.is_valid():
			callback.call(result if result is Dictionary else {})
	)


func set_preferences(room_id: String, prefs: Dictionary, callback: Callable = Callable()) -> void:
	_require_client()
	var params: Dictionary = {"roomId": room_id}
	params.merge(prefs)
	client.call_rpc("room.preferences.set", params, func(result, err):
		if err != null:
			error_occurred.emit("set_preferences: %s" % str(err))
			return
		if callback.is_valid():
			callback.call(result)
	)


func bookmark(room_id: String, callback: Callable = Callable()) -> void:
	_require_client()
	client.call_rpc("room.bookmark", {"roomId": room_id}, func(result, err):
		if err != null:
			error_occurred.emit("bookmark: %s" % str(err))
			return
		if callback.is_valid():
			callback.call(result)
	)


func unbookmark(room_id: String, callback: Callable = Callable()) -> void:
	_require_client()
	client.call_rpc("room.unbookmark", {"roomId": room_id}, func(result, err):
		if err != null:
			error_occurred.emit("unbookmark: %s" % str(err))
			return
		if callback.is_valid():
			callback.call(result)
	)


func _require_client() -> void:
	if client == null:
		push_error("KeetRoom: client not set")