Name
sn_oe_sfs.SidebarTeamsCustomTransformer
Description
SidebarTeamsCustomTransformer is used for transforming sidebar conversation message to the Teams message format.
Script
var SidebarTeamsCustomTransformer = Class.create();
SidebarTeamsCustomTransformer.prototype = {
initialize: function() {
},
_getCollabUserSender: function(sender) {
var gr = new GlideRecord("sys_cs_collab_provider_user_profile");
gr.addQuery("external_user_id", sender);
gr.query();
if (!gr.next()) {
return null;
}
return gr.getValue("collab_user");
},
transformOutboundMessage: function(collabMessage) {
var collabChatId = collabMessage.collabChatId;
var payload = collabMessage.payload;
var messageType = collabMessage.messageType;
switch (messageType) {
case 'text':
return {
content_type: "text",
content: payload,
collab_chat_id: collabChatId,
attachments: []
};
case 'rich':
var parsedPayload = JSON.parse(payload);
if(parsedPayload.uiType == "MultiAttachmentsControl")
return {
content_type: "html",
content: parsedPayload.uiMetadata.message,
collab_chat_id: collabChatId,
attachments: parsedPayload.uiMetadata.attachments
};
break;
default:
break;
}
return {};
},
transformInboundMessage: function(teamsMessage, teamsChangeType) {
var chatInboundMessage = {};
chatInboundMessage.externalChatId = teamsMessage.chatId;
chatInboundMessage.externalMessageId = teamsMessage.id;
chatInboundMessage.messageType = teamsMessage.messageType;
chatInboundMessage.createdDateTime = teamsMessage.createdDateTime;
chatInboundMessage.lastModifiedDateTime = teamsMessage.lastModifiedDateTime;
chatInboundMessage.lastEditedDateTime = teamsMessage.lastEditedDateTime;
chatInboundMessage.deletedDateTime = teamsMessage.deletedDateTime;
var fromUser = teamsMessage.from;
if (!fromUser || !fromUser.user || !fromUser.user.id) {
gs.error("The message sender info is empty");
return null;
}
//fromUser.user.id is external user id from sys_cs_collab_provider_user_profile
chatInboundMessage.externalSenderId = fromUser.user.id;
chatInboundMessage.userIdentityType = fromUser.user.userIdentityType;
var body = teamsMessage.body;
if (!body || (!body.content && teamsChangeType !== "deleted")) {
gs.error("The message body is empty");
return null;
}
chatInboundMessage.contentType = body.contentType;
if (teamsChangeType === "deleted") {
chatInboundMessage.content = "";
} else {
if (body.contentType === 'text') {
chatInboundMessage.content = body.content;
} else if (body.contentType === 'html') {
//if message contains emoji, it should have itemtype="http://schema.skype.com/Emoji, use the alt value for emoji
var emojiContent = body.content.replace(/<emoji.*?alt="(.*?)"[^>]+>/g, '$1');
if (!emojiContent) {
gs.debug("Message is empty after replace MS emoji with alt value");
return null;
}
//remove all html tags from the content,
var contentWithoutTag = emojiContent.replace(/<[^>]*>?/g, '');
// Append attachment URL to the content
teamsMessage.attachments.forEach(function (attachment) {
var urlWithSpace = attachment.contentUrl.replace(/[()[\] ]/g, function(c) {return '%' + c.charCodeAt(0).toString(16);});
contentWithoutTag = contentWithoutTag + " " + urlWithSpace;
});
if (!contentWithoutTag) {
gs.debug("Message is empty after remove all html tags");
return null;
}
// unescape the message. e.g. <h1>hello</h1> will be converted to <p>hello</p>
var content = GlideStringUtil.unEscapeHTML(contentWithoutTag);
if (!content) {
gs.error("Message content is empty");
return null;
}
chatInboundMessage.content = content;
} else {
gs.error("Message content type is not supported " + body.contentType);
return null;
}
}
//get collab user:
chatInboundMessage.collabChatSender = this._getCollabUserSender(chatInboundMessage.externalSenderId);
if (!chatInboundMessage.collabChatSender) {
gs.error("No such collab user " + sender);
return null;
}
return chatInboundMessage;
},
transformInboundMember: function(teamsMember) {
var chatInboundMember = {};
chatInboundMember.externalUserId = teamsMember.userId;
chatInboundMember.email = teamsMember.email;
chatInboundMember.tenantId = teamsMember.tenantId;
chatInboundMember.id = teamsMember.id;
chatInboundMember.roles = teamsMember.roles;
chatInboundMember.displayName = teamsMember.displayName;
chatInboundMember.visibleHistoryStartDateTime = teamsMember.visibleHistoryStartDateTime;
chatInboundMember.user = teamsMember.user;
chatInboundMember.collabUser = this._getCollabUserSender(teamsMember.userId);
return chatInboundMember;
},
type: 'SidebarTeamsCustomTransformer'
};
Sys ID
d3dc4cccc3b911100f24c87af040dd34