Skip to content

Commit 6075859

Browse files
committed
Setup bot base
1 parent 6155a91 commit 6075859

31 files changed

Lines changed: 3118 additions & 57 deletions

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
node_modules
2+
# Keep environment variables out of version control
3+
.env
4+
.env.local
5+
.env.development
6+
.env.test
7+
8+
# Ignore the .env file that will be created for you

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +0,0 @@
1-
# alicebot
2-
Main repo for the bot of devscafe.

main.go

Lines changed: 0 additions & 55 deletions
This file was deleted.

src/commands/ping.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = {
2+
name: 'ping',
3+
description: 'Ping...',
4+
async execute(interaction) {
5+
await interaction.reply('Pong!');
6+
},
7+
options: [
8+
{
9+
name: 'item',
10+
description: 'Item to buy',
11+
type: 3,
12+
required: true
13+
}
14+
]
15+
}

src/commands/regex.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
module.exports = {
2+
name: 'regex',
3+
description: 'Testa expressões regulares',
4+
async execute(interaction) {
5+
const pattern = interaction.options.getString('padrao');
6+
const text = interaction.options.getString('texto');
7+
8+
try {
9+
const regex = new RegExp(pattern);
10+
const result = regex.test(text);
11+
await interaction.reply(`Resultado: ${result ? '✅ Match' : '❌ No match'}`);
12+
} catch (error) {
13+
await interaction.reply('❌ Expressão regular inválida!');
14+
}
15+
},
16+
options: [
17+
{
18+
name: 'padrao',
19+
description: 'Padrão regex',
20+
type: 3,
21+
required: true
22+
},
23+
{
24+
name: 'texto',
25+
description: 'Texto para testar',
26+
type: 3,
27+
required: true
28+
}
29+
],
30+
};

src/commands/reminder.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module.exports = {
2+
name: 'reminder',
3+
description: 'Set a reminder',
4+
async execute(interaction) {
5+
// Obtem os valores dos argumentos, e o usuário que executou o comando
6+
const time = interaction.options.getString('time');
7+
const message = interaction.options.getString('message');
8+
const user = interaction.user;
9+
10+
// Responde ao usuário
11+
await interaction.reply(`I will remind you in ${time} minutes: ${message}`);
12+
13+
// Define um temporizador para enviar uma mensagem ao usuário após o tempo especificado
14+
setTimeout(() => {
15+
user.send(`Reminder: ${message}`);
16+
}, time * 60 * 1000);
17+
},
18+
options: [
19+
{
20+
name: 'time',
21+
description: 'Time to set the reminder',
22+
type: 3,
23+
required: true
24+
},
25+
{
26+
name: 'message',
27+
description: 'Message to remind',
28+
type: 3,
29+
required: true
30+
}
31+
]
32+
}

src/commands/reposearch.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
function gitMessageReply(data){
2+
const { EmbedBuilder } = require('discord.js');
3+
const embed = new EmbedBuilder()
4+
.setTitle('GitHub Repository Search')
5+
.setDescription(`Total results: ${data.total_count}`)
6+
.setColor('#0099ff')
7+
.setTimestamp()
8+
// Dinamically add fields in
9+
// (method) EmbedBuilder.setFields(...fields: RestOrArray<APIEmbedField>): EmbedBuilder
10+
embed.setFields(data.items.map((item, index) => {
11+
return {
12+
// [discordjs](https://github.com/discordjs/discord.js)
13+
name: `#${index + 1} ${item.name}`,
14+
value: `${item.description}\n 🌟 ${item.stargazers_count} | 🔗 ${item.forks_count} | 📝 ${item.open_issues_count} | 👁 ${item.watchers_count} | 🌎 ${item.language}\n
15+
[View Repo](${item.html_url})`,
16+
inline: false
17+
}
18+
}));
19+
return embed;
20+
}
21+
22+
module.exports = {
23+
name: 'reposearch',
24+
description: 'Search for a repository on GitHub by name or github deep search query.',
25+
async execute(interaction) {
26+
const reposearch = require('../lib/github/reposearch.js');
27+
const query = interaction.options.getString('query');
28+
const result = await reposearch(query);
29+
const embed = gitMessageReply(result);
30+
await interaction.reply({ embeds: [embed] });
31+
},
32+
options: [
33+
{
34+
name: 'query',
35+
description: 'Query to search for repositories.',
36+
type: 3,
37+
required: true
38+
}
39+
]
40+
}

src/events/join.js

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
prisma model :
3+
4+
model User {
5+
id String @id @default(cuid())
6+
userId String @unique
7+
guildId String
8+
9+
// User settings
10+
timezone String?
11+
birthday DateTime?
12+
13+
// User stats
14+
messages Int
15+
xp Int
16+
17+
createdAt DateTime @default(now())
18+
updatedAt DateTime @updatedAt
19+
}
20+
21+
// Usado para guardar a data de entrada e saída de um usuário
22+
model Movement {
23+
id String @id @default(cuid())
24+
userId String
25+
guildId String
26+
type String // join | leave
27+
createdAt DateTime @default(now())
28+
}
29+
30+
Base exemplo:
31+
32+
const { PrismaClient } = require('@prisma/client');
33+
const prisma = new PrismaClient();
34+
35+
async function setupGuild(guild) {
36+
try {
37+
console.log(`Setting up guild ${guild.name}`);
38+
await prisma.guild.upsert({
39+
where: {
40+
guildId: guild.id,
41+
},
42+
update: {}, // Atualiza se existir
43+
create: {
44+
guildId: guild.id, // Cria se não existir
45+
},
46+
});
47+
console.log("Guild configurada com sucesso!");
48+
} catch (error) {
49+
console.error('Erro durante a configuração da guild:', error);
50+
} finally {
51+
await prisma.$disconnect(); // Encerra a conexão
52+
}
53+
}
54+
55+
*/
56+
57+
const { PrismaClient } = require('@prisma/client');
58+
const prisma = new PrismaClient();
59+
60+
async function addMovement(member, type) {
61+
try {
62+
await prisma.movement.create({
63+
data: {
64+
userId: member.id,
65+
guildId: member.guild.id,
66+
type: type,
67+
},
68+
});
69+
} catch (error) {
70+
console.error('Error adding movement:', error);
71+
}
72+
}
73+
74+
async function addUser(member) {
75+
try {
76+
await prisma.user.upsert({
77+
where: {
78+
userId: member.id,
79+
},
80+
update: {},
81+
create: {
82+
userId: member.id,
83+
guildId: member.guild.id,
84+
messages: 0,
85+
xp: 0,
86+
},
87+
});
88+
} catch (error) {
89+
console.error('Error adding user:', error);
90+
}
91+
}
92+
93+
module.exports = {
94+
name: 'guildMemberAdd',
95+
once: true,
96+
execute(client) {
97+
98+
client.on('guildMemberAdd', async (member) => {
99+
console.log('guildMemberAdd event loaded!');
100+
await addMovement(member, 'join');
101+
await addUser(member);
102+
});
103+
},
104+
};

src/events/start.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const { PrismaClient } = require('@prisma/client');
2+
const prisma = new PrismaClient();
3+
4+
async function setupGuild(guild) {
5+
try {
6+
console.log(`Setting up guild ${guild.name}`);
7+
await prisma.guild.upsert({
8+
where: {
9+
guildId: guild.id,
10+
},
11+
update: {}, // Atualiza se existir
12+
create: {
13+
guildId: guild.id, // Cria se não existir
14+
},
15+
});
16+
console.log("Guild configurada com sucesso!");
17+
} catch (error) {
18+
console.error('Erro durante a configuração da guild:', error);
19+
} finally {
20+
await prisma.$disconnect(); // Encerra a conexão
21+
}
22+
}
23+
24+
module.exports = {
25+
name: 'ready',
26+
once: true,
27+
async execute(client) {
28+
console.log(`Logged in as ${client.user.tag}`);
29+
30+
const targetGuild = client.guilds.cache.first();
31+
if (!targetGuild) {
32+
console.log("Nenhuma guild encontrada!");
33+
return;
34+
}
35+
36+
await setupGuild(targetGuild); // Passa a guild como parâmetro
37+
38+
client.user.setActivity('/help', { type: 'LISTENING' });
39+
},
40+
};

src/index.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Load dotenv
2+
require('dotenv').config();
3+
const { Discord, GatewayIntentBits, Client } = require('discord.js');
4+
const { Routes } = require('discord-api-types/v9');
5+
6+
const clientFactory = require('./lib/factoryes/clientFactory');
7+
const client = clientFactory();
8+
9+
// Commands
10+
const commandloader = require('./lib/commands/commandloader');
11+
const commandHandler = require('./lib/commands/commandhandler');
12+
13+
14+
const commands = commandloader('./commands', '../../commands/');
15+
console.log("cmd: " + commands);
16+
commandHandler(client, commands);
17+
18+
// Events
19+
const eventloader = require('./lib/events/eventloader');
20+
const eventHandler = require('./lib/events/eventhandler');
21+
22+
const events = eventloader('./events', '../../events/');
23+
eventHandler(client, events);
24+
25+
// Load main
26+
const discordRestFactory = require('./lib/factoryes/discordRestFactory');
27+
28+
// Main server
29+
const main = require('./lib/main/botmain');
30+
31+
const CLIENT_ID = process.env.CLIENT_ID;
32+
const TOKEN = process.env.TOKEN;
33+
34+
const rest = discordRestFactory(TOKEN);
35+
const routes = Routes;
36+
37+
const { osinfoMsg } = require('./lib/main/osinfo');
38+
39+
// Main
40+
console.log(osinfoMsg());
41+
42+
// const timedCmd = require('./lib/main/timedcmd');
43+
44+
main(rest, routes, CLIENT_ID, TOKEN, client, commands); // Corrected parameter order
45+
46+
// timedCmd(); // Executa um comando a cada x tempo (usado para backup)

0 commit comments

Comments
 (0)