// import * as SphinxBot from '../../../sphinx-bot' import * as Sphinx from 'sphinx-bot' import { finalAction } from '../controllers/actions' import { installBotAsTribeAdmin } from '../controllers/bots' import * as path from 'path' import * as WelcomeBot from './welcome' import * as LoopBot from './loop' import { models } from '../models' import fetch from 'node-fetch' const msg_types = Sphinx.MSG_TYPE const env = process.env.NODE_ENV || 'development' const constants = require(path.join(__dirname, '../../config/constants.json')) const config = require(path.join(__dirname, '../../config/app.json'))[env] const builtinBots = [ 'welcome', 'loopout' ] const builtInBotMsgTypes = { 'welcome': [ constants.message_types.message, constants.message_types.group_join ], } const builtInBotNames = { welcome: 'WelcomeBot', loopout: 'LoopBot', } export function init() { const client = new Sphinx.Client() client.login('_', finalAction) client.on(msg_types.MESSAGE, async (message: Sphinx.Message) => { const arr = (message.content && message.content.split(' ')) || [] if (arr.length < 2) return if (arr[0] !== '/bot') return const cmd = arr[1] const isAdmin = message.member.roles.find(role => role.name === 'Admin') if(!isAdmin) return switch (cmd) { case 'install': if (arr.length < 3) return const botName = arr[2] if (builtinBots.includes(botName)) { console.log("INSTALL", botName) const chat = await models.Chat.findOne({ where: { uuid: message.channel.id } }) if (!chat) return const existing = await models.ChatBot.findOne({ where: { chatId: chat.id, botPrefix: '/' + botName, } }) if (existing) { const embed = new Sphinx.MessageEmbed() .setAuthor('MotherBot') .setDescription(botName + ' already installed') return message.channel.send({ embed }) } const msgTypes = builtInBotMsgTypes[botName] || [ constants.message_types.message ] const chatBot = { chatId: chat.id, botPrefix: '/' + botName, botType: constants.bot_types.builtin, msgTypes: JSON.stringify(msgTypes), pricePerUse: 0, } await models.ChatBot.create(chatBot) if (botName === 'welcome') { WelcomeBot.init() } if (botName === 'loopout') { LoopBot.init() } const theName = builtInBotNames[botName] || 'Bot' const embed = new Sphinx.MessageEmbed() .setAuthor('MotherBot') .setDescription(theName + ' has been installed!') message.channel.send({ embed }) } else { const bot = await getBotByName(botName) if (bot && bot.uuid) { console.log('=> FOUND BOT', bot.unique_name) const chat = await models.Chat.findOne({ where: { uuid: message.channel.id } }) if (!chat) return installBotAsTribeAdmin(chat.dataValues, bot) } else { const embed = new Sphinx.MessageEmbed() .setAuthor('MotherBot') .setDescription('No bot with that name') message.channel.send({ embed }) } } return true case 'search': if (arr.length < 2) return const query = arr[2] const bots = await searchBots(query) if (bots.length === 0) { const embed = new Sphinx.MessageEmbed() .setAuthor('MotherBot') .setDescription('No bots found') return message.channel.send({ embed }) } const embed3 = new Sphinx.MessageEmbed() .setAuthor('MotherBot') .setTitle('Bots:') .addFields(bots.map(b => { const maxLength = 35 const value = b.description.length > maxLength ? b.description.substr(0, maxLength) + '...' : b.description return ({ name: b.unique_name, value }) })) .setThumbnail(botSVG) message.channel.send({ embed: embed3 }) return true default: const embed = new Sphinx.MessageEmbed() .setAuthor('MotherBot') .setTitle('Bot Commands:') .addFields([ { name: 'Install a new bot', value: '/bot install {BOTNAME}' }, { name: 'Search for bots', value: '/bot search {SEARCH_TERM}' }, { name: 'Help', value: '/bot help' } ]) .setThumbnail(botSVG) message.channel.send({ embed }) } }) } const botSVG = ` ` async function searchBots(q: string) { try { const r = await fetch(`https://${config.tribes_host}/search/bots/${q}`) const j = await r.json() return Array.isArray(j) ? j : [] } catch (e) { return [] } } async function getBotByName(name: string) { try { const r = await fetch(`https://${config.tribes_host}/bot/${name}`) const j = await r.json() if (j && j.uuid && j.owner_pubkey) { return j } return null } catch (e) { return null } }