Advertisement
tobaJK

COMMUNITYBOARD - RankingSystem

Aug 12th, 2021 (edited)
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.29 KB | None | 0 0
  1. package net.sf.l2j.gameserver.communitybbs.manager;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.util.Set;
  7. import java.util.concurrent.ConcurrentHashMap;
  8. import java.util.concurrent.ScheduledFuture;
  9. import java.util.concurrent.TimeUnit;
  10. import java.util.function.Predicate;
  11. import java.util.stream.IntStream;
  12.  
  13. import net.sf.l2j.commons.lang.StringUtil;
  14. import net.sf.l2j.commons.pool.ConnectionPool;
  15. import net.sf.l2j.commons.pool.ThreadPool;
  16.  
  17. import net.sf.l2j.gameserver.data.cache.HtmCache;
  18. import net.sf.l2j.gameserver.model.World;
  19. import net.sf.l2j.gameserver.model.actor.Player;
  20.  
  21. public class RankingBBSManager extends BaseBBSManager implements Runnable
  22. {
  23.     private final Set<Rank> _rankStatistics = ConcurrentHashMap.newKeySet();
  24.     private static final int PAGE_LIMIT_15 = 15;
  25.     private final ScheduledFuture<?> _task;
  26.    
  27.     protected RankingBBSManager()
  28.     {
  29.         _task = ThreadPool.scheduleAtFixedRate(this, 0, TimeUnit.MINUTES.toMillis(1));
  30.     }
  31.    
  32.     @Override
  33.     public void parseCmd(String command, Player player)
  34.     {
  35.         if (command.equals("_bbsranking"))
  36.             showRakingList(player);
  37.         else
  38.             super.parseCmd(command, player);
  39.     }
  40.    
  41.     public void showRakingList(Player player)
  42.     {
  43.         StringBuilder pvpContent = new StringBuilder();
  44.         StringBuilder pkContent = new StringBuilder();
  45.        
  46.         int pvpRankCount = feedContent(pvpContent, rank -> rank.isPvP());
  47.         int pkRankCount = feedContent(pkContent, rank -> !rank.isPvP());
  48.        
  49.         feedEmptyTables(pvpContent, pvpRankCount);
  50.         feedEmptyTables(pkContent, pkRankCount);
  51.        
  52.         sendPage(player, pvpContent, pkContent);
  53.     }
  54.    
  55.     private int feedContent(StringBuilder sb, Predicate<Rank> filter)
  56.     {
  57.         int counter = 1;
  58.         for (final var rank : _rankStatistics.stream().filter(filter).toList())
  59.         {
  60.             StringUtil.append(sb, "<table width=300 bgcolor=000000><tr><td width=20 align=right>", getColor(counter), String.format("%02d", counter), "</td>");
  61.             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>");
  62.             StringUtil.append(sb, "<td width=100 align=right>", StringUtil.formatNumber(rank.value()), "</font></td></tr></table><img src=L2UI.SquareGray width=296 height=1>");
  63.             counter++;
  64.         }
  65.         return counter;
  66.     }
  67.    
  68.     private void feedEmptyTables(StringBuilder sb, int objectCounter)
  69.     {
  70.         IntStream.range(objectCounter - 1, PAGE_LIMIT_15).forEach(x -> applyEmptyTable(sb));
  71.     }
  72.    
  73.     private void sendPage(Player player, StringBuilder pvp, StringBuilder pk)
  74.     {
  75.         String content = HtmCache.getInstance().getHtm(CB_PATH + getFolder() + "ranklist.htm");
  76.         content = content.replaceAll("%name%", player.getName());
  77.         content = content.replaceAll("%pvp%", pvp.toString());
  78.         content = content.replaceAll("%pks%", pk.toString());
  79.         content = content.replaceAll("%time%", String.valueOf(_task.getDelay(TimeUnit.SECONDS)));
  80.         separateAndSend(content, player);
  81.     }
  82.    
  83.     protected void applyEmptyTable(StringBuilder sb)
  84.     {
  85.         sb.append("<table width=300 bgcolor=000000><tr>");
  86.         sb.append("<td width=20 align=right><font color=B09878>--</font></td><td width=20 height=18></td>");
  87.         sb.append("<td width=160 align=left><font color=B09878>----------------</font></td>");
  88.         sb.append("<td width=100 align=right><font color=FF0000>0</font></td>");
  89.         sb.append("</tr></table><img src=L2UI.SquareGray width=296 height=1>");
  90.     }
  91.    
  92.     protected String getColor(int index)
  93.     {
  94.         return switch (index)
  95.         {
  96.             case 1 -> "<font color=FFFF00>";
  97.             case 2 -> "<font color=FFA500>";
  98.             case 3 -> "<font color=E9967A>";
  99.             default -> "";
  100.         };
  101.     }
  102.    
  103.     @Override
  104.     protected String getFolder()
  105.     {
  106.         return "ranking/";
  107.     }
  108.    
  109.     public record Rank(String name, int value, boolean playerIsOnline, boolean isPvP)
  110.     {
  111.         private static Rank updateList(String name, int val, boolean type)
  112.         {
  113.             return new Rank(name, val, World.getInstance().getPlayer(name) != null, type);
  114.         }
  115.        
  116.         public static Rank updatePvPList(String name, int val)
  117.         {
  118.             return updateList(name, val, true);
  119.         }
  120.        
  121.         public static Rank updatePkList(String name, int val)
  122.         {
  123.             return updateList(name, val, false);
  124.         }
  125.     }
  126.    
  127.     @Override
  128.     public void run()
  129.     {
  130.         try (Connection con = ConnectionPool.getConnection())
  131.         {
  132.             _rankStatistics.clear();
  133.             try (PreparedStatement ps = con.prepareStatement("SELECT char_name, pvpkills FROM characters WHERE pvpkills > 0 ORDER BY pvpkills DESC LIMIT " + PAGE_LIMIT_15);
  134.                 ResultSet rs = ps.executeQuery())
  135.             {
  136.                 while (rs.next())
  137.                     _rankStatistics.add(Rank.updatePvPList(rs.getString("char_name"), rs.getInt("pvpkills")));
  138.             }
  139.            
  140.             try (PreparedStatement ps = con.prepareStatement("SELECT char_name, pkkills FROM characters WHERE pkkills > 0 ORDER BY pkkills DESC LIMIT " + PAGE_LIMIT_15);
  141.                 ResultSet rs = ps.executeQuery())
  142.             {
  143.                 while (rs.next())
  144.                     _rankStatistics.add(Rank.updatePkList(rs.getString("char_name"), rs.getInt("pkkills")));
  145.             }
  146.         }
  147.         catch (Exception e)
  148.         {
  149.             LOGGER.warn("There was problem while updating ranking system.", e);
  150.         }
  151.     }
  152.    
  153.     public static RankingBBSManager getInstance()
  154.     {
  155.         return SingletonHolder.INSTANCE;
  156.     }
  157.    
  158.     private static class SingletonHolder
  159.     {
  160.         protected static final RankingBBSManager INSTANCE = new RankingBBSManager();
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement