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())); } }