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