diff options
| author | davidovski <david@davidovski.xyz> | 2025-10-11 04:55:51 +0100 |
|---|---|---|
| committer | davidovski <david@davidovski.xyz> | 2025-10-11 04:55:51 +0100 |
| commit | 10b327e9f6441a8863227ce3e075a5a587654065 (patch) | |
| tree | 5e94ecc91290febacf5181d3596563a7a24bd010 /src/main/java/net/uomc/mineshaft/RobCommand.java | |
v0.3.1
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/RobCommand.java')
| -rw-r--r-- | src/main/java/net/uomc/mineshaft/RobCommand.java | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/main/java/net/uomc/mineshaft/RobCommand.java b/src/main/java/net/uomc/mineshaft/RobCommand.java new file mode 100644 index 0000000..c04f2f4 --- /dev/null +++ b/src/main/java/net/uomc/mineshaft/RobCommand.java @@ -0,0 +1,142 @@ +package net.uomc.mineshaft; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Random; +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.util.PeelingUtils; +import com.mouldycheerio.dbot.util.EventWaiter; +import com.vdurmont.emoji.EmojiParser; + +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.entities.emoji.Emoji; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; + +public class RobCommand extends CooldownCommand { + + private static final int TO_PICK = 3; + private static final double MAX_AMOUNT_PERCENT = 0.2; + private static final long DROP_DURATION_SECONDS = 90; + private static final String LOOT_STRING = "loot"; + private Mineshaft bot; + private @NotNull String embedTitle; + + protected RobCommand(Mineshaft bot) { + super(bot); + setCooldown(60l * 30l * 1000l); + this.bot = bot; + setDetails(CommandDetails.from("kill,pvp,rob", "kill another player")); + embedTitle = EmojiParser.parseToUnicode(":crossed_swords:"); + } + + @Override + public boolean trigger(MessageReceivedEvent e) { + String[] args = e.getMessage().getContentRaw().split(" "); + if (args.length < 2) { + e.getMessage().reply(":x: Please specify a target! `kill @user`").queue(); + return false; + } + + Optional<Member> mentionToMember = PeelingUtils.mentionToMember(args[1], e.getGuild()); + if (!mentionToMember.isPresent()) { + e.getMessage().reply(":x: Invalid Target! `kill @user`").queue(); + return false; + } + Member target = mentionToMember.get(); + + String response = target.getAsMention() + " was slain by " + e.getAuthor().getAsMention(); + + Map<MineshaftItem, Long> rob = getRob(target); + + EmbedBuilder eb = new EmbedBuilder(); + eb.setTitle(embedTitle); + eb.getDescriptionBuilder().append(response); + eb.getDescriptionBuilder().append("\nThey dropped:\n\n"); + eb.getDescriptionBuilder().append(bot.createItemList(rob)); + 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); + + e.getMessage().addReaction(Emoji.fromUnicode(EmojiParser.parseToUnicode(":crossed_swords:"))).queue(); + spawnDrop(e, eb.build(), target, rob); + + return true; + } + + public Map<MineshaftItem, Long> getRob(Member member) { + Map<MineshaftItem, Long> rob = new HashMap<>(); + + Map<MineshaftItem, Long> inventory = bot.getInventory(member); + + int items = TO_PICK; + if (bot.getItem(member, MineshaftItem.XP) > 0) { + rob.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 -> { + rob.put(e.getKey(), + (long) Math.ceil(e.getValue() * (Math.random() * MAX_AMOUNT_PERCENT)) + ); + }); + + + return rob; + } + + public void spawnDrop(MessageReceivedEvent event, MessageEmbed embed, Member target, Map<MineshaftItem, Long> rob) { + bot.removeItems(target, rob); + + event.getChannel().sendMessageEmbeds(embed).queue( m -> { + + EventWaiter eventWaiter = new EventWaiter(); + event.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(), rob); + bot.editMessage(m, embedTitle, e.getMember().getAsMention() + " claimed the loot!\n**" + bot.createItemList(rob, "+%s") + "**"); + cleanup(event.getChannel(), m); + }, DROP_DURATION_SECONDS, TimeUnit.SECONDS, () -> { + m.delete().queue(); + cleanup(event.getChannel(), m); + }); + }); + } + public void cleanup(MessageChannel channel, Message message) { + message.delete().queueAfter(60, TimeUnit.SECONDS); + + channel.getHistoryAfter(message, 100).queueAfter(1, TimeUnit.SECONDS, h -> { + ArrayList<Message> msgs = new ArrayList<Message>(); + h.getRetrievedHistory().forEach(m -> { + if (m.getContentRaw().equalsIgnoreCase(LOOT_STRING)) { + msgs.add(m); + } + }); + PeelingUtils.bulkDelte(channel, msgs); + }); + ; + } +} |
