UNPKG

ringcentral-personal-chatbot

Version:
149 lines (123 loc) 4.6 kB
"use strict"; 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;