use of com.sx4.bot.core.Sx4Command in project Sx4 by sx4-discord-bot.
the class BlacklistCommand method add.
@Command(value = "add", description = "Add a role/user to be blacklisted from a specified command/module in a channel")
@CommandId(168)
@Examples({ "blacklist add #general @Shea#6653 fish", "blacklist add #bots @Members ban" })
@AuthorPermissions(permissions = { Permission.MANAGE_SERVER })
public void add(Sx4CommandEvent event, @Argument(value = "channel", nullDefault = true) TextChannel channel, @Argument(value = "user | role") IPermissionHolder holder, @Argument(value = "command | module", endless = true) List<Sx4Command> commands) {
List<TextChannel> channels = channel == null ? event.getGuild().getTextChannels() : List.of(channel);
boolean role = holder instanceof Role;
int type = role ? HolderType.ROLE.getType() : HolderType.USER.getType();
BitSet bitSet = new BitSet();
commands.stream().map(Sx4Command::getId).forEach(bitSet::set);
Document defaultData = new Document("id", holder.getIdLong()).append("type", type).append("blacklisted", Collections.EMPTY_LIST);
List<Long> longArray = Arrays.stream(bitSet.toLongArray()).boxed().collect(Collectors.toList());
List<Bson> update = List.of(Operators.set("holders", Operators.let(new Document("holders", Operators.ifNull("$holders", Collections.EMPTY_LIST)), Operators.let(new Document("holder", Operators.filter("$$holders", Operators.eq("$$this.id", holder.getIdLong()))), Operators.concatArrays(Operators.ifNull(Operators.filter("$$holders", Operators.ne("$$this.id", holder.getIdLong())), Collections.EMPTY_LIST), List.of(Operators.mergeObjects(Operators.ifNull(Operators.first("$$holder"), defaultData), new Document("blacklisted", Operators.bitSetOr(longArray, Operators.ifNull(Operators.first(Operators.map("$$holder", "$$this.blacklisted")), Collections.EMPTY_LIST))))))))), Operators.setOnInsert("guildId", event.getGuild().getIdLong()));
List<WriteModel<Document>> bulkData = channels.stream().map(textChannel -> new UpdateOneModel<Document>(Filters.eq("channelId", textChannel.getIdLong()), update, new UpdateOptions().upsert(true))).collect(Collectors.toList());
event.getMongo().bulkWriteBlacklists(bulkData).whenComplete((result, exception) -> {
if (ExceptionUtility.sendExceptionally(event, exception)) {
return;
}
if (result.getModifiedCount() == 0) {
event.replyFailure((commands.size() == 1 ? "That command is" : "Those commands are") + " already blacklisted for that " + (role ? "role" : "user") + " in those channels").queue();
return;
}
event.replySuccess((commands.size() == 1 ? "That command is" : "Those commands are") + " now blacklisted for that " + (role ? "role" : "user") + " in **" + result.getModifiedCount() + "** extra channel" + (result.getModifiedCount() == 1 ? "" : "s")).queue();
});
}
use of com.sx4.bot.core.Sx4Command in project Sx4 by sx4-discord-bot.
the class BlacklistCommand method remove.
@Command(value = "remove", description = "Remove a role/user from being blacklisted from a specified command/module in a channel")
@CommandId(180)
@Examples({ "blacklist remove #general @Shea#6653 fish", "blacklist remove #bots @Members ban" })
@AuthorPermissions(permissions = { Permission.MANAGE_SERVER })
public void remove(Sx4CommandEvent event, @Argument(value = "channel", nullDefault = true) TextChannel channel, @Argument(value = "user | role") IPermissionHolder holder, @Argument(value = "command | module", endless = true) List<Sx4Command> commands) {
List<TextChannel> channels = channel == null ? event.getGuild().getTextChannels() : List.of(channel);
boolean role = holder instanceof Role;
BitSet bitSet = new BitSet();
commands.stream().map(Sx4Command::getId).forEach(bitSet::set);
List<Long> longArray = Arrays.stream(bitSet.toLongArray()).boxed().collect(Collectors.toList());
List<Bson> update = List.of(Operators.set("holders", Operators.let(new Document("holder", Operators.filter("$holders", Operators.eq("$$this.id", holder.getIdLong()))), Operators.cond(Operators.or(Operators.extinct("$holders"), Operators.isEmpty("$$holder")), "$holders", Operators.concatArrays(Operators.filter("$holders", Operators.ne("$$this.id", holder.getIdLong())), Operators.let(new Document("result", Operators.bitSetAndNot(Operators.ifNull(Operators.first(Operators.map("$$holder", "$$this.blacklisted")), Collections.EMPTY_LIST), longArray)), Operators.cond(Operators.and(Operators.isEmpty(Operators.ifNull(Operators.first(Operators.map("$$holder", "$$this.whitelisted")), Collections.EMPTY_LIST)), Operators.bitSetIsEmpty("$$result")), Collections.EMPTY_LIST, List.of(Operators.cond(Operators.bitSetIsEmpty("$$result"), Operators.removeObject(Operators.first("$$holder"), "blacklisted"), Operators.mergeObjects(Operators.first("$$holder"), new Document("blacklisted", "$$result")))))))))));
List<WriteModel<Document>> bulkData = channels.stream().map(textChannel -> new UpdateOneModel<Document>(Filters.eq("channelId", textChannel.getIdLong()), update, new UpdateOptions())).collect(Collectors.toList());
event.getMongo().bulkWriteBlacklists(bulkData).whenComplete((result, exception) -> {
if (ExceptionUtility.sendExceptionally(event, exception)) {
return;
}
if (result.getModifiedCount() == 0) {
event.replyFailure((commands.size() == 1 ? "That command is" : "Those commands are") + " not blacklisted for that " + (role ? "role" : "user") + " in those channels").queue();
return;
}
event.replySuccess((commands.size() == 1 ? "That command is" : "Those commands are") + " no longer blacklisted for that " + (role ? "role" : "user") + " in **" + result.getModifiedCount() + "** channel" + (result.getModifiedCount() == 1 ? "" : "s")).queue();
});
}
use of com.sx4.bot.core.Sx4Command in project Sx4 by sx4-discord-bot.
the class WhitelistCommand method add.
@Command(value = "add", description = "Add a role/user to be whitelisted from a specified command/module in a channel")
@CommandId(184)
@Examples({ "whitelist add #general @Shea#6653 fish", "whitelist add #bots @Members ban" })
@AuthorPermissions(permissions = { Permission.MANAGE_SERVER })
public void add(Sx4CommandEvent event, @Argument(value = "channel", nullDefault = true) TextChannel channel, @Argument(value = "user | role") IPermissionHolder holder, @Argument(value = "command | module", endless = true) List<Sx4Command> commands) {
List<TextChannel> channels = channel == null ? event.getGuild().getTextChannels() : List.of(channel);
boolean role = holder instanceof Role;
int type = role ? HolderType.ROLE.getType() : HolderType.USER.getType();
BitSet bitSet = new BitSet();
commands.stream().map(Sx4Command::getId).forEach(bitSet::set);
Document defaultData = new Document("id", holder.getIdLong()).append("type", type).append("whitelisted", Collections.EMPTY_LIST);
List<Long> longArray = Arrays.stream(bitSet.toLongArray()).boxed().collect(Collectors.toList());
List<Bson> update = List.of(Operators.set("holders", Operators.let(new Document("holders", Operators.ifNull("$holders", Collections.EMPTY_LIST)), Operators.let(new Document("holder", Operators.filter("$$holders", Operators.eq("$$this.id", holder.getIdLong()))), Operators.concatArrays(Operators.ifNull(Operators.filter("$$holders", Operators.ne("$$this.id", holder.getIdLong())), Collections.EMPTY_LIST), List.of(Operators.mergeObjects(Operators.ifNull(Operators.first("$$holder"), defaultData), new Document("whitelisted", Operators.bitSetOr(longArray, Operators.ifNull(Operators.first(Operators.map("$$holder", "$$this.whitelisted")), Collections.EMPTY_LIST))))))))), Operators.setOnInsert("guildId", event.getGuild().getIdLong()));
List<WriteModel<Document>> bulkData = channels.stream().map(textChannel -> new UpdateOneModel<Document>(Filters.eq("channelId", textChannel.getIdLong()), update, new UpdateOptions().upsert(true))).collect(Collectors.toList());
event.getMongo().bulkWriteBlacklists(bulkData).whenComplete((result, exception) -> {
if (ExceptionUtility.sendExceptionally(event, exception)) {
return;
}
if (result.getModifiedCount() == 0) {
event.replyFailure((commands.size() == 1 ? "That command is" : "Those commands are") + " already whitelisted for that " + (role ? "role" : "user") + " in those channels").queue();
return;
}
event.replySuccess((commands.size() == 1 ? "That command is" : "Those commands are") + " now whitelisted for that " + (role ? "role" : "user") + " in **" + result.getModifiedCount() + "** extra channel" + (result.getModifiedCount() == 1 ? "" : "s")).queue();
});
}
use of com.sx4.bot.core.Sx4Command in project Sx4 by sx4-discord-bot.
the class WhitelistCommand method list.
@Command(value = "list", description = "Lists the commands roles/users whitelisted from using in a specific channel")
@CommandId(187)
@Examples({ "whitelist list", "whitelist list #channel" })
public void list(Sx4CommandEvent event, @Argument(value = "channel", nullDefault = true, endless = true) TextChannel channel) {
List<TextChannel> channels = channel == null ? event.getGuild().getTextChannels() : List.of(channel);
PagedResult<TextChannel> channelPaged = new PagedResult<>(event.getBot(), channels).setAutoSelect(true).setAuthor("Channels", null, event.getGuild().getIconUrl()).setDisplayFunction(TextChannel::getAsMention);
channelPaged.onSelect(channelSelect -> {
TextChannel selectedChannel = channelSelect.getSelected();
Document blacklist = event.getMongo().getBlacklist(Filters.eq("channelId", selectedChannel.getIdLong()), Projections.include("holders"));
if (blacklist == null) {
event.replyFailure("Nothing is whitelisted in " + selectedChannel.getAsMention()).queue();
return;
}
List<Document> holders = blacklist.getList("holders", Document.class).stream().filter(holder -> !holder.getList("whitelisted", Long.class, Collections.emptyList()).isEmpty()).sorted(Comparator.comparingInt(a -> a.getInteger("type"))).collect(Collectors.toList());
if (holders.isEmpty()) {
event.replyFailure("Nothing is whitelisted in " + selectedChannel.getAsMention()).queue();
return;
}
PagedResult<Document> holderPaged = new PagedResult<>(event.getBot(), holders).setAuthor("Users/Roles", null, event.getGuild().getIconUrl()).setDisplayFunction(holder -> {
long id = holder.getLong("id");
int type = holder.getInteger("type");
if (type == HolderType.ROLE.getType()) {
Role role = event.getGuild().getRoleById(id);
return role == null ? "Deleted Role (" + id + ")" : role.getAsMention();
} else {
User user = event.getShardManager().getUserById(id);
return user == null ? "Unknown User (" + id + ")" : user.getAsTag();
}
});
holderPaged.onSelect(holderSelect -> {
Document holder = holderSelect.getSelected();
List<Long> whitelisted = holder.getList("whitelisted", Long.class, Collections.emptyList());
BitSet bitSet = BitSet.valueOf(whitelisted.stream().mapToLong(l -> l).toArray());
List<Sx4Command> commands = event.getCommandListener().getAllCommands().stream().map(Sx4Command.class::cast).filter(command -> bitSet.get(command.getId())).collect(Collectors.toList());
PagedResult<Sx4Command> commandPaged = new PagedResult<>(event.getBot(), commands).setAuthor("Whitelisted Commands", null, event.getGuild().getIconUrl()).setDisplayFunction(Sx4Command::getCommandTrigger).setSelect().setIndexed(false);
commandPaged.execute(event);
});
holderPaged.execute(event);
});
channelPaged.execute(event);
}
use of com.sx4.bot.core.Sx4Command in project Sx4 by sx4-discord-bot.
the class WhitelistCommand method remove.
@Command(value = "remove", description = "Remove a role/user from being whitelisted from a specified command/module in a channel")
@CommandId(185)
@Examples({ "whitelist remove #general @Shea#6653 fish", "whitelist remove #bots @Members ban" })
@AuthorPermissions(permissions = { Permission.MANAGE_SERVER })
public void remove(Sx4CommandEvent event, @Argument(value = "channel", nullDefault = true) TextChannel channel, @Argument(value = "user | role") IPermissionHolder holder, @Argument(value = "command | module", endless = true) List<Sx4Command> commands) {
List<TextChannel> channels = channel == null ? event.getGuild().getTextChannels() : List.of(channel);
boolean role = holder instanceof Role;
BitSet bitSet = new BitSet();
commands.stream().map(Sx4Command::getId).forEach(bitSet::set);
List<Long> longArray = Arrays.stream(bitSet.toLongArray()).boxed().collect(Collectors.toList());
List<Bson> update = List.of(Operators.set("holders", Operators.let(new Document("holder", Operators.filter("$holders", Operators.eq("$$this.id", holder.getIdLong()))), Operators.cond(Operators.or(Operators.extinct("$holders"), Operators.isEmpty("$$holder")), "$holders", Operators.concatArrays(Operators.filter("$holders", Operators.ne("$$this.id", holder.getIdLong())), Operators.let(new Document("result", Operators.bitSetAndNot(Operators.ifNull(Operators.first(Operators.map("$$holder", "$$this.whitelisted")), Collections.EMPTY_LIST), longArray)), Operators.cond(Operators.and(Operators.isEmpty(Operators.ifNull(Operators.first(Operators.map("$$holder", "$$this.blacklisted")), Collections.EMPTY_LIST)), Operators.bitSetIsEmpty("$$result")), Collections.EMPTY_LIST, List.of(Operators.cond(Operators.bitSetIsEmpty("$$result"), Operators.removeObject(Operators.first("$$holder"), "whitelisted"), Operators.mergeObjects(Operators.first("$$holder"), new Document("whitelisted", "$$result")))))))))));
List<WriteModel<Document>> bulkData = channels.stream().map(textChannel -> new UpdateOneModel<Document>(Filters.eq("channelId", textChannel.getIdLong()), update, new UpdateOptions())).collect(Collectors.toList());
event.getMongo().bulkWriteBlacklists(bulkData).whenComplete((result, exception) -> {
if (ExceptionUtility.sendExceptionally(event, exception)) {
return;
}
if (result.getModifiedCount() == 0) {
event.replyFailure((commands.size() == 1 ? "That command is" : "Those commands are") + " not whitelisted for that " + (role ? "role" : "user") + " in those channels").queue();
return;
}
event.replySuccess((commands.size() == 1 ? "That command is" : "Those commands are") + " no longer whitelisted for that " + (role ? "role" : "user") + " in **" + result.getModifiedCount() + "** channel" + (result.getModifiedCount() == 1 ? "" : "s")).queue();
});
}
Aggregations