From e822452304d6258cc454380f319567caea42d161 Mon Sep 17 00:00:00 2001 From: Evan Feenstra Date: Fri, 11 Sep 2020 16:19:29 -0700 Subject: [PATCH] bot server search and find by unique name for install --- api/bots/mother.ts | 73 +++++++++++++++++++++++++++++++++-- dist/api/bots/mother.js | 76 +++++++++++++++++++++++++++++++++++-- dist/api/bots/mother.js.map | 2 +- 3 files changed, 143 insertions(+), 8 deletions(-) diff --git a/api/bots/mother.ts b/api/bots/mother.ts index 3c5bda1..334c3f7 100644 --- a/api/bots/mother.ts +++ b/api/bots/mother.ts @@ -6,9 +6,12 @@ import * as WelcomeBot from './welcome' import * as BitcoinBot from './btc' 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', 'btc', 'loopout' @@ -42,12 +45,22 @@ export function init() { 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 ] @@ -74,12 +87,42 @@ export function init() { .setDescription(theName+' has been installed!') message.channel.send({ embed }) } else { - // message.reply('No built-in bot by that name') + 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 bot with that name') - message.channel.send({ embed }) + .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: @@ -98,4 +141,26 @@ export function init() { const botSVG = ` -` \ No newline at end of file +` + +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_pub_key) { + return j + } + return null + } catch(e) { + return null + } +} \ No newline at end of file diff --git a/dist/api/bots/mother.js b/dist/api/bots/mother.js index 21b720a..d183421 100644 --- a/dist/api/bots/mother.js +++ b/dist/api/bots/mother.js @@ -17,8 +17,11 @@ const WelcomeBot = require("./welcome"); const BitcoinBot = require("./btc"); const LoopBot = require("./loop"); const models_1 = require("../models"); +const node_fetch_1 = require("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', 'btc', 'loopout' ]; @@ -55,6 +58,15 @@ function init() { } }); if (!chat) return; + const existing = yield models_1.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 ]; @@ -82,12 +94,43 @@ function init() { message.channel.send({ embed }); } else { - // message.reply('No built-in bot by that name') + const bot = yield 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 = yield searchBots(query); + if (bots.length === 0) { const embed = new Sphinx.MessageEmbed() .setAuthor('MotherBot') - .setDescription('No bot with that name'); - message.channel.send({ embed }); + .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() @@ -106,4 +149,31 @@ exports.init = init; const botSVG = ` `; +function searchBots(q) { + return __awaiter(this, void 0, void 0, function* () { + try { + const r = yield node_fetch_1.default(`https://${config.tribes_host}/search/bots/${q}`); + const j = yield r.json(); + return Array.isArray(j) ? j : []; + } + catch (e) { + return []; + } + }); +} +function getBotByName(name) { + return __awaiter(this, void 0, void 0, function* () { + try { + const r = yield node_fetch_1.default(`https://${config.tribes_host}/bot/${name}`); + const j = yield r.json(); + if (j && j.uuid && j.owner_pub_key) { + return j; + } + return null; + } + catch (e) { + return null; + } + }); +} //# sourceMappingURL=mother.js.map \ No newline at end of file diff --git a/dist/api/bots/mother.js.map b/dist/api/bots/mother.js.map index e3a9d8f..58b4d53 100644 --- a/dist/api/bots/mother.js.map +++ b/dist/api/bots/mother.js.map @@ -1 +1 @@ -{"version":3,"file":"mother.js","sourceRoot":"","sources":["../../../api/bots/mother.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"mother.js","sourceRoot":"","sources":["../../../api/bots/mother.ts"],"names":[],"mappings":"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"} \ No newline at end of file