From c3a55c4d2cd5cedf39cacae46ff3e5ef5d4f4f9c Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 12:33:02 -0300 Subject: [PATCH 01/11] feat: mark methods to change --- app/ee/omnichannel/lib/index.ts | 1 + app/lib/services/restApi.ts | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/app/ee/omnichannel/lib/index.ts b/app/ee/omnichannel/lib/index.ts index 486749d005d..6ca8b1cdec8 100644 --- a/app/ee/omnichannel/lib/index.ts +++ b/app/ee/omnichannel/lib/index.ts @@ -20,6 +20,7 @@ export const getInquiriesQueued = (serverVersion: string) => { // this inquiry is added to the db by the subscriptions stream // and will be removed by the queue stream // RC 2.4.0 +// change it export const takeInquiry = (inquiryId: string) => sdk.methodCallWrapper('livechat:takeInquiry', inquiryId); // RC 4.26 diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index 2aaaebd7734..d84f34db2d2 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -430,6 +430,7 @@ export const editLivechat = (userData: TParams, roomData: TParams): Promise<{ er return sdk.post('livechat/room.saveInfo', { guestData: userData, roomData }) as any; }; +// change it export const returnLivechat = (rid: string): Promise => // RC 0.72.0 sdk.methodCallWrapper('livechat:returnAsInquiry', rid); @@ -461,6 +462,7 @@ export const usersAutoComplete = (selector: any) => // RC 2.4.0 sdk.get('users.autocomplete', { selector }); +// change it export const getRoutingConfig = (): Promise<{ previewRoom: boolean; showConnecting: boolean; @@ -515,6 +517,7 @@ export const deleteRoom = (roomId: string, t: RoomTypes) => // RC 0.49.0 sdk.post(`${roomTypeToApiType(t)}.delete`, { roomId }); +// change it export const toggleMuteUserInRoom = ( rid: string, username: string, @@ -658,6 +661,7 @@ export const getSingleMessage = (msgId: string) => // RC 0.47.0 sdk.get('chat.getMessage', { msgId }); +// change it export const getRoomRoles = ( roomId: string, type: SubscriptionType.CHANNEL | SubscriptionType.GROUP | SubscriptionType.OMNICHANNEL From adf100f894143f0be16322b505c65a84c345a9a7 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 13:59:15 -0300 Subject: [PATCH 02/11] chore: deprecate methods --- app/definitions/rest/v1/omnichannel.ts | 8 ++++++++ app/ee/omnichannel/lib/index.ts | 10 ++++++++-- app/lib/services/restApi.ts | 13 +++++++++---- app/views/RoomActionsView/index.tsx | 4 ++-- app/views/RoomView/RightButtons.tsx | 4 ++-- app/views/RoomView/index.tsx | 3 ++- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/app/definitions/rest/v1/omnichannel.ts b/app/definitions/rest/v1/omnichannel.ts index f467ed176c7..40d67c6d380 100644 --- a/app/definitions/rest/v1/omnichannel.ts +++ b/app/definitions/rest/v1/omnichannel.ts @@ -122,6 +122,14 @@ export type OmnichannelEndpoints = { }>; }; + 'livechat/inquiries.take': { + POST: (params: { inquiryId: string }) => void; + }; + + 'livechat/inquiries.returnAsInquiry': { + POST: (params: { roomId: string; departmentId?: string }) => boolean; + }; + 'livechat/rooms': { GET: (params: { guest: string; diff --git a/app/ee/omnichannel/lib/index.ts b/app/ee/omnichannel/lib/index.ts index 6ca8b1cdec8..e117fb1ef85 100644 --- a/app/ee/omnichannel/lib/index.ts +++ b/app/ee/omnichannel/lib/index.ts @@ -20,8 +20,14 @@ export const getInquiriesQueued = (serverVersion: string) => { // this inquiry is added to the db by the subscriptions stream // and will be removed by the queue stream // RC 2.4.0 -// change it -export const takeInquiry = (inquiryId: string) => sdk.methodCallWrapper('livechat:takeInquiry', inquiryId); + +export const takeInquiry = (inquiryId: string, serverVersion: string) => { + if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '7.11.0')) { + return sdk.methodCallWrapper('livechat:takeInquiry', inquiryId); + } + // Method removed in 8.0.0 + return sdk.post('livechat/inquiries.take', { inquiryId }); +}; // RC 4.26 export const takeResume = (roomId: string) => sdk.methodCallWrapper('livechat:resumeOnHold', roomId); diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index d84f34db2d2..1488fa3dbdf 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -431,11 +431,16 @@ export const editLivechat = (userData: TParams, roomData: TParams): Promise<{ er }; // change it -export const returnLivechat = (rid: string): Promise => - // RC 0.72.0 - sdk.methodCallWrapper('livechat:returnAsInquiry', rid); +export const returnLivechat = (rid: string, departmentId?: string): Promise => { + const serverVersion = reduxStore.getState().server.version; + + if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '7.12.0')) { + return sdk.post('livechat/inquiries.returnAsInquiry', { roomId: rid, departmentId }); + } -export const onHoldLivechat = (roomId: string) => sdk.post('livechat/room.onHold', { roomId }); + // RC 0.72.0 + return sdk.methodCallWrapper('livechat:returnAsInquiry', rid); +}; export const forwardLivechat = (transferData: any) => // RC 0.36.0 diff --git a/app/views/RoomActionsView/index.tsx b/app/views/RoomActionsView/index.tsx index 400389faea6..e192b2a6b44 100644 --- a/app/views/RoomActionsView/index.tsx +++ b/app/views/RoomActionsView/index.tsx @@ -447,14 +447,14 @@ class RoomActionsView extends React.Component { const { - room: { rid } + room: { rid, departmentId } } = this.state; showConfirmationAlert({ message: I18n.t('Would_you_like_to_return_the_inquiry'), confirmationText: I18n.t('Yes'), onPress: async () => { try { - await returnLivechat(rid); + await returnLivechat(rid, departmentId); } catch (e: any) { showErrorAlert(e.reason, I18n.t('Oops')); } diff --git a/app/views/RoomView/RightButtons.tsx b/app/views/RoomView/RightButtons.tsx index a2d8d5c2e59..7b3b838b54f 100644 --- a/app/views/RoomView/RightButtons.tsx +++ b/app/views/RoomView/RightButtons.tsx @@ -232,14 +232,14 @@ class RightButtonsContainer extends Component { - const { rid } = this.props; + const { rid, departmentId } = this.props; if (rid) { showConfirmationAlert({ message: i18n.t('Would_you_like_to_return_the_inquiry'), confirmationText: i18n.t('Yes'), onPress: async () => { try { - await returnLivechat(rid); + await returnLivechat(rid, departmentId); } catch (e: any) { showErrorAlert(e.reason, i18n.t('Oops')); } diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index 041628ce5de..a6bfc5ba106 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -1088,10 +1088,11 @@ class RoomView extends React.Component { logEvent(events.ROOM_JOIN); try { const { room } = this.state; + const { serverVersion } = this.props; if (this.isOmnichannel) { if ('_id' in room) { - await takeInquiry(room._id); + await takeInquiry(room._id, serverVersion as string); } this.onJoin(); } else { From b58e3fd2e3e20b2f618e24ec925c78a2b11b2903 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 14:41:09 -0300 Subject: [PATCH 03/11] feat: finished deprecated methods --- app/definitions/rest/v1/omnichannel.ts | 13 ++++++++++ app/definitions/rest/v1/rooms.ts | 12 +++++++++ app/lib/services/restApi.ts | 35 ++++++++++++++++++++------ app/views/RoomMembersView/helpers.ts | 2 +- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/app/definitions/rest/v1/omnichannel.ts b/app/definitions/rest/v1/omnichannel.ts index 40d67c6d380..0f3162d195e 100644 --- a/app/definitions/rest/v1/omnichannel.ts +++ b/app/definitions/rest/v1/omnichannel.ts @@ -19,6 +19,19 @@ export type OmnichannelEndpoints = { appearance: ISetting[]; }; }; + 'livechat/config/routing': { + GET: () => { + config: { + previewRoom: boolean; + showConnecting: boolean; + showQueue: boolean; + showQueueLink: boolean; + returnQueue: boolean; + enableTriggerAction: boolean; + autoAssignAgent: boolean; + }; + }; + }; 'livechat/visitors.info': { GET: (params: { visitorId: string }) => { visitor: ILivechatVisitor; diff --git a/app/definitions/rest/v1/rooms.ts b/app/definitions/rest/v1/rooms.ts index 0343a298a40..31716b6f588 100644 --- a/app/definitions/rest/v1/rooms.ts +++ b/app/definitions/rest/v1/rooms.ts @@ -44,6 +44,18 @@ export type RoomsEndpoints = { 'rooms.saveNotification': { POST: (params: { roomId: string; notifications: IRoomNotifications }) => {}; }; + 'rooms.muteUser': { + POST: (params: { roomId: string; userId: string }) => { + message: { msg: string; result: boolean }; + success: boolean; + }; + }; + 'rooms.unmuteUser': { + POST: (params: { rid: string; userId: string }) => { + message: { msg: string; result: boolean }; + success: boolean; + }; + }; }; export type TRoomsMediaResponse = { diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index 1488fa3dbdf..587c78881f9 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -430,7 +430,6 @@ export const editLivechat = (userData: TParams, roomData: TParams): Promise<{ er return sdk.post('livechat/room.saveInfo', { guestData: userData, roomData }) as any; }; -// change it export const returnLivechat = (rid: string, departmentId?: string): Promise => { const serverVersion = reduxStore.getState().server.version; @@ -467,8 +466,7 @@ export const usersAutoComplete = (selector: any) => // RC 2.4.0 sdk.get('users.autocomplete', { selector }); -// change it -export const getRoutingConfig = (): Promise<{ +export const getRoutingConfig = async (): Promise<{ previewRoom: boolean; showConnecting: boolean; showQueue: boolean; @@ -476,9 +474,18 @@ export const getRoutingConfig = (): Promise<{ returnQueue: boolean; enableTriggerAction: boolean; autoAssignAgent: boolean; -}> => +}> => { + const serverVersion = reduxStore.getState().server.version; + if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '7.11.0')) { + const result = await sdk.get('livechat/config/routing'); + if (result.success) { + return result.config; + } + } + // RC 2.0.0 - sdk.methodCallWrapper('livechat:getRoutingConfig'); + return sdk.methodCallWrapper('livechat:getRoutingConfig'); +}; export const getTagsList = (): Promise => // RC 2.0.0 @@ -522,12 +529,27 @@ export const deleteRoom = (roomId: string, t: RoomTypes) => // RC 0.49.0 sdk.post(`${roomTypeToApiType(t)}.delete`, { roomId }); -// change it export const toggleMuteUserInRoom = ( rid: string, username: string, + userId: string, mute: boolean ): Promise<{ message: { msg: string; result: boolean }; success: boolean }> => { + const serverVersion = reduxStore.getState().server.version; + if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '6.8.0')) { + if (mute) { + return sdk.post('rooms.muteUser', { roomId: rid, userId }) as Promise<{ + message: { msg: string; result: boolean }; + success: boolean; + }>; + } + + return sdk.post('rooms.unmuteUser', { rid, userId }) as Promise<{ + message: { msg: string; result: boolean }; + success: boolean; + }>; + } + if (mute) { // RC 0.51.0 return sdk.methodCallWrapper('muteUserInRoom', { rid, username }); @@ -666,7 +688,6 @@ export const getSingleMessage = (msgId: string) => // RC 0.47.0 sdk.get('chat.getMessage', { msgId }); -// change it export const getRoomRoles = ( roomId: string, type: SubscriptionType.CHANNEL | SubscriptionType.GROUP | SubscriptionType.OMNICHANNEL diff --git a/app/views/RoomMembersView/helpers.ts b/app/views/RoomMembersView/helpers.ts index 3f8b5aa072d..65fc33fd87c 100644 --- a/app/views/RoomMembersView/helpers.ts +++ b/app/views/RoomMembersView/helpers.ts @@ -49,7 +49,7 @@ export const fetchRoomMembersRoles = async (roomType: TRoomType, rid: string, up export const handleMute = async (user: TUserModel, rid: string) => { try { - await toggleMuteUserInRoom(rid, user?.username, !user.muted); + await toggleMuteUserInRoom(rid, user?.username, user.id, !user.muted); EventEmitter.emit(LISTENER, { message: I18n.t('User_has_been_key', { key: user?.muted ? I18n.t('unmuted') : I18n.t('muted') }) }); From c32ee773d436482ec44112745a56ae42189e1073 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 14:45:24 -0300 Subject: [PATCH 04/11] chore: code improvements --- app/ee/omnichannel/lib/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/ee/omnichannel/lib/index.ts b/app/ee/omnichannel/lib/index.ts index e117fb1ef85..6b80b9da353 100644 --- a/app/ee/omnichannel/lib/index.ts +++ b/app/ee/omnichannel/lib/index.ts @@ -20,7 +20,6 @@ export const getInquiriesQueued = (serverVersion: string) => { // this inquiry is added to the db by the subscriptions stream // and will be removed by the queue stream // RC 2.4.0 - export const takeInquiry = (inquiryId: string, serverVersion: string) => { if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '7.11.0')) { return sdk.methodCallWrapper('livechat:takeInquiry', inquiryId); From a9c4d371f3a2e441029057854e34acfc2c54c5a2 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 14:47:13 -0300 Subject: [PATCH 05/11] fix: lint --- app/lib/services/restApi.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index 587c78881f9..60cd084dc44 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -441,6 +441,8 @@ export const returnLivechat = (rid: string, departmentId?: string): Promise return sdk.methodCallWrapper('livechat:returnAsInquiry', rid); }; +export const onHoldLivechat = (roomId: string) => sdk.post('livechat/room.onHold', { roomId }); + export const forwardLivechat = (transferData: any) => // RC 0.36.0 sdk.methodCallWrapper('livechat:transfer', transferData); From 37a8101c758ad26d9e79742c13a2f10ed7c7cb3a Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 14:59:17 -0300 Subject: [PATCH 06/11] fix: type --- app/definitions/rest/v1/rooms.ts | 2 -- app/lib/services/restApi.ts | 17 +++-------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/app/definitions/rest/v1/rooms.ts b/app/definitions/rest/v1/rooms.ts index 31716b6f588..2da03ec4539 100644 --- a/app/definitions/rest/v1/rooms.ts +++ b/app/definitions/rest/v1/rooms.ts @@ -46,13 +46,11 @@ export type RoomsEndpoints = { }; 'rooms.muteUser': { POST: (params: { roomId: string; userId: string }) => { - message: { msg: string; result: boolean }; success: boolean; }; }; 'rooms.unmuteUser': { POST: (params: { rid: string; userId: string }) => { - message: { msg: string; result: boolean }; success: boolean; }; }; diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index 60cd084dc44..0470765b23c 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -531,25 +531,14 @@ export const deleteRoom = (roomId: string, t: RoomTypes) => // RC 0.49.0 sdk.post(`${roomTypeToApiType(t)}.delete`, { roomId }); -export const toggleMuteUserInRoom = ( - rid: string, - username: string, - userId: string, - mute: boolean -): Promise<{ message: { msg: string; result: boolean }; success: boolean }> => { +export const toggleMuteUserInRoom = (rid: string, username: string, userId: string, mute: boolean) => { const serverVersion = reduxStore.getState().server.version; if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '6.8.0')) { if (mute) { - return sdk.post('rooms.muteUser', { roomId: rid, userId }) as Promise<{ - message: { msg: string; result: boolean }; - success: boolean; - }>; + return sdk.post('rooms.muteUser', { roomId: rid, userId }); } - return sdk.post('rooms.unmuteUser', { rid, userId }) as Promise<{ - message: { msg: string; result: boolean }; - success: boolean; - }>; + return sdk.post('rooms.unmuteUser', { rid, userId }); } if (mute) { From 580c3074fe3ef36cd703becdb4deac03870fd069 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 15:02:19 -0300 Subject: [PATCH 07/11] chore: code improvements --- app/lib/services/restApi.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index 0470765b23c..97d2d82b0bd 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -541,6 +541,7 @@ export const toggleMuteUserInRoom = (rid: string, username: string, userId: stri return sdk.post('rooms.unmuteUser', { rid, userId }); } + // Methods removed in RC 8.0.0 if (mute) { // RC 0.51.0 return sdk.methodCallWrapper('muteUserInRoom', { rid, username }); From 333057cf6c3e188c73f310b03e1f9c7780daf3b0 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 15:03:44 -0300 Subject: [PATCH 08/11] chore: code improvements --- app/ee/omnichannel/lib/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/ee/omnichannel/lib/index.ts b/app/ee/omnichannel/lib/index.ts index 6b80b9da353..3b81d091be4 100644 --- a/app/ee/omnichannel/lib/index.ts +++ b/app/ee/omnichannel/lib/index.ts @@ -22,10 +22,10 @@ export const getInquiriesQueued = (serverVersion: string) => { // RC 2.4.0 export const takeInquiry = (inquiryId: string, serverVersion: string) => { if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '7.11.0')) { - return sdk.methodCallWrapper('livechat:takeInquiry', inquiryId); + return sdk.post('livechat/inquiries.take', { inquiryId }); } // Method removed in 8.0.0 - return sdk.post('livechat/inquiries.take', { inquiryId }); + return sdk.methodCallWrapper('livechat:takeInquiry', inquiryId); }; // RC 4.26 From 8630d3dda21935bca18fe159867b44f76c690694 Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 17:54:00 -0300 Subject: [PATCH 09/11] code improvements --- app/lib/services/restApi.ts | 13 ++----------- app/views/RoomMembersView/helpers.ts | 3 ++- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index 97d2d82b0bd..31b195cb8c9 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -534,20 +534,11 @@ export const deleteRoom = (roomId: string, t: RoomTypes) => export const toggleMuteUserInRoom = (rid: string, username: string, userId: string, mute: boolean) => { const serverVersion = reduxStore.getState().server.version; if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '6.8.0')) { - if (mute) { - return sdk.post('rooms.muteUser', { roomId: rid, userId }); - } - - return sdk.post('rooms.unmuteUser', { rid, userId }); + return sdk.post(mute ? 'rooms.muteUser' : 'rooms.unmuteUser', { roomId: rid, userId }); } - // Methods removed in RC 8.0.0 - if (mute) { - // RC 0.51.0 - return sdk.methodCallWrapper('muteUserInRoom', { rid, username }); - } // RC 0.51.0 - return sdk.methodCallWrapper('unmuteUserInRoom', { rid, username }); + return sdk.methodCallWrapper(mute ? 'muteUserInRoom' : 'unmuteUserInRoom', { rid, username }); }; export const toggleRoomOwner = ({ diff --git a/app/views/RoomMembersView/helpers.ts b/app/views/RoomMembersView/helpers.ts index 65fc33fd87c..bfb3a1f9429 100644 --- a/app/views/RoomMembersView/helpers.ts +++ b/app/views/RoomMembersView/helpers.ts @@ -49,11 +49,12 @@ export const fetchRoomMembersRoles = async (roomType: TRoomType, rid: string, up export const handleMute = async (user: TUserModel, rid: string) => { try { - await toggleMuteUserInRoom(rid, user?.username, user.id, !user.muted); + await toggleMuteUserInRoom(rid, user?.username, user?._id, !user.muted); EventEmitter.emit(LISTENER, { message: I18n.t('User_has_been_key', { key: user?.muted ? I18n.t('unmuted') : I18n.t('muted') }) }); } catch (e) { + console.log('e', e); log(e); } }; From b997a64731e944f6da5bf27e6fe9c6d5f4950bde Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 18:29:32 -0300 Subject: [PATCH 10/11] remove logs --- app/views/RoomMembersView/helpers.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/views/RoomMembersView/helpers.ts b/app/views/RoomMembersView/helpers.ts index bfb3a1f9429..df6f27ababd 100644 --- a/app/views/RoomMembersView/helpers.ts +++ b/app/views/RoomMembersView/helpers.ts @@ -54,7 +54,6 @@ export const handleMute = async (user: TUserModel, rid: string) => { message: I18n.t('User_has_been_key', { key: user?.muted ? I18n.t('unmuted') : I18n.t('muted') }) }); } catch (e) { - console.log('e', e); log(e); } }; From cd739b75e4c64281cad2643728c6400db7430aef Mon Sep 17 00:00:00 2001 From: OtavioStasiak Date: Mon, 15 Dec 2025 18:31:49 -0300 Subject: [PATCH 11/11] code improvements --- app/lib/services/restApi.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index 31b195cb8c9..6cb05cc5ab1 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -536,7 +536,6 @@ export const toggleMuteUserInRoom = (rid: string, username: string, userId: stri if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '6.8.0')) { return sdk.post(mute ? 'rooms.muteUser' : 'rooms.unmuteUser', { roomId: rid, userId }); } - // RC 0.51.0 return sdk.methodCallWrapper(mute ? 'muteUserInRoom' : 'unmuteUserInRoom', { rid, username }); };