@@ -2,7 +2,7 @@ import { Apps } from '@rocket.chat/apps';
22import type { AppVideoConfProviderManager } from '@rocket.chat/apps/dist/server/managers/AppVideoConfProviderManager' ;
33import type { VideoConfData , VideoConfDataExtended } from '@rocket.chat/apps-engine/definition/videoConfProviders' ;
44import type { IVideoConfService , VideoConferenceJoinOptions } from '@rocket.chat/core-services' ;
5- import { api , ServiceClassInternal , Room } from '@rocket.chat/core-services' ;
5+ import { api , Presence , ServiceClassInternal , Room } from '@rocket.chat/core-services' ;
66import type {
77 IDirectVideoConference ,
88 ILivechatVideoConference ,
@@ -25,6 +25,7 @@ import type {
2525 IVoIPVideoConference ,
2626} from '@rocket.chat/core-typings' ;
2727import {
28+ UserStatus ,
2829 VideoConferenceStatus ,
2930 isDirectVideoConference ,
3031 isGroupVideoConference ,
@@ -322,8 +323,8 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf
322323 throw new Error ( 'Invalid User' ) ;
323324 }
324325
325- const user = await Users . findOneById < Required < Pick < IUser , '_id' | 'username' | 'name' | 'avatarETag' > > > ( userId , {
326- projection : { username : 1 , name : 1 , avatarETag : 1 } ,
326+ const user = await Users . findOneById < Required < Pick < IUser , '_id' | 'username' | 'name' | 'avatarETag' | 'language' > > > ( userId , {
327+ projection : { username : 1 , name : 1 , avatarETag : 1 , language : 1 } ,
327328 } ) ;
328329 if ( ! user ) {
329330 throw new Error ( 'Invalid User' ) ;
@@ -334,6 +335,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf
334335 username : user . username ,
335336 name : user . name ,
336337 avatarETag : user . avatarETag ,
338+ language : user . language ,
337339 ts : ts || new Date ( ) ,
338340 } ) ;
339341 }
@@ -502,6 +504,15 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf
502504 }
503505
504506 await VideoConferenceModel . setDataById ( call . _id , { endedAt : new Date ( ) , status : VideoConferenceStatus . ENDED } ) ;
507+
508+ await Promise . all (
509+ call . users . map ( ( user ) =>
510+ Presence . endActiveState ( user . _id ) . catch ( ( err ) =>
511+ logger . error ( { msg : 'Failed to clear presence for user after video conference' , uid : user . _id , err } ) ,
512+ ) ,
513+ ) ,
514+ ) ;
515+
505516 await this . runVideoConferenceChangedEvent ( call . _id ) ;
506517 this . notifyVideoConfUpdate ( call . rid , call . _id ) ;
507518
@@ -576,6 +587,10 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf
576587 return message . _id ;
577588 }
578589
590+ private getLanguageForUser ( language ?: string ) : string {
591+ return language || settings . get ( 'Language' ) || 'en' ;
592+ }
593+
579594 private async validateProvider ( providerName : string ) : Promise < void > {
580595 const manager = await this . getProviderManager ( ) ;
581596 const configured = await manager . isFullyConfigured ( providerName ) . catch ( ( ) => false ) ;
@@ -1067,7 +1082,14 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf
10671082
10681083 private async addUserToCall (
10691084 call : Optional < VideoConference , 'providerData' > ,
1070- { _id, username, name, avatarETag, ts } : AtLeast < Required < IUser > , '_id' | 'username' | 'name' | 'avatarETag' > & { ts ?: Date } ,
1085+ {
1086+ _id,
1087+ username,
1088+ name,
1089+ avatarETag,
1090+ language,
1091+ ts,
1092+ } : AtLeast < Required < IUser > , '_id' | 'username' | 'name' | 'avatarETag' > & { language ?: string ; ts ?: Date } ,
10711093 ) : Promise < void > {
10721094 // If the call has a discussion, ensure the user is subscribed to it;
10731095 // This is done even if the user has already joined the call before, so they can be added back if they had left the discussion.
@@ -1081,6 +1103,12 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf
10811103
10821104 await VideoConferenceModel . addUserById ( call . _id , { _id, username, name, avatarETag, ts } ) ;
10831105
1106+ await Presence . setActiveState ( _id , {
1107+ statusDefault : UserStatus . BUSY ,
1108+ statusText : i18n . t ( 'Presence_status_in_a_meeting' , { lng : this . getLanguageForUser ( language ) } ) ,
1109+ statusSource : 'internal' ,
1110+ } ) . catch ( ( err ) => logger . error ( { msg : 'Failed to set presence for user joining video conference' , uid : _id , err } ) ) ;
1111+
10841112 if ( call . type === 'direct' ) {
10851113 return this . updateDirectCall ( call as IDirectVideoConference , _id ) ;
10861114 }
0 commit comments