summaryrefslogtreecommitdiff
path: root/src/main/java/net/uomc/mineshaft/resources
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/resources')
-rw-r--r--src/main/java/net/uomc/mineshaft/resources/Resource.java2
-rw-r--r--src/main/java/net/uomc/mineshaft/resources/ResourceManager.java9
-rw-r--r--src/main/java/net/uomc/mineshaft/resources/commands/GiveResourcesCommand.java112
-rw-r--r--src/main/java/net/uomc/mineshaft/resources/commands/ValuesCommand.java7
-rw-r--r--src/main/java/net/uomc/mineshaft/resources/market/MarketCommand.java62
-rw-r--r--src/main/java/net/uomc/mineshaft/resources/market/MarketManager.java86
-rw-r--r--src/main/java/net/uomc/mineshaft/resources/market/Offer.java2
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) {