// import * as SphinxBot from '../../../sphinx-bot' import * as Sphinx from 'sphinx-bot' import { finalAction } from '../controllers/actions' 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', // btc:'BitcoinBot', 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.split(' ') if (arr.length < 2) return if (arr[0]!=='/bot') return const cmd = arr[1] 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('=> FOUDN BOT', bot) // send msg to bot owner // await models.ChatBot.create(chatBot) } 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: '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 } }