diff options
| author | davidovski <david@davidovski.xyz> | 2025-10-15 04:01:15 +0100 |
|---|---|---|
| committer | davidovski <david@davidovski.xyz> | 2025-10-15 04:01:15 +0100 |
| commit | dc825ad776f9fe9f763267874f6fa70c4870fc46 (patch) | |
| tree | d8d2bcf26b180f2c1abbab4e0dc1929dd88e05ab /src/main/java/net/uomc/mineshaft/resources | |
| parent | 10b327e9f6441a8863227ce3e075a5a587654065 (diff) | |
v5
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/resources')
7 files changed, 166 insertions, 114 deletions
diff --git a/src/main/java/net/uomc/mineshaft/resources/Resource.java b/src/main/java/net/uomc/mineshaft/resources/Resource.java index 1cd508e..3b02050 100644 --- a/src/main/java/net/uomc/mineshaft/resources/Resource.java +++ b/src/main/java/net/uomc/mineshaft/resources/Resource.java @@ -123,7 +123,7 @@ public class Resource extends JSONObject { } public long getValue() { - if (total() <= 0) { + if (total() <= 0 || resourceManager.getPrimaryResource().total() <= 0) { return -1; } else { return resourceManager.getPrimaryResource().total() / total(); diff --git a/src/main/java/net/uomc/mineshaft/resources/ResourceManager.java b/src/main/java/net/uomc/mineshaft/resources/ResourceManager.java index 8c58ab3..da1bd83 100644 --- a/src/main/java/net/uomc/mineshaft/resources/ResourceManager.java +++ b/src/main/java/net/uomc/mineshaft/resources/ResourceManager.java @@ -45,6 +45,7 @@ public class ResourceManager { private MarketManager marketManager; + public ResourceManager(CustomBot customBot) { this.bot = customBot; configFile = new File(customBot.getDatadir(), "resources_config.json"); @@ -169,6 +170,10 @@ public class ResourceManager { return resource == null ? resources.get(0) : resource; } + public long getTotalResources() { + return resources.stream().mapToLong(r -> r.total()).sum(); + + } public String getPrimaryResourceName() { return primaryResource; @@ -221,4 +226,8 @@ public class ResourceManager { }); return string.toString(); } + + public MarketManager getMarketManager() { + return marketManager; + } } diff --git a/src/main/java/net/uomc/mineshaft/resources/commands/GiveResourcesCommand.java b/src/main/java/net/uomc/mineshaft/resources/commands/GiveResourcesCommand.java index a98a452..2925bd4 100644 --- a/src/main/java/net/uomc/mineshaft/resources/commands/GiveResourcesCommand.java +++ b/src/main/java/net/uomc/mineshaft/resources/commands/GiveResourcesCommand.java @@ -2,6 +2,8 @@ package net.uomc.mineshaft.resources.commands; import static java.lang.Math.abs; +import java.util.List; +import java.util.Arrays; import java.util.Optional; import com.mouldycheerio.dbot.CustomBot; @@ -9,7 +11,6 @@ import com.mouldycheerio.dbot.commands.CommandDetails; import com.mouldycheerio.dbot.util.PeelingUtils; import net.dv8tion.jda.api.entities.Member; -import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.uomc.mineshaft.resources.Resource; import net.uomc.mineshaft.resources.ResourceManager; @@ -20,66 +21,73 @@ public class GiveResourcesCommand extends ResourceCommand { public GiveResourcesCommand(ResourceManager resourceManager) { super(resourceManager); - setCommandDetails(CommandDetails.from("give,trade", "Give a user an item", "give [@user] [quantity] [item]")); + 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 > 1) { - String usermention = args[0]; - String quantitystring = args[1]; - String resourcename = getResourceManager().getPrimaryResourceName(); - if (args.length > 2) { - resourcename = args[2]; - } - - boolean generate = false; - String ownerid = op.getConfig().getString("ownerid"); - if (ownerid.equals(e.getAuthor().getId())) { - if (args.length > 3) { - if (args[3].equals("generate")) { - generate = true; - } - } - } - Optional<Member> mentionToUser = PeelingUtils.mentionToMember(usermention, e.getGuild()); - if (mentionToUser.isPresent()) { - Member member = mentionToUser.get(); - try { - long quantity = Long.parseLong(quantitystring); - quantity = abs(quantity); - - Resource resource = getResourceManager().getResource(resourcename); - if (resource != null) { - - if (!generate && quantity > resource.get(e.getMember())) { - op.sendErrorMessage(e,":x: You do not have enough " + resource.getName() + "!"); - } else { - if (!generate) { - resource.increment(e.getMember(), -quantity); - } - resource.increment(member, quantity); - op.sendSuccessMessage(e, ":white_check_mark: You gave " + member.getAsMention() + " " + resource.prettyValue(quantity)); - } - } else { - op.sendErrorMessage(e, ":x: Please provide a valid resource!" + usage); - - } - - } catch (NumberFormatException ex) { - op.sendErrorMessage(e,":x: Please provide a valid quantity!" + usage); - - } - - } else { - op.sendErrorMessage(e, ":x: That user was not found!" + usage); - } - } else { + if (args.length < 3) { op.sendErrorMessage(e, ":x: Invalid usage!" + usage); + return; + } + List<String> argList = Arrays.asList(args); + + Optional<String> memberMention = argList.stream().filter(s -> s.startsWith("<@")).findFirst(); + + if (memberMention.isEmpty()) { + op.sendErrorMessage(e, ":x: Invalid usage!" + usage); + return; + } + + Optional<Long> 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<String> 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<Member> 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 = 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 (!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/resources/commands/ValuesCommand.java b/src/main/java/net/uomc/mineshaft/resources/commands/ValuesCommand.java index c094d83..084856b 100644 --- a/src/main/java/net/uomc/mineshaft/resources/commands/ValuesCommand.java +++ b/src/main/java/net/uomc/mineshaft/resources/commands/ValuesCommand.java @@ -7,6 +7,7 @@ import java.util.List; import com.mouldycheerio.dbot.CustomBot; import com.mouldycheerio.dbot.commands.CommandDetails; import com.mouldycheerio.dbot.commands.CommandFail; +import com.mouldycheerio.dbot.util.PeelingUtils; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.uomc.mineshaft.resources.Resource; @@ -21,8 +22,6 @@ public class ValuesCommand extends ResourceCommand { @Override public void execute(MessageReceivedEvent e, CustomBot b, String[] args) throws CommandFail { - long total = getResourceManager().getPrimaryResource().total(); - List<Resource> resources = new ArrayList<Resource>(getResourceManager().getResources()); Collections.sort(resources, (r1, r2) -> Long.compare(r2.getValue(),r1.getValue())); @@ -33,13 +32,11 @@ public class ValuesCommand extends ResourceCommand { if (v < 0) { stringBuilder.append("**???**"); } else { - stringBuilder.append("**" + getResourceManager().getPrimaryResource().prettyValue(v) + "**"); + stringBuilder.append("**" +PeelingUtils.amountToString(v) + "**"); } stringBuilder.append("\n"); }); b.sendMessage(e, "Estimated Market Values", stringBuilder.toString()); } - - } 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 47b0536..7b4122a 100644 --- a/src/main/java/net/uomc/mineshaft/resources/market/MarketCommand.java +++ b/src/main/java/net/uomc/mineshaft/resources/market/MarketCommand.java @@ -6,12 +6,14 @@ import com.mouldycheerio.dbot.CustomBot; import com.mouldycheerio.dbot.commands.CommandDetails; import com.mouldycheerio.dbot.commands.DetailedCommand; import com.mouldycheerio.dbot.util.PeelingUtils; +import com.vdurmont.emoji.EmojiParser; import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.MessageEmbed.Field; +import net.dv8tion.jda.api.entities.emoji.Emoji; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.uomc.mineshaft.resources.Resource; import net.uomc.mineshaft.resources.ResourceManager; -import net.uomc.mineshaft.resources.market.Offer; public class MarketCommand extends DetailedCommand { private ResourceManager resourceManager; @@ -26,21 +28,30 @@ public class MarketCommand extends DetailedCommand { @Override public void execute(MessageReceivedEvent e, CustomBot op, String[] args) { + market(e, op, args); + } - marketManager.processOffers(); + private void market(MessageReceivedEvent e, CustomBot op, String[] args) { + marketManager.processOffers(e.getGuild()); if (args.length == 0) { - // TODO allow multipages with <-, -> - EmbedBuilder embedBuilder = new EmbedBuilder(); embedBuilder.setTitle("Market"); embedBuilder.setColor(op.color); - if (marketManager.getEmbedFields().size() == 0) { + List<Field> embedFields = marketManager.getEmbedFields(e.getGuild()); + if (embedFields.size() == 0) { embedBuilder.setDescription("**:x: There are no available offers!**\n" + "Create one with `market sell`"); e.getMessage().replyEmbeds(embedBuilder.build()).queue(); } else { - embedBuilder.setDescription("Use `" + op.getPrefixManager().getPrefix(e.getGuild()) + "market buy [id]` to accept an offer"); - PeelingUtils.pagesEmbed(e.getAuthor(), e.getChannel(), embedBuilder, marketManager.getEmbedFields()); - } + 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" + ); + + e.getMessage().addReaction(Emoji.fromUnicode(EmojiParser.parseToUnicode(":white_check_mark:"))) + .queue((r) -> { + PeelingUtils.pagesEmbed(e.getAuthor(), e.getChannel(), embedBuilder, embedFields); + }); + } } else if (args.length > 0) { if (args[0].equals("buy")) { @@ -76,7 +87,7 @@ public class MarketCommand extends DetailedCommand { offer.setSellingQuantity(sellQ); offer.setSellingResource(sellR); - marketManager.addOffer(offer); + marketManager.addOffer(e.getGuild(), offer); op.sendSuccessMessage(e, ":white_check_mark: successfully listed **" + offer.getAsString(resourceManager) + "** offer id: `" + offer.getID() + "`"); } else { op.sendErrorMessage(e, ":x: You don't have enough " + sellR + " to offer"); @@ -99,19 +110,20 @@ public class MarketCommand extends DetailedCommand { int q1 = (int) (Math.random() * 10); int q2 = (int) (Math.random() * 10); - op.sendMessage( - e, "incorrect usage", + op.sendErrorMessage( + e, ":x: usage: `market sell [items] for [price]`\ni.e: `market sell " + q1 + " " + resource1.getName() + " for " + q2 + " " + resource2.getName() + "`" ); } private void buy(MessageReceivedEvent e, CustomBot op, String[] args) { String id = args[1]; - Offer offer = marketManager.getOffer(id); + Offer offer = marketManager.getOffer(e.getGuild(), id); if (offer != null) { offer.getMember(e.getGuild(), seller -> { - if (seller.equals(e.getAuthor())) { - op.sendErrorMessage(e, ":x: you cannot accept your own offer"); + + if (e.getMember().equals(seller)) { + op.sendErrorMessage(e, ":x: You cannot accept your own offer"); } else { long buyingQuantity = offer.getBuyingQuantity(); Resource buyingResource = offer.getBuyingResource(resourceManager); @@ -120,6 +132,12 @@ public class MarketCommand extends DetailedCommand { long sellingQuantity = offer.getSellingQuantity(); Resource sellingResource = offer.getSellingResource(resourceManager); + if (sellingResource.get(seller) < sellingQuantity) { + op.sendErrorMessage(e, ":x: This offer no longer exists as " + seller.getAsMention() + "does not have enough " + sellingResource.getName()); + marketManager.removeOffer(e.getGuild(), offer); + return; + } + buyingResource.increment(e.getMember(), -buyingQuantity); sellingResource.increment(e.getMember(), sellingQuantity); @@ -127,6 +145,7 @@ public class MarketCommand extends DetailedCommand { buyingResource.increment(seller, buyingQuantity); sellingResource.increment(seller, -sellingQuantity); } + seller.getUser().openPrivateChannel().queue(pc -> { pc.sendMessage( "**" + e.getAuthor().getAsTag() + "** has accepted your market offer: **" + offer.getAsString(resourceManager) + "** [" + offer.getID() + "]" @@ -134,26 +153,25 @@ public class MarketCommand extends DetailedCommand { .queue(); }); - String from = ""; - if (seller != null) { - from = " from " + seller.getAsMention(); - } + String from = " from " + seller.getAsMention(); - marketManager.removeOffer(offer); - op.sendSuccessMessage( + marketManager.removeOffer(e.getGuild(), offer); + e.getMessage().addReaction(Emoji.fromUnicode(EmojiParser.parseToUnicode(":white_check_mark:"))).queue((r) -> { + op.sendMessageRaw( e, ":white_check_mark: successfully bought **" + sellingResource.prettyValue(sellingQuantity) + "** for **" + buyingResource.prettyValue(buyingQuantity) + "**" + from ); + }); } else { long have = buyingResource.get(e.getMember()); long more = buyingQuantity - have; - op.sendErrorMessage(e, ":x: you need **" + buyingResource.prettyValue(more) + "** more to buy this"); + op.sendErrorMessage(e, ":x: You need **" + buyingResource.prettyValue(more) + "** more to buy this"); } } }); } else { - op.sendErrorMessage(e, ":x: please specify a valid id!"); + op.sendErrorMessage(e, ":x: Please specify a valid id!"); } } } diff --git a/src/main/java/net/uomc/mineshaft/resources/market/MarketManager.java b/src/main/java/net/uomc/mineshaft/resources/market/MarketManager.java index 05517aa..3b820b5 100644 --- a/src/main/java/net/uomc/mineshaft/resources/market/MarketManager.java +++ b/src/main/java/net/uomc/mineshaft/resources/market/MarketManager.java @@ -3,8 +3,10 @@ package net.uomc.mineshaft.resources.market; import java.io.File; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import org.json.JSONObject; @@ -12,6 +14,7 @@ import org.json.JSONObject; import com.mouldycheerio.dbot.CustomBot; import com.mouldycheerio.dbot.util.PeelingUtils; +import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.MessageEmbed.Field; import net.dv8tion.jda.api.entities.User; import net.uomc.mineshaft.resources.Resource; @@ -21,7 +24,7 @@ import net.uomc.mineshaft.resources.market.Offer; public class MarketManager { private ResourceManager resourceManager; - private List<Offer> offers = new ArrayList<Offer>(); + private Map<Guild, List<Offer>> guildOffers = new HashMap<Guild, List<Offer>>(); private File dataFile; @@ -38,27 +41,48 @@ public class MarketManager { public void load() { JSONObject loadJSON = PeelingUtils.loadJSON(dataFile); - if (loadJSON.has("offers")) { - loadJSON.getJSONArray("offers").forEach(o -> { - if (o instanceof JSONObject) { - Offer offer = new Offer((JSONObject) o); - offers.add(offer); - } + if (loadJSON.has("guilds")) { + loadJSON.getJSONObject("guilds").keySet().forEach(g -> { + Guild guild = bot.getClient().getGuildById(g); + if (guild == null) + return; + + guildOffers.put(guild, new ArrayList<Offer>()); + + loadJSON.getJSONObject("guilds").getJSONArray(g).forEach(o -> { + if (o instanceof JSONObject) { + Offer offer = new Offer((JSONObject) o); + guildOffers.get(guild).add(offer); + } + }); }); } } public void save() { JSONObject jsonObject = new JSONObject(); - for (Offer offer : offers) { - jsonObject.append("offers", offer); - } + + JSONObject guilds = new JSONObject(); + + guildOffers.forEach((g, l) -> { + l.forEach(o -> { + guilds.append(g.getId(), o); + }); + }); + jsonObject.put("guilds", guilds); PeelingUtils.saveJSON(dataFile, jsonObject); } - public Offer getOffer(String id) { - for (Offer offer : offers) { + public List<Offer> getOffers(Guild guild) { + if (!guildOffers.containsKey(guild)) { + guildOffers.put(guild, new ArrayList<Offer>()); + } + return guildOffers.get(guild); + } + + public Offer getOffer(Guild guild, String id) { + for (Offer offer : getOffers(guild)) { if (id.equals(offer.getID() + "")) { return offer; } @@ -66,27 +90,23 @@ public class MarketManager { return null; } - public void addOffer(Offer offer) { - offers.add(offer); - processOffers(); + public void addOffer(Guild guild, Offer offer) { + getOffers(guild).add(offer); + processOffers(guild); + save(); } - public void processOffers() { - // TODO uhhh we should bring this back - //Iterator<Offer> iterator = offers.iterator(); + public void processOffers(Guild guild) { + // TODO Fix tis + //Iterator<Offer> iterator = getOffers(guild).iterator(); //while (iterator.hasNext()) { // Offer offer = iterator.next(); - // bot.getClient().retrieveUserById(offer.getUserID()).queue(seller -> { - // long quantity = offer.getSellingQuantity(); - // Resource resource = offer.getSellingResource(resourceManager); - // long l = resource.get(seller); - // if (l < quantity) { + // if (l < quantity) { - // sendNoLongerValidMessage(offer, seller); - // iterator.remove(); - // } - // }); + // sendNoLongerValidMessage(offer, seller); + // iterator.remove(); + // } //} //save(); @@ -98,17 +118,17 @@ public class MarketManager { }); } - public void removeOffer(Offer o) { - offers.remove(o); + public void removeOffer(Guild guild, Offer o) { + getOffers(guild).remove(o); save(); } - public List<Offer> listOffers() { - return Collections.unmodifiableList(offers); + public List<Offer> listOffers(Guild guild) { + return Collections.unmodifiableList(getOffers(guild)); } - public List<Field> getEmbedFields() { - return listOffers().stream().map( + public List<Field> getEmbedFields(Guild guild) { + return listOffers(guild).stream().map( o -> new Field( "[" + o.getID() + "] " + o.getAsString(resourceManager), diff --git a/src/main/java/net/uomc/mineshaft/resources/market/Offer.java b/src/main/java/net/uomc/mineshaft/resources/market/Offer.java index 9e01acd..d093f2f 100644 --- a/src/main/java/net/uomc/mineshaft/resources/market/Offer.java +++ b/src/main/java/net/uomc/mineshaft/resources/market/Offer.java @@ -53,7 +53,7 @@ public class Offer extends JSONObject { } public void getMember(Guild guild, Consumer<Member> c) { - c.accept(guild.getMemberById(getUserID())); + guild.retrieveMemberById(getUserID()).queue(c); } public Member getMember(Guild guild) { |
