OverviewFilesCommitsIssuesDocsReleasesPeers

godot-keet / scripts / member_panel.gd

102 lines · gd ref:
extends PanelContainer
## Right panel: member list with role badges and DM context menu.

@onready var member_count_label: Label = %MemberCount
@onready var member_list: ItemList = %MemberList

var _current_room_id: String = ""
var _members: Array = []  # cached member data for context menu
var _context_menu: PopupMenu = null


func _ready() -> void:
	KeetService.room_selected.connect(_on_room_selected)
	KeetService.room_mgr.members_loaded.connect(_on_members_loaded)

	member_count_label.text = "Members"

	# Right-click context menu on member list
	member_list.item_clicked.connect(_on_member_clicked)


func _on_room_selected(room_id: String, _title: String) -> void:
	_current_room_id = room_id
	_members.clear()
	member_list.clear()
	member_count_label.text = "Members"
	KeetService.room_mgr.list_members(room_id)


func _on_members_loaded(room_id: String, members: Array) -> void:
	if room_id != _current_room_id:
		return

	_members = members
	member_list.clear()
	member_count_label.text = "%d members" % members.size()

	for m: Variant in members:
		if not m is Dictionary:
			continue
		var mname: String = m.get("name", "?")
		var role: String = m.get("role", "peer")
		var online: bool = m.get("online", false)

		var badge: String = ""
		var color: Color = Color.WHITE
		match role:
			"admin":
				badge = " [A]"
				color = Color(1.0, 0.84, 0.0)  # Gold
			"mod":
				badge = " [M]"
				color = Color(0.4, 0.6, 1.0)  # Blue
			"read-only":
				badge = " [S]"
				color = Color(0.6, 0.6, 0.6)  # Gray

		var display: String = mname + badge
		if not online:
			color = color.darkened(0.4)

		var idx: int = member_list.add_item(display)
		member_list.set_item_custom_fg_color(idx, color)


func _on_member_clicked(idx: int, _at_position: Vector2, mouse_button_index: int) -> void:
	if mouse_button_index != MOUSE_BUTTON_RIGHT:
		return
	if idx < 0 or idx >= _members.size():
		return

	var member: Dictionary = _members[idx] if _members[idx] is Dictionary else {}
	var member_id: String = member.get("memberId", "")
	var member_name: String = member.get("name", "?")
	if member_id == "":
		return

	# Create context menu
	if _context_menu != null:
		_context_menu.queue_free()
	_context_menu = PopupMenu.new()
	_context_menu.add_item("Message %s" % member_name, 0)
	_context_menu.id_pressed.connect(func(id: int, _mid = member_id, _mname = member_name):
		if id == 0:
			_initiate_dm(_mid, _mname)
	)
	add_child(_context_menu)
	_context_menu.popup(Rect2i(
		get_viewport().get_mouse_position() as Vector2i,
		Vector2i(150, 30)
	))


func _initiate_dm(member_id: String, member_name: String) -> void:
	print("[member] initiating DM with %s (%s)" % [member_name, member_id.left(12)])
	KeetService.dm.request_from_room(_current_room_id, member_id, "", func(result):
		if result != null:
			print("[member] DM request sent to %s" % member_name)
		else:
			print("[member] DM request failed for %s" % member_name)
	)