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; 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; import net.uomc.mineshaft.resources.ResourceManager; import net.uomc.mineshaft.resources.market.Offer; public class MarketManager { private ResourceManager resourceManager; private Map> guildOffers = new HashMap>(); private File dataFile; private CustomBot bot; public MarketManager(net.uomc.mineshaft.resources.ResourceManager resourceManager) { this.resourceManager = resourceManager; bot = resourceManager.getBot(); dataFile = new File(resourceManager.getBot().getDatadir(), "market.json"); load(); } public void load() { JSONObject loadJSON = PeelingUtils.loadJSON(dataFile); 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()); 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(); 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 List getOffers(Guild guild) { if (!guildOffers.containsKey(guild)) { guildOffers.put(guild, new ArrayList()); } return guildOffers.get(guild); } public Offer getOffer(Guild guild, String id) { for (Offer offer : getOffers(guild)) { if (id.equals(offer.getID() + "")) { return offer; } } return null; } public void addOffer(Guild guild, Offer offer) { getOffers(guild).add(offer); processOffers(guild); save(); } public void processOffers(Guild guild) { // TODO Fix tis //Iterator iterator = getOffers(guild).iterator(); //while (iterator.hasNext()) { // Offer offer = iterator.next(); // if (l < quantity) { // sendNoLongerValidMessage(offer, seller); // iterator.remove(); // } //} //save(); } private void sendNoLongerValidMessage(Offer offer, User seller) { seller.openPrivateChannel().queue(pc -> { pc.sendMessage("Your market offer: **" + offer.getAsString(resourceManager) + "** [" + offer.getID() + "] is no longer valid because you no longer have enough resources to complete it.").queue(); }); } public void removeOffer(Guild guild, Offer o) { getOffers(guild).remove(o); save(); } public List listOffers(Guild guild) { return Collections.unmodifiableList(getOffers(guild)); } public List getEmbedFields(Guild guild) { return listOffers(guild).stream().map( o -> new Field( "[" + o.getID() + "] " + o.getAsString(resourceManager), "<@" + o.getUserID() + ">", false ) ) .collect(Collectors.toList()); } public ResourceManager getResourceManager() { return resourceManager; } public void setResourceManager(ResourceManager resourceManager) { this.resourceManager = resourceManager; } }