Search in sources :

Example 6 with Item

use of com.sx4.bot.entities.economy.item.Item in project Sx4 by sx4-discord-bot.

the class FishingRodCommand method info.

@Command(value = "info", aliases = { "information" }, description = "View information on a users fishing rod")
@CommandId(382)
@Examples({ "fishing rod info", "fishing rod info @Shea#6653", "fishing rod info Shea" })
@BotPermissions(permissions = { Permission.MESSAGE_EMBED_LINKS })
public void info(Sx4CommandEvent event, @Argument(value = "user", endless = true, nullDefault = true) Member member) {
    Member effectiveMember = member == null ? event.getMember() : member;
    User user = member == null ? event.getAuthor() : effectiveMember.getUser();
    Bson filter = Filters.and(Filters.eq("userId", effectiveMember.getIdLong()), Filters.eq("item.type", ItemType.ROD.getId()));
    Document data = event.getMongo().getItem(filter, Projections.include("item"));
    if (data == null) {
        event.replyFailure("That user does not have a fishing rod").queue();
        return;
    }
    Rod rod = Rod.fromData(event.getBot().getEconomyManager(), data.get("item", Document.class));
    EmbedBuilder embed = new EmbedBuilder().setAuthor(user.getName() + "'s " + rod.getName(), null, user.getEffectiveAvatarUrl()).setColor(effectiveMember.getColorRaw()).setThumbnail("https://emojipedia-us.s3.amazonaws.com/thumbs/120/twitter/147/fishing-pole-and-fish_1f3a3.png").addField("Durability", rod.getDurability() + "/" + rod.getMaxDurability(), false).addField("Current Price", String.format("$%,d", rod.getCurrentPrice()), false).addField("Price", String.format("$%,d", rod.getPrice()), false).addField("Yield", String.format("$%,d to $%,d", rod.getMinYield(), rod.getMaxYield()), false);
    event.reply(embed.build()).queue();
}
Also used : EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) User(net.dv8tion.jda.api.entities.User) Rod(com.sx4.bot.entities.economy.item.Rod) Document(org.bson.Document) ReturnDocument(com.mongodb.client.model.ReturnDocument) Member(net.dv8tion.jda.api.entities.Member) Bson(org.bson.conversions.Bson) 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 7 with Item

use of com.sx4.bot.entities.economy.item.Item in project Sx4 by sx4-discord-bot.

the class GiveItemCommand method onCommand.

public void onCommand(Sx4CommandEvent event, @Argument(value = "user") Member member, @Argument(value = "item", endless = true) ItemStack<Item> stack) {
    User user = member.getUser();
    if (user.isBot()) {
        event.replyFailure("You can not give items to bots").queue();
        return;
    }
    if (user.getIdLong() == event.getAuthor().getIdLong()) {
        event.replyFailure("You can not give items to yourself").queue();
        return;
    }
    long amount = stack.getAmount();
    if (amount < 1) {
        event.replyFailure("You need to give at least 1 item").queue();
        return;
    }
    Item item = stack.getItem();
    if (item instanceof Tool) {
        event.replyFailure("You cannot give tools").queue();
        return;
    }
    long price = stack.getTotalPrice();
    long tax = (long) Math.ceil(price * 0.05D);
    event.getMongo().withTransaction(session -> {
        UpdateResult balanceResult = event.getMongo().getUsers().updateOne(session, Filters.eq("_id", event.getAuthor().getIdLong()), List.of(EconomyUtility.decreaseBalanceUpdate(tax)));
        if (balanceResult.getModifiedCount() == 0) {
            event.replyFormat("You do not have enough to pay the tax for this item (**$%,d**) %s", tax, event.getConfig().getFailureEmote()).queue();
            session.abortTransaction();
            return null;
        }
        FindOneAndUpdateOptions options = new FindOneAndUpdateOptions().returnDocument(ReturnDocument.BEFORE).projection(Projections.include("amount", "resets"));
        Bson authorFilter = Filters.and(Filters.eq("userId", event.getAuthor().getIdLong()), Filters.eq("item.id", item.getId()));
        List<Bson> authorUpdate = List.of(Operators.set("amount", Operators.let(new Document("amount", Operators.ifNull("$amount", 0L)), Operators.cond(Operators.lt(Operators.subtract("$$amount", Operators.sum(Operators.map(Operators.filter(Operators.ifNull("$resets", Collections.EMPTY_LIST), Operators.gt("$$this.time", Operators.nowEpochSecond())), "$$this.amount"))), amount), "$$amount", Operators.subtract("$$amount", amount)))));
        Document authorData = event.getMongo().getItems().findOneAndUpdate(session, authorFilter, authorUpdate, options);
        long authorAmount = authorData == null ? 0L : authorData.get("amount", 0L);
        if (authorAmount < amount) {
            event.replyFailure("You do not have `" + amount + " " + item.getName() + "`").queue();
            session.abortTransaction();
            return null;
        }
        CooldownItemStack<Item> cooldownStack = new CooldownItemStack<>(item, authorData);
        long cooldownAmount = cooldownStack.getCooldownAmount();
        if (authorAmount - cooldownAmount < amount) {
            event.replyFormat("You have `%,d %s` but **%,d** %s on cooldown %s", authorAmount, item.getName(), cooldownAmount, cooldownAmount == 1 ? "is" : "are", event.getConfig().getFailureEmote()).queue();
            session.abortTransaction();
            return null;
        }
        Bson userFilter = Filters.and(Filters.eq("userId", member.getIdLong()), Filters.eq("item.id", item.getId()));
        List<Bson> userUpdate = List.of(Operators.set("item", item.toData()), Operators.set("amount", Operators.add(Operators.ifNull("$amount", 0L), stack.getAmount())));
        Document userData = event.getMongo().getItems().findOneAndUpdate(session, userFilter, userUpdate, options.upsert(true));
        event.getMongo().getUsers().updateOne(session, Filters.eq("_id", event.getSelfUser().getIdLong()), Updates.inc("economy.balance", tax));
        EmbedBuilder embed = new EmbedBuilder().setColor(event.getMember().getColor()).setAuthor(event.getAuthor().getName() + " → " + member.getUser().getName(), null, "https://cdn0.iconfinder.com/data/icons/social-messaging-ui-color-shapes/128/money-circle-green-3-512.png").setDescription(String.format("You have gifted **%,d %s** to **%s**\n\n%s's new %s amount: **%,d %s**\n%s's new %s amount: **%,d %s**", amount, item.getName(), user.getName(), event.getAuthor().getName(), item.getName(), authorAmount - amount, item.getName(), user.getName(), item.getName(), (userData == null ? 0L : userData.getLong("amount")) + amount, item.getName())).setFooter(String.format("$%,d (%d%%) tax was taken", tax, Math.round((double) tax / price * 100)), null);
        return embed.build();
    }).whenComplete((embed, exception) -> {
        if (ExceptionUtility.sendExceptionally(event, exception) || embed == null) {
            return;
        }
        event.reply(embed).queue();
    });
}
Also used : CooldownItemStack(com.sx4.bot.entities.economy.item.CooldownItemStack) Document(org.bson.Document) Operators(com.sx4.bot.database.mongo.model.Operators) EconomyUtility(com.sx4.bot.utility.EconomyUtility) Sx4Command(com.sx4.bot.core.Sx4Command) Permission(net.dv8tion.jda.api.Permission) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) Member(net.dv8tion.jda.api.entities.Member) User(net.dv8tion.jda.api.entities.User) Bson(org.bson.conversions.Bson) ModuleCategory(com.sx4.bot.category.ModuleCategory) ItemStack(com.sx4.bot.entities.economy.item.ItemStack) List(java.util.List) UpdateResult(com.mongodb.client.result.UpdateResult) Item(com.sx4.bot.entities.economy.item.Item) Sx4CommandEvent(com.sx4.bot.core.Sx4CommandEvent) ExceptionUtility(com.sx4.bot.utility.ExceptionUtility) com.mongodb.client.model(com.mongodb.client.model) Collections(java.util.Collections) Argument(com.jockie.bot.core.argument.Argument) Tool(com.sx4.bot.entities.economy.item.Tool) User(net.dv8tion.jda.api.entities.User) Document(org.bson.Document) CooldownItemStack(com.sx4.bot.entities.economy.item.CooldownItemStack) Bson(org.bson.conversions.Bson) Item(com.sx4.bot.entities.economy.item.Item) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) List(java.util.List) UpdateResult(com.mongodb.client.result.UpdateResult) Tool(com.sx4.bot.entities.economy.item.Tool)

Example 8 with Item

use of com.sx4.bot.entities.economy.item.Item in project Sx4 by sx4-discord-bot.

the class LeaderboardCommand method items.

@Command(value = "items", description = "View the leaderboard for a specific items count of users")
@CommandId(372)
@Examples({ "leaderboard items", "leaderboard items Shoe", "leaderboard items Diamond --server" })
@BotPermissions(permissions = { Permission.MESSAGE_EMBED_LINKS })
public void items(Sx4CommandEvent event, @Argument(value = "item", endless = true, nullDefault = true) Item item, @Option(value = "server", aliases = { "guild" }, description = "View the leaderboard with a server filter") boolean guild) {
    Bson filter = Filters.and(Filters.ne("_id", event.getJDA().getSelfUser().getIdLong()), Filters.ne("amount", 0));
    if (item != null) {
        filter = Filters.and(filter, Filters.eq("item.id", item.getId()));
    }
    List<Bson> pipeline = List.of(Aggregates.project(Projections.include("amount", "userId", "item.id")), Aggregates.match(filter), Aggregates.group("$userId", Accumulators.sum("amount", "$amount")), Aggregates.sort(Sorts.descending("amount")));
    event.getMongo().aggregateItems(pipeline).whenCompleteAsync((documents, exception) -> {
        if (ExceptionUtility.sendExceptionally(event, exception)) {
            return;
        }
        List<Map.Entry<User, Long>> users = new ArrayList<>();
        AtomicInteger userIndex = new AtomicInteger(-1);
        int i = 0;
        for (Document data : documents) {
            User user = event.getShardManager().getUserById(data.getLong("_id"));
            if (user == null) {
                continue;
            }
            if (!event.getGuild().isMember(user) && guild) {
                continue;
            }
            i++;
            users.add(Map.entry(user, data.getLong("amount")));
            if (user.getIdLong() == event.getAuthor().getIdLong()) {
                userIndex.set(i);
            }
        }
        if (users.isEmpty()) {
            event.replyFailure("There are no users which fit into this leaderboard").queue();
            return;
        }
        PagedResult<Map.Entry<User, Long>> paged = new PagedResult<>(event.getBot(), users).setPerPage(10).setCustomFunction(page -> {
            int rank = userIndex.get();
            EmbedBuilder embed = new EmbedBuilder().setTitle((item == null ? "All Items" : item.getName()) + " Leaderboard").setFooter(event.getAuthor().getName() + "'s Rank: " + (rank == -1 ? "N/A" : NumberUtility.getSuffixed(rank)) + " | Page " + page.getPage() + "/" + page.getMaxPage(), event.getAuthor().getEffectiveAvatarUrl());
            page.forEach((entry, index) -> embed.appendDescription(String.format("%d. `%s` - %,d %s\n", index + 1, MarkdownSanitizer.escape(entry.getKey().getAsTag()), entry.getValue(), item == null ? "Item" + (entry.getValue() == 1 ? "" : "s") : item.getName())));
            return new MessageBuilder().setEmbeds(embed.build());
        });
        paged.execute(event);
    });
}
Also used : User(net.dv8tion.jda.api.entities.User) ArrayList(java.util.ArrayList) Document(org.bson.Document) Bson(org.bson.conversions.Bson) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) MessageBuilder(net.dv8tion.jda.api.MessageBuilder) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) PagedResult(com.sx4.bot.paged.PagedResult) 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 9 with Item

use of com.sx4.bot.entities.economy.item.Item in project Sx4 by sx4-discord-bot.

the class MineCommand method onCommand.

public void onCommand(Sx4CommandEvent event) {
    EmbedBuilder embed = new EmbedBuilder();
    event.getMongo().withTransaction(session -> {
        Bson filter = Filters.and(Filters.eq("userId", event.getAuthor().getIdLong()), Filters.eq("item.type", ItemType.PICKAXE.getId()));
        Document data = event.getMongo().getItems().find(session, filter).first();
        if (data == null) {
            event.replyFailure("You do not have a pickaxe").queue();
            session.abortTransaction();
            return;
        }
        CooldownItemStack<Pickaxe> pickaxeStack = new CooldownItemStack<>(event.getBot().getEconomyManager(), data);
        long usableAmount = pickaxeStack.getUsableAmount();
        if (usableAmount == 0) {
            event.reply("Slow down! You can go mining again in " + TimeUtility.LONG_TIME_FORMATTER.parse(pickaxeStack.getTimeRemaining()) + " :stopwatch:").queue();
            session.abortTransaction();
            return;
        }
        Pickaxe pickaxe = pickaxeStack.getItem();
        long yield = pickaxe.getYield();
        List<ItemStack<Material>> materialStacks = pickaxe.getMaterialYield();
        String materials = materialStacks.stream().map(ItemStack::getItem).map(item -> item.getName() + item.getEmote()).collect(Collectors.joining(", "));
        embed.setAuthor(event.getAuthor().getName(), null, event.getAuthor().getEffectiveAvatarUrl()).setColor(event.getMember().getColorRaw()).setDescription(String.format("You mined resources and made **$%,d** :pick:\nMaterials found: %s", yield, materialStacks.isEmpty() ? "Nothing" : materials));
        if (pickaxe.getDurability() == 2) {
            embed.appendDescription("\n\nYour pickaxe will break the next time you use it :warning:");
        } else if (pickaxe.getDurability() == 1) {
            embed.appendDescription("\n\nYour pickaxe broke in the process");
        }
        Bson itemFilter = Filters.and(Filters.eq("userId", event.getAuthor().getIdLong()), Filters.eq("item.id", pickaxe.getId()));
        if (pickaxe.getDurability() == 1) {
            event.getMongo().getItems().deleteOne(session, itemFilter);
        } else {
            List<Bson> update = List.of(EconomyUtility.getResetsUpdate(usableAmount, MineCommand.COOLDOWN), Operators.set("item.durability", Operators.subtract("$item.durability", 1)));
            event.getMongo().getItems().updateOne(session, itemFilter, update);
        }
        for (ItemStack<?> stack : materialStacks) {
            Item item = stack.getItem();
            List<Bson> update = List.of(Operators.set("item", item.toData()), Operators.set("amount", Operators.add(Operators.ifNull("$amount", 0L), stack.getAmount())));
            Bson materialFilter = Filters.and(Filters.eq("userId", event.getAuthor().getIdLong()), Filters.eq("item.id", item.getId()));
            event.getMongo().getItems().updateOne(session, materialFilter, update, new UpdateOptions().upsert(true));
        }
        event.getMongo().getUsers().updateOne(session, Filters.eq("_id", event.getAuthor().getIdLong()), Updates.inc("economy.balance", yield), new UpdateOptions().upsert(true));
    }).whenComplete((updated, exception) -> {
        if (ExceptionUtility.sendExceptionally(event, exception)) {
            return;
        }
        if (updated) {
            event.reply(embed.build()).queue();
        }
    });
}
Also used : Document(org.bson.Document) Operators(com.sx4.bot.database.mongo.model.Operators) EconomyUtility(com.sx4.bot.utility.EconomyUtility) Sx4Command(com.sx4.bot.core.Sx4Command) Permission(net.dv8tion.jda.api.Permission) Updates(com.mongodb.client.model.Updates) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) Collectors(java.util.stream.Collectors) Filters(com.mongodb.client.model.Filters) Bson(org.bson.conversions.Bson) ModuleCategory(com.sx4.bot.category.ModuleCategory) List(java.util.List) com.sx4.bot.entities.economy.item(com.sx4.bot.entities.economy.item) Sx4CommandEvent(com.sx4.bot.core.Sx4CommandEvent) TimeUtility(com.sx4.bot.utility.TimeUtility) ExceptionUtility(com.sx4.bot.utility.ExceptionUtility) UpdateOptions(com.mongodb.client.model.UpdateOptions) Document(org.bson.Document) UpdateOptions(com.mongodb.client.model.UpdateOptions) Bson(org.bson.conversions.Bson) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) List(java.util.List)

Example 10 with Item

use of com.sx4.bot.entities.economy.item.Item in project Sx4 by sx4-discord-bot.

the class AdventCalendarCommand method onCommand.

public void onCommand(Sx4CommandEvent event) {
    ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
    int day = now.getDayOfMonth();
    if (now.getMonthValue() != 12 || day > 24) {
        event.replyFormat("There's no advent calendar box for the %s %s :no_entry:", NumberUtility.getSuffixed(day), now.getMonth().getDisplayName(TextStyle.FULL, Locale.UK)).queue();
        return;
    }
    EconomyManager manager = event.getBot().getEconomyManager();
    event.getMongo().withTransaction(session -> {
        Document data = event.getMongo().getUsers().findOneAndUpdate(session, Filters.eq("_id", event.getAuthor().getIdLong()), Updates.addToSet("economy.opened", day), new FindOneAndUpdateOptions().upsert(true));
        List<Integer> opened = data == null ? Collections.emptyList() : data.getEmbedded(List.of("economy", "opened"), Collections.emptyList());
        if (opened.contains(day)) {
            long secondsTillTomorrow = now.toLocalDate().atStartOfDay(ZoneOffset.UTC).plusDays(1).toEpochSecond() - now.toEpochSecond();
            event.replyFormat("You've already opened today's box on your advent calendar%s :no_entry:", day != 24 ? ", you can open tomorrows in **" + TimeUtility.LONG_TIME_FORMATTER.parse(Duration.of(secondsTillTomorrow, ChronoUnit.SECONDS)) + "**" : "").queue();
            session.abortTransaction();
            return null;
        }
        List<Item> items = manager.getItems();
        items.sort(Comparator.comparingLong(Item::getPrice).reversed());
        Item item = items.get(items.size() - 1);
        for (Item winnableItem : items) {
            if (winnableItem instanceof Tool) {
                continue;
            }
            int equation = (int) Math.ceil(winnableItem.getPrice() / Math.pow(day * 3, 2));
            if (manager.getRandom().nextInt(equation + 1) == 0) {
                item = winnableItem;
                break;
            }
        }
        if (opened.size() == 23) {
            Crate present = manager.getItemById(PRESENT_CRATE, Crate.class);
            List<Bson> update = List.of(Operators.set("item", present.toData()), Operators.set("amount", Operators.add(Operators.ifNull("$amount", 0L), 1L)));
            event.getMongo().getItems().updateOne(session, Filters.and(Filters.eq("userId", event.getAuthor().getIdLong()), Filters.eq("item.id", item.getId())), update, new UpdateOptions().upsert(true));
        }
        List<Bson> update = List.of(Operators.set("item", item.toData()), Operators.set("amount", Operators.add(Operators.ifNull("$amount", 0L), 1L)));
        event.getMongo().getItems().updateOne(session, Filters.and(Filters.eq("userId", event.getAuthor().getIdLong()), Filters.eq("item.id", item.getId())), update, new UpdateOptions().upsert(true));
        return "You opened your advent calendar for the " + NumberUtility.getSuffixed(day) + " and got **" + item.getName() + "**" + (opened.size() == 23 ? " and a **Present Crate**" : "") + " :christmas_tree:";
    }).whenComplete((content, exception) -> {
        if (ExceptionUtility.sendExceptionally(event, exception) || content == null) {
            return;
        }
        event.reply(content).queue();
    });
}
Also used : Document(org.bson.Document) ZonedDateTime(java.time.ZonedDateTime) FindOneAndUpdateOptions(com.mongodb.client.model.FindOneAndUpdateOptions) Filters(com.mongodb.client.model.Filters) Bson(org.bson.conversions.Bson) Item(com.sx4.bot.entities.economy.item.Item) Locale(java.util.Locale) Sx4CommandEvent(com.sx4.bot.core.Sx4CommandEvent) TimeUtility(com.sx4.bot.utility.TimeUtility) Duration(java.time.Duration) ZoneOffset(java.time.ZoneOffset) UpdateOptions(com.mongodb.client.model.UpdateOptions) Tool(com.sx4.bot.entities.economy.item.Tool) Operators(com.sx4.bot.database.mongo.model.Operators) TextStyle(java.time.format.TextStyle) Sx4Command(com.sx4.bot.core.Sx4Command) NumberUtility(com.sx4.bot.utility.NumberUtility) EconomyManager(com.sx4.bot.managers.EconomyManager) Updates(com.mongodb.client.model.Updates) ModuleCategory(com.sx4.bot.category.ModuleCategory) List(java.util.List) ChronoUnit(java.time.temporal.ChronoUnit) ExceptionUtility(com.sx4.bot.utility.ExceptionUtility) Crate(com.sx4.bot.entities.economy.item.Crate) Comparator(java.util.Comparator) Collections(java.util.Collections) Item(com.sx4.bot.entities.economy.item.Item) ZonedDateTime(java.time.ZonedDateTime) EconomyManager(com.sx4.bot.managers.EconomyManager) Crate(com.sx4.bot.entities.economy.item.Crate) FindOneAndUpdateOptions(com.mongodb.client.model.FindOneAndUpdateOptions) List(java.util.List) Document(org.bson.Document) FindOneAndUpdateOptions(com.mongodb.client.model.FindOneAndUpdateOptions) UpdateOptions(com.mongodb.client.model.UpdateOptions) Tool(com.sx4.bot.entities.economy.item.Tool)

Aggregations

Sx4Command (com.sx4.bot.core.Sx4Command)29 Document (org.bson.Document)29 EmbedBuilder (net.dv8tion.jda.api.EmbedBuilder)28 Bson (org.bson.conversions.Bson)27 Command (com.jockie.bot.core.command.Command)22 CommandId (com.sx4.bot.annotations.command.CommandId)22 Examples (com.sx4.bot.annotations.command.Examples)22 ModuleCategory (com.sx4.bot.category.ModuleCategory)18 Sx4CommandEvent (com.sx4.bot.core.Sx4CommandEvent)18 Permission (net.dv8tion.jda.api.Permission)17 Operators (com.sx4.bot.database.mongo.model.Operators)16 PagedResult (com.sx4.bot.paged.PagedResult)15 ExceptionUtility (com.sx4.bot.utility.ExceptionUtility)15 Argument (com.jockie.bot.core.argument.Argument)14 BotPermissions (com.sx4.bot.annotations.command.BotPermissions)14 Collectors (java.util.stream.Collectors)13 MessageBuilder (net.dv8tion.jda.api.MessageBuilder)13 ReturnDocument (com.mongodb.client.model.ReturnDocument)12 User (net.dv8tion.jda.api.entities.User)12 Filters (com.mongodb.client.model.Filters)11