-
Notifications
You must be signed in to change notification settings - Fork 16
/
mentions.js
112 lines (100 loc) · 2.97 KB
/
mentions.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
const { getOnCallPerson } = require('rosters');
const { addSlackExtension, addTeamsExtension } = require('../helpers/extension.helper');
const { HOOK, STATUS } = require('../helpers/constants');
function run({ target, extension, payload, root_payload }) {
if (target.name === 'teams') {
extension.inputs = Object.assign({}, default_inputs_teams, extension.inputs);
attachForTeam({ extension, payload });
} else if (target.name === 'slack') {
extension.inputs = Object.assign({}, default_inputs_slack, extension.inputs);
attachForSlack({ extension, payload });
} else if (target.name === 'chat') {
extension.inputs = Object.assign({}, default_inputs_chat, extension.inputs);
attachForChat({ extension, root_payload });
}
}
function attachForTeam({ extension, payload }) {
const users = getUsers(extension);
if (users.length > 0) {
setPayloadWithMSTeamsEntities(payload);
const users_ats = users.map(user => `<at>${user.name}</at>`);
addTeamsExtension({ payload, extension, text: users_ats.join(' | ')});
for (const user of users) {
payload.msteams.entities.push({
"type": "mention",
"text": `<at>${user.name}</at>`,
"mentioned": {
"id": user.teams_upn,
"name": user.name
}
});
}
}
}
function formatSlackMentions({slack_uid, slack_gid}) {
if (slack_gid && slack_uid) {
throw new Error(`Error in slack extension configuration. Either slack user or group Id is allowed`);
}
if (slack_uid) {
return `<@${slack_uid}>`
}
const tagPrefix = ["here", "everyone", "channel"].includes(slack_gid.toLowerCase()) ? "" : "subteam^";
return `<!${tagPrefix}${slack_gid}>`
}
function attachForSlack({ extension, payload }) {
const users = getUsers(extension);
const user_ids = users.map(formatSlackMentions);
if (users.length > 0) {
addSlackExtension({ payload, extension, text: user_ids.join(' | ') });
}
}
function attachForChat({ extension, root_payload }) {
const users = getUsers(extension);
const user_ids = users.map(user => `<users/${user.chat_uid}>`);
if (users.length > 0) {
root_payload.text = user_ids.join(' | ');
}
}
function getUsers(extension) {
const users = [];
if (extension.inputs.users) {
users.push(...extension.inputs.users);
}
if (extension.inputs.schedule) {
const user = getOnCallPerson(extension.inputs.schedule);
if (user) {
users.push(user);
} else {
// TODO: warn message for no on-call person
}
}
return users;
}
function setPayloadWithMSTeamsEntities(payload) {
if (!payload.msteams) {
payload.msteams = {};
}
if (!payload.msteams.entities) {
payload.msteams.entities = [];
}
}
const default_options = {
hook: HOOK.END,
condition: STATUS.FAIL
}
const default_inputs_teams = {
title: '',
separator: true
}
const default_inputs_slack = {
title: '',
separator: false
}
const default_inputs_chat = {
title: '',
separator: true
}
module.exports = {
run,
default_options
}