ringcentral-personal-chatbot
Version:
RingCentral personal chatbot framework
149 lines (123 loc) • 4.6 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _get2 = _interopRequireDefault(require("lodash/get"));
var _ringcentral = require("../models/ringcentral");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function buildBotInfo(conf) {
const skillsInfo = conf.skills.reduce((prev, s) => {
let name = s.name || 'skill No name';
name = s.homepage ? `[${name}](${s.homepage})` : name;
return prev + `* **${name}**: ${s.description || 'no description'}\n`;
}, '');
let cn = conf.name;
cn = conf.homepage ? `[${cn}](${conf.homepage})` : cn;
return `Hi, this is my AI assistant: **${cn}**, here to help with common questions and requests.
${skillsInfo ? '**Skills:**\n' + skillsInfo : ''}`;
}
var _default = async (message, conf) => {
const {
text
} = message.body;
if (!text) {
return; // not a text message
}
const {
ownerId
} = message;
const {
creatorId
} = message.body;
const isTalkToSelf = ownerId === creatorId && text.startsWith('#me ');
if (ownerId === creatorId && !isTalkToSelf) {
return; // bot should not talk to itself to avoid dead-loop conversation
}
const {
groupId
} = message.body;
const {
user
} = conf;
const group = await user.getGroup(groupId);
const isPrivateChat = group.members.length <= 2;
const isNotMentioned = !message.body.mentions || !message.body.mentions.some(m => m.type === 'Person' && m.id === ownerId);
const replyWithoutMentionInTeam = (0, _get2.default)(user, 'data.replyWithoutMentionInTeam');
if (!isPrivateChat && !isTalkToSelf && !replyWithoutMentionInTeam && isNotMentioned) {
// only respond to mentioned chat in group chat or private chat
return;
}
const now = Date.now();
const pausegUntil = user && user.data && user.data[`pauseUntil_${groupId}`] ? user.data[`pauseUntil_${groupId}`] : 0;
const regex = new RegExp(`!\\[:Person\\]\\(${user.id}\\)`);
const textFiltered = text.replace(regex, ' ').replace(/^#me /, '').trim();
if (pausegUntil && pausegUntil > now && textFiltered !== 'resume') {
return;
}
const pauseReg = /^pause( +[0-9]+m)?$/;
const max = 60;
const defaultMin = 5;
if (textFiltered === '__test__' || textFiltered === '__help__') {
await user.sendMessage(groupId, {
text: buildBotInfo(conf)
});
} else if (textFiltered === 'resume') {
const dt = _objectSpread({}, user.data);
Object.keys(dt).forEach(k => {
if (k.startsWith('pauseUntil')) {
delete dt[k];
}
});
dt.pauseUntil = 0;
await _ringcentral.User.update({
data: dt
}, {
where: {
id: user.id
}
});
await user.sendMessage(groupId, {
text: 'Bot resume'
});
} else if (pauseReg.test(textFiltered)) {
let t = textFiltered.match(pauseReg)[1];
if (!t) {
t = 5;
} else {
t = parseInt(t.trim().replace(/m/, ''), 10);
}
if (t > max) {
t = max;
} else if (!t) {
t = defaultMin;
}
const pauseUntil = t * 60 * 1000 + new Date().getTime();
const up = _objectSpread({}, user.data);
up[`pauseUntil_${groupId}`] = pauseUntil;
await _ringcentral.User.update({
data: up
}, {
where: {
id: user.id
}
});
await user.sendMessage(groupId, {
text: `Bot pause for ${t} minutes`
});
}
return {
creatorId,
text,
textFiltered,
isTalkToSelf,
isPrivateChat,
group,
user,
shouldUseSignature: conf.shouldUseSignature
};
};
exports.default = _default;