-
-
Notifications
You must be signed in to change notification settings - Fork 96
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
v7.3.0 #880
Conversation
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
“Following function are provided by PeerBanHelper:” 修改为 “The following functions are provided by PeerBanHelper:”,以匹配正确的复数形式。 “and supports the following functions once it successful loaded” 修改为 “and supports the following functions once it has been successfully loaded”,以使用正确的时态和副词形式。 “Transmission (deprecated;3.00-20 or higher)” 中的分号修改为英文分号,以符合英文标点规范。
修正 README.EN.md 中的错误
Update dependency org.springframework:spring-context to v6.2.1
Bumps [org.springframework:spring-context](https://github.com/spring-projects/spring-framework) from 6.2.0 to 6.2.1. - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](spring-projects/spring-framework@v6.2.0...v6.2.1) --- updated-dependencies: - dependency-name: org.springframework:spring-context dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]>
Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.3.1-jre to 33.4.0-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]>
Bumps [org.junit.jupiter:junit-jupiter-api](https://github.com/junit-team/junit5) from 5.11.3 to 5.11.4. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](junit-team/junit5@r5.11.3...r5.11.4) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]>
Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.12 to 1.5.15. - [Commits](qos-ch/logback@v_1.5.12...v_1.5.15) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]>
Bumps [io.javalin:javalin](https://github.com/javalin/javalin) from 6.3.0 to 6.4.0. - [Release notes](https://github.com/javalin/javalin/releases) - [Commits](javalin/javalin@javalin-parent-6.3.0...javalin-parent-6.4.0) --- updated-dependencies: - dependency-name: io.javalin:javalin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]>
Update dependency io.javalin:javalin to v6.4.0
…lin-6.4.0 Bump io.javalin:javalin from 6.3.0 to 6.4.0
…logback-classic-1.5.15 Bump ch.qos.logback:logback-classic from 1.5.12 to 1.5.15
…er-junit-jupiter-api-5.11.4 Bump org.junit.jupiter:junit-jupiter-api from 5.11.3 to 5.11.4
…a-guava-33.4.0-jre Bump com.google.guava:guava from 33.3.1-jre to 33.4.0-jre
…work-spring-context-6.2.1 Bump org.springframework:spring-context from 6.2.0 to 6.2.1
… an dependency of #834
# Conflicts: # pom.xml
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (1)
install4j/project.install4j (1)
15-16
: 建议优化 JVM 参数配置当前 JVM 参数配置合理,但建议考虑以下优化:
- 考虑根据系统内存动态调整
-Xmx
值- 添加 GC 日志相关参数以便问题排查
- 考虑添加
-XX:+HeapDumpOnOutOfMemoryError
参数
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
install4j/project.install4j
(8 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (3)
- GitHub Check: Build_SPK / pkgcreate
- GitHub Check: Build_Installers / install4jc
- GitHub Check: Build_Docker_Standalone
🔇 Additional comments (2)
install4j/project.install4j (2)
4-4
: 版本号更新正确!版本号从 7.0.0 更新到 7.3.0,与 PR 目标一致。
434-438
: 服务停止操作添加正确!在卸载过程中添加服务停止操作,确保了卸载过程的清洁性和完整性。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
♻️ Duplicate comments (1)
src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java (1)
24-27
:⚠️ Potential issue需要修复
getFirst()
方法调用
List
接口中没有getFirst()
方法,这会导致编译错误。应该使用get(0)
来获取第一个元素。建议修改如下:
public IPMatcher(String ruleId, String ruleName, List<DualIPv4v6AssociativeTries<String>> ruleData) { super(ruleId, ruleName, ruleData); - this.ips = ruleData.getFirst(); + this.ips = ruleData.get(0); }
🧹 Nitpick comments (17)
src/main/java/com/ghostchu/peerbanhelper/wrapper/BanMetadata.java (1)
47-57
: toString() 方法实现得很完整,建议进一步优化方法实现包含了所有必要的字段,并正确处理了本地化组件。不过建议考虑以下优化:
- 可以考虑使用
StringBuilder
来提高性能- 建议为时间戳(banAt 和 unbanAt)添加格式化显示
建议参考以下实现:
@Override public String toString() { - return "BanMetadata{" + - "context='" + context + '\'' + - ", banAt=" + banAt + - ", unbanAt=" + unbanAt + - ", banForDisconnect=" + banForDisconnect + - ", rule=" + tlUI(rule) + - ", description=" + tlUI(description) + - '}'; + StringBuilder sb = new StringBuilder("BanMetadata{"); + sb.append("context='").append(context).append('\'') + .append(", banAt=").append(new Date(banAt)) + .append(", unbanAt=").append(new Date(unbanAt)) + .append(", banForDisconnect=").append(banForDisconnect) + .append(", rule=").append(tlUI(rule)) + .append(", description=").append(tlUI(description)) + .append('}'); + return sb.toString(); }src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PeerIdBlacklist.java (1)
98-102
: 建议处理被注释掉的缓存代码代码中存在被注释掉的缓存相关代码。如果缓存功能不再需要,建议完全移除这些注释掉的代码;如果还需要,建议恢复并优化缓存实现。
建议应用以下修改:
- //return getCache().readCache(this, peer.getPeerId(), () -> { RuleMatchResult matchResult = RuleParser.matchRule(bannedPeers, peer.getPeerId()); if (matchResult.hit()) { return new CheckResult(getClass(), PeerAction.BAN, banDuration, matchResult.rule().matcherName(), new TranslationComponent(Lang.MODULE_CNB_MATCH_CLIENT_NAME, matchResult.comment())); } return pass(); - //}, true);src/main/java/com/ghostchu/peerbanhelper/text/TextManager.java (3)
76-81
: 增强了空值处理逻辑对 translationComponent 参数增加了更严格的空值检查,这样可以避免空指针异常,提高了代码的健壮性。
建议考虑以下优化:
- 可以将这些检查逻辑抽取到一个单独的辅助方法中,以提高代码的可重用性
- 建议添加日志记录,以便于问题排查
+ private static String validateTranslationComponent(@Nullable TranslationComponent component) { + if (component == null) { + log.debug("Translation component is null"); + return "null"; + } + if (component.getKey().isBlank()) { + log.debug("Translation key is blank"); + return ""; + } + return null; + }
122-122
: 移除多余的空行这是一个不必要的空行,建议删除以保持代码整洁。
Line range hint
1-324
: 建议改进国际化架构设计考虑到 PR 目标中提到的新功能(如下载暂停、全局暂停等),建议对国际化系统进行以下架构改进:
- 引入缓存机制以提高性能
- 支持动态重载以适应运行时语言切换
- 添加事件系统以支持语言变更通知
- 考虑使用建造者模式重构 TranslationComponent 的创建过程
这些改进将使系统更好地支持新功能的本地化需求。
src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java (1)
26-32
: 建议改进翻译组件的构造方式当前实现中的 "Hit-" 和规则的字符串拼接(
"Hit-" + rule
)可能不是最佳的国际化实践。建议:
- 为这些前缀创建专门的翻译键
- 使用参数化的翻译消息
建议按如下方式修改:
-new TranslationComponent(Lang.MATCH_STRING_ENDS_WITH, "Hit-" + rule) +new TranslationComponent(Lang.MATCH_STRING_ENDS_WITH_HIT, rule)同样的修改也应用于 miss 的情况:
-new TranslationComponent(Lang.MATCH_STRING_ENDS_WITH, "Miss-" + rule) +new TranslationComponent(Lang.MATCH_STRING_ENDS_WITH_MISS, rule)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java (1)
26-27
: 默认匹配结果初始化逻辑可以优化初始化消息中的 "Hit-Min-" 和 "Max-" 直接拼接在字符串中,建议将这些文本移至语言文件中。
建议修改为:
- this.hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_LENGTH, "Hit-Min-" + min + ", Max-" + max)); - this.miss = new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent(Lang.MATCH_STRING_LENGTH, "Hit-Min-" + min + ", Max-" + max)); + this.hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_LENGTH, + new TranslationComponent(Lang.MATCH_STRING_LENGTH_FORMAT, min, max))); + this.miss = new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent(Lang.MATCH_STRING_LENGTH, + new TranslationComponent(Lang.MATCH_STRING_LENGTH_FORMAT, min, max)));src/main/resources/lang/en_us/messages.yml (1)
569-569
: 建议在文件末尾添加换行符根据YAML规范,建议在文件末尾添加一个换行符。
BTN_CONFIG_STATUS_EXCEPTION: "An unexpected error occurred while connecting to the BTN server: {}" +
🧰 Tools
🪛 yamllint (1.35.1)
[error] 569-569: no new line character at the end of file
(new-line-at-end-of-file)
src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHBanController.java (2)
109-110
: 建议添加搜索参数验证搜索功能的实现逻辑正确,但建议添加对
search
参数的验证,如:
- 检查长度限制
- 过滤特殊字符
- 防止 SQL 注入(如果参数用于数据库查询)
120-129
: 性能优化建议搜索实现的功能完整,支持地址和元数据的不区分大小写搜索。但考虑到以下几点建议:
- 对于大数据集,多重过滤器链可能影响性能
toLowerCase()
的重复调用可以优化建议如下优化:
private @NotNull Stream<BanResponse> getBanResponseStream(String locale, long lastBanTime, long limit, boolean ignoreBanForDisconnect, String search) { + final String searchLower = search == null ? null : search.toLowerCase(Locale.ROOT); var banResponseList = getServer().getBannedPeers() .entrySet() .stream() .filter(b -> { if (!ignoreBanForDisconnect) return true; return !b.getValue().isBanForDisconnect(); }) - .filter(b -> search == null || b.getKey().toString().toLowerCase(Locale.ROOT).contains(search.toLowerCase(Locale.ROOT)) - || b.getValue().toString().toLowerCase(Locale.ROOT).contains(search.toLowerCase(Locale.ROOT))) + .filter(b -> searchLower == null || b.getKey().toString().toLowerCase(Locale.ROOT).contains(searchLower) + || b.getValue().toString().toLowerCase(Locale.ROOT).contains(searchLower))src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java (2)
911-923
: 建议改进DNS查询的错误处理当前实现在异步操作中缺少完整的错误处理。建议添加异常捕获和日志记录。
建议如下修改:
if (laboratory.isExperimentActivated(Experiments.DNSJAVA.getExperiment())) { - dnsLookup.ptr(peer.getPeerAddress().getAddress().toReverseDNSLookupString()).thenAccept(hostName -> { + dnsLookup.ptr(peer.getPeerAddress().getAddress().toReverseDNSLookupString()) + .thenAccept(hostName -> { if (hostName.isPresent()) { if (!peer.getPeerAddress().getIp().equals(hostName.get())) { banMetadata.setReverseLookup(hostName.get()); } } - }); + }) + .exceptionally(throwable -> { + log.error("DNS反向查询失败: " + peer.getPeerAddress(), throwable); + return null; + }); } else { try { String hostName = peer.getPeerAddress().getAddress().toInetAddress().getHostName(); if (!peer.getPeerAddress().getIp().equals(hostName)) { banMetadata.setReverseLookup(peer.getPeerAddress().getAddress().toInetAddress().getHostName()); } + } catch (Exception e) { + log.error("DNS反向查询失败: " + peer.getPeerAddress(), e); } }
617-624
: 建议改进错误消息的具体性当前的错误消息比较笼统。建议添加更多上下文信息以便于调试。
建议如下修改:
try { CheckResult checkResult = checkBan(torrent, peer, downloader); details.add(new BanDetail(torrent, peer, checkResult, checkResult.duration())); } catch (Exception e) { - log.error("Unexpected error occurred while checking bans", e); + log.error("检查封禁时发生错误 - Torrent: {}, Peer: {}, Downloader: {}", + torrent.getName(), peer.getPeerAddress(), downloader.getName(), e); throw e; }src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java (1)
47-55
: match0 方法的改进很棒!错误处理和返回消息的改进都很到位。使用
TranslationComponent
来处理消息翻译也很合适。不过建议在构造函数和
setData
方法中添加对ruleData
的验证:public IPMatcher(String ruleId, String ruleName, List<DualIPv4v6AssociativeTries<String>> ruleData) { + if (ruleData == null || ruleData.isEmpty()) { + throw new IllegalArgumentException("ruleData 不能为空"); + } super(ruleId, ruleName, ruleData); this.ips = ruleData.get(0); } public void setData(String ruleName, List<DualIPv4v6AssociativeTries<String>> ruleData) { + if (ruleData == null || ruleData.isEmpty()) { + throw new IllegalArgumentException("ruleData 不能为空"); + } setRuleName(ruleName); this.ips = ruleData.get(0); }src/main/resources/lang/messages_fallback.yml (1)
569-569
: 文件末尾缺少换行符。根据 YAML 规范,文件末尾应该有一个换行符。
建议在文件末尾添加一个换行符:
BTN_CONFIG_STATUS_EXCEPTION: "配置 BTN 功能时发生意外错误:{}: {}" +
🧰 Tools
🪛 yamllint (1.35.1)
[error] 569-569: no new line character at the end of file
(new-line-at-end-of-file)
src/main/resources/lang/zh_cn/messages.yml (1)
536-537
: 建议优化免费许可证描述文本建议将
FREE_LICENSE_DESCRIPTION
的描述改为更友好的表述:-FREE_LICENSE_DESCRIPTION: "本地生成的循环免费许可证,仅用于个人用途" +FREE_LICENSE_DESCRIPTION: "本地生成的个人免费许可证"src/main/java/com/ghostchu/peerbanhelper/text/Lang.java (1)
484-494
: 建议对匹配条件相关的枚举常量进行分组为了提高代码的可维护性,建议将所有匹配条件相关的枚举常量(MATCH_开头)放在一起。
建议将这些常量按照以下顺序重新排列:
- MATCH_CONDITION_PORT_MATCH, - MODULE_IBL_COMMENT_UNKNOWN, - JSON_MATCHER_NOT_MET, - MATCH_CONDITION_BOOLEAN, - MATCH_CONDITION_BOOLEAN_BY_INTEGER, - MATCH_CONDITION_BOOLEAN_BY_STRING, - MATCH_STRING_CONTAINS, - MATCH_STRING_ENDS_WITH, - MATCH_STRING_LENGTH, - MATCH_STRING_EQUALS, - MATCH_STRING_REGEX, + // 匹配条件相关常量 + MATCH_CONDITION_BOOLEAN, + MATCH_CONDITION_BOOLEAN_BY_INTEGER, + MATCH_CONDITION_BOOLEAN_BY_STRING, + MATCH_CONDITION_PORT_MATCH, + MATCH_STRING_CONTAINS, + MATCH_STRING_ENDS_WITH, + MATCH_STRING_EQUALS, + MATCH_STRING_LENGTH, + MATCH_STRING_REGEX, + MATCH_STRING_STARTS_WITH,src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/ClientNameBlacklist.java (1)
23-23
: 添加了 @slf4j 注解但未使用您在第23行导入了
lombok.extern.slf4j.Slf4j
,并在第32行添加了@Slf4j
注解,但在代码中未看到对log
对象的使用。如果未使用日志功能,建议移除该注解和导入,以保持代码简洁。可以应用以下修改来移除不必要的导入和注解:
- import lombok.extern.slf4j.Slf4j;
- @Slf4j
Also applies to: 32-32
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (19)
src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java
(23 hunks)src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/ClientNameBlacklist.java
(3 hunks)src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java
(9 hunks)src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PeerIdBlacklist.java
(1 hunks)src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHBanController.java
(3 hunks)src/main/java/com/ghostchu/peerbanhelper/text/Lang.java
(2 hunks)src/main/java/com/ghostchu/peerbanhelper/text/TextManager.java
(2 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/AbstractJsonMatcher.java
(2 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java
(4 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java
(1 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java
(1 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java
(1 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java
(1 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java
(1 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java
(1 hunks)src/main/java/com/ghostchu/peerbanhelper/wrapper/BanMetadata.java
(2 hunks)src/main/resources/lang/en_us/messages.yml
(3 hunks)src/main/resources/lang/messages_fallback.yml
(3 hunks)src/main/resources/lang/zh_cn/messages.yml
(4 hunks)
🚧 Files skipped from review as they are similar to previous changes (5)
- src/main/java/com/ghostchu/peerbanhelper/util/rule/AbstractJsonMatcher.java
- src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java
- src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java
- src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java
- src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java
🧰 Additional context used
📓 Learnings (2)
src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHBanController.java (1)
Learnt from: Ghost-chu
PR: PBH-BTN/PeerBanHelper#875
File: src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHBanController.java:120-128
Timestamp: 2025-01-08T11:52:59.043Z
Learning: The ban list in PeerBanHelper is designed to be an in-memory data structure that maintains a relatively small number of entries, making complex search indexing unnecessary.
src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java (1)
Learnt from: Ghost-chu
PR: PBH-BTN/PeerBanHelper#875
File: src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java:199-205
Timestamp: 2025-01-08T12:53:19.783Z
Learning: The `runTestCode()` method in PeerBanHelperServer is an intentional design feature guarded by the `pbh.release=LiveDebug` system property, used for debug purposes in production code.
🪛 yamllint (1.35.1)
src/main/resources/lang/en_us/messages.yml
[error] 569-569: no new line character at the end of file
(new-line-at-end-of-file)
src/main/resources/lang/zh_cn/messages.yml
[error] 566-566: no new line character at the end of file
(new-line-at-end-of-file)
src/main/resources/lang/messages_fallback.yml
[error] 569-569: no new line character at the end of file
(new-line-at-end-of-file)
⏰ Context from checks skipped due to timeout of 90000ms (2)
- GitHub Check: Build_Installers / install4jc
- GitHub Check: Build_SPK / pkgcreate
🔇 Additional comments (25)
src/main/java/com/ghostchu/peerbanhelper/wrapper/BanMetadata.java (1)
12-12
: 静态导入使代码更简洁!使用静态导入
tlUI
方法是个不错的选择,可以提高代码的可读性。src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PeerIdBlacklist.java (1)
99-99
: 改进了禁止原因的显示方式!代码改进使用了规则的
matcherName
和comment
来提供更详细的禁止原因,这样可以让用户更清楚地了解为什么某个 peer 被禁止。src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java (2)
17-17
: 将类标记为 final 是个好的改进!通过防止继承,这个改动提高了类的不可变性和安全性。这符合匹配器实现的最佳实践。
20-21
: 字段初始化模式的改进很合理!将 hit 和 miss 字段的初始化移至构造函数中使得初始化逻辑更加集中和清晰。这种方式更容易维护和理解。
src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java (3)
7-7
: 类修改为 final 并添加了新的依赖将类声明为 final 是个好的改进,可以防止意外的继承。新增的 MatchResultEnum 导入也使得匹配结果的处理更加规范。
Also applies to: 15-15
19-20
: 字段初始化方式的改进将 hit 和 miss 字段从静态初始化改为动态初始化是个好的改进,提高了灵活性。
Line range hint
37-40
: 匹配逻辑实现简洁明了match0 方法的实现简洁且易于理解,使用三元运算符使代码更加紧凑。
src/main/resources/lang/en_us/messages.yml (3)
21-21
: 消息格式更新正确!消息格式已更新以包含评论字段,这与订阅规则功能的增强相符。
202-202
: 状态文本添加正确!新增的暂停下载器状态文本与PR中描述的暂停功能特性相符。
539-569
: 新增消息内容完整且准确!新增的消息文本完全符合PR中描述的新功能,包括下载器暂停、DNS解析增强、数据库优化等特性。所有消息格式统一,描述清晰。
🧰 Tools
🪛 yamllint (1.35.1)
[error] 569-569: no new line character at the end of file
(new-line-at-end-of-file)
src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHBanController.java (1)
74-81
: 批量删除功能实现正确新增的通配符 "*" 支持实现了批量解除IP封禁的功能,代码逻辑清晰。设置
reApplyBanList
标志确保了在批量操作后能正确重新应用封禁列表。src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java (3)
26-26
: 导入和字段声明看起来不错!新添加的导入和字段与PR目标中描述的全局暂停和DNS黑名单功能相符。
Also applies to: 37-37, 133-136
450-459
: 全局暂停功能实现完善!实现考虑了以下关键点:
- 正确处理暂停状态的更新
- 更新UI显示标志
- 在暂停状态下正确处理封禁列表的重新应用
- 保持了线程安全性
Also applies to: 979-986
759-764
: 下载器状态处理逻辑完善!状态处理逻辑考虑了以下要点:
- 正确处理PAUSED状态
- 维护了清晰的错误报告
- 区分了不同类型的错误状态
src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java (2)
17-17
: 将类声明为 final 是个好的改进!将 StringContainsMatcher 类声明为 final 可以防止继承,这样可以确保匹配器的行为不会被子类意外修改,提高了代码的安全性和可预测性。
20-21
: 将静态字段改为实例字段提升了线程安全性!将 hit 和 miss 从静态字段改为实例字段是很好的改进:
- 提高了线程安全性
- 允许每个实例有自己的匹配结果
- 更好地封装了状态
src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java (2)
21-22
: 泛型类型更改看起来不错!将
DualIPv4v6Tries
更改为DualIPv4v6AssociativeTries<String>
可以让我们为每个 IP 地址关联额外的字符串数据,这是个很好的改进。
35-38
:⚠️ Potential issuesetData 方法中也需要修复
getFirst()
调用这里存在相同的问题,需要将
getFirst()
替换为get(0)
。建议修改如下:
public void setData(String ruleName, List<DualIPv4v6AssociativeTries<String>> ruleData) { setRuleName(ruleName); - this.ips = ruleData.getFirst(); + this.ips = ruleData.get(0); }Likely invalid or redundant comment.
src/main/resources/lang/messages_fallback.yml (3)
202-202
: LGTM!新增的暂停状态消息文本清晰明了。
538-569
: LGTM!新增的消息文本包含了以下功能的本地化支持:
- qBittorrent 多重连接设置提示
- 下载器暂停状态
- DNSJava DNS 解析实验功能
- SQLite VACUUM 数据库优化
- PTR 规则匹配
- 字符串匹配条件
- BTN 网络配置状态
所有消息的中文翻译准确且易于理解。
🧰 Tools
🪛 yamllint (1.35.1)
[error] 569-569: no new line character at the end of file
(new-line-at-end-of-file)
21-21
: 消息格式已更新,请确认所有使用此消息的代码都已更新。消息
MODULE_IBL_MATCH_IP_RULE
增加了一个新的占位符用于备注信息。请确保所有调用此消息的代码都已更新以提供所需的备注参数。✅ Verification successful
消息格式和代码实现已完全匹配,无需修改。
代码中已经正确处理了所有消息占位符,包括规则名称、IP地址和备注信息。备注信息已经通过 Optional 进行了空值处理,在没有备注时会显示未知备注提示。
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # 搜索所有使用此消息的代码位置 rg "MODULE_IBL_MATCH_IP_RULE" -A 2Length of output: 1638
Script:
#!/bin/bash # Check the implementation in IPBlackRuleList.java ast-grep --pattern 'new TranslationComponent(Lang.MODULE_IBL_MATCH_IP_RULE, $$$)'Length of output: 893
src/main/resources/lang/zh_cn/messages.yml (2)
537-566
: LGTM! 新功能的本地化文本新增功能的本地化文本翻译准确,表述清晰。
🧰 Tools
🪛 yamllint (1.35.1)
[error] 566-566: no new line character at the end of file
(new-line-at-end-of-file)
21-21
: 请确认消息格式的一致性消息
MODULE_IBL_MATCH_IP_RULE
新增了一个备注占位符{}
,请确认所有调用此消息的代码都已更新以提供备注参数。✅ Verification successful
消息格式使用正确 ✅
代码实现中已正确提供所有必需的参数,包括规则名称、IP地址和备注(当备注为空时会显示未知)。
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # 搜索使用此消息的代码位置 rg "MODULE_IBL_MATCH_IP_RULE" -A 2Length of output: 1638
Script:
#!/bin/bash # Check the complete implementation around the TranslationComponent usage ast-grep --pattern 'new TranslationComponent(Lang.MODULE_IBL_MATCH_IP_RULE, $$$)'Length of output: 893
src/main/java/com/ghostchu/peerbanhelper/text/Lang.java (1)
473-502
: 新增的枚举常量符合PR目标新增的枚举常量完全符合PR目标中提到的新功能:
- 下载暂停功能(DOWNLOADER_PAUSED等)
- SQLite数据库管理(SQLITE_VACUUM相关常量)
- IP地址反向DNS黑名单模块(LAB_EXPERIMENT_DNSJAVA相关常量)
- 配置文件检索错误报告(BTN_CONFIG_STATUS相关常量)
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/ClientNameBlacklist.java (1)
100-103
: 确认matchResult.comment()
不会返回 null在第100-103行,您在构造
CheckResult
对象时使用了matchResult.rule().matcherName()
和matchResult.comment()
作为参数。请确保matchResult.comment()
方法不会返回 null,以避免潜在的NullPointerException
。建议检查
matchResult.comment()
的实现,确保在所有情况下都返回非空值。若可能返回 null,建议在使用前添加空值检查或提供默认值。
src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java
Show resolved
Hide resolved
src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🧹 Nitpick comments (12)
src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java (3)
19-20
: 字段初始化逻辑优化建议建议将字段声明为 final,因为它们只在构造函数中被赋值一次。这样可以更好地表达设计意图并防止意外修改。
- private MatchResult hit; - private MatchResult miss; + private final MatchResult hit; + private final MatchResult miss;
26-27
: 默认值初始化逻辑可以提取到单独的方法当前的默认值初始化逻辑和自定义值覆盖逻辑混合在构造函数中,建议将默认值初始化提取到单独的私有方法中,以提高代码的可读性和可维护性。
+ private MatchResult createDefaultHitResult() { + return new MatchResult(MatchResultEnum.TRUE, + new TranslationComponent(Lang.MATCH_STRING_LENGTH, + "Hit-Min-" + min + ", Max-" + max)); + } + + private MatchResult createDefaultMissResult() { + return new MatchResult(MatchResultEnum.DEFAULT, + new TranslationComponent(Lang.MATCH_STRING_LENGTH, + "Hit-Min-" + min + ", Max-" + max)); + } public StringLengthMatcher(JsonObject syntax) { super(syntax); this.min = syntax.get("min").getAsInt(); this.max = syntax.get("max").getAsInt(); - this.hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_LENGTH, "Hit-Min-" + min + ", Max-" + max)); - this.miss = new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent(Lang.MATCH_STRING_LENGTH, "Hit-Min-" + min + ", Max-" + max)); + this.hit = createDefaultHitResult(); + this.miss = createDefaultMissResult();
44-44
: matcherName 方法的改进建议当前实现每次调用都会创建新的 TranslationComponent 实例。考虑到 min 和 max 是不可变的,建议将此结果缓存起来以提高性能。
+ private final TranslationComponent cachedMatcherName; + + public StringLengthMatcher(JsonObject syntax) { // ... existing code ... + this.cachedMatcherName = new TranslationComponent(Lang.MATCH_STRING_LENGTH, + "Min-" + min + ", Max-" + max); } @Override public TranslationComponent matcherName() { - return new TranslationComponent(Lang.MATCH_STRING_LENGTH, "Min-" + min + ", Max-" + max); + return this.cachedMatcherName; }src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java (2)
20-21
: 建议添加字段的非空保证!字段
hit
和miss
现在没有直接初始化,虽然在构造函数中设置了值,但从代码分析的角度来看可能为空。建议添加@NotNull
注解来明确表达非空意图。- private MatchResult hit; - private MatchResult miss; + @NotNull + private MatchResult hit; + @NotNull + private MatchResult miss;
52-52
: 建议优化 TranslationComponent 的创建!每次调用
matcherName()
都会创建新的TranslationComponent
对象,这可能会影响性能。建议将这个对象缓存为类的成员变量。+ private final TranslationComponent nameComponent; public StringRegexMatcher(JsonObject syntax) { super(syntax); this.rule = Pattern.compile(syntax.get("content").getAsString()); this.hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_REGEX, rule)); this.miss = new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent(Lang.MATCH_STRING_REGEX, rule)); + this.nameComponent = new TranslationComponent(Lang.MATCH_STRING_REGEX, rule); // ... rest of the constructor } @Override public TranslationComponent matcherName() { - return new TranslationComponent(Lang.MATCH_STRING_REGEX, rule); + return this.nameComponent; }src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java (1)
48-48
: 建议优化 matcherName 方法的性能当前实现在每次调用时都创建新的
TranslationComponent
对象,这可能会影响性能。建议将结果缓存起来:+ private final TranslationComponent nameComponent; public StringContainsMatcher(JsonObject syntax) { // ... existing code ... + this.nameComponent = new TranslationComponent(Lang.MATCH_STRING_CONTAINS, rule); } @Override public TranslationComponent matcherName() { - return new TranslationComponent(Lang.MATCH_STRING_CONTAINS, rule); + return this.nameComponent; }src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java (2)
25-34
: 建议优化 matchRule 方法的可读性当前实现可以通过以下方式改进:
- 使用更具描述性的变量名替代
matchResult
- 考虑提取匹配逻辑到单独的私有方法
- 添加方法级别的 JavaDoc 说明匹配规则的优先级
建议重构为:
+ /** + * 匹配规则并返回结果 + * @param rules 规则列表 + * @param content 待匹配内容 + * @return 匹配结果,优先级:FALSE > TRUE > UNKNOWN + */ public static RuleMatchResult matchRule(List<Rule> rules, String content) { - RuleMatchResult matchResult = new RuleMatchResult(false, null, null); + RuleMatchResult finalResult = new RuleMatchResult(false, null, null); for (Rule rule : rules) { MatchResult result = rule.match(content); if (result.result() == MatchResultEnum.FALSE) { return new RuleMatchResult(false, rule, result.comment()); } if (result.result() == MatchResultEnum.TRUE) { - matchResult = new RuleMatchResult(true, rule, result.comment()); + finalResult = new RuleMatchResult(true, rule, result.comment()); } } - return matchResult; + return finalResult; }
84-84
: 建议拆分长行以提高可读性当前的三元运算符行太长,建议拆分为多行以提高可读性。
- return primitive.getAsBoolean() ? new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_CONDITION_BOOLEAN)) : new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.MATCH_CONDITION_BOOLEAN)); + return primitive.getAsBoolean() + ? new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_CONDITION_BOOLEAN)) + : new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.MATCH_CONDITION_BOOLEAN));src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java (3)
425-428
: 建议统一规则匹配的处理方式IP 规则和其他规则(端口、客户端名称、Peer ID)的匹配结果处理方式不一致:
- IP 规则使用
matchResult.result() == MatchResultEnum.TRUE
- 其他规则使用
matchResult.hit()
建议统一处理方式以提高代码的一致性和可维护性。
Also applies to: 444-446
Line range hint
185-220
: 建议改进脚本执行的错误处理虽然使用虚拟线程来执行脚本是个很好的性能优化,但错误处理还可以改进:
- 建议为不同类型的异常提供更具体的错误信息
- 考虑添加重试机制处理临时性故障
- 添加更详细的日志记录,包括失败的脚本标识符
} catch (InterruptedException | ExecutionException e) { - log.error("Error executing script, skipping", e); + log.error("脚本执行失败 - 脚本ID: {}, 原因: {}", script.hashCode(), e.getMessage(), e); + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } }
Line range hint
1-450
: 总体代码质量评价代码整体结构清晰,有以下亮点:
- 使用虚拟线程优化性能
- 完善的配置状态报告
- 统一的规则处理架构
建议改进的方面:
- 统一规则匹配的处理方式
- 加强空值检查
- 改进错误处理的粒度
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java (1)
53-70
: 建议改进配置命名和API路径构建方式建议将以下内容改进:
- 将配置名称移至常量中,避免硬编码
- 使用统一的API路径构建工具类
建议修改如下:
+private static final String CONFIG_NAME = "ptr-blacklist"; +private static final String API_PATH = "/api/modules/"; @Override public @NotNull String getConfigName() { - return "ptr-blacklist"; + return CONFIG_NAME; } @Override public void onEnable() { reloadConfig(); webContainer.javalin() - .get("/api/modules/" + getConfigName(), this::handleWebAPI, Role.USER_READ); + .get(API_PATH + getConfigName(), this::handleWebAPI, Role.USER_READ); Main.getReloadManager().register(this); }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (9)
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java
(15 hunks)src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java
(1 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java
(8 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java
(2 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java
(2 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java
(2 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java
(2 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java
(2 hunks)src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java
(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
- src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java
- src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java
- src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java
⏰ Context from checks skipped due to timeout of 90000ms (4)
- GitHub Check: Build_Installers / install4jc
- GitHub Check: Build_PKG / pkg (13.4)
- GitHub Check: Build_SPK / pkgcreate
- GitHub Check: Build_Docker_Standalone
🔇 Additional comments (14)
src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java (2)
15-15
: 将类标记为 final 是个好的实践通过将类标记为 final,可以防止意外的继承,这有助于保持代码的可预测性和可维护性。
29-29
: 需要添加防御性编程检查在处理自定义的 hit 和 miss 值时,没有对
syntax.get()
的结果进行空值检查,可能导致 NullPointerException。建议添加防御性检查。Also applies to: 32-32
src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java (2)
17-17
: 类声明修改得很合理!将类标记为 final 是一个很好的做法,因为这个匹配器应该是不可变的实现。这样可以防止意外的继承和修改。
29-33
: 需要添加异常处理!使用
MatchResultEnum.valueOf
时如果传入无效的字符串会抛出异常。建议添加异常处理来提供更友好的错误提示。if (syntax.has("hit")) { + try { this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), new TranslationComponent(Lang.MATCH_STRING_REGEX, "Hit=" + rule.pattern())); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("无效的 hit 匹配结果类型:" + syntax.get("hit").getAsString(), e); + } } if (syntax.has("miss")) { + try { this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), new TranslationComponent(Lang.MATCH_STRING_REGEX, "Miss=" + rule.pattern())); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("无效的 miss 匹配结果类型:" + syntax.get("miss").getAsString(), e); + } }src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java (3)
7-7
: 类声明修改得当!将类标记为
final
是个很好的决定,这样可以:
- 防止类被继承,增强封装性
- 确保匹配行为的一致性
- 提高代码的可维护性
Also applies to: 17-17
20-21
: 字段声明改进合理!将
hit
和miss
从静态字段改为实例字段是很好的改进:
- 每个实例可以有自己的匹配结果
- 避免了静态字段可能带来的并发问题
- 更符合面向对象的设计原则
26-33
: 构造函数中存在潜在问题需要改进当前实现存在以下问题:
- 没有对
syntax.get()
的返回值进行空值检查- 消息格式不一致(默认初始化使用 rule,自定义初始化使用 "Hit-" + rule)
- 字符串拼接可以优化
建议按如下方式修改:
- this.hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_CONTAINS, rule)); - this.miss = new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent(Lang.MATCH_STRING_CONTAINS, rule)); + String defaultMessage = rule; + this.hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_CONTAINS, defaultMessage)); + this.miss = new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent(Lang.MATCH_STRING_CONTAINS, defaultMessage)); if (syntax.has("hit")) { - this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), new TranslationComponent(Lang.MATCH_STRING_CONTAINS, "Hit-" + rule)); + JsonElement hitElement = syntax.get("hit"); + if (hitElement != null && !hitElement.isJsonNull()) { + this.hit = new MatchResult( + MatchResultEnum.valueOf(hitElement.getAsString()), + new TranslationComponent(Lang.MATCH_STRING_CONTAINS, defaultMessage) + ); + } } if (syntax.has("miss")) { - this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), new TranslationComponent(Lang.MATCH_STRING_CONTAINS, "Miss-" + rule)); + JsonElement missElement = syntax.get("miss"); + if (missElement != null && !missElement.isJsonNull()) { + this.miss = new MatchResult( + MatchResultEnum.valueOf(missElement.getAsString()), + new TranslationComponent(Lang.MATCH_STRING_CONTAINS, defaultMessage) + ); + } }src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java (4)
16-16
: 将类标记为 final 是个好的改进!将工具类标记为 final 可以防止继承,这符合不可变设计原则,使代码更加安全可靠。
46-46
: 枚举类型的使用更加规范了!使用
MatchResultEnum.TRUE
替代原来的布尔值,使得代码更加类型安全。
64-64
: 枚举类型的使用更加规范了!使用
MatchResultEnum.TRUE
替代原来的布尔值,使得代码更加类型安全。
102-102
: 很好地修复了之前的数字转布尔问题!现在使用
!= 0
来判断数字的布尔值,这是更安全的做法。感谢采纳之前的建议!src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java (2)
103-103
: 配置结果报告的改进很好!添加
configResult
到状态信息中有助于更好地诊断配置问题。
58-59
: 需要增强空指针检查
btnNetwork
被标记为可选注入(required = false
),虽然在某些方法中已经进行了空值检查,但建议在所有使用btnNetwork
的地方都添加防御性检查,以避免潜在的NullPointerException
。src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java (1)
36-47
: 类结构设计合理!组件结构清晰,依赖注入使用恰当,并且通过实现 Reloadable 接口提供了良好的可重载性。
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java
Show resolved
Hide resolved
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java
Show resolved
Hide resolved
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (3)
src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java (3)
118-119
: HTTP请求失败处理更清晰使用
TranslationComponent
来格式化错误信息是个很好的改进,但建议添加重试机制。建议添加以下功能:
- 实现指数退避重试
- 记录重试次数
- 在达到最大重试次数后通知管理员
+ private static final int MAX_RETRY_ATTEMPTS = 3; + private static final long INITIAL_RETRY_DELAY = 1000; // 1 second if (resp.statusCode() != 200) { + for (int attempt = 1; attempt <= MAX_RETRY_ATTEMPTS; attempt++) { + Thread.sleep(INITIAL_RETRY_DELAY * attempt); + resp = HTTPUtil.retryableSend(httpClient, MutableRequest.GET(configUrl), + HttpResponse.BodyHandlers.ofString()).join(); + if (resp.statusCode() == 200) break; + } + if (resp.statusCode() != 200) { configResult = new TranslationComponent(Lang.BTN_CONFIG_STATUS_UNSUCCESSFUL_HTTP_REQUEST, configUrl, resp.statusCode(), resp.body()); return; + } }
129-130
: 协议版本不兼容的错误处理优化使用
configResult
存储详细的错误信息很好,但建议在抛出异常前记录更多诊断信息。建议在抛出异常前添加详细的日志记录:
+ log.error("协议版本不兼容:客户端版本 {} < 服务器要求的最小版本 {}", + Main.PBH_BTN_PROTOCOL_IMPL_VERSION, min_protocol_version); configResult = new TranslationComponent(Lang.BTN_CONFIG_STATUS_UNSUCCESSFUL_INCOMPATIBLE_BTN_PROTOCOL_VERSION_CLIENT, Main.PBH_BTN_PROTOCOL_IMPL_VERSION, min_protocol_version); throw new IllegalStateException(tlUI(configResult));
111-111
: 同步机制可以进一步优化虽然添加了
synchronized
关键字来保护configBtnNetwork
方法,但建议考虑更细粒度的锁定机制。建议考虑以下优化:
- 使用
ReentrantLock
替代synchronized
以获得更好的灵活性- 将配置读取和更新分开锁定
- 添加超时机制
+ private final ReentrantLock configLock = new ReentrantLock(); - public synchronized void configBtnNetwork() { + public void configBtnNetwork() { + if (!configLock.tryLock(30, TimeUnit.SECONDS)) { + log.warn("获取配置锁超时,可能存在死锁风险"); + return; + } + try { // 现有的配置逻辑 + } finally { + configLock.unlock(); + } }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java
(8 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (2)
- GitHub Check: Build_SPK / pkgcreate
- GitHub Check: Build_Installers / install4jc
🔇 Additional comments (4)
src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java (4)
44-44
: 使用线程安全的Map集合实现很好的改进!使用
Collections.synchronizedMap
确保了在多线程环境下abilities
Map 的线程安全性。这样可以避免并发修改异常(ConcurrentModificationException)。
75-75
: 添加重载日志记录很有帮助添加日志记录有助于追踪系统的重载状态,这对于问题诊断很有价值。
86-87
: 配置重置逻辑更完善重置
configSuccess
和configResult
的顺序很合理,确保了配置状态的一致性。
105-105
: 调度器延迟设置需要考虑影响将初始延迟设置为0可能会导致系统启动时立即执行配置检查。建议考虑是否需要一个小的初始延迟来避免启动时的资源竞争。
建议验证在高负载情况下是否会对系统启动性能造成影响。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (3)
.github/workflows/jvm-ci.yml (1)
65-77
: 建议添加构建参数以增强版本追踪配置看起来不错,但建议添加构建参数以便更好地追踪版本信息。
- name: Build and push Docker image (Primary) uses: docker/[email protected] with: context: . file: ./Dockerfile-Primary push: true platforms: | linux/amd64 linux/arm64/v8 tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}-jvm-universal cache-from: type=gha cache-to: type=gha,mode=max + build-args: | + GIT_HASH=${{ github.sha }} + VERSION=${{ github.ref_name }}.github/workflows/jvm-release.yml (2)
161-175
: 建议补充版本构建参数当前配置已包含 GIT_HASH 构建参数,建议添加 VERSION 参数以便更好地追踪发布版本。
build-args: | GIT_HASH=${{ github.sha }} + VERSION=${{ github.ref_name }}
Line range hint
176-191
: 请移除尾随空格第191行存在尾随空格,建议移除以保持代码整洁。
- +
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
.github/workflows/jvm-ci.yml
(1 hunks).github/workflows/jvm-release.yml
(3 hunks)
🧰 Additional context used
🪛 yamllint (1.35.1)
.github/workflows/jvm-release.yml
[error] 191-191: trailing spaces
(trailing-spaces)
⏰ Context from checks skipped due to timeout of 90000ms (4)
- GitHub Check: Build_SPK / pkgcreate
- GitHub Check: Build_Installers / install4jc
- GitHub Check: Build_PKG / pkg (14.1)
- GitHub Check: Build_Docker_Standalone
🔇 Additional comments (4)
.github/workflows/jvm-ci.yml (2)
78-90
: 配置正确且完整次要架构的 Docker 构建配置完整且与主要架构保持一致,包括缓存配置。
91-125
: 重复的元数据提取配置独立构建任务中的元数据提取步骤与主构建任务重复,建议采用之前建议的可重用工作流方案。
.github/workflows/jvm-release.yml (2)
Line range hint
200-226
: 配置正确且与 Docker Hub 构建保持一致阿里云 ACR 主要架构的构建配置完整,且与 Docker Hub 构建保持一致。
227-239
: 次要架构配置正确阿里云 ACR 次要架构的构建配置完整,标签后缀设置正确。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
.github/workflows/jvm-ci.yml
(1 hunks)Dockerfile
(1 hunks)Dockerfile-Release
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- .github/workflows/jvm-ci.yml
⏰ Context from checks skipped due to timeout of 90000ms (3)
- GitHub Check: Build_Installers / install4jc
- GitHub Check: Build_Docker
- GitHub Check: Build_Docker_Standalone
🔇 Additional comments (1)
Dockerfile-Release (1)
8-8
: 优化JVM内存配置添加最小堆内存设置
-Xms16M
是个不错的改进,可以帮助容器在启动时更好地控制内存占用。但建议考虑以下几点:
- 验证16MB是否足够应用正常启动
- 考虑添加容器内存限制参数(如
-XX:MaxRAMPercentage
)✅ Verification successful
JVM内存配置验证结果
经过代码库分析,当前的内存配置是合理的:
- 最小堆内存16MB适合容器化的Java应用初始启动
- 最大堆内存512MB与应用规模相匹配
- G1GC和字符串重复数据删除等优化选项配置恰当
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # 检查应用启动时的内存使用情况 docker run --rm eclipse-temurin:23-jre-noble java -XX:+PrintFlagsFinal -version | grep -i heapsizeLength of output: 197
Script:
#!/bin/bash # Search for memory-related configurations and documentation echo "=== Searching for memory configurations in Dockerfiles ===" fd Dockerfile --exec grep -i "java.*opts\|memory\|heap" {} || true echo -e "\n=== Searching for memory settings in properties files ===" fd "\.properties$" --exec grep -i "memory\|heap\|xm[sx]" {} || true echo -e "\n=== Checking README for system requirements ===" if [ -f README.md ]; then echo "Found README.md:" grep -i "memory\|system.*require\|prerequisite" README.md || true fiLength of output: 1086
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (1)
Dockerfile-Release (1)
11-11
:⚠️ Potential issueENTRYPOINT配置存在安全隐患
当前ENTRYPOINT配置使用shell形式可能导致安全风险:
- shell形式会创建额外的shell进程
- 存在命令注入的潜在风险
建议修改为exec形式:
-ENTRYPOINT ["sh", "-c", "${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar PeerBanHelper.jar"] +ENTRYPOINT ["java", "-Dpbh.release=docker", "-Djava.awt.headless=true", "-Xmx512M", "-Xms16M", "-Xss512k", "-XX:+UseG1GC", "-XX:+UseStringDeduplication", "-XX:+ShrinkHeapInSteps", "-jar", "PeerBanHelper.jar"]
🧹 Nitpick comments (2)
Dockerfile-Release (2)
1-1
: 基础镜像更改评估从eclipse-temurin切换到bellsoft/liberica是一个积极的改变:
- slim-musl变体可以显著减小镜像大小
- 保持了JDK 23版本的兼容性
建议在README中记录这个基础镜像变更的原因,以便其他开发者了解选择bellsoft/liberica的优势。
8-8
: 内存配置优化建议当前的Java内存配置参数合理,新增的
-Xms16M
初始堆大小设置适中。但建议考虑以下优化:
- 考虑添加
-XX:MaxRAMPercentage
来动态调整最大堆大小- 添加
-XX:+ExitOnOutOfMemoryError
以便容器在OOM时能够正常重启
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
.github/workflows/jvm-ci.yml
(1 hunks).github/workflows/jvm-release.yml
(0 hunks)Dockerfile
(1 hunks)Dockerfile-Release
(1 hunks)
💤 Files with no reviewable changes (1)
- .github/workflows/jvm-release.yml
🚧 Files skipped from review as they are similar to previous changes (2)
- Dockerfile
- .github/workflows/jvm-ci.yml
⏰ Context from checks skipped due to timeout of 90000ms (4)
- GitHub Check: Build_SPK / pkgcreate
- GitHub Check: Build_Installers / install4jc
- GitHub Check: Build_Docker
- GitHub Check: Build_Docker_Standalone
@coderabbitai resolve |
✅ Actions performedComments resolved and changes approved. |
新功能
优化
错误修复
其它更改
Sparkle BTN 更新
Sparkle Tracker 更新
PBH-BTN/Trunker 是一个使用 Golang 编写的高性能 BitTorrent HTTP Tracker 程序(不支持其它协议是刻意的)。其设计目标是使用尽可能少的 CPU 和网络资源处理 Tracker 服务器面临的高并发问题,同时收集和存储 Peer 特征数据以供 BTN 网络程序分析使用。
在不启用持久化的情况下,可以作为普通的 Tracker 程序使用。支持 Unix Domain Socket 以降低 CPU 网络软中断压力。
Trunker 运行高效且经过生产环境的压力验证,欢迎试用。
您也可以使用由 PBH-BTN 维护的 Trunker 实例,由此实例收集的数据会用于 BTN 分析。如果您是种子发布者,欢迎将其添加到 Tracker 列表中:
BTN-Collected-Rules 更改
新增规则
在 Sparkle BTN 完成更新后,我们对过去 6 个月的累积数据进行了分析,并创建了多个新规则,欢迎订阅它们或者用作参考:
cevskxsnm-10-idc.txt
(推荐订阅)某 IDC 刷流机房 IP 地址(静态公网 IP),IP 段完美符合其官网宣传的所有机房的地理位置分布,通过 IP 段和主机名确认关联,伪装特征为qBittorrent/4.6.7
,代表 IP 地址段:101.69.63.0/24
。通过主机名确认至少有 82 台机器运行刷流程序,每台机器分配多张由于法律原因,更多证明信息和公司名称不对外公布。poonisxq-10.txt
(用于参考)某电影分发的小微企业的边缘节点 IP 地址(动静混合),公司域名 ICP 备案于 24 年 8 月份完成,并在备案完成的 2 周内出现刷流 Peer(由 BTN 客户端发现模块记录)。通过 PeerID、主机名、部署的服务程序确认存在关联。特征为Rain 0.0.0
,代表 IP 段:185.107.45.0/24
。由于法律原因,更多证明信息和公司名称不对外公布。gopeeddev.txt
(用于参考)Gopeed dev 的节点 IP 地址(静态公网 IP),通过 IP 段和主机名确认存在关联。代表 IP 段:218.91.255.0/24
。目前所有者不明。aria2c.txt
(用于参考)使用 aria2 特征刷流的 IP 地址(动静混合),特征aria2/1.37.0
,代表 IP 段:114.227.158.0/24
。目前所有者不明。您无需修改 PBH 的配置,所有新的规则都会合并到 all.txt 中。
现有规则更改
multi-dial.txt
规则清理尾言
在本次问卷调查中,我们收到了很多伙伴们的建设性建议。其中一部分建议已在本次更新中加入 PeerBanHelper 中,但仍有部分留言由于系统限制无法回复。我们在此统一对这些问题进行回答:
-Dpbh.datadir=/path/to/data
单独更改配置目录:-Dpbh.configdir=/path/to/config
单独更改日志目录:-Dpbh.logsdir=/path/to/logs
转眼又是新的一年,转眼 PeerBanHelper 就快要一周年啦(2 月 7 日)。
时间飞逝,希望有 PeerBanHelper 陪伴下,今年也会是快乐 BT 的一年。提前拜个早年,2025 新年快乐~
已知问题
Docker
DockerHub:
ghostchu/peerbanhelper:v7.3.0
阿里云国内镜像加速:
registry.cn-hangzhou.aliyuncs.com/ghostchu/peerbanhelper:v7.3.0