package net.uomc.mineshaft.farm; import java.awt.Color; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; import com.mouldycheerio.dbot.commands.CommandDetails; import com.mouldycheerio.dbot.commands.cooldowns.CooldownCommand; import com.mouldycheerio.dbot.util.PeelingUtils; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.uomc.mineshaft.Mineshaft; import net.uomc.mineshaft.MineshaftItem; public class CompostCommand extends CooldownCommand { private static final Color COMMAND_COLOUR = PeelingUtils.hex2Rgb("#603a19"); private static final String COMMAND_IMAGE = "https://minecraft.wiki/images/Composter_JE1.png"; public static final int COMPOST_LEVEL = 7; private static final String COMMAND_TITLE = "Composter"; Mineshaft bot; List compostable; public CompostCommand(Mineshaft bot) { super(bot); setCommandDetails(CommandDetails.from("compost,compostor,composter", "access your compostor", "farm")); setCooldown(1000l * 30l); compostable = new ArrayList<>(); compostable.add(MineshaftItem.CARROT); compostable.add(MineshaftItem.FISH); compostable.add(MineshaftItem.POTATO); compostable.add(MineshaftItem.CANE); this.bot = bot; } @Override public boolean trigger(MessageReceivedEvent e) { long composters = bot.getItem(e.getMember(), MineshaftItem.COMPOSTER); String[] args = e.getMessage().getContentRaw().split("\\s+"); if (composters < 1) { bot.sendErrorMessage(e, ":x: You need to have at least **" + bot.getItem(MineshaftItem.COMPOSTER).prettyValue(1) + "** to use this!"); return false; } if (args.length > 1) { List argList = Arrays.asList(Arrays.copyOfRange(args, 1, args.length)); return compost(e, argList, composters); } StringBuilder description = new StringBuilder(); description.append(String.format("This is your compostor, level `%s`.\nUse `%scompost [item]` to compost your items\n\n", composters, bot.getPrefixManager().getPrefix(e.getGuild()), bot.getPrefixManager().getPrefix(e.getGuild()))); AtomicLong amount = new AtomicLong(); compostable.forEach(i -> { long q = bot.getItem(e.getMember(), i); if (q < 1) { return; } long itemAmount = getMaxCompostable(e.getMember(), composters, i); long bonemealAmount = (long) (itemAmount / COMPOST_LEVEL); description.append(String.format("%s->%s\n", bot.getItem(i).prettyValue(itemAmount), bot.getItem(MineshaftItem.BONEMEAL).prettyValue(bonemealAmount))); }); if (amount.get() == 0) { description.append("*You have nothing that can be composted*"); } EmbedBuilder em = new EmbedBuilder(); em.setTitle(COMMAND_TITLE); em.setDescription(description); em.setColor(COMMAND_COLOUR); em.setThumbnail(COMMAND_IMAGE); e.getMessage().replyEmbeds(em.build()).queue(); return false; } private boolean compost(MessageReceivedEvent e, List argList, long composters) { Optional resourceName = argList.stream().findFirst(); if (resourceName.isEmpty()) return false; MineshaftItem item = MineshaftItem.valueOf(resourceName.get().toUpperCase()); if (item == null) { bot.sendErrorMessage(e, ":x: Please provide a valid item! `m!compost [item]`"); return false; } if (!compostable.contains(item)) { bot.sendErrorMessage(e, ":x: This item cannot be composted"); return false; } long itemAmount = getMaxCompostable(e.getMember(), composters, item); // should never happen technically if (itemAmount > bot.getItem(item).get(e.getMember())) { bot.sendErrorMessage(e, ":x: You dont have enough " + bot.getItem(item).getSymbol()); return true; } long bonemealAmount = (long) (itemAmount / COMPOST_LEVEL); bot.removeItem(e.getMember(), item, itemAmount); bot.addItem(e.getMember(), MineshaftItem.BONEMEAL, bonemealAmount); String content = String.format(":white_check_mark: You turned %s into %s", bot.getItem(item).prettyValue(itemAmount), bot.getItem(MineshaftItem.BONEMEAL).prettyValue(bonemealAmount)); if (bot.getPickaxes().getFarmLevel(e.getMember()) < 1) { content += "\nUse your bonemeal to expand your `m!farm`"; } bot.sendSuccessMessage(e, content); return true; } public long getMaxCompostable(Member m, long composters, MineshaftItem i) { return Math.min(bot.getItem(m, i), composters*COMPOST_LEVEL); } }