diff --git a/Procfile b/Procfile index 94d75ea..0034fc1 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -worker: node src/bot.js \ No newline at end of file +worker: node src/bot/bot.js \ No newline at end of file diff --git a/package.json b/package.json index 3ed38b4..a99b98d 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Um bot para a comunidade devmode de Campos/RJ", "main": "bot.js", "scripts": { - "dev": "nodemon src/bot.js", + "dev": "nodemon src/bot/bot.js", "lint": "eslint --ignore-path .gitignore .", "lintfix": "eslint --ignore-path .gitignore . --fix", "test": "echo \"Error: no test specified\" && exit 1", diff --git a/src/app.js b/src/app.js index 3eae3d3..77106bb 100644 --- a/src/app.js +++ b/src/app.js @@ -1,2 +1,2 @@ require = require('esm')(module /* , options */); -module.exports = require('./bot.js'); +module.exports = require('./bot/bot.js'); diff --git a/src/bot.js b/src/bot.js deleted file mode 100644 index efdc65d..0000000 --- a/src/bot.js +++ /dev/null @@ -1,231 +0,0 @@ -const path = require('path'); -const Discord = require('discord.js'); -const btcValor = require('btc-value'); -const Commando = require('discord.js-commando'); -const channel_ids = require('./channel_ids.json'); -const botconfig = require('./botconfig.json'); - -require('dotenv').config(); -// Set the API key -btcValor.setApiKey(process.env.BTC_VALUE_API_KEY); - -const { prefixo } = botconfig; - -const bot = new Discord.Client(); -const bot_comando = new Commando.Client({ - commandPrefix: prefixo, - owner: '186519740863217664', -}); - -const devmodeserver_roles = { - // areas - developer: '732607336451014669', - datascientist: '732607450204733621', - devops: '732607609068060753', - infra: '732607758980874290', - uxui: '732613392912613378', - coach: '732608475049230396', - business: '732608526874312754', - gestor: '732608722068701235', - rh: '732608699218002010', - // especialidades - fullstack: '732607560221196340', - mobile: '732610332950003835', - backend: '732607499491868724', - frontend: '732607536934682704', - // linguagens - java: '732607292951887993', - javascript: '732607042304344095', - python: '732607821333659729', - ruby: '732612456014282762', - php: '732612770679226521', - dotnet: '732608002900754483', - sap: '732608366266023957', -}; - -bot.on('ready', async () => { - console.log(`${bot.user.username} is online`); - console.log('Estou pronto!'); - // guild/servidor que o bot está(nesse caso DevMode) - SERVER = bot.guilds.cache.get('475507684024516608'); - // console.log(bot.guilds.cache.get("475507684024516608")); - // Setando a atividade do bot - bot.user - .setActivity('Star Wars', { type: 'WATCHING' }) - .then((presence) => - console.log(`Atividade setada para ${presence.activities[0].name}`) - ) - .catch(console.error); -}); - -// evento em que o bot envia uma mensagem assim que um novo membro é adicionado ao servidor -bot.on('guildMemberAdd', (member) => { - const channel = member.guild.channels.find( - (c) => c.id === '475507684024516610' - ); // ou c.name, nesse nosso caso, GERAL - if (!channel) return; - - channel.send(`Bem vindo a Dev Mode, ${member}! :wave:`); - channel.send( - 'Você pode adicionar roles digitando o comando como no exemplo: `' + - '!addrole' + - ' developer javascript fullstack`' - ); -}); - -// evento ativado quando o bot recebe uma mensagem -bot.on('message', async (message) => { - const mensagemArray = message.content.split(' '); - const comando = mensagemArray[0].toLowerCase(); - // let args = mensagemArray.slice(1); - - const args = message.content.slice(1).trim().split(/ +/g); - const comando_com_arg = args.shift().toLowerCase(); - - // moderar certas mensagens que contem palavras desrespeitosas - const swearWords = ['nigga', 'puta']; - if (swearWords.some((word) => message.content.includes(word))) { - message.reply(`Mais respeito <@${message.author.id}>!!!`); - message.delete().catch((e) => {}); - } - - if (message.author.bot) return; - - // em caso de mensagem privada(direct message) - if (message.channel.type === 'dm') { - // Necessário verificar se o user faz parte da comunidade no discord - if (SERVER.member(message.author.id)) { - // existe um membro do servidor/guild com essa ID - // console.log('esse user faz parte da guild') - // console.log(message.author.id) - // mensagem para quem não é da comunidade e está enviando msg privada pro bot - // TODO: embed richtext com contatos para inserir-se na comunidade - } else { - message.reply( - 'Desculpe, mas você não faz parte da comunidade Dev Mode de Campos :sob:' - ); - } - // fim da Direct Message(DM) - } - - if (comando_com_arg === 'addrole') { - if (args.length > 0) { - for (var i = 0; i < args.length; i++) { - for (var devmode_role in devmodeserver_roles) { - if (devmode_role === args[i].toLowerCase()) { - var server_role = SERVER.roles.cache.find( - (role) => role.id === devmodeserver_roles[devmode_role] - ); - message.member.roles.add(server_role); - } - } - } - message.reply('Roles adicionadas :]'); - } else { - message.reply( - 'Por favor, providencie os argumentos necessários no formato exemplo: `' + - '!addrole' + - ' developer javascript fullstack`' - ); - } - } - - if (comando_com_arg === 'removerole') { - if (args.length > 0) { - for (var i = 0; i < args.length; i++) { - for (var devmode_role in devmodeserver_roles) { - if (devmode_role === args[i].toLowerCase()) { - var server_role = SERVER.roles.cache.find( - (role) => role.id === devmodeserver_roles[devmode_role] - ); - server_role - ? message.member.roles.remove(server_role) - : message.reply( - `<@${message.author.id}> não possui a role ${devmode_role}` - ); - } - } - } - message.reply('Roles removidas :]'); - } else { - message.reply( - 'Por favor, providencie os argumentos necessários no formato exemplo: `' + - '!addrole' + - ' developer javascript fullstack`' - ); - } - } - - if (comando === `${prefixo}ping`) { - // WebSocketManager no client.ws.ping - message.reply( - 'Pong! O ping do bot ao discord é `' + `${bot.ws.ping}` + ' ms`' - ); - message.reply('O trafego é feito do user ao bot e do bot ao discord'); - } - - if (message.content == `${prefixo}btcdia`) { - btcValor().then((value) => { - btcValor.getPercentageChangeLastDay().then((percentage) => { - const perc = percentage; - if (perc > 0) { - message.channel.send(`<@${message.author.id}> - BTC: ${value}$ \nSubiu (ultimo dia): ${perc}% :hugging:`); - } else if (perc < 0) { - message.channel.send(`<@${message.author.id}> - BTC: ${value}$ \nDesceu (ultimo dia): ${perc}% :sob:`); - } else { - message.channel.send(`<@${message.author.id}> - BTC: ${value}$ \nManteve (ultimo dia): ${perc}% :rolling_eyes:`); - } - }); - }); - } - - if (message.content == `${prefixo}btcsemana`) { - btcValor().then((value) => { - btcValor.getPercentageChangeLastWeek().then((percentage) => { - const perc = percentage; - if (perc > 0) { - message.channel.send( - `BTC: ${value}$ \nSubiu (ultima semana): ${perc}% :hugging:` - ); - } else if (perc < 0) { - message.channel.send( - `BTC: ${value}$ \nDesceu (ultima semana): ${perc}% :sob:` - ); - } else { - message.channel.send( - `BTC: ${value}$ \nManteve (ultima semana): ${perc}% :rolling_eyes:` - ); - } - }); - }); - } -}); - -// habilitando framework de comandos -bot_comando.login(process.env.BOT_TOKEN); -bot_comando.registry - // Registers your custom command groups - .registerGroups([ - ['rolardados', 'Rolardados'], - ['procurarvaga', 'Procurarvaga'], - ]) - - // Registra todos os grupos, comandos e tipos de argumentos pré-construidos pelo framework Discord Commando - // .registerDefaults() //cuidado, aqui vai ser utilizado os padrões, os padrões são em ingles e captura qualquer msg como se fosse comandos - /* .registerDefaultCommands({ - help: false, - prefix: false, - ping: false, - eval: false, - unknownCommand: true, - commandState: true - }) */ - - // Aqui registra todos os comandos customizados no diretório ./comandos/ - .registerCommandsIn(path.join(__dirname, 'comandos')); - -// tem que ser assim pra utilizar no Heroku -bot.login(process.env.BOT_TOKEN); diff --git a/src/bot/bot.js b/src/bot/bot.js new file mode 100644 index 0000000..f9cde6e --- /dev/null +++ b/src/bot/bot.js @@ -0,0 +1,60 @@ +const path = require('path'); +const Discord = require('discord.js'); +const btcValor = require('btc-value'); +const Commando = require('discord.js-commando'); + +const botconfig = require('./schemas/botconfig.json'); + +const { prefixo } = botconfig; + +const result = require('dotenv').config(); + +//verificar se existe erros no env +if (result.error) { + throw result.error; +} + +// Set the API key +btcValor.setApiKey(process.env.BTC_VALUE_API_KEY); + +const bot = new Discord.Client(); +const bot_comando = new Commando.Client({ + commandPrefix: prefixo, + owner: '186519740863217664', +}); + +const bot_controller = require('./bot_actions')(bot, btcValor); + +bot.on('ready', bot_controller.onReady); + +// evento em que o bot envia uma mensagem assim que um novo membro é adicionado ao servidor +bot.on('guildMemberAdd', bot_controller.onMemberAdd); + +// evento ativado quando o bot recebe uma mensagem +bot.on('message', bot_controller.onMessage); + +// habilitando framework de comandos +bot_comando.login(process.env.BOT_TOKEN); + +bot_comando.registry + // Registers your custom command groups + .registerGroups([ + ['rolardados', 'Rolardados'], + ['procurarvaga', 'Procurarvaga'], + ]) + // Registra todos os grupos, comandos e tipos de argumentos pré-construidos pelo framework Discord Commando + // .registerDefaults() //cuidado, aqui vai ser utilizado os padrões, os padrões são em ingles e captura qualquer msg como se fosse comandos + /* .registerDefaultCommands({ + help: false, + prefix: false, + ping: false, + eval: false, + unknownCommand: true, + commandState: true + }) */ + + // Aqui registra todos os comandos customizados no diretório ./comandos/ + .registerCommandsIn(path.join(__dirname, 'comandos')); + +// tem que ser assim pra utilizar no Heroku +bot.login(process.env.BOT_TOKEN); diff --git a/src/bot/bot_actions.js b/src/bot/bot_actions.js new file mode 100644 index 0000000..03de50f --- /dev/null +++ b/src/bot/bot_actions.js @@ -0,0 +1,176 @@ +var SERVER = null; +const GUILD_SERVIDOR = '475507684024516608'; +const GENERAL_CHANNEL = '475507684024516610'; +const swearWords = ['nigga', 'puta']; + +const ARGUMENTS_FALLBACK = + 'Por favor, providencie os argumentos necessários no formato exemplo: `' + + '!addrole' + + ' developer javascript fullstack`'; + +// import devmodeserver_roles from './const/devmodeserver_roles'; +const devmodeserver_roles = require('./const/devmodeserver_roles') + +module.exports = function (bot, btcValor) { + return { + getServer: () => { + return SERVER; + }, + _getRoles: (args) => + new Promise((resolve, reject) => { + try { + if (args.length > 0) { + let output = []; + for (var i = 0; i < args.length; i++) { + for (var devmode_role in devmodeserver_roles) { + if (devmode_role === args[i].toLowerCase()) { + const server_role = SERVER.roles.cache.find( + (role) => role.id === devmodeserver_roles[devmode_role] + ); + output.push(server_role); + } + } + } + resolve(output); + } else { + resolve(null); + } + } catch (error) { + console.log(error); + resolve(null); + } + }), + onReady: async () => { + try { + console.log(`${bot.user.username} is online`); + console.log('Estou pronto!'); + // guild/servidor que o bot está(nesse caso DevMode) + SERVER = bot.guilds.cache.get(GUILD_SERVIDOR); + // Setando a atividade do bot + const presence = await bot.user.setActivity('Star Wars', { + type: 'WATCHING', + }); + console.log(`Atividade setada para ${presence.activities[0].name}`); + } catch (error) { + console.error(error); + } + }, + onMemberAdd: async (member) => { + const channel = member.guild.channels.find( + (channels) => channels.id === GENERAL_CHANNEL + ); + if (!channel) return; + channel.send(`Bem vindo a Dev Mode, ${member}! :wave:`); + channel.send( + 'Você pode adicionar roles digitando o comando como no exemplo: `' + + '!addrole' + + ' developer javascript fullstack`' + ); + }, + onMessage: async (message) => { + const mensagemArray = message.content.split(' '); + if (mensagemArray.length) return; + const comando = mensagemArray[0].toLowerCase(); + // moderar certas mensagens que contem palavras desrespeitosas + if (swearWords.some((word) => message.content.includes(word))) { + message.reply(`Mais respeito <@${message.author.id}>!!!`); + message.delete().catch((e) => {}); + } + if (message.author.bot) return; + + switch (message.channel.type) { + case 'dm': + if (SERVER.member(message.author.id)) { + // existe um membro do servidor/guild com essa ID + // console.log('esse user faz parte da guild') + // console.log(message.author.id) + // mensagem para quem não é da comunidade e está enviando msg privada pro bot + // TODO: embed richtext com contatos para inserir-se na comunidade + } else { + message.reply( + 'Desculpe, mas você não faz parte da comunidade Dev Mode de Campos :sob:' + ); + } + break; + case 'addrole': + const server_role = await this._getRoles(args); + if (server_role) { + server_role.forEach((role) => { + message.member.roles.add(role); + }); + message.reply('Roles adicionadas :]'); + } else { + message.reply(ARGUMENTS_FALLBACK); + } + break; + case 'removerole': + const server_role_remove = await this._getRoles(args); + if (server_role_remove) { + server_role_remove.forEach((role) => { + server_role_remove + ? message.member.roles.remove(server_role_remove) + : message.reply( + `<@${message.author.id}> não possui a role ${devmode_role}` + ); + }); + } else { + message.reply(ARGUMENTS_FALLBACK); + } + break; + } + + if (comando === `${prefixo}ping`) { + // WebSocketManager no client.ws.ping + message.reply( + 'Pong! O ping do bot ao discord é `' + `${bot.ws.ping}` + ' ms`' + ); + message.reply('O trafego é feito do user ao bot e do bot ao discord'); + } + + if (message.content == `${prefixo}btcdia`) { + const btcValorAsync = btcValor(); + const percentageAsync = btcValor.getPercentageChangeLastDay(); + Promise.all([btcValorAsync, percentageAsync]) + .then((data) => { + const value = data[0]; + const percentage = data[1]; + if (percentage > 0) { + message.channel.send(`<@${message.author.id}> + BTC: ${value}$ \nSubiu (ultimo dia): ${percentage}% :hugging:`); + } else if (percentage < 0) { + message.channel.send(`<@${message.author.id}> + BTC: ${value}$ \nDesceu (ultimo dia): ${percentage}% :sob:`); + } else { + message.channel.send(`<@${message.author.id}> + BTC: ${value}$ \nManteve (ultimo dia): ${percentage}% :rolling_eyes:`); + } + }) + .catch(console.error); + } + + if (message.content == `${prefixo}btcsemana`) { + const btcValorAsync = btcValor(); + const percentageAsync = btcValor.getPercentageChangeLastWeek(); + Promise.all([btcValorAsync, percentageAsync]) + .then((data) => { + const value = data[0]; + const percentage = data[1]; + if (percentage > 0) { + message.channel.send( + `BTC: ${value}$ \nSubiu (ultima semana): ${percentage}% :hugging:` + ); + } else if (percentage < 0) { + message.channel.send( + `BTC: ${value}$ \nDesceu (ultima semana): ${percentage}% :sob:` + ); + } else { + message.channel.send( + `BTC: ${value}$ \nManteve (ultima semana): ${percentage}% :rolling_eyes:` + ); + } + }) + .catch(console.error); + } + }, + }; +} diff --git a/src/bot/comandos/procurarvaga/procurar_vaga.js b/src/bot/comandos/procurarvaga/procurar_vaga.js new file mode 100644 index 0000000..2304120 --- /dev/null +++ b/src/bot/comandos/procurarvaga/procurar_vaga.js @@ -0,0 +1,193 @@ +const commando = require('discord.js-commando'); +const channel_ids = require('../../schemas/channel_ids.json'); + +class RolarDadosComando extends commando.Command { + constructor(client) { + super(client, { + name: 'work', + group: 'procurarvaga', + memberName: 'work', + description: + 'Montar uma apresentação resumida informando a procura por emprego', + }); + } + + checkCancelar(collected) { + if ( + collected.first().content.toLowerCase() === 'cancelar' || + collected.first().content.toLowerCase() === '' + ) { + return true; + } else { + return false; + } + } + + createEmbed(procurador) { + let urlformatado = procurador.link; + if (['http://', 'https://', 'www'].indexOf(procurador.link) > -1) { + urlformatado = procurador.link; + } else { + // TODO RegEX + urlformatado = 'https://'.concat(procurador.link); + } + return { + color: 0x0099ff, + title: procurador.nome, + // url: procurador.link, + author: { + name: 'Olá, estou procurando oportunidades!', + icon_url: 'https://i.imgur.com/wSTFkRM.png', + }, + description: `**${procurador.area}**`, + fields: [ + { + name: 'Habilidades', + value: procurador.skills, + }, + /* { + name: '\u200b', + value: '\u200b', + inline: false, + }, */ + { + name: 'Portifólio', + value: urlformatado, + inline: true, + }, + { + name: 'Contato', + value: procurador.contato, + inline: true, + }, + ], + timestamp: new Date(), + footer: { + text: '© Dev Mode', + }, + }; + } + + async getAuthorMessage(message) { + try { + // Primeiro argumento é uma função filter - que é feita de condições + // msg é um objeto 'Message' + return await message.channel.awaitMessages( + (msg) => msg.author.id == message.author.id, + { + max: 1, + time: 60000, + } + ); + } catch (error) { + throw error; + } + } + + // bloco em que roda o comando cada vez que for digitado + async run(message, args) { + const id_procurando_vagas = channel_ids.PROCURANDO_VAGAS; + // em caso de mensagem privada(direct message) + if (message.channel.type === 'dm') { + // Necessário verificar se o user faz parte da comunidade no discord + if (SERVER.member(message.author.id)) { + // capturar cadeia de respostas para montar a postagem dep rocura por vaga + [ + 'Então está procurando trabalho? Vou te perguntar algumas coisas e responda corretamente ok?', + '**Qual seu nome? (Max 128 chars)**', + 'Você pode cancelar a qualquer momento digitando `' + 'cancelar`', + ].forEach((msg) => { + message.reply(msg); + }); + try { + const collected_1 = await this.getAuthorMessage(message); + + if (this.checkCancelar(collected_1)) { + message.reply('Operação cancelada'); + } + + // somente aceita mensagens do user que enviou o comando + // aceita somente 1 mensagem, e retorna uma promise depois de 60000ms = 60s + const nome = collected_1.first().content; + message.reply( + '**Qual a sua área?(Front, Back, FullStack, UX/UI, DataScience, BA, etc**' + ); + //pega mensagem do usuário + const collected_2 = await this.getAuthorMessage(message); + + if (this.checkCancelar(collected_2)) { + message.reply('Operação cancelada'); + } + + const area = collected_2.first().content; + message.reply( + '**Descreva suas skills e o tipo de trabalho que está procurando. (Max 1024 chars)**' + ); + //pega mensagem do usuário + const collected_3 = await this.getAuthorMessage(message); + + if (this.checkCancelar(collected_3)) { + message.reply('Operação cancelada'); + } + + const skills = collected_3.first().content; + message.reply('**Favor adicione um link para seu portfolio.**'); + + //pega mensagem do usuário + const collected_4 = await this.getAuthorMessage(message); + + if (this.checkCancelar(collected_4)) { + message.reply('Operação cancelada'); + } + + const link = collected_4.first().content; + message.reply( + '**Como as partes interessadas podem contactar você?**' + ); + + //pega mensagem do usuário + const collected_5 = await this.getAuthorMessage(message); + + if (this.checkCancelar(collected_5)) { + message.reply('Operação cancelada'); + } + + const contato = collected_5.first().content; + const procurador = { + nome, + area, + skills, + link, + contato, + }; + const embed = this.createEmbed(procurador); + message.reply(`Solicitado por: <@${message.author.id}>`); + message.reply({ + embed, + }); + message.reply( + 'As informações acima foram enviadas para o canal de texto #procurando-vagas da comunidade Dev Mode!' + ); + + this.client.channels.cache + .get(id_procurando_vagas) + .send(`Solicitado por: <@${message.author.id}>`); + this.client.channels.cache.get(id_procurando_vagas).send({ + embed, + }); + } catch (error) { + console.log(err); + message.reply( + 'Nenhuma resposta depois de 60s ou resposta invalida, operação cancelada.' + ); + } + } else { + message.reply( + 'Desculpe, mas você não faz parte da comunidade Dev Mode de Campos :sob:' + ); + } + } + } +} + +module.exports = RolarDadosComando; diff --git a/src/comandos/rolardados/rola_dados.js b/src/bot/comandos/rolardados/rola_dados.js similarity index 100% rename from src/comandos/rolardados/rola_dados.js rename to src/bot/comandos/rolardados/rola_dados.js diff --git a/src/channel_ids.js b/src/bot/const/channel_ids.js similarity index 100% rename from src/channel_ids.js rename to src/bot/const/channel_ids.js diff --git a/src/bot/const/devmodeserver_roles.js b/src/bot/const/devmodeserver_roles.js new file mode 100644 index 0000000..b84c6f9 --- /dev/null +++ b/src/bot/const/devmodeserver_roles.js @@ -0,0 +1,25 @@ +module.exports = { + // areas + developer: '732607336451014669', + datascientist: '732607450204733621', + devops: '732607609068060753', + infra: '732607758980874290', + uxui: '732613392912613378', + coach: '732608475049230396', + business: '732608526874312754', + gestor: '732608722068701235', + rh: '732608699218002010', + // especialidades + fullstack: '732607560221196340', + mobile: '732610332950003835', + backend: '732607499491868724', + frontend: '732607536934682704', + // linguagens + java: '732607292951887993', + javascript: '732607042304344095', + python: '732607821333659729', + ruby: '732612456014282762', + php: '732612770679226521', + dotnet: '732608002900754483', + sap: '732608366266023957', +}; diff --git a/src/botconfig.json b/src/bot/schemas/botconfig.json similarity index 100% rename from src/botconfig.json rename to src/bot/schemas/botconfig.json diff --git a/src/channel_ids.json b/src/bot/schemas/channel_ids.json similarity index 100% rename from src/channel_ids.json rename to src/bot/schemas/channel_ids.json diff --git a/src/comandos/procurarvaga/procurar_vaga.js b/src/comandos/procurarvaga/procurar_vaga.js deleted file mode 100644 index a892937..0000000 --- a/src/comandos/procurarvaga/procurar_vaga.js +++ /dev/null @@ -1,244 +0,0 @@ -const commando = require('discord.js-commando'); -const channel_ids = require('../../channel_ids.json'); - -class RolarDadosComando extends commando.Command { - constructor(client) { - super(client, { - name: 'work', - group: 'procurarvaga', - memberName: 'work', - description: - 'Montar uma apresentação resumida informando a procura por emprego', - }); - } - - // bloco em que roda o comando cada vez que for digitado - async run(message, args) { - const id_procurando_vagas = channel_ids.PROCURANDO_VAGAS; - // em caso de mensagem privada(direct message) - if (message.channel.type === 'dm') { - // Necessário verificar se o user faz parte da comunidade no discord - if (SERVER.member(message.author.id)) { - // capturar cadeia de respostas para montar a postagem dep rocura por vaga - - message.reply( - 'Então está procurando trabalho? Vou te perguntar algumas coisas e responda corretamente ok?' - ); - message.reply('**Qual seu nome? (Max 128 chars)**'); - message.reply( - 'Você pode cancelar a qualquer momento digitando `' + 'cancelar`' - ); - // Primeiro argumento é uma função filter - que é feita de condições - // m é um objeto 'Message' - message.channel - .awaitMessages((m) => m.author.id == message.author.id, { - max: 1, - time: 60000, - }) - .then((collected) => { - if ( - collected.first().content.toLowerCase() === 'cancelar' || - collected.first().content.toLowerCase() === '' - ) { - message.reply('Operação cancelada'); - } - // somente aceita mensagens do user que enviou o comando - // aceita somente 1 mensagem, e retorna uma promise depois de 60000ms = 60s - - // first (e, nesse caso, somente) mensagem da collection - else { - const nome = collected.first().content; - message.reply( - '**Qual a sua área?(Front, Back, FullStack, UX/UI, DataScience, BA, etc**' - ); - message.channel - .awaitMessages((m) => m.author.id == message.author.id, { - max: 1, - time: 60000, - }) - .then((collected) => { - if ( - collected.first().content.toLowerCase() === 'cancelar' || - collected.first().content.toLowerCase() === '' - ) { - message.reply('Operação cancelada'); - } else { - const area = collected.first().content; - message.reply( - '**Descreva suas skills e o tipo de trabalho que está procurando. (Max 1024 chars)**' - ); - message.channel - .awaitMessages((m) => m.author.id == message.author.id, { - max: 1, - time: 60000, - }) - .then((collected) => { - if ( - collected.first().content.toLowerCase() === - 'cancelar' || - collected.first().content.toLowerCase() === '' - ) { - message.reply('Operação cancelada'); - } else { - const skills = collected.first().content; - message.reply( - '**Favor adicione um link para seu portfolio.**' - ); - message.channel - .awaitMessages( - (m) => m.author.id == message.author.id, - { - max: 1, - time: 60000, - } - ) - .then((collected) => { - if ( - collected.first().content.toLowerCase() === - 'cancelar' || - collected.first().content.toLowerCase() === '' - ) { - message.reply('Operação cancelada'); - } else { - const link = collected.first().content; - message.reply( - '**Como as partes interessadas podem contactar você?**' - ); - message.channel - .awaitMessages( - (m) => m.author.id == message.author.id, - { - max: 1, - time: 60000, - } - ) - .then((collected) => { - if ( - collected - .first() - .content.toLowerCase() === 'cancelar' || - collected - .first() - .content.toLowerCase() === '' - ) { - message.reply('Operação cancelada'); - } else { - const contato = collected.first().content; - const procurador = { - nome, - area, - skills, - link, - contato, - }; - let urlformatado = procurador.link; - if ( - ['http://', 'https://', 'www'].indexOf( - procurador.link - ) > -1 - ) { - urlformatado = procurador.link; - } else { - // TODO RegEX - urlformatado = 'https://'.concat( - procurador.link - ); - } - const embed = { - color: 0x0099ff, - title: procurador.nome, - // url: procurador.link, - author: { - name: - 'Olá, estou procurando oportunidades!', - icon_url: - 'https://i.imgur.com/wSTFkRM.png', - }, - description: `**${procurador.area}**`, - fields: [ - { - name: 'Habilidades', - value: procurador.skills, - }, - /* { - name: '\u200b', - value: '\u200b', - inline: false, - }, */ - { - name: 'Portifólio', - value: urlformatado, - inline: true, - }, - { - name: 'Contato', - value: procurador.contato, - inline: true, - }, - ], - timestamp: new Date(), - footer: { - text: '© Dev Mode', - }, - }; - message.reply( - `Solicitado por: <@${message.author.id}>` - ); - message.reply({ - embed, - }); - message.reply( - 'As informações acima foram enviadas para o canal de texto #procurando-vagas da comunidade Dev Mode!' - ); - this.client.channels.cache - .get(id_procurando_vagas) - .send( - `Solicitado por: <@${message.author.id}>` - ); - this.client.channels.cache - .get(id_procurando_vagas) - .send({ - embed, - }); - } - }) - .catch((err) => { - console.log(err); - }); - } - }) - .catch((err) => { - console.log(err); - }); - } - }) - .catch((err) => { - console.log(err); - }); - } - }) - .catch((err) => { - console.log(err); - }); - } - }) - .catch((err) => { - console.log(err); - message.reply( - 'Nenhuma resposta depois de 60s ou resposta invalida, operação cancelada.' - ); - }); - - // mensagem para quem não é da comunidade e está enviando msg privada pro bot - // TODO: embed richtext com contatos para inserir-se na comunidade - // TODO: Refactor, essa mensagem vai ser repedita sempre que tiver um comando novo... - } else { - message.reply( - 'Desculpe, mas você não faz parte da comunidade Dev Mode de Campos :sob:' - ); - } - } - } -} - -module.exports = RolarDadosComando; diff --git a/src/helpers.js b/src/helpers.js deleted file mode 100644 index 008ddd8..0000000 --- a/src/helpers.js +++ /dev/null @@ -1,17 +0,0 @@ -export function contemUrl(message) { - message = message.toLowerCase(); - let urlFound = false; - if ( - message.includes('http://') || - message.includes('https://') || - message.includes('www') - ) { - urlFound = true; - } - return urlFound; -} - -export function isTwitchUrl(message) { - message = message.toLowerCase(); - return message.includes('google.com'); -}