Search in sources :

Example 56 with CommandId

use of com.sx4.bot.annotations.command.CommandId in project Sx4 by sx4-discord-bot.

the class RoleCommand method add.

@Command(value = "add", description = "Add a role to a member")
@CommandId(250)
@Redirects({ "addrole", "add role", "ar" })
@Examples({ "role add @Shea#6653 Role", "role add Shea 345718366373150720", "role add @Role" })
@AuthorPermissions(permissions = { Permission.MANAGE_ROLES })
@BotPermissions(permissions = { Permission.MANAGE_ROLES })
public void add(Sx4CommandEvent event, @Argument(value = "user", nullDefault = true) @AlternativeOptions("all") Alternative<Member> option, @Argument(value = "role", endless = true) Role role) {
    if (role.isManaged()) {
        event.replyFailure("I cannot give managed roles").queue();
        return;
    }
    if (role.isPublicRole()) {
        event.replyFailure("I cannot give the @everyone role").queue();
        return;
    }
    if (!event.getMember().canInteract(role)) {
        event.replyFailure("You cannot give a role higher or equal than your top role").queue();
        return;
    }
    if (!event.getSelfMember().canInteract(role)) {
        event.replyFailure("I cannot give a role higher or equal than my top role").queue();
        return;
    }
    if (option != null && option.isAlternative()) {
        List<Member> members = event.getGuild().getMemberCache().applyStream(stream -> stream.filter(member -> !member.getRoles().contains(role)).collect(Collectors.toList()));
        if (members.size() == 0) {
            event.replyFailure("All users already have that role").queue();
            return;
        }
        if (!this.pending.add(event.getGuild().getIdLong())) {
            event.replyFailure("You can only have 1 concurrent role being added to all users").queue();
            return;
        }
        event.replyFormat("Adding %s to **%,d** user%s, another message will be sent once this is done %s", role.getAsMention(), members.size(), members.size() == 1 ? "" : "s", event.getConfig().getSuccessEmote()).queue();
        List<CompletableFuture<Integer>> futures = new ArrayList<>();
        for (Member member : members) {
            futures.add(event.getGuild().addRoleToMember(member, role).submit().handle((result, exception) -> exception == null ? 1 : 0));
        }
        FutureUtility.allOf(futures).whenComplete((completed, exception) -> {
            this.pending.remove(event.getGuild().getIdLong());
            int count = completed.stream().reduce(0, Integer::sum);
            event.replyFormat("Successfully added the role %s to **%,d/%,d** user%s %s", role.getAsMention(), count, members.size(), count == 1 ? "" : "s", event.getConfig().getSuccessEmote()).queue();
        });
    } else {
        Member effectiveMember = option == null ? event.getMember() : option.getValue();
        event.getGuild().addRoleToMember(effectiveMember, role).flatMap($ -> event.replySuccess(role.getAsMention() + " has been added to **" + effectiveMember.getUser().getAsTag() + "**")).queue();
    }
}
Also used : Command(com.jockie.bot.core.command.Command) Sx4Command(com.sx4.bot.core.Sx4Command) Permission(net.dv8tion.jda.api.Permission) Set(java.util.Set) CompletableFuture(java.util.concurrent.CompletableFuture) Member(net.dv8tion.jda.api.entities.Member) Colour(com.sx4.bot.annotations.argument.Colour) Collectors(java.util.stream.Collectors) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) ModuleCategory(com.sx4.bot.category.ModuleCategory) Alternative(com.sx4.bot.entities.argument.Alternative) PermissionUtility(com.sx4.bot.utility.PermissionUtility) List(java.util.List) Role(net.dv8tion.jda.api.entities.Role) Sx4CommandEvent(com.sx4.bot.core.Sx4CommandEvent) Option(com.jockie.bot.core.option.Option) AlternativeOptions(com.sx4.bot.annotations.argument.AlternativeOptions) FutureUtility(com.sx4.bot.utility.FutureUtility) com.sx4.bot.annotations.command(com.sx4.bot.annotations.command) Argument(com.jockie.bot.core.argument.Argument) Limit(com.sx4.bot.annotations.argument.Limit) PermissionUtil(net.dv8tion.jda.internal.utils.PermissionUtil) CompletableFuture(java.util.concurrent.CompletableFuture) ArrayList(java.util.ArrayList) Member(net.dv8tion.jda.api.entities.Member) Command(com.jockie.bot.core.command.Command) Sx4Command(com.sx4.bot.core.Sx4Command)

Example 57 with CommandId

use of com.sx4.bot.annotations.command.CommandId in project Sx4 by sx4-discord-bot.

the class InvitesCommand method leaderboard.

@Command(value = "leaderboard", aliases = { "lb" }, description = "View a leaderboard of all invites in the server sorted by user")
@CommandId(266)
@Redirects({ "lb invites", "leaderboard invites" })
@Examples({ "invites leaderboard" })
@BotPermissions(permissions = { Permission.MESSAGE_EMBED_LINKS })
public void leaderboard(Sx4CommandEvent event) {
    event.getGuild().retrieveInvites().queue(invites -> {
        if (invites.isEmpty()) {
            event.replyFailure("There are no invites in this server").queue();
            return;
        }
        Map<Long, Integer> count = new HashMap<>();
        AtomicInteger total = new AtomicInteger(0);
        for (Invite invite : invites) {
            User inviter = invite.getInviter();
            if (inviter != null) {
                count.compute(inviter.getIdLong(), (key, value) -> value == null ? invite.getUses() : value + invite.getUses());
            }
            total.addAndGet(invite.getUses());
        }
        List<Map.Entry<Long, Integer>> sortedCount = new ArrayList<>(count.entrySet());
        sortedCount.sort(Collections.reverseOrder(Comparator.comparingInt(Map.Entry::getValue)));
        PagedResult<Map.Entry<Long, Integer>> paged = new PagedResult<>(event.getBot(), sortedCount).setIncreasedIndex(true).setAuthor("Invites Leaderboard", null, event.getGuild().getIconUrl()).setDisplayFunction(data -> {
            int percentInvited = Math.round(((float) data.getValue() / total.get()) * 100);
            String percent = percentInvited >= 1 ? String.valueOf(percentInvited) : "<1";
            Member member = event.getGuild().getMemberById(data.getKey());
            String memberString = member == null ? String.valueOf(data.getKey()) : member.getUser().getAsTag();
            return String.format("`%s` - %,d %s (%s%%)", memberString, data.getValue(), data.getValue() == 1 ? "invite" : "invites", percent);
        });
        paged.execute(event);
    });
}
Also used : User(net.dv8tion.jda.api.entities.User) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Member(net.dv8tion.jda.api.entities.Member) Invite(net.dv8tion.jda.api.entities.Invite) Redirects(com.sx4.bot.annotations.command.Redirects) BotPermissions(com.sx4.bot.annotations.command.BotPermissions) Command(com.jockie.bot.core.command.Command) Sx4Command(com.sx4.bot.core.Sx4Command) CommandId(com.sx4.bot.annotations.command.CommandId) Examples(com.sx4.bot.annotations.command.Examples)

Example 58 with CommandId

use of com.sx4.bot.annotations.command.CommandId in project Sx4 by sx4-discord-bot.

the class TemporaryBanCommand method defaultTime.

@Command(value = "default time", aliases = { "default duration" }, description = "Sets the default time to be used when a duration argument isn't given")
@CommandId(344)
@Examples({ "temporary ban default time 10m", "temporary ban default time 5d", "temporary ban default time 1h 30m" })
@AuthorPermissions(permissions = { Permission.MANAGE_SERVER })
public void defaultTime(Sx4CommandEvent event, @Argument(value = "duration", endless = true) Duration duration) {
    long seconds = duration.toSeconds();
    Bson update = seconds == ModUtility.DEFAULT_TEMPORARY_BAN_DURATION ? Updates.unset("temporaryBan.defaultTime") : Updates.set("temporaryBan.defaultTime", seconds);
    event.getMongo().updateGuildById(event.getGuild().getIdLong(), update).whenComplete((result, exception) -> {
        if (ExceptionUtility.sendExceptionally(event, exception)) {
            return;
        }
        if (result.getModifiedCount() == 0 && result.getUpsertedId() == null) {
            event.replyFailure("Your temporary ban default time was already set to that").queue();
            return;
        }
        event.replySuccess("Your temporary ban default time has been set to **" + TimeUtility.LONG_TIME_FORMATTER.parse(seconds) + "**").queue();
    });
}
Also used : Bson(org.bson.conversions.Bson) AuthorPermissions(com.sx4.bot.annotations.command.AuthorPermissions) Command(com.jockie.bot.core.command.Command) Sx4Command(com.sx4.bot.core.Sx4Command) CommandId(com.sx4.bot.annotations.command.CommandId) Examples(com.sx4.bot.annotations.command.Examples)

Example 59 with CommandId

use of com.sx4.bot.annotations.command.CommandId in project Sx4 by sx4-discord-bot.

the class TemporaryBanCommand method list.

@Command(value = "list", description = "Lists all the users who have temporary bans")
@CommandId(345)
@Examples({ "temporary ban list" })
public void list(Sx4CommandEvent event) {
    List<Document> bans = event.getMongo().getTemporaryBans(Filters.eq("guildId", event.getGuild().getIdLong()), Projections.include("unbanAt", "userId")).into(new ArrayList<>());
    if (bans.isEmpty()) {
        event.replyFailure("There is no one with a temporary ban in this server").queue();
        return;
    }
    bans.sort(Comparator.comparingLong(d -> d.getLong("unbanAt")));
    PagedResult<Document> paged = new PagedResult<>(event.getBot(), bans).setAuthor("Muted Users", null, event.getGuild().getIconUrl()).setIndexed(false).setSelect().setDisplayFunction(data -> {
        User user = event.getShardManager().getUserById(data.getLong("userId"));
        return (user == null ? "Anonymous#0000" : user.getAsTag()) + " - " + TimeUtility.LONG_TIME_FORMATTER.parse(data.getLong("unbanAt") - Clock.systemUTC().instant().getEpochSecond());
    });
    paged.execute(event);
}
Also used : Document(org.bson.Document) Command(com.jockie.bot.core.command.Command) Permission(net.dv8tion.jda.api.Permission) Projections(com.mongodb.client.model.Projections) MongoDatabase(com.sx4.bot.database.mongo.MongoDatabase) CommandId(com.sx4.bot.annotations.command.CommandId) Member(net.dv8tion.jda.api.entities.Member) ErrorResponse(net.dv8tion.jda.api.requests.ErrorResponse) PagedResult(com.sx4.bot.paged.PagedResult) User(net.dv8tion.jda.api.entities.User) ArrayList(java.util.ArrayList) Filters(com.mongodb.client.model.Filters) Bson(org.bson.conversions.Bson) Guild(net.dv8tion.jda.api.entities.Guild) Sx4CommandEvent(com.sx4.bot.core.Sx4CommandEvent) TimeUtility(com.sx4.bot.utility.TimeUtility) Duration(java.time.Duration) Option(com.jockie.bot.core.option.Option) TemporaryBanEvent(com.sx4.bot.events.mod.TemporaryBanEvent) Reason(com.sx4.bot.entities.mod.Reason) UpdateOptions(com.mongodb.client.model.UpdateOptions) Argument(com.jockie.bot.core.argument.Argument) Limit(com.sx4.bot.annotations.argument.Limit) AuthorPermissions(com.sx4.bot.annotations.command.AuthorPermissions) Operators(com.sx4.bot.database.mongo.model.Operators) ErrorResponseException(net.dv8tion.jda.api.exceptions.ErrorResponseException) Sx4Command(com.sx4.bot.core.Sx4Command) ModUtility(com.sx4.bot.utility.ModUtility) SearchUtility(com.sx4.bot.utility.SearchUtility) Updates(com.mongodb.client.model.Updates) ModuleCategory(com.sx4.bot.category.ModuleCategory) List(java.util.List) DefaultNumber(com.sx4.bot.annotations.argument.DefaultNumber) Examples(com.sx4.bot.annotations.command.Examples) Clock(java.time.Clock) ExceptionUtility(com.sx4.bot.utility.ExceptionUtility) Comparator(java.util.Comparator) User(net.dv8tion.jda.api.entities.User) Document(org.bson.Document) PagedResult(com.sx4.bot.paged.PagedResult) Command(com.jockie.bot.core.command.Command) Sx4Command(com.sx4.bot.core.Sx4Command) CommandId(com.sx4.bot.annotations.command.CommandId) Examples(com.sx4.bot.annotations.command.Examples)

Example 60 with CommandId

use of com.sx4.bot.annotations.command.CommandId in project Sx4 by sx4-discord-bot.

the class WarnCommand method view.

@Command(value = "view", description = "View the amount of warnings a specific user is on")
@CommandId(259)
@Examples({ "warn view @Shea#6653", "warn view Shea", "warn view 402557516728369153" })
@Redirects({ "warnings", "warns" })
public void view(Sx4CommandEvent event, @Argument(value = "user", endless = true) Member member) {
    List<Bson> pipeline = List.of(Aggregates.match(Filters.and(Filters.eq("userId", member.getIdLong()), Filters.eq("guildId", event.getGuild().getIdLong()))), Aggregates.project(Projections.computed("warnings", Operators.cond(Operators.or(Operators.isNull("$reset"), Operators.isNull("$warnings")), Operators.ifNull("$warnings", 0), Operators.max(0, Operators.subtract("$warnings", Operators.multiply(Operators.toInt(Operators.floor(Operators.divide(Operators.subtract(Operators.nowEpochSecond(), "$lastWarning"), "$reset.after"))), "$reset.amount")))))));
    event.getMongo().aggregateWarnings(pipeline).whenComplete((documents, exception) -> {
        if (ExceptionUtility.sendExceptionally(event, exception)) {
            return;
        }
        Document data = documents.isEmpty() ? MongoDatabase.EMPTY_DOCUMENT : documents.get(0);
        int warnings = data.getInteger("warnings", 0);
        event.reply("**" + member.getUser().getAsTag() + "** is currently on **" + warnings + "** warning" + (warnings == 1 ? "" : "s")).queue();
    });
}
Also used : Document(org.bson.Document) Bson(org.bson.conversions.Bson) Command(com.jockie.bot.core.command.Command) Sx4Command(com.sx4.bot.core.Sx4Command)

Aggregations

Command (com.jockie.bot.core.command.Command)177 Sx4Command (com.sx4.bot.core.Sx4Command)177 CommandId (com.sx4.bot.annotations.command.CommandId)117 Examples (com.sx4.bot.annotations.command.Examples)115 Document (org.bson.Document)112 Bson (org.bson.conversions.Bson)97 EmbedBuilder (net.dv8tion.jda.api.EmbedBuilder)81 PagedResult (com.sx4.bot.paged.PagedResult)71 AuthorPermissions (com.sx4.bot.annotations.command.AuthorPermissions)59 Argument (com.jockie.bot.core.argument.Argument)52 ModuleCategory (com.sx4.bot.category.ModuleCategory)52 Sx4CommandEvent (com.sx4.bot.core.Sx4CommandEvent)52 Permission (net.dv8tion.jda.api.Permission)51 BotPermissions (com.sx4.bot.annotations.command.BotPermissions)46 MessageBuilder (net.dv8tion.jda.api.MessageBuilder)43 ExceptionUtility (com.sx4.bot.utility.ExceptionUtility)42 User (net.dv8tion.jda.api.entities.User)42 Operators (com.sx4.bot.database.mongo.model.Operators)41 Collectors (java.util.stream.Collectors)36 AlternativeOptions (com.sx4.bot.annotations.argument.AlternativeOptions)31