* fixing duplicated message issue

* assign unique ID for activity.id

* remove extra logging

* remove activity id before egress

Co-authored-by: Erli Suo <ersuo@microsoft.com>
This commit is contained in:
earliest 2020-06-23 19:08:28 -07:00 коммит произвёл GitHub
Родитель 2af18bda22
Коммит 9a88673d8c
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
7 изменённых файлов: 21 добавлений и 21 удалений

Просмотреть файл

@ -96,8 +96,7 @@ export default function exportDLJSInterface<TAdapterState extends AdapterState>(
{
progress: ({ id }: { id?: string }) => id && observer.next(id)
});
await adapter.ingress({...activity, id: uniqueId()});
//await adapter.ingress({...activity, id: uniqueId()}); //No need to call ingress as IC3 is providing echo back. If we need this for DL, a new class for IC3 should be created
observer.complete();
})();
});

Просмотреть файл

@ -5,8 +5,6 @@ import { IC3AdapterState, StateKey } from '../../../types/ic3/IC3AdapterState';
import { ActivityType } from '../../../types/DirectLineTypes';
import { EgressMiddleware } from '../../../applyEgressMiddleware';
import { IC3DirectLineActivity } from '../../../types/ic3/IC3DirectLineActivity';
import { sendingActivityMap } from '../../utils/helper'
import uniqueId from '../../utils/uniqueId';
export default function createEgressMessageActivityMiddleware(): EgressMiddleware<
IC3DirectLineActivity,
@ -16,8 +14,6 @@ export default function createEgressMessageActivityMiddleware(): EgressMiddlewar
if (activity.type !== ActivityType.Message) {
return next(activity);
}
activity.text = activity.text;
activity.id = uniqueId(); //added unique id:
const conversation: Microsoft.CRM.Omnichannel.IC3Client.Model.IConversation = getState(StateKey.Conversation);
@ -28,6 +24,8 @@ export default function createEgressMessageActivityMiddleware(): EgressMiddlewar
const { channelData, from, text, timestamp, value } = activity;
const deliveryMode = channelData.deliveryMode || Microsoft.CRM.Omnichannel.IC3Client.Model.DeliveryMode.Bridged;
let uniqueClientMessageId = Date.now().toString();
(activity as any).clientmessageid = uniqueClientMessageId;
// If the text is null, we check if the value object is available.
// Assign text to be the value string.
// If text is still falsy, we set to empty string to avoid breaking IC3 SDK.
@ -49,7 +47,11 @@ export default function createEgressMessageActivityMiddleware(): EgressMiddlewar
tags: channelData.tags,
clientmessageid: uniqueClientMessageId
};
sendingActivityMap.set(uniqueClientMessageId, activity);
// attach client activity id tag
if(activity.channelData && activity.channelData.clientActivityID){
message.tags.push("client_activity_id:" + activity.channelData.clientActivityID);
}
if (channelData.uploadedFileMetadata) {
await conversation.sendFileMessage(

Просмотреть файл

@ -1,8 +1,9 @@
/// <reference path="../../../types/ic3/external/Model.d.ts" />
import { IC3AdapterState, StateKey } from '../../../types/ic3/IC3AdapterState';
import { ActivityType } from '../../../types/DirectLineTypes';
import { EgressMiddleware } from '../../../applyEgressMiddleware';
import { IC3AdapterState, StateKey } from '../../../types/ic3/IC3AdapterState';
import { IC3DirectLineActivity } from '../../../types/ic3/IC3DirectLineActivity';
import { MessageTag } from '../../../types/ic3/MessageTag';

Просмотреть файл

@ -20,13 +20,15 @@ export default function createPatchFromRoleAndNameMiddleware(): IngressMiddlewar
// TODO: Why use "id.includes" instead of string equal?
const patchedRole = role === Role.Channel ? role : id.includes(userId) ? Role.User : Role.Bot;
return next({
//Taking out for easier debugging
let patchedActivity = {
...activity,
from: {
id,
role: patchedRole,
name: (patchedRole === Role.User && getState(StateKey.UserDisplayName)) || name
}
});
}
return next(patchedActivity);
};
}

Просмотреть файл

@ -85,13 +85,19 @@ export default function createUserMessageToDirectLineActivityMapper({
id,
name
},
id: uniqueId(),
id: message.clientmessageid ? message.clientmessageid : uniqueId(),
suggestedActions,
text: content,
timestamp: timestamp.toISOString(),
type: ActivityType.Message
};
if(message.tags){
let clientActivityTags = message.tags.filter(tag => tag.indexOf("client_activity_id:") !== -1);
if(clientActivityTags[0]){
activity.channelData.clientActivityID = clientActivityTags[0].replace("client_activity_id:", "");
}
}
return activity;
};
}

Просмотреть файл

@ -11,7 +11,6 @@ import { compose } from 'redux';
import createThreadToDirectLineActivityMapper from './mappers/createThreadToDirectLineActivityMapper';
import createTypingMessageToDirectLineActivityMapper from './mappers/createTypingMessageToDirectLineActivityMapper';
import createUserMessageToDirectLineActivityMapper from './mappers/createUserMessageToDirectLineActivityMapper';
import { sendingActivityMap } from '../../utils/helper';
export default function createSubscribeNewMessageAndThreadUpdateEnhancer(): AdapterEnhancer<
IC3DirectLineActivity,
@ -46,13 +45,6 @@ export default function createSubscribeNewMessageAndThreadUpdateEnhancer(): Adap
conversation.registerOnNewMessage(async message => {
let activity: any = await convertMessage(message);
if(activity && sendingActivityMap.get(message.clientmessageid)){
activity = sendingActivityMap.get(message.clientmessageid);
if(message.timestamp){
activity.timestamp = message.timestamp.toISOString();
}
sendingActivityMap.delete(message.clientmessageid);
}
!unsubscribed && next(activity);
});

Просмотреть файл

@ -1,2 +0,0 @@
export const sendingActivityMap = new Map<string, any>(); //add clean logic when go over the size