diff --git a/example/lib/pages/room.dart b/example/lib/pages/room.dart index e48a3ea..0a74645 100644 --- a/example/lib/pages/room.dart +++ b/example/lib/pages/room.dart @@ -66,6 +66,10 @@ class _RoomPageState extends State { }) ..on((_) => _sortParticipants()) ..on((_) => _sortParticipants()) + ..on((event) { + print( + 'Participant name updated: ${event.participant.identity}, name => ${event.name}'); + }) ..on((event) { String decoded = 'Failed to decode'; try { diff --git a/lib/src/core/signal_client.dart b/lib/src/core/signal_client.dart index 714fb0f..692e957 100644 --- a/lib/src/core/signal_client.dart +++ b/lib/src/core/signal_client.dart @@ -381,6 +381,12 @@ extension SignalClientRequests on SignalClient { )); } + @internal + void sendUpdateLocalMetadata(lk_rtc.UpdateParticipantMetadata metadata) => + _sendRequest(lk_rtc.SignalRequest( + updateMetadata: metadata, + )); + @internal void sendUpdateTrackSettings(lk_rtc.UpdateTrackSettings settings) => _sendRequest(lk_rtc.SignalRequest( diff --git a/lib/src/events.dart b/lib/src/events.dart index 958c277..db2fea1 100644 --- a/lib/src/events.dart +++ b/lib/src/events.dart @@ -411,3 +411,16 @@ class ParticipantPermissionsUpdatedEvent with RoomEvent, ParticipantEvent { String toString() => '${runtimeType}' '(participant: ${participant}, permissions: ${permissions})'; } + +class ParticipantNameUpdatedEvent with RoomEvent, ParticipantEvent { + final Participant participant; + final String name; + const ParticipantNameUpdatedEvent({ + required this.participant, + required this.name, + }); + + @override + String toString() => '${runtimeType}' + '(participant: ${participant}, name: ${name})'; +} diff --git a/lib/src/participant/local.dart b/lib/src/participant/local.dart index bb512f0..033483e 100644 --- a/lib/src/participant/local.dart +++ b/lib/src/participant/local.dart @@ -276,6 +276,29 @@ class LocalParticipant extends Participant { await room.engine.sendDataPacket(packet); } + /// Sets and updates the metadata of the local participant. + /// Note: this requires `CanUpdateOwnMetadata` permission encoded in the token. + /// @param metadata + void setMetadata(String metadata) { + room.engine.signalClient + .sendUpdateLocalMetadata(lk_rtc.UpdateParticipantMetadata( + name: name, + metadata: metadata, + )); + } + + /// Sets and updates the name of the local participant. + /// Note: this requires `CanUpdateOwnMetadata` permission encoded in the token. + /// @param name + void setName(String name) { + super.updateName(name); + room.engine.signalClient + .sendUpdateLocalMetadata(lk_rtc.UpdateParticipantMetadata( + name: name, + metadata: metadata, + )); + } + /// A convenience property to get all video tracks. @override List> get videoTracks => diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index 2bc8548..4205354 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -159,8 +159,8 @@ abstract class Participant @internal void updateFromInfo(lk_models.ParticipantInfo info) { identity = info.identity; - _name = info.name; sid = info.sid; + updateName(info.name); if (info.metadata.isNotEmpty) { _setMetadata(info.metadata); } @@ -177,6 +177,16 @@ abstract class Participant return oldValue; } + @internal + void updateName(String name) { + if (_name == name) return; + _name = name; + [events, room.events].emit(ParticipantNameUpdatedEvent( + participant: this, + name: name, + )); + } + /// for internal use /// {@nodoc} @internal