From ae3f52532c5fb1397b7690ac55dfa83c235dbad3 Mon Sep 17 00:00:00 2001 From: LamGC Date: Wed, 1 Apr 2020 09:50:45 +0800 Subject: [PATCH] =?UTF-8?q?[Add]=20PixivURL=20=E4=B8=BARankingContentType?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0isSupportedMode=E4=BB=A5=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E7=9A=84RankingMode=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E6=94=AF=E6=8C=81;=20[Update]=20=E5=AF=B9CQProcess,=20PixivDow?= =?UTF-8?q?nload,=20RankingUpdateTimer=E6=B7=BB=E5=8A=A0=E5=AF=B9RankingCo?= =?UTF-8?q?ntentType.isSupportedMode=E7=9A=84=E6=94=AF=E6=8C=81=E4=BB=A5?= =?UTF-8?q?=E6=B6=88=E9=99=A4=E6=97=A0=E6=95=88=E8=AF=B7=E6=B1=82=E5=B8=A6?= =?UTF-8?q?=E6=9D=A5=E7=9A=84=E8=B5=84=E6=BA=90=E6=B5=AA=E8=B4=B9;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/net/lamgc/cgj/CQProcess.java | 33 ++++++++++-- .../net/lamgc/cgj/RankingUpdateTimer.java | 3 ++ .../net/lamgc/cgj/pixiv/PixivDownload.java | 4 ++ .../java/net/lamgc/cgj/pixiv/PixivURL.java | 54 +++++++++++++++++-- 4 files changed, 86 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/lamgc/cgj/CQProcess.java b/src/main/java/net/lamgc/cgj/CQProcess.java index 57c4b30..14ab53c 100644 --- a/src/main/java/net/lamgc/cgj/CQProcess.java +++ b/src/main/java/net/lamgc/cgj/CQProcess.java @@ -1,6 +1,7 @@ package net.lamgc.cgj; import com.google.common.base.Strings; +import com.google.common.base.Throwables; import com.google.common.reflect.TypeToken; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.gson.*; @@ -112,7 +113,8 @@ public class CQProcess { @Command public static String ranking( @Argument(force = false, name = "date") Date queryTime, - @Argument(force = false, name = "contentMode", defaultValue = "DAILY") String contentMode + @Argument(force = false, name = "mode", defaultValue = "DAILY") String contentMode, + @Argument(force = false, name = "type") String contentType ) { Date queryDate = queryTime; if (queryDate == null) { @@ -135,6 +137,19 @@ public class CQProcess { log.warn("无效的RankingMode值: {}", contentMode); } + PixivURL.RankingContentType type = PixivURL.RankingContentType.TYPE_ILLUST; + try { + type = PixivURL.RankingContentType.valueOf("TYPE_" + contentMode.toUpperCase()); + } catch (IllegalArgumentException e) { + log.warn("无效的RankingContentType值: {}", contentMode); + } + + if(!type.isSupportedMode(mode)) { + log.warn("RankingContentType不支持指定的RankingMode.(ContentType: {}, RankingMode: {})", + type.name(), mode.name()); + return "不支持的内容类型或模式!"; + } + StringBuilder resultBuilder = new StringBuilder(mode.name() + " - 以下是 ").append(new SimpleDateFormat("yyyy-MM-dd").format(queryDate)).append(" 的Pixiv插画排名榜前十名:\n"); try { int index = 0; @@ -154,7 +169,7 @@ public class CQProcess { log.warn("配置项 {} 的参数值格式有误!", imageLimitPropertyKey); } - for (JsonObject rankInfo : getRankingInfoByCache(PixivURL.RankingContentType.TYPE_ILLUST, mode, queryDate, 0, itemLimit)) { + for (JsonObject rankInfo : getRankingInfoByCache(type, mode, queryDate, 1, itemLimit)) { index++; int rank = rankInfo.get("rank").getAsInt(); int illustId = rankInfo.get("illust_id").getAsInt(); @@ -561,9 +576,21 @@ public class CQProcess { * @throws IOException 获取异常时抛出 */ public static List getRankingInfoByCache(PixivURL.RankingContentType contentType, PixivURL.RankingMode mode, Date queryDate, int start, int range) throws IOException { + if(!contentType.isSupportedMode(mode)) { + log.warn("试图获取不支持的排行榜类型已拒绝.(ContentType: {}, RankingMode: {})", contentType.name(), mode.name()); + if(log.isDebugEnabled()) { + try { + Thread.dumpStack(); + } catch(Exception e) { + log.debug("本次非法请求的堆栈信息如下: \n{}", Throwables.getStackTraceAsString(e)); + } + } + return new ArrayList<>(0); + } + String date = new SimpleDateFormat("yyyyMMdd").format(queryDate); //int requestSign = ("Ranking." + contentType.name() + "." + mode.name() + "." + date).hashCode(); - String requestSign = buildSyncKey("Ranking.", contentType.name(), ".", mode.name(), ".", date); + String requestSign = buildSyncKey(contentType.name(), ".", mode.name(), ".", date); if(!rankingCache.exists(requestSign)) { synchronized(requestSign) { if(!rankingCache.exists(requestSign)) { diff --git a/src/main/java/net/lamgc/cgj/RankingUpdateTimer.java b/src/main/java/net/lamgc/cgj/RankingUpdateTimer.java index beac501..ff0a280 100644 --- a/src/main/java/net/lamgc/cgj/RankingUpdateTimer.java +++ b/src/main/java/net/lamgc/cgj/RankingUpdateTimer.java @@ -52,6 +52,9 @@ public class RankingUpdateTimer { log.info("正在获取 {} 期排行榜数据...", calendar.getTime()); for (PixivURL.RankingMode rankingMode : PixivURL.RankingMode.values()) { for (PixivURL.RankingContentType contentType : PixivURL.RankingContentType.values()) { + if(!contentType.isSupportedMode(rankingMode)) { + log.debug("不支持的类型, 填空值跳过...(类型: {}.{})", rankingMode.name(), contentType.name()); + } log.info("当前排行榜类型: {}.{}, 正在更新...", rankingMode.name(), contentType.name()); try { CQProcess.getRankingInfoByCache(contentType, rankingMode, calendar.getTime(), 1, 0); diff --git a/src/main/java/net/lamgc/cgj/pixiv/PixivDownload.java b/src/main/java/net/lamgc/cgj/pixiv/PixivDownload.java index 118dcab..468a76e 100644 --- a/src/main/java/net/lamgc/cgj/pixiv/PixivDownload.java +++ b/src/main/java/net/lamgc/cgj/pixiv/PixivDownload.java @@ -293,6 +293,10 @@ public class PixivDownload { throw new IllegalArgumentException("range cannot be less than or equal to zero"); } + if(!contentType.isSupportedMode(mode)) { + throw new IllegalArgumentException("ContentType不支持指定的RankingMode: ContentType: " + contentType.name() + ", Mode: " + mode.name()); + } + int startPage = (int) Math.ceil(rankStart / 50F); int requestFrequency = (int) Math.ceil((rankStart + (range - 1)) / 50F); int surplusQuantity = range; diff --git a/src/main/java/net/lamgc/cgj/pixiv/PixivURL.java b/src/main/java/net/lamgc/cgj/pixiv/PixivURL.java index 3fab25a..72706a6 100644 --- a/src/main/java/net/lamgc/cgj/pixiv/PixivURL.java +++ b/src/main/java/net/lamgc/cgj/pixiv/PixivURL.java @@ -1,6 +1,7 @@ package net.lamgc.cgj.pixiv; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; @@ -175,7 +176,7 @@ public class PixivURL { public static String getRankingLink(RankingContentType contentType, RankingMode mode, Date time, int pageIndex, boolean json){ StringBuilder linkBuilder = new StringBuilder(PIXIV_RANKING_LINK); linkBuilder.append("mode=").append(mode == null ? RankingMode.MODE_DAILY.modeParam : mode.modeParam); - if(contentType != null){ + if(contentType != null && !contentType.equals(RankingContentType.ALL)){ linkBuilder.append("&content=").append(contentType.typeName); } SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); @@ -263,28 +264,71 @@ public class PixivURL { * 排名榜类型 */ public enum RankingContentType{ + ALL("", RankingMode.values()), /** * 插画 * 支持的时间类型: 每天, 每周, 每月, 新人 */ - TYPE_ILLUST("illust"), + TYPE_ILLUST("illust", + new RankingMode[]{ + RankingMode.MODE_DAILY, + RankingMode.MODE_MONTHLY, + RankingMode.MODE_WEEKLY, + RankingMode.MODE_ROOKIE, + RankingMode.MODE_DAILY_R18, + RankingMode.MODE_WEEKLY_R18, + RankingMode.MODE_MALE_R18, + RankingMode.MODE_FEMALE_R18 + } + ), /** * 动图 * 支持的时间类型:每天, 每周 */ - TYPE_UGOIRA("ugoira"), + TYPE_UGOIRA("ugoira", + new RankingMode[]{ + RankingMode.MODE_DAILY, + RankingMode.MODE_WEEKLY, + RankingMode.MODE_DAILY_R18, + RankingMode.MODE_WEEKLY_R18 + } + ), /** * 漫画 * 支持的时间类型: 每天, 每周, 每月, 新人 */ - TYPE_MANGA("manga") + TYPE_MANGA("manga", + new RankingMode[]{ + RankingMode.MODE_DAILY, + RankingMode.MODE_MONTHLY, + RankingMode.MODE_WEEKLY, + RankingMode.MODE_ROOKIE, + RankingMode.MODE_DAILY_R18, + RankingMode.MODE_WEEKLY_R18, + RankingMode.MODE_MALE_R18, + RankingMode.MODE_FEMALE_R18 + } + ) ; String typeName; - RankingContentType(String typeName){ + private final RankingMode[] supportedMode; + + RankingContentType(String typeName, RankingMode[] supportedMode){ this.typeName = typeName; + this.supportedMode = supportedMode; } + + /** + * 检查指定RankingMode是否支持 + * @param mode 要检查的RankingMode项 + * @return 如果支持返回true + */ + public boolean isSupportedMode(RankingMode mode) { + return Arrays.binarySearch(supportedMode, mode) != -1; + } + } }