package net.uomc.mineshaft; import static java.util.Map.entry; import java.awt.Color; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import org.jetbrains.annotations.NotNull; import com.mouldycheerio.dbot.commands.CommandDetails; import com.mouldycheerio.dbot.commands.cooldowns.CooldownCommand; import com.mouldycheerio.dbot.commands.cooldowns.CooldownController; import com.mouldycheerio.dbot.util.PeelingUtils; import com.vdurmont.emoji.EmojiParser; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.emoji.Emoji; import net.dv8tion.jda.api.entities.emoji.UnicodeEmoji; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.uomc.mineshaft.resources.commands.LeaderBoardCommand; public class EatCommand extends CooldownCommand { private static final UnicodeEmoji EAT_EMOJI = Emoji.fromUnicode(EmojiParser.parseToUnicode(":fork_and_knife:")); private static final Color COMMAND_COLOR = PeelingUtils.hex2Rgb("#b23028"); private Mineshaft bot; private Map edible; public EatCommand(Mineshaft bot) { super(bot); setCommandDetails(CommandDetails.from("eat", "eat", "eat")); this.bot = bot; setCooldown(3l * 60l * 1000l); edible = Map.ofEntries( entry(MineshaftItem.POTATO, 1l), entry(MineshaftItem.CARROT, 1l), entry(MineshaftItem.FISH, 2l), entry(MineshaftItem.COOKED_FISH, 10l), entry(MineshaftItem.BAKED_POTATO, 8l) ); } @Override public boolean trigger(MessageReceivedEvent e) { String[] args = e.getMessage().getContentRaw().split("\\s+"); if (args.length > 1) { String arg = String.join("_", Arrays.asList(Arrays.copyOfRange(args, 1, args.length))); MineshaftItem item = MineshaftItem.valueOf(arg.toUpperCase()); if (item == null) { bot.sendErrorMessage(e, ":x: Please provide a valid item! `m!eat [item]`"); return false; } return eat(e, item); } String edible = getEdibleItems(e.getMember()); if (edible.length() < 0) { bot.sendErrorMessage(e, ":x: You have no edible items!"); return false; } EmbedBuilder em = new EmbedBuilder(); em.setColor(COMMAND_COLOR); em.setTitle("Eat"); em.setDescription("Use `m!eat [item]` to eat an item! The following items can be eaten:\n\n"); em.appendDescription(edible); e.getMessage().replyEmbeds(em.build()).queue(); return false; } public Mineshaft getBot() { return bot; } public String getEdibleItems(Member m) { return edible.entrySet().stream().filter(entry -> bot.hasItem(m, entry.getKey())).map(entry -> bot.prettyValue(entry.getKey(), 1) + "🡒" + PlayerHealths.getHPString(entry.getValue()) ).collect(Collectors.joining("\n")); } public boolean eat(MessageReceivedEvent event, MineshaftItem item) { Member member = event.getMember(); if (bot.getPlayerStats().isInBattle(member)) { bot.sendErrorMessage(event, ":x: You can't eat until pvp is over!"); return false; } if (!bot.hasItem(member, item)) { bot.sendErrorMessage(event, "You don't have any " + bot.getItem(item).getSymbol() + " to eat!"); return false; } if (!isEdible(item)) { bot.sendErrorMessage(event, "This item not edible!"); return false; } long hp = bot.getHealths().getHP(member); if (hp >= PlayerHealths.MAX_HP) { bot.sendErrorMessage(event, "You can't eat this! You are already at " + PlayerHealths.getHPString(hp)); return false; } long itemHp = edible.get(item); hp += itemHp; if (hp > PlayerHealths.MAX_HP) { hp = PlayerHealths.MAX_HP; } bot.removeItem(member, item, 1); bot.getHealths().setHP(member, hp); event.getMessage().addReaction(EAT_EMOJI).queue(r -> { event.getMessage().reply( EAT_EMOJI.getFormatted() + " You ate " + bot.prettyValue(item, 1) + ". You are now on " + bot.getHealths().getHPString(member) + " (+" + itemHp + ")" ).delay(10, TimeUnit.SECONDS) .flatMap(m -> m.delete()).queue(); }); return true; } public boolean isEdible(MineshaftItem item) { return edible.entrySet().stream().filter(entry -> entry.getKey() == item).findFirst().isPresent(); } }