From da9ece80133a33aff456d30854adc095b8f303ab Mon Sep 17 00:00:00 2001 From: davidovski Date: Fri, 17 Oct 2025 18:47:36 +0100 Subject: v0.5.1 --- .../mineshaft/MineshaftGiveResourcesCommand.java | 99 ++++++++++++++++++++ .../mineshaft/MineshaftLeaderBoardCommand.java | 102 +++++++++++++++++++++ src/main/java/net/uomc/mineshaft/Pickaxes.java | 2 +- src/main/java/net/uomc/mineshaft/Portal.java | 74 +++++++++++++++ .../mineshaft/resources/market/MarketCommand.java | 6 +- 5 files changed, 279 insertions(+), 4 deletions(-) create mode 100644 src/main/java/net/uomc/mineshaft/MineshaftGiveResourcesCommand.java create mode 100644 src/main/java/net/uomc/mineshaft/MineshaftLeaderBoardCommand.java create mode 100644 src/main/java/net/uomc/mineshaft/Portal.java (limited to 'src/main/java') diff --git a/src/main/java/net/uomc/mineshaft/MineshaftGiveResourcesCommand.java b/src/main/java/net/uomc/mineshaft/MineshaftGiveResourcesCommand.java new file mode 100644 index 0000000..553bb76 --- /dev/null +++ b/src/main/java/net/uomc/mineshaft/MineshaftGiveResourcesCommand.java @@ -0,0 +1,99 @@ +package net.uomc.mineshaft; + +import static java.lang.Math.abs; + +import java.util.List; +import java.util.Arrays; +import java.util.Optional; + +import com.mouldycheerio.dbot.CustomBot; +import com.mouldycheerio.dbot.commands.CommandDetails; +import com.mouldycheerio.dbot.commands.DetailedCommand; +import com.mouldycheerio.dbot.util.PeelingUtils; + +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.uomc.mineshaft.resources.Resource; + +public class MineshaftGiveResourcesCommand extends DetailedCommand { + + private String usage; + private Mineshaft bot; + + public MineshaftGiveResourcesCommand(Mineshaft bot) { + this.bot = bot; + setCommandDetails(CommandDetails.from("give", "Give a user an item", "give [@user] [quantity] [item]")); + usage = "\n`" + getCommandDetails().getUsage() + "`"; + + } + + @Override + public void execute(MessageReceivedEvent e, CustomBot op, String[] args) { + if (args.length < 3) { + op.sendErrorMessage(e, ":x: Invalid usage!" + usage); + return; + } + List argList = Arrays.asList(args); + + Optional memberMention = argList.stream().filter(s -> s.startsWith("<@")).findFirst(); + + if (memberMention.isEmpty()) { + op.sendErrorMessage(e, ":x: Invalid usage!" + usage); + return; + } + + Optional quantity = argList.stream().filter(s -> PeelingUtils.isLong(s)).map(s -> Long.parseLong(s)) + .findFirst(); + if (quantity.isEmpty()) { + op.sendErrorMessage(e, ":x: Invalid usage!" + usage); + return; + } + Optional resourceName = argList.stream().filter(s -> !s.startsWith("<@") && !PeelingUtils.isLong(s)) + .findFirst(); + if (resourceName.isEmpty()) { + op.sendErrorMessage(e, ":x: Invalid usage!" + usage); + return; + } + + boolean generate = argList.stream().filter(s -> "generate".equals(s)).findFirst().isPresent(); + + if (!e.getMember().getId().equals(op.getOwnerID())){ + generate = false; + } + + Optional mentionToUser = PeelingUtils.mentionToMember(memberMention.get(), e.getGuild()); + + if (!mentionToUser.isPresent()) { + op.sendErrorMessage(e, ":x: That user was not found!" + usage); + return; + } + + Member member = mentionToUser.get(); + long q = abs(quantity.get()); + + Resource resource = bot.getResourceManager().getResource(resourceName.get()); + if (resource == null) { + op.sendErrorMessage(e, ":x: Please provide a valid resource!" + usage); + return; + } + + if (!generate && q > resource.get(e.getMember())) { + op.sendErrorMessage(e, ":x: You do not have enough " + resource.getName() + "!"); + return; + } + + if (bot.getPickaxes().isNether(member) != bot.getPickaxes().isNether(e.getMember())) { + op.sendErrorMessage(e, ":x: You can't give items to players in other dimensions!"); + return; + } + + if (!generate) { + resource.increment(e.getMember(), -q); + } + + resource.increment(member, q); + op.sendSuccessMessage(e, + ":white_check_mark: You gave " + member.getAsMention() + " " + resource.prettyValue(q)); + } + +} diff --git a/src/main/java/net/uomc/mineshaft/MineshaftLeaderBoardCommand.java b/src/main/java/net/uomc/mineshaft/MineshaftLeaderBoardCommand.java new file mode 100644 index 0000000..91c9ef6 --- /dev/null +++ b/src/main/java/net/uomc/mineshaft/MineshaftLeaderBoardCommand.java @@ -0,0 +1,102 @@ +package net.uomc.mineshaft; + +import static java.util.stream.Collectors.toMap; + +import java.util.List; +import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.mouldycheerio.dbot.CustomBot; +import com.mouldycheerio.dbot.commands.CommandDetails; +import com.mouldycheerio.dbot.commands.DetailedCommand; +import com.mouldycheerio.dbot.util.PeelingUtils; + +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.uomc.mineshaft.resources.Resource; + +public class MineshaftLeaderBoardCommand extends DetailedCommand { + + private Mineshaft bot; + + public MineshaftLeaderBoardCommand(Mineshaft bot) { + setCommandDetails( + CommandDetails.from("leaderboard,lb,top,best", "Lists the most valuable users", "top [@user] [item]")); + this.bot = bot; + } + + @Override + public void execute(MessageReceivedEvent e, CustomBot op, String[] args) { + if (args.length > 0) { + Resource resource = bot.getResourceManager().getResource(args[0]); + if (resource == null) { + if (args[0].equalsIgnoreCase("pickaxes") || args[0].equalsIgnoreCase("pickaxe")) { + bot.sendMessage(e, "Leaderboard", makeMessage( + bot.getPickaxes().getMembers(e.getGuild()), "pickaxe level", + entry -> { + String ench = ""; + long level = bot.getPickaxes().getLevel(entry.getKey(), e.getGuild().getId()); + long fortune = bot.getPickaxes().getFortune(entry.getKey(), e.getGuild().getId()); + long efficiency = bot.getPickaxes().getEfficiency(entry.getKey(), e.getGuild().getId()); + + if (fortune > 0 || efficiency > 0) { + ench = String.format("(Eff%s,Fort%s)", efficiency, fortune); + } + return Pickaxes.pickaxeLevelToName(level) + ench ; + }, + user -> bot.getPickaxes().getLevel(user, e.getGuild().getId()) + bot.getPickaxes().getEfficiency(user, e.getGuild().getId()) + bot.getPickaxes().getFortune(user, e.getGuild().getId()))); + return; + } + if (args[0].equalsIgnoreCase("farm") || args[0].equalsIgnoreCase("farmlevel")) { + bot.sendMessage(e, "Leaderboard", makeMessage( + bot.getPickaxes().getMembers(e.getGuild()), "farm level", + entry -> PeelingUtils.amountToString(entry.getValue()), + user -> bot.getPickaxes().getFarmLevel(user, e.getGuild().getId()) + )); + return; + } + + op.sendErrorMessage(e, ":x: Please provide a valid resource!"); + return; + } + + bot.sendMessage(e, "Leaderboard", makeMessage( + resource.getMembers(e.getGuild()), resource.getSymbol(), + entry -> resource.prettyValue(entry.getValue()), + user -> resource.getValue(user, e.getGuild().getId()))); + return; + } + bot.sendMessage(e, "Leaderboard", makeMessage( + bot.getResourceManager().getPrimaryResource().getMembers(e.getGuild()), "inventory value", + entry -> PeelingUtils.amountToString(entry.getValue()), + user -> bot.getResourceManager() + .getResources() + .stream() + .map(r -> r.getValue(user, e.getGuild().getId()) * r.getValue()) + .reduce((long) 0, (a, b) -> a + b))); + } + + public String makeMessage(List members, String rankedBy, + Function, String> getValueString, Function getValueLong) { + + AtomicInteger n = new AtomicInteger(0); + + return "*ranked by " + rankedBy + "*\n\n" + String.join( + "\n", members.stream().collect( + toMap( + Function.identity(), + getValueLong)) + .entrySet().stream() + .sorted( + (o1, o2) -> Long.compare(o2.getValue(), o1.getValue())) + .limit(10) + .map( + entry -> String.format( + "%d <@%s> **%s**", + n.incrementAndGet(), + entry.getKey(), + getValueString.apply(entry))) + .collect(Collectors.toList())); + } +} diff --git a/src/main/java/net/uomc/mineshaft/Pickaxes.java b/src/main/java/net/uomc/mineshaft/Pickaxes.java index 16d6958..ca0fb34 100644 --- a/src/main/java/net/uomc/mineshaft/Pickaxes.java +++ b/src/main/java/net/uomc/mineshaft/Pickaxes.java @@ -23,7 +23,7 @@ public class Pickaxes { private static final String EFFICIENCY_TABLE = "ench_efficiency"; private static final String DIMENSION_TABLE = "dimension"; - private static final String FARM_LEVEL_TABLE = "farm"; + private static final String FARM_LEVEL_TABLE = "farms"; private String pickaxesDb; diff --git a/src/main/java/net/uomc/mineshaft/Portal.java b/src/main/java/net/uomc/mineshaft/Portal.java new file mode 100644 index 0000000..2d3df02 --- /dev/null +++ b/src/main/java/net/uomc/mineshaft/Portal.java @@ -0,0 +1,74 @@ +package net.uomc.mineshaft; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Random; +import java.util.stream.IntStream; +import java.util.stream.LongStream; + +import com.mouldycheerio.dbot.CustomBot; +import com.mouldycheerio.dbot.commands.CommandDetails; +import com.mouldycheerio.dbot.commands.CommandFail; +import com.mouldycheerio.dbot.commands.DetailedCommand; +import com.mouldycheerio.dbot.commands.cooldowns.CooldownCommand; +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.emoji.CustomEmoji; +import net.dv8tion.jda.api.entities.emoji.Emoji; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; + +public class Portal extends CooldownCommand { + + private static final String COMMAND_IMAGE = "https://minecraft.wiki/images/Nether_portal_%28animated%29.png?26915"; + private static final String NETHER_IMAGE = "https://minecraft.wiki/images/thumb/The_Nether.png/600px-The_Nether.png?92e82"; + private static final String OVERWORLD_IMAGE = "https://minecraft.wiki/images/thumb/Overworld_1.18.png/640px-Overworld_1.18.png?9499d"; + private static final String COMMAND_TITLE = "Portal"; + Mineshaft bot; + + public Portal(Mineshaft bot) { + super(bot); + setCommandDetails(CommandDetails.from("portal", "go to the nether", "furnace")); + this.bot = bot; + setCooldown(2l * 1000l); + } + + @Override + public boolean trigger(MessageReceivedEvent e) { + + long furnaces = bot.getItem(e.getMember(), MineshaftItem.PORTAL); + + if (furnaces < 1) { + bot.sendErrorMessage(e, ":x: You need to have at least **" + + bot.getItem(MineshaftItem.PORTAL).prettyValue(1) + + "** to use this!"); + return false; + } + + EmbedBuilder em = new EmbedBuilder(); + em.setTitle(COMMAND_TITLE); + em.setColor(PeelingUtils.hex2Rgb("#8947e8")); + em.setThumbnail(COMMAND_IMAGE); + + if (bot.getPickaxes().isNether(e.getMember())) { + bot.getPickaxes().setNether(e.getMember(), false); + + em.setDescription("You go through the potal... everything is back to normal\n\n**You are now in the overworld**"); + em.setImage(OVERWORLD_IMAGE); + } else { + bot.getPickaxes().setNether(e.getMember(), true); + em.setDescription("You go through the potal... things look different on this side...\n\n**You are now in the nether**"); + em.setFooter(COMMAND_IMAGE); + em.setImage(NETHER_IMAGE); + em.setFooter(EmojiParser.parseToUnicode(":bulb:") + "Use " + bot.getPrefixManager().getPrefix(e.getGuild()) + "portal at any time to return"); + } + + + e.getMessage().replyEmbeds(em.build()).queue(); + return true; + } + +} diff --git a/src/main/java/net/uomc/mineshaft/resources/market/MarketCommand.java b/src/main/java/net/uomc/mineshaft/resources/market/MarketCommand.java index 7b4122a..2b69223 100644 --- a/src/main/java/net/uomc/mineshaft/resources/market/MarketCommand.java +++ b/src/main/java/net/uomc/mineshaft/resources/market/MarketCommand.java @@ -43,9 +43,9 @@ public class MarketCommand extends DetailedCommand { e.getMessage().replyEmbeds(embedBuilder.build()).queue(); } else { embedBuilder.setDescription( - "Use `" + op.getPrefixManager().getPrefix(e.getGuild()) + "market buy [id]` to accept an offer\n" -+ "Use `" + op.getPrefixManager().getPrefix(e.getGuild()) + "market sell` to create an offer\n" - ); + "Use `" + op.getPrefixManager().getPrefix(e.getGuild()) + + "market buy [id]` to accept an offer\n" + "Use `" + + op.getPrefixManager().getPrefix(e.getGuild()) + "market sell` to create an offer\n"); e.getMessage().addReaction(Emoji.fromUnicode(EmojiParser.parseToUnicode(":white_check_mark:"))) .queue((r) -> { -- cgit v1.2.3