Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
752f228
added new config file to module config
Aug 4, 2022
39107d5
fixed text description
Aug 4, 2022
10f8308
added example config for voice-channel feature
Aug 4, 2022
ef8b0c8
added in-voice chat purgeOnStart functionality;
Aug 4, 2022
880ad82
added filtering of channels (no duplicates in config); Added overwrit…
Aug 4, 2022
ca84a1b
added reusing of botReady unique channels to reduce work load
Aug 4, 2022
c427d7a
[auto-delete] added new event and feature functionality in-voice chats
Aug 4, 2022
0864a7f
[auto-delete] added "could-not-fetch-messages" locale
Aug 5, 2022
dceb45b
[auto-delete] fixed missing import of localize function
Aug 5, 2022
4cedf55
[auto-delete] deleted unnecessary object cloning
Aug 5, 2022
21cddc7
[auto-delete] added catch functionality on channel.fetch
Aug 5, 2022
0d812ec
[auto-delete] fixed if statement to be more readable
Aug 5, 2022
d758c4f
[auto-delete] added channel message catch functionality
Aug 5, 2022
7a3bae1
[auto-delete] added early exit on no messages in channel
Aug 5, 2022
869c4bf
[auto-delete] added now using variable for message parameter
Aug 5, 2022
5d62998
[auto-delete] fixed unnecessary new line
Aug 5, 2022
64470bf
[auto-delete] added channel message catch functionality + early return
Aug 5, 2022
f1eb904
[auto-delete] added usage of channelMessage variable in bulkDelete
Aug 5, 2022
0cc109f
[auto-delete] fixed if statement to be more readable
Aug 5, 2022
4472a56
[auto-delete] added channel.messages catch functionality + early return
Aug 5, 2022
0708359
[auto-delete] added usage of channelMessage variable in Bulkdelete
Aug 5, 2022
04f3dbb
[auto-delete] fixed order of if statements to fit logically
Aug 5, 2022
9355290
fixed eslint errors
Aug 5, 2022
1bb6a32
[auto-delete] fixed logic errors and restructured code
Aug 5, 2022
b4d83c8
fix(auto-delete): only parsing not int valus as int
Aug 12, 2022
9bc3afc
fix(auto-delete): changed early return statement
Aug 12, 2022
193fe2e
fix(auto-delete): added check for Voice channel Type
Aug 12, 2022
2d50b73
feat(auto-delete:config): added more detailed bilingual description a…
Aug 12, 2022
3339504
fix(auto-delete): changed from "Zeit" to Timeout
Aug 12, 2022
5ef8c2d
Merge branch 'upstream/main' into auto-delete-inVoiceFeature
Sep 8, 2022
d044c80
feat(auto-delete): added locale entries for could-not-fetch-messages
Aug 13, 2022
563f64c
fix(auto-delete): translated text to locale language
Aug 13, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,8 @@
"manage-suggestion-comment-description": "Erkläre, warum du diese Entscheidung getroffen hast"
},
"auto-delete": {
"could-not-fetch-channel": "Der Kanal mit der ID %c konnte nicht gefunden werden"
"could-not-fetch-channel": "Der Kanal mit der ID %c konnte nicht gefunden werden",
"could-not-fetch-messages": "Die Nachrichten im Kanal mit der ID %c konnten nicht gefunden werden"
},
"auto-thread": {
"thread-create-reason": "Dieser Thread wurde aufgrund der Einstellungen von auto-thread erstellt"
Expand Down
3 changes: 2 additions & 1 deletion locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,8 @@
"manage-suggestion-comment-description": "Explain why you made this choice"
},
"auto-delete": {
"could-not-fetch-channel": "Could not fetch channel with ID %c"
"could-not-fetch-channel": "Could not fetch channel with ID %c",
"could-not-fetch-messages": "Could not fetch messages from channel with ID %c"
},
"auto-thread": {
"thread-create-reason": "This thread got created, because you configured auto-thread to do so"
Expand Down
15 changes: 12 additions & 3 deletions modules/auto-delete/channels.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,28 @@
"field_name": "channelID",
"default": "",
"type": "channelID",
"description": "ID of the (text) channel"
"humanname-de": "Sprachkanal",
"humanname-en": "Voice-Channel",
"description-en": "The Voice-Channel you want the auto-deleter to clear if there are no channel members left.",
"description-de": "Wähle den Sprachkanal aus, den der Bot leeren soll, sobald keine Mitglieder mehr im Sprachkanal sind."
},
{
"field_name": "timeout",
"default": "5",
"type": "integer",
"description": "Timeout after which messages sent (if not pinned) in this channel get deleted automatically (in minutes, at least 2 minutes)"
"humanname-de": "Timeout",
"humanname-en": "Timeout",
"description-en": "Timeout (in minutes) after which the messages in a channel will be deleted.",
"description-de": "Timeout (in Minuten), nachdem die Nachrichten in einem Kanal automatisch gelöscht werden sollen."
},
{
"field_name": "purgeOnStart",
"default": false,
"type": "boolean",
"description": "If enabled every (excluding pinned) message (max 100) in this channel gets deleted when the bot starts"
"humanname-de": "Kanal leeren beim Bot Start",
"humanname-en": "Purge On Start",
"description-en": "If enabled every (excluding pinned) message (max 100) in this channel gets deleted when the bot starts.",
"description-de": "Wenn aktiviert, werden alle (außer angepinnte) Nachrichten (max 100) aus dem gewälten Kanal, beim Start des Bots, gelöscht."
}
]
}
59 changes: 54 additions & 5 deletions modules/auto-delete/events/botReady.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,60 @@
const {localize} = require('../../../src/functions/localize');
module.exports.run = async function (client) {
const channels = client.configurations['auto-delete']['channels'];
for (const channel of channels) {
const voiceChannels = client.configurations['auto-delete']['voice-channels'];

const uniqueConfigChannels = findUniqueChannels(channels);
const uniqueConfigVoiceChannels = findUniqueChannels(voiceChannels);

client.modules['auto-delete'].uniqueChannels = uniqueConfigChannels.filter((channel) => {
const channelConfigObject = uniqueConfigVoiceChannels.find((voiceChannel) => voiceChannel.channelID === channel.channelID);
return !channelConfigObject;
});

for (const channel of client.modules['auto-delete'].uniqueChannels) {
if (!channel.purgeOnStart) continue;
const dcChannel = await client.channels.fetch(channel.channelID).catch(() => {
});

const dcChannel = await client.channels.fetch(channel.channelID).catch(() => {});
if (!dcChannel) return client.logger.error(`[auto-delete] ${localize('auto-delete', 'could-not-fetch-channel', {c: channel.channelID})}`);
dcChannel.bulkDelete((await dcChannel.messages.fetch()).filter(m => !m.pinned && m.deletable), true);

const channelMessages = await dcChannel.messages.fetch().catch(() => {});
if (!channelMessages) {
return client.logger.error(`[auto-delete] ${localize('auto-delete', 'could-not-fetch-messages', {c: channel.channelID})}`);
}
if (channelMessages.size === 0) continue;

dcChannel.bulkDelete(channelMessages.filter(m => !m.pinned && m.deletable), true);
}
};

for (const voiceChannel of uniqueConfigVoiceChannels) {
if (!voiceChannel.purgeOnStart) continue;

const dcVoiceChannel = await client.channels.fetch(voiceChannel.channelID).catch(() => {});
if (!dcVoiceChannel) return client.logger.error(`[auto-delete] ${localize('auto-delete', 'could-not-fetch-channel', {c: voiceChannel.channelID})}`);
if (dcVoiceChannel.members.size > 0) continue;

const channelMessages = await dcVoiceChannel.messages.fetch().catch(() => {});
if (!channelMessages) {
return client.logger.error(`[auto-delete] ${localize('auto-delete', 'could-not-fetch-messages', {c: voiceChannel.channelID})}`);
}
if (channelMessages.size === 0) continue;

dcVoiceChannel.bulkDelete(channelMessages, true);
}
};

/**
* Finds and deletes duplicates in Array (Last Writer wins)
* @param {String} arrayToFilter Array of Channels
* @returns {Array} Filtered Array of Channels
* @private
*/
function findUniqueChannels(arrayToFilter) {
const uniqueConfigChannelIds = {};

for (let i = 0; i < arrayToFilter.length; i++) {
uniqueConfigChannelIds[arrayToFilter[i].channelID] = i;
}

return arrayToFilter.filter((channel, index) => uniqueConfigChannelIds[channel.channelID] === index);
}
4 changes: 2 additions & 2 deletions modules/auto-delete/events/messageCreate.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ module.exports.run = async function (client, msg) {
if (!msg.guild) return;
if (msg.guild.id !== client.guildID) return;
if (!msg.member) return;
if (!client.modules['auto-delete'].uniqueChannels) return;

const channels = client.configurations['auto-delete']['channels'];
const channel = channels.find(c => c.channelID === msg.channel.id);
const channel = client.modules['auto-delete'].uniqueChannels.find(c => c.channelID === msg.channel.id);
if (!channel) return;
setTimeout(() => {
if (msg.deletable && !msg.pinned) msg.delete().catch(() => {
Expand Down
26 changes: 26 additions & 0 deletions modules/auto-delete/events/voiceStateUpdate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
const {localize} = require('../../../src/functions/localize');
module.exports.run = async function (client, oldState) {
if (!client.botReadyAt) return;

const voiceChannels = client.configurations['auto-delete']['voice-channels'];

const channelConfigEntry = voiceChannels.find((vc) => oldState.channelId === vc.channelID);
if (!channelConfigEntry) return;

const channel = await client.channels.fetch(channelConfigEntry.channelID).catch(() => {});
if (!channel) {
return client.logger.error(`[auto-delete] ${localize('auto-delete', 'could-not-fetch-channel', {c: channelConfigEntry.channelID})}`);
}
if (channel.type !== 'GUILD_VOICE') return;
if (channel.members.size > 0) return;

const channelMessages = await channel.messages.fetch().catch(() => {});
if (!channelMessages) {
return client.logger.error(`[auto-delete] ${localize('auto-delete', 'could-not-fetch-messages', {c: channelConfigEntry.channelID})}`);
}
if (channelMessages.size === 0) return;

setTimeout(async() => {
channel.bulkDelete(channelMessages, true).catch(() => {});
}, parseInt(channelConfigEntry.timeout) * 1000 * 60);
};
5 changes: 3 additions & 2 deletions modules/auto-delete/module.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "auto-delete",
"humanReadableName-en": "Auto-Message-Delete",
"humanReadableName-de": "Automatisches Löschen",
"description-en": "This module allows you to delete messages in a channel after a specified timeout to keep your channel clean",
"description-en": "This module allows you to delete messages from a channel after a specified timeout to keep your channel clean",
"description-de": "Halte deine Channel sauber, in dem du alle Nachrichten nach einem bestimmten Intervall in einem Channel löschst",
"author": {
"scnxOrgID": "1",
Expand All @@ -13,7 +13,8 @@
"openSourceURL": "https://github.com/SCNetwork/CustomDCBot/tree/main/modules/auto-delete",
"events-dir": "/events",
"config-example-files": [
"channels.json"
"channels.json",
"voice-channels.json"
],
"tags": [
"administration"
Expand Down
36 changes: 36 additions & 0 deletions modules/auto-delete/voice-channels.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"filename": "voice-channels.json",
"humanname-de": "Voice-Channel",
"humanname-en": "Voice-Channels",
"configElements": true,
"content": [
{
"field_name": "channelID",
"default": "",
"type": "channelID",
"content": "GUILD_VOICE",
"humanname-de": "Sprachkanal",
"humanname-en": "Voice-Channel",
"description-en": "The Voice-Channel you want the auto-deleter to clear if there are no channel members left.",
"description-de": "Wähle den Sprachkanal aus, den der Bot leeren soll, sobald keine Mitglieder mehr im Sprachkanal sind."
},
{
"field_name": "timeout",
"default": "5",
"type": "integer",
"humanname-de": "Timeout",
"humanname-en": "Timeout",
"description-en": "Timeout (in minutes) after which the messages in a Voice-Channel are deleted after the last member left the channel. Entering '0' will result in an instant deletion.",
"description-de": "Timeout (in Minuten), nachdem die Nachrichten gelöscht werden, wenn das letzte Mitglied den Sprachkanal verlassen hat. Wenn du eine '0' verwendest, werden die Nachrichten sofort gelöscht."
},
{
"field_name": "purgeOnStart",
"default": false,
"type": "boolean",
"humanname-de": "Kanal leeren beim Bot Start",
"humanname-en": "Purge On Start",
"description-en": "If enabled every message (max 100) in this channel gets deleted when the bot starts and no members are left in the channel",
"description-de": "Wenn aktiviert, werden alle Nachrichten (max 100) aus dem gewälten Sprachkanal gelöscht (beim Start des Bots), sofern keine Mitglieder in dem Sprachkanal sind."
}
]
}