Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package net.sf.l2j.gameserver.communitybbs.manager;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.util.Set;
- import java.util.concurrent.ConcurrentHashMap;
- import java.util.concurrent.ScheduledFuture;
- import java.util.concurrent.TimeUnit;
- import java.util.function.Predicate;
- import java.util.stream.IntStream;
- import net.sf.l2j.commons.lang.StringUtil;
- import net.sf.l2j.commons.pool.ConnectionPool;
- import net.sf.l2j.commons.pool.ThreadPool;
- import net.sf.l2j.gameserver.data.cache.HtmCache;
- import net.sf.l2j.gameserver.model.World;
- import net.sf.l2j.gameserver.model.actor.Player;
- public class RankingBBSManager extends BaseBBSManager implements Runnable
- {
- private final Set<Rank> _rankStatistics = ConcurrentHashMap.newKeySet();
- private static final int PAGE_LIMIT_15 = 15;
- private final ScheduledFuture<?> _task;
- protected RankingBBSManager()
- {
- _task = ThreadPool.scheduleAtFixedRate(this, 0, TimeUnit.MINUTES.toMillis(1));
- }
- @Override
- public void parseCmd(String command, Player player)
- {
- if (command.equals("_bbsranking"))
- showRakingList(player);
- else
- super.parseCmd(command, player);
- }
- public void showRakingList(Player player)
- {
- StringBuilder pvpContent = new StringBuilder();
- StringBuilder pkContent = new StringBuilder();
- int pvpRankCount = feedContent(pvpContent, rank -> rank.isPvP());
- int pkRankCount = feedContent(pkContent, rank -> !rank.isPvP());
- feedEmptyTables(pvpContent, pvpRankCount);
- feedEmptyTables(pkContent, pkRankCount);
- sendPage(player, pvpContent, pkContent);
- }
- private int feedContent(StringBuilder sb, Predicate<Rank> filter)
- {
- int counter = 1;
- for (final var rank : _rankStatistics.stream().filter(filter).toList())
- {
- StringUtil.append(sb, "<table width=300 bgcolor=000000><tr><td width=20 align=right>", getColor(counter), String.format("%02d", counter), "</td>");
- StringUtil.append(sb, "<td width=20 height=18><img src=", "L2UI_CH3.msnicon" + (rank.playerIsOnline() ? "1" : "4"), " width=16 height=16></td><td width=160 align=left>", rank.name(), "</td>");
- StringUtil.append(sb, "<td width=100 align=right>", StringUtil.formatNumber(rank.value()), "</font></td></tr></table><img src=L2UI.SquareGray width=296 height=1>");
- counter++;
- }
- return counter;
- }
- private void feedEmptyTables(StringBuilder sb, int objectCounter)
- {
- IntStream.range(objectCounter - 1, PAGE_LIMIT_15).forEach(x -> applyEmptyTable(sb));
- }
- private void sendPage(Player player, StringBuilder pvp, StringBuilder pk)
- {
- String content = HtmCache.getInstance().getHtm(CB_PATH + getFolder() + "ranklist.htm");
- content = content.replaceAll("%name%", player.getName());
- content = content.replaceAll("%pvp%", pvp.toString());
- content = content.replaceAll("%pks%", pk.toString());
- content = content.replaceAll("%time%", String.valueOf(_task.getDelay(TimeUnit.SECONDS)));
- separateAndSend(content, player);
- }
- protected void applyEmptyTable(StringBuilder sb)
- {
- sb.append("<table width=300 bgcolor=000000><tr>");
- sb.append("<td width=20 align=right><font color=B09878>--</font></td><td width=20 height=18></td>");
- sb.append("<td width=160 align=left><font color=B09878>----------------</font></td>");
- sb.append("<td width=100 align=right><font color=FF0000>0</font></td>");
- sb.append("</tr></table><img src=L2UI.SquareGray width=296 height=1>");
- }
- protected String getColor(int index)
- {
- return switch (index)
- {
- case 1 -> "<font color=FFFF00>";
- case 2 -> "<font color=FFA500>";
- case 3 -> "<font color=E9967A>";
- default -> "";
- };
- }
- @Override
- protected String getFolder()
- {
- return "ranking/";
- }
- public record Rank(String name, int value, boolean playerIsOnline, boolean isPvP)
- {
- private static Rank updateList(String name, int val, boolean type)
- {
- return new Rank(name, val, World.getInstance().getPlayer(name) != null, type);
- }
- public static Rank updatePvPList(String name, int val)
- {
- return updateList(name, val, true);
- }
- public static Rank updatePkList(String name, int val)
- {
- return updateList(name, val, false);
- }
- }
- @Override
- public void run()
- {
- try (Connection con = ConnectionPool.getConnection())
- {
- _rankStatistics.clear();
- try (PreparedStatement ps = con.prepareStatement("SELECT char_name, pvpkills FROM characters WHERE pvpkills > 0 ORDER BY pvpkills DESC LIMIT " + PAGE_LIMIT_15);
- ResultSet rs = ps.executeQuery())
- {
- while (rs.next())
- _rankStatistics.add(Rank.updatePvPList(rs.getString("char_name"), rs.getInt("pvpkills")));
- }
- try (PreparedStatement ps = con.prepareStatement("SELECT char_name, pkkills FROM characters WHERE pkkills > 0 ORDER BY pkkills DESC LIMIT " + PAGE_LIMIT_15);
- ResultSet rs = ps.executeQuery())
- {
- while (rs.next())
- _rankStatistics.add(Rank.updatePkList(rs.getString("char_name"), rs.getInt("pkkills")));
- }
- }
- catch (Exception e)
- {
- LOGGER.warn("There was problem while updating ranking system.", e);
- }
- }
- public static RankingBBSManager getInstance()
- {
- return SingletonHolder.INSTANCE;
- }
- private static class SingletonHolder
- {
- protected static final RankingBBSManager INSTANCE = new RankingBBSManager();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement