Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Massrole module #56

Merged
merged 30 commits into from
May 1, 2022
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
15bd079
removed borken, unnecessary dependency
hfgd123 Apr 27, 2022
216dfc0
Revert "removed borken, unnecessary dependency"
hfgd123 Apr 27, 2022
3946db4
removed broken, unnecessary dependency
hfgd123 Apr 27, 2022
be019c2
created necessary structure
hfgd123 Apr 28, 2022
53c798e
Base system now works for target all
hfgd123 Apr 28, 2022
559e9fc
Update massrole.js
hfgd123 Apr 29, 2022
3746b3a
Delete config.json
hfgd123 Apr 29, 2022
2e9afd1
Update module.json
hfgd123 Apr 29, 2022
99e9f9e
Update massrole.js
hfgd123 Apr 29, 2022
a0f0948
Added targets bots and humans
hfgd123 Apr 30, 2022
a60a2ff
Implemented autocomplete for "target"-option
hfgd123 Apr 30, 2022
23c0a08
Now using locales for all strings thus making strings.json irrelevant
hfgd123 Apr 30, 2022
d85a97d
Fixed autocomplete by removing locales from options
hfgd123 Apr 30, 2022
b22c05b
Undid last change, since it somehow works now
hfgd123 Apr 30, 2022
1368627
Now using old package-lock file
hfgd123 Apr 30, 2022
bcb10eb
Update massrole.js
hfgd123 Apr 30, 2022
639e5f5
Update massrole.js
hfgd123 Apr 30, 2022
a13d42d
Merge branch 'SCNetwork:main' into main
hfgd123 Apr 30, 2022
ec31065
did npm run test -- --fix to fix errors or smth like that
hfgd123 May 1, 2022
657eacf
Update modules/massrole/commands/massrole.js
hfgd123 May 1, 2022
cbdf8da
Replaced forEach with for loop
hfgd123 May 1, 2022
12c4b75
Merge remote-tracking branch 'origin/main'
hfgd123 May 1, 2022
a82678e
Now using choices instead of autocomplete
hfgd123 May 1, 2022
f3f9d24
yes
hfgd123 May 1, 2022
ae10eb2
keyword-spacing
hfgd123 May 1, 2022
4ae4c0e
Update package.json
hfgd123 May 1, 2022
9af2192
Implemented error-handling if bot hasn't enough permissions
hfgd123 May 1, 2022
81a6d20
Implemented error-handling if bot hasn't enough permissions
hfgd123 May 1, 2022
cdcc60f
...
hfgd123 May 1, 2022
24fcbf2
Update default-locales.json
hfgd123 May 1, 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
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,9 @@
/node_modules/
/config/
src/functions/scnx-integration.js
/.vscode/
/.vscode/
/.idea/CustomDCBot.iml
/.idea/modules.xml
/.idea/inspectionProfiles/Project_Default.xml
/.idea/vcs.xml
/.idea/workspace.xml
13 changes: 13 additions & 0 deletions default-locales.json
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,19 @@
"shop-command-description-list": "List all items in the shop",
"shop-command-description-delete": "Remove an item from the shop",
"channel-not-found": "Can't find the leaderboard channel with the ID %c"
},
"massrole": {
"command-description": "Manage roles for all members",
"add-subcommand-description": "Add a role to all members",
"remove-subcommand-description": "Remove a role from all members",
"remove-all-subcommand-description": "Remove all roles from all members",
"role-option-add-description": "The role, that will be given to all members",
"role-option-remove-description": "The role, that will be removed from all members",
"target-option-description": "Determines whether bots should be included or not",
"all-users": "All Users",
"bots": "Bots",
"humans": "Humans",
"done": "Action executed"
}
}
}
202 changes: 202 additions & 0 deletions modules/massrole/commands/massrole.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
const {localize} = require('../../../src/functions/localize');
let target;

module.exports.subcommands = {
'add': async function (interaction) {
await checkTarget(interaction);
if (target === 'all') {
await interaction.deferReply({ ephemeral: true });
interaction.guild.members.cache.forEach(member => {
member.roles.add(interaction.options.getRole('role'));
});
await interaction.editReply(localize('massrole', 'done'));
} else if (target === 'bots') {
await interaction.deferReply({ ephemeral: true });
interaction.guild.members.cache.forEach(member => {
if (member.user.bot) {
member.roles.add(interaction.options.getRole('role'));
}
});
await interaction.editReply(localize('massrole', 'done'));
} else if (target === 'humans') {
await interaction.deferReply({ ephemeral: true });
interaction.guild.members.cache.forEach(member => {
if (member.manageable) {
if (!member.user.bot) {
member.roles.add(interaction.options.getRole('role'));
}
}
});
await interaction.editReply(localize('massrole', 'done'));
}
},
'remove': async function (interaction) {
await checkTarget(interaction);
if (target === 'all') {
await interaction.deferReply({ ephemeral: true });
interaction.guild.members.cache.forEach(member => {
member.roles.remove(interaction.options.getRole('role'));
});
await interaction.editReply(localize('massrole', 'done'));
}
if (target === 'bots') {
await interaction.deferReply({ ephemeral: true });
interaction.guild.members.cache.forEach(member => {
if (member.user.bot) {
member.roles.remove(interaction.options.getRole('role'));
}
});
await interaction.editReply(localize('massrole', 'done'));
}
if (target === 'humans') {
await interaction.deferReply({ ephemeral: true });
interaction.guild.members.cache.forEach(member => {
if (member.manageable) {
if (!member.user.bot) {
member.roles.remove(interaction.options.getRole('role'));
}
}
});
await interaction.editReply(localize('massrole', 'done'));
}
},
'remove-all': async function (interaction) {
await checkTarget(interaction);
if (target === 'all') {
await interaction.deferReply({ ephemeral: true });
interaction.guild.members.cache.forEach(member => {
member.roles.remove(member.roles.cache.filter(role => !role.managed));
});
await interaction.editReply(localize('massrole', 'done'));
} else if (target === 'bots') {
await interaction.deferReply({ ephemeral: true });
interaction.guild.members.cache.forEach(member => {
if (member.manageable) {
if (member.user.bot) {
member.roles.remove(member.roles.cache.filter(role => !role.managed));
}
}
});
await interaction.editReply(localize('massrole', 'done'));
} else if (target === 'humans') {
await interaction.deferReply({ ephemeral: true });
interaction.guild.members.cache.forEach(member => {
if (member.manageable) {
if (!member.user.bot) {
member.roles.remove(member.roles.cache.filter(role => !role.managed));
}
}
});
await interaction.editReply(localize('massrole', 'done'));
}
}
};

/**
* Read content of "target"-option
*
*/
function checkTarget(interaction) {
if (!interaction.options.getString('target') || interaction.options.getString('target') === 'all') {
target = 'all';
} else if (interaction.options.getString('target') === 'bots') {
target = 'bots';
} else if (interaction.options.getString('target') === 'humans') {
target = 'humans';
}
}

/**
* Make autocomplete for "target"-option in commands
*
*/
function autoCompleteTarget(interaction) {
interaction.respond([
{
name: localize('massrole', 'all-users'),
value: 'all'
},
{
name: localize('massrole', 'bots'),
value: 'bots'
},
{
name: localize('massrole', 'humans'),
value: 'humans'
}
]);
}

module.exports.config = {
name: 'massrole',
description: localize('massrole', 'command-description'),
defaultPermission: false,
options: [
{
type: 'SUB_COMMAND',
name: 'add',
description: localize('massrole', 'add-subcommand-description'),
options: [
{
type: 'ROLE',
required: true,
name: 'role',
description: localize('massrole', 'role-option-add-description')
},
{
type: 'STRING',
required: false,
name: 'target',
autocomplete: true,
description: localize('massrole', 'target-option-description')
}
]
},
{
type: 'SUB_COMMAND',
name: 'remove',
description: localize('massrole', 'remove-subcommand-description'),
options: [
{
type: 'ROLE',
required: true,
name: 'role',
description: localize('massrole', 'role-option-remove-description')
},
{
type: 'STRING',
required: false,
name: 'target',
autocomplete: true,
description: localize('massrole', 'target-option-description')
}
]
},
{
type: 'SUB_COMMAND',
name: 'remove-all',
description: localize('massrole', 'remove-all-subcommand-description'),
options: [
{
type: 'STRING',
required: false,
name: 'target',
autocomplete: true,
description: localize('massrole', 'target-option-description')
}
]
}
]
};

module.exports.autoComplete = {
'add': {
'target': autoCompleteTarget
},
'remove': {
'target': autoCompleteTarget
},
'remove-all': {
'target': autoCompleteTarget
}
};
14 changes: 14 additions & 0 deletions modules/massrole/module.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "massrole",
"humanReadableName": "Massrole",
"author": {
"name": "hfgd",
"link": "https://github.com/hfgd123",
"scnxOrgID": "2"
},
"openSourceURL": "https://github.com/hfgd123/CustomDCBot/tree/main/modules/massrole",
"description-en": "Simple module to manage the roles of many members at once!",
"description-de": "Einfaches Modul, um die Rollen vieler Nutzer gleichzeitig zu verwalten!",
"commands-dir": "/commands",
"tags": ["administration"]
}
5 changes: 2 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,10 @@
"node-schedule": "^2.1.0",
"parse-duration": "^1.0.2",
"sequelize": "^6.14.0",
"sqlite3": "^5.0.2",
"sqlite3": "^5.0.6",
"twitch": "^4.6.7",
"twitch-auth": "^4.6.7",
"utf-8-validate": "^5.0.8",
"zlib-sync": "^0.1.7"
"utf-8-validate": "^5.0.8"
},
"devDependencies": {
"eslint": "^7.32.0"
Expand Down