Skip to content

Commit 312d4e8

Browse files
committed
Codes Manager
1 parent befa518 commit 312d4e8

File tree

3 files changed

+220
-38
lines changed

3 files changed

+220
-38
lines changed

events/presenceUpdate.js

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
const Discord = require('discord.js');
2+
const settings = require('../settings.json');
3+
const nconf = require('nconf');
4+
const Memory = nconf.file('memory.json');
5+
const { CodesManager } = require('../utils/codesmanager');
6+
7+
module.exports = {
8+
run: async (oldPresence, newPresence) => {
9+
10+
// Delete old codes
11+
if(oldPresence != undefined && oldPresence.activities.length != 0 && oldPresence.activities[0].party != null && oldPresence.activities[0].party.id != null) {
12+
const _code = oldPresence.activities[0].party.id;
13+
if(newPresence.activities.length == 0 || newPresence.activities[0].party == null || newPresence.activities[0].party.id == null) {
14+
if(CodesManager.exists(_code)) {
15+
const gamecode = CodesManager.get(_code);
16+
if(gamecode.owner === oldPresence.member.user.id) {
17+
console.log('DELETING ROOM CODE ' + _code);
18+
// DISABLED: Cuando el owner se va otra persona hostea y asi empieza a repetir sucesivamente el codigo de la sala
19+
// CodesManager.delete(_code);
20+
}
21+
}
22+
}
23+
}
24+
25+
const guild = newPresence.guild;
26+
const member = newPresence.member;
27+
const user = newPresence.member.user;
28+
if(user.is_bot) return;
29+
// const logChannel = await guild.channels.cache.find(c => c.id === '754359601612456008');
30+
const logChannel = await guild.channels.cache.find(c => c.id === settings.codereader.channel);
31+
if(newPresence.activities.length == 0) return;
32+
const activity = newPresence.activities[0];
33+
const party = activity.party;
34+
if(activity.name !== 'Among Us') return;
35+
if(activity.details !== 'Hosting a game') return;
36+
// console.log(activity);
37+
38+
// TESTING
39+
if(!CodesManager.exists(party.id)) {
40+
const data = {
41+
'owner': user.id,
42+
'party': party.size[0] + '/' + party.size[1],
43+
'channel': member.voice.channelID,
44+
};
45+
CodesManager.set(party.id, data);
46+
47+
// Send Embed
48+
const fields = [
49+
{ name: 'Owner', value: `${user}` },
50+
{ name: 'Code', value: `${party != null ? party.id : 'NO_CODE'}` },
51+
];
52+
const embed = new Discord.MessageEmbed()
53+
.setColor('#ff8e00')
54+
.setTitle('Nueva Partida de ' + activity.name)
55+
.setThumbnail(user.avatarURL())
56+
.addFields(fields)
57+
.setTimestamp()
58+
.setFooter('Among Us - ESPAÑA | Buscador de partidas', 'https://cdn.discordapp.com/emojis/750737029096013924.png?v=1');
59+
logChannel.send(embed);
60+
61+
// Send Audio code
62+
if(member.voice.channelID !== undefined) {
63+
CodesManager.generateCodeAnounce(party.id, member.voice.channel);
64+
}
65+
66+
}
67+
else {
68+
const data = {
69+
'owner': user.id,
70+
'party': party.size[0] + '/' + party.size[1],
71+
'channel': member.voice.channelID,
72+
};
73+
CodesManager.set(party.id, data);
74+
}
75+
76+
// EMBED
77+
78+
},
79+
};

index.js

+40-38
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ const settings = require('./settings.json');
55
const _ = require('lodash');
66

77
const Discord = require('discord.js');
8-
const client = global.client = new Discord.Client({ partials: ['MESSAGE', 'CHANNEL', 'REACTION'] });
8+
const client = global.client = new Discord.Client({ partials: ['MESSAGE', 'CHANNEL', 'REACTION', 'GUILD_PRESENCES'] });
99

1010
const nconf = require('nconf');
1111
const Memory = nconf.file('memory.json');
1212

1313
const { GameRoomManager } = require('./utils/gamemanager');
1414
const { StatsManager } = require('./utils/statsmanager');
15+
const { CodesManager } = require('./utils/codesmanager');
1516

1617
const say = require('say');
1718

@@ -93,6 +94,7 @@ function tts(voiceChannel, text) {
9394
}
9495
});
9596
}
97+
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay));
9698

9799
// Events
98100
fs.readdir('./events/', (err, files) => {
@@ -124,43 +126,7 @@ client.on('message', async msg => {
124126
// Check for codes (6 chars) && user in-voice
125127
if(msg.content.length == 6 && member.voice.channelID !== undefined) {
126128
const code = msg.content;
127-
const library = {
128-
'A': ['Albacete'],
129-
'B': ['Barcelona'],
130-
'C': ['Casa'],
131-
'D': ['Dinamarca'],
132-
'E': ['España'],
133-
'F': ['Francia', 'Furcia'],
134-
'G': ['Gato'],
135-
'H': ['Helado'],
136-
'I': ['Italia'],
137-
'J': ['Jaen'],
138-
'K': ['Kilo'],
139-
'L': ['Lugo'],
140-
'M': ['Madrid'],
141-
'N': ['Noruega'],
142-
'O': ['Oviedo'],
143-
'P': ['Pamplona'],
144-
'Q': ['Queso'],
145-
'R': ['Roma'],
146-
'S': ['Sevilla'],
147-
'T': ['Toledo'],
148-
'U': ['Ucrania'],
149-
'V': ['Valencia'],
150-
'W': ['Washington'],
151-
'X': ['Xilofono'],
152-
'Y': ['Yogurt'],
153-
'Z': ['Zapato'],
154-
};
155-
let frase_completa = '';
156-
for (let i = 0; i < code.length; i++) {
157-
const letter = code.charAt(i);
158-
const city_array = library[letter.toUpperCase()];
159-
const city = city_array[Math.floor(Math.random() * city_array.length)];
160-
frase_completa += letter + ' de ' + city + '. ';
161-
}
162-
163-
tts(member.voice.channel, frase_completa);
129+
CodesManager.generateCodeAnounce(code, member.voice.channel);
164130
}
165131
}
166132

@@ -300,12 +266,46 @@ client.on('message', async msg => {
300266
// Command: muteall
301267
if(command === 'muteall') {
302268

269+
const sala_roja = '753653471479332905';
270+
if(member === null) { // webhook
271+
const mute_state = args[0] == 1 ? true : false;
272+
const emoji = args[1];
273+
let gamechannel = msg.guild.channels.cache.find(c => c.name.includes(emoji));
274+
if(gamechannel == undefined) {
275+
gamechannel = msg.guild.channels.cache.get(sala_roja);
276+
}
277+
gamechannel.members.forEach(async (_member) => {
278+
await _member.voice.setMute(mute_state);
279+
});
280+
return;
281+
}
282+
283+
// Required to be in a voice channel
284+
if(member.voice.channelID === undefined) {
285+
return msg.reply('Primero tienes que estar dentro de un canal de voz.');
286+
}
287+
288+
// Argumentos
289+
if(args.length !== 1) {
290+
return msg.reply('Falta el argumento 1 o 0');
291+
}
292+
const mute_state = args[0] == 1 ? true : false;
293+
294+
member.voice.channel.members.forEach(async (_member) => {
295+
await _member.voice.setMute(mute_state);
296+
});
297+
}
298+
299+
// Command: supermute
300+
if(command === 'supermute') {
301+
303302
const sala_roja = '753653471479332905';
304303
if(member === null) {
305304
const mute_state = args[0] == 1 ? true : false;
306305
const channel = msg.guild.channels.cache.get(sala_roja);
307306
channel.members.forEach(async (_member) => {
308307
await _member.voice.setMute(mute_state);
308+
await _member.voice.setDeaf(mute_state);
309309
});
310310
return;
311311
}
@@ -323,9 +323,11 @@ client.on('message', async msg => {
323323

324324
member.voice.channel.members.forEach(async (_member) => {
325325
await _member.voice.setMute(mute_state);
326+
await _member.voice.setDeaf(mute_state);
326327
});
327328
}
328329

330+
// say command
329331
if(command === 'say') {
330332
// Required to be in a voice channel
331333
if(member.voice.channelID === undefined) {

utils/codesmanager.js

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
const fs = require('fs');
2+
const nconf = require('nconf');
3+
const Memory = nconf.file('memory.json');
4+
const say = require('say');
5+
6+
class CodesManager {
7+
static exists(_code) {
8+
const _value = Memory.get('gamecodes:' + _code);
9+
return !(_value == undefined);
10+
}
11+
static get(_code) {
12+
const _value = Memory.get('gamecodes:' + _code);
13+
return _value;
14+
}
15+
static set(_code, _value) {
16+
Memory.set('gamecodes:' + _code, _value);
17+
Memory.save();
18+
return _value;
19+
}
20+
static delete(_code) {
21+
Memory.clear('gamecodes:' + _code);
22+
Memory.save();
23+
}
24+
static generateCodeAnounce(_code, _channel) {
25+
const library = {
26+
'A': ['Albacete', 'Andrea'],
27+
'B': ['Barcelona', 'Beatriz'],
28+
'C': ['Casa', 'Carlos'],
29+
'D': ['Dinamarca', 'Dinosaurio'],
30+
'E': ['Espanya', 'Espanyita'],
31+
'F': ['Francia', 'Furcia'],
32+
'G': ['Gato', 'Guarra'],
33+
'H': ['Helado', 'Huevo'],
34+
'I': ['Italia', 'Indiana'],
35+
'J': ['Jaen'],
36+
'K': ['Kilo', 'Khuruk'],
37+
'L': ['Lugo'],
38+
'M': ['Madrid'],
39+
'N': ['Noruega'],
40+
'O': ['Oviedo'],
41+
'P': ['Pamplona'],
42+
'Q': ['Queso'],
43+
'R': ['Roma', 'Rata', 'Raton'],
44+
'S': ['Sevilla', 'Sabinico'],
45+
'T': ['Toledo'],
46+
'U': ['Ucrania'],
47+
'V': ['Valencia'],
48+
'W': ['Guasinton'],
49+
'X': ['Xilofono'],
50+
'Y': ['griega de iogurt'],
51+
'Z': ['Zapato'],
52+
};
53+
let frase_completa = 'El codigo de la sala es el siguiente. ';
54+
for (let i = 0; i < _code.length; i++) {
55+
const letter = _code.charAt(i);
56+
const city_array = library[letter.toUpperCase()];
57+
const city = city_array[Math.floor(Math.random() * city_array.length)];
58+
frase_completa += letter + ' de ' + city + '. ';
59+
}
60+
frase_completa = frase_completa + 'Repito. ' + frase_completa;
61+
62+
CodesManager.tts(_channel, frase_completa);
63+
}
64+
static tts(voiceChannel, text) {
65+
if (!fs.existsSync('./temp')) {
66+
fs.mkdirSync('./temp');
67+
}
68+
const timestamp = new Date().getTime();
69+
const soundPath = `./temp/${timestamp}.wav`;
70+
const velocity = 1;
71+
say.export(text, null, velocity, soundPath, (err) => {
72+
if (err) {
73+
console.error(err);
74+
return;
75+
}
76+
else{
77+
voiceChannel.join().then((connection) => {
78+
const dispatcher = connection.play(soundPath).on('finish', () => {
79+
connection.disconnect();
80+
fs.unlinkSync(soundPath);
81+
});
82+
dispatcher.on('error', (err) => {
83+
console.error(err);
84+
connection.disconnect();
85+
fs.unlinkSync(soundPath);
86+
});
87+
dispatcher.on('start', () => {
88+
console.log('Speaking code...');
89+
});
90+
dispatcher.on('finish', () => {
91+
console.log('Finished speaking code!');
92+
});
93+
}).catch((err) => {
94+
console.error(err);
95+
});
96+
}
97+
});
98+
}
99+
}
100+
101+
module.exports.CodesManager = CodesManager;

0 commit comments

Comments
 (0)