package net.uomc.mineshaft; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import com.mouldycheerio.dbot.util.EventWaiter; import com.mouldycheerio.dbot.util.PeelingUtils; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; public class DropUtil { private static final String FOLLOWING_STRING = "The following items have dropped:"; private static final int TO_PICK = 3; private static final double MAX_AMOUNT_PERCENT = 0.35; private static final long DROP_DURATION_SECONDS = 90; public static final String LOOT_STRING = "loot"; public static Map getDeathDrops(Mineshaft bot, Member member) { Map drop = new HashMap<>(); Map inventory = bot.getInventory(member); int items = TO_PICK; if (bot.getItem(member, MineshaftItem.XP) > 0) { drop.put(MineshaftItem.XP, (long) Math.ceil(bot.getItem(member, MineshaftItem.XP) * (Math.random() * MAX_AMOUNT_PERCENT))); items--; } int random = new Random().nextInt(); inventory.entrySet().stream().filter(e -> e.getValue() > 0 && e.getKey() != MineshaftItem.XP) .sorted(Comparator.comparingInt(o -> System.identityHashCode(o) ^ random)) .limit(items).collect(Collectors.toList()).forEach(e -> { drop.put(e.getKey(), (long) Math.ceil(e.getValue() * (Math.random() * MAX_AMOUNT_PERCENT))); }); return drop; } public static void spawnDropEdit(Mineshaft bot, Message message, MessageEmbed embed, Map items) { message.editMessageEmbeds(embed).setContent("").queue(m -> { waitForPickUp(bot, embed, items, m); }); } private static void waitForPickUp(Mineshaft bot, MessageEmbed embed, Map items, Message m) { EventWaiter eventWaiter = new EventWaiter(); m.getChannel().getJDA().addEventListener(eventWaiter); eventWaiter.waitForEvent(MessageReceivedEvent.class, e -> { if (!e.getMessage().getContentRaw().equalsIgnoreCase(LOOT_STRING)) return false; return true; }, e -> { bot.addItems(e.getMember(), items); EmbedBuilder em = new EmbedBuilder(embed); String desc = embed.getDescription().split(FOLLOWING_STRING)[0]; em.setDescription( desc + "\n" + e.getMember().getAsMention() + " claimed the loot!\n**" + bot.createItemList(items, "+%s") + "**"); m.editMessageEmbeds(em.build()).queue(); cleanupDrop(m.getChannel(), m); }, DROP_DURATION_SECONDS, TimeUnit.SECONDS, () -> { m.delete().queue(); cleanupDrop(m.getChannel(), m); }); } public static void spawnDrop(Mineshaft bot, MessageChannel channel, MessageEmbed embed, Map items) { channel.sendMessageEmbeds(embed).queue(m -> { waitForPickUp(bot, embed, items, m); }); } public static MessageEmbed getNoDropEmbed(Mineshaft bot, String reason, String title) { EmbedBuilder eb = new EmbedBuilder(); eb.setTitle(title); eb.getDescriptionBuilder().append(reason); eb.getDescriptionBuilder().append("\nThey dropped nothing..."); eb.setColor(bot.color); return eb.build(); } public static MessageEmbed getDropEmbed(Mineshaft bot, Map items, MessageEmbed embed) { EmbedBuilder eb = new EmbedBuilder(embed); if (!bot.isEmpty(items)) { eb.getDescriptionBuilder().append("\n" + FOLLOWING_STRING + "\n\n"); eb.getDescriptionBuilder().append(bot.createItemList(items)); eb.getDescriptionBuilder().append("\nSay `" + LOOT_STRING + "` to loot these items.\nHurry you only have " + PeelingUtils.formatTimeRelativeFromNow(DROP_DURATION_SECONDS * 1000l) + " to collect them!"); } return eb.build(); } public static MessageEmbed getDropEmbed(Mineshaft bot, Map items, String description, String title) { EmbedBuilder eb = new EmbedBuilder(); eb.setTitle(title); eb.getDescriptionBuilder().append(description); if (!bot.isEmpty(items)) { eb.getDescriptionBuilder().append("\n" + FOLLOWING_STRING + "\n\n"); eb.getDescriptionBuilder().append(bot.createItemList(items)); eb.getDescriptionBuilder().append("\n\nSay `" + LOOT_STRING + "` to loot these items.\nHurry you only have " + PeelingUtils.formatTimeRelativeFromNow(DROP_DURATION_SECONDS * 1000l) + " to collect them!"); } eb.setColor(bot.color); return eb.build(); } public static void cleanupDrop(MessageChannel channel, Message message) { channel.getHistoryAfter(message, 100).queueAfter(1, TimeUnit.SECONDS, h -> { ArrayList msgs = new ArrayList(); h.getRetrievedHistory().forEach(m -> { if (m.getContentRaw().equalsIgnoreCase(LOOT_STRING)) { msgs.add(m); } }); PeelingUtils.bulkDelte(channel, msgs); }); ; } }