-
-
Notifications
You must be signed in to change notification settings - Fork 137
Merge into master #919
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
Merge into master #919
Conversation
…HUtilitiesController.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Tracker 列表操作能力
…n-6.x Update docker/build-push-action action to v6.12.0
…-jdk18on-1.x Update dependency org.bouncycastle:bcprov-jdk18on to v1.80
…dk18on-1.x Update dependency org.bouncycastle:bcpg-jdk18on to v1.80
|
Warning Rate limit exceeded@Ghost-chu has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 2 minutes and 27 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📒 Files selected for processing (6)
概述工作流程这个拉取请求(PR)包含了 PeerBanHelper 项目的多个重要更新,主要涉及 CI/CD 工作流、依赖版本、系统配置管理和新功能引入。主要变更包括更新 Docker 构建操作版本、项目和依赖版本、引入新的配置管理类 变更
序列图sequenceDiagram
participant Client
participant WebAPI
participant UtilitiesController
participant Downloader
Client->>WebAPI: 发送替换跟踪器请求
WebAPI->>UtilitiesController: 处理替换请求
UtilitiesController->>Downloader: 获取当前跟踪器
Downloader-->>UtilitiesController: 返回跟踪器列表
UtilitiesController->>UtilitiesController: 替换跟踪器
UtilitiesController->>Downloader: 更新跟踪器
Downloader-->>UtilitiesController: 确认更新
UtilitiesController-->>WebAPI: 返回替换结果
WebAPI-->>Client: 响应替换状态
可能相关的 PR
总结这个 PR 代表了 PeerBanHelper 项目的重要演进,通过引入集中式配置管理、增强跟踪器处理能力和更新依赖,提高了项目的灵活性和可维护性。主要亮点包括:
这些变更不仅改进了代码质量,还为未来的功能扩展奠定了基础。 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
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: 19
🔭 Outside diff range comments (1)
src/main/java/com/ghostchu/peerbanhelper/btn/ping/BtnPeerHistory.java (1)
Line range hint
41-57: 需要更新 from 方法
from方法中缺少对新增字段torrentIsPrivate的赋值。建议添加如下代码:
public static BtnPeerHistory from(PeerRecordEntity peer) { BtnPeerHistory btnPeer = new BtnPeerHistory(); btnPeer.setIpAddress(peer.getAddress()); btnPeer.setPeerId(peer.getPeerId()); btnPeer.setClientName(peer.getClientName()); String hashedId = InfoHashUtil.getHashedIdentifier(peer.getTorrent().getInfoHash()); btnPeer.setTorrentIdentifier(hashedId); + btnPeer.setTorrentIsPrivate(peer.getTorrent().isPrivateTorrent()); btnPeer.setTorrentSize(peer.getTorrent().getSize());
🧹 Nitpick comments (41)
src/main/java/com/ghostchu/peerbanhelper/metric/impl/persist/PersistMetrics.java (1)
102-103: 代码变更正确地添加了私有种子标记!代码变更正确地将种子的私有状态(privateTorrent)添加到了数据持久化中。这个改动:
- 增强了数据收集的完整性
- 有助于后续基于种子类型进行分析
- 保持了与数据库模型的一致性
建议:考虑添加注释说明私有种子的判定标准,以便后续维护。
metadata.getTorrent().getSize(), + // 根据 BitTorrent 协议判断种子是否为私有 metadata.getTorrent().isPrivateTorrent()src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRTorrent.java (1)
74-76: 建议增加方法文档和空值处理当前实现有以下几点建议改进:
- 建议添加方法的 Javadoc 文档说明
- 需要添加 @NotNull 或 @nullable 注解来明确返回值的可空性
- 建议添加对 backend.getTrackerList() 返回值的空值检查
- 建议添加异常处理机制,以防解析失败
建议按如下方式修改:
+ /** + * 获取当前种子关联的 Tracker 列表 + * + * @return Tracker 列表,永不为 null + * @throws IllegalStateException 如果解析 Tracker 列表失败 + */ + @NotNull public List<Tracker> getTrackers() { - return TrackerImpl.parseFromTrackerList(backend.getTrackerList()); + List<String> trackerList = backend.getTrackerList(); + if (trackerList == null) { + return Collections.emptyList(); + } + try { + return TrackerImpl.parseFromTrackerList(trackerList); + } catch (Exception e) { + throw new IllegalStateException("Failed to parse tracker list", e); + } }src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java (2)
45-46: 建议优化配置检索逻辑当前实现有以下几点可以改进:
- "pbh.kuboRPC" 字符串重复出现,建议提取为常量
- 配置检索逻辑可以更简洁
- 缺少对 RPC URL 格式的验证
建议按如下方式重构:
+ private static final String KUBO_RPC_KEY = "pbh.kuboRPC"; // ... - if (ExternalSwitch.parse("pbh.kuboRPC") != null) { - ipfsRpc = ExternalSwitch.parse("pbh.kuboRPC"); - } + ipfsRpc = ExternalSwitch.parse(KUBO_RPC_KEY, ipfsRpc);另外,建议添加 RPC URL 格式验证:
private boolean isValidRpcUrl(String url) { return url != null && (url.startsWith("/ip4/") || url.startsWith("http://") || url.startsWith("https://")); }
Line range hint
49-52: 建议改进错误处理机制当前代码捕获所有异常(Exception),这可能会掩盖具体的连接问题或配置错误。建议区分处理不同类型的异常,以便更好地进行故障排查。
建议改进如下:
try { // ... existing code ... + } catch (IllegalArgumentException e) { + log.error(tlUI(Lang.IPFS_CONFIG_INVALID, ipfsRpc, e.getMessage())); + } catch (IOException e) { + log.error(tlUI(Lang.IPFS_CONNECTION_FAILED, ipfsRpc, e.getMessage())); } catch (Exception e) { - log.warn(tlUI(Lang.IPFS_INIT_FAILED, e.getMessage())); + log.error(tlUI(Lang.IPFS_INIT_FAILED, e.getMessage())); }src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/resp/BCTaskTrackersResponse.java (2)
9-19: 建议添加类级别的JavaDoc文档为了提高代码的可维护性,建议添加以下内容:
- 类的用途说明
- 字段的含义描述
- 与BitComet API的关系说明
建议添加如下文档:
+/** + * BitComet任务追踪器响应的数据传输对象。 + * 用于封装来自BitComet API的tracker相关响应数据。 + */ @NoArgsConstructor @Data public class BCTaskTrackersResponse {
20-41: 建议对TrackerDTO进行以下优化
- 添加字段验证
- 将status字段改为枚举类型
- 添加JavaDoc文档
建议进行如下修改:
+import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +/** + * Tracker详细信息的数据传输对象 + */ @NoArgsConstructor @Data public static class TrackersDTO { @JsonProperty("name") + @NotNull private String name; @JsonProperty("retries") + @Min(0) private Integer retries; // ... other fields ... @JsonProperty("status") - private String status; + private TrackerStatus status; } +/** + * Tracker状态枚举 + */ +public enum TrackerStatus { + WORKING, + FAILED, + UPDATING + // 添加其他可能的状态 +}src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/ExpressionRule.java (1)
170-170: 建议增加安全相关的文档和日志记录!代码重构的方向是正确的,但建议做如下加强:
- 添加详细的方法级文档,说明禁用安全检查的风险
- 在检测到禁用安全检查时,添加警告级别的日志记录,以便于审计和监控
建议添加如下改动:
+ /** + * 检查当前网络环境是否安全。 + * + * 警告:通过系统属性禁用此检查会带来严重的安全风险,可能导致: + * - 未经授权的脚本访问和修改 + * - 潜在的远程代码执行风险 + * - 数据泄露或损坏 + * + * @param context HTTP上下文 + * @return 如果环境安全返回true,否则返回false + */ private boolean isSafeNetworkEnvironment(Context context){ var value = ExternalSwitch.parse("pbh.please-disable-safe-network-environment-check-i-know-this-is-very-dangerous-and-i-may-lose-my-data-and-hacker-may-attack-me-via-this-endpoint-and-steal-my-data-or-destroy-my-computer-i-am-fully-responsible-for-this-action-and-i-will-not-blame-the-developer-for-any-loss"); if(value != null && value.equals("true")){ + log.warn("安全网络环境检查已被禁用!这可能导致严重的安全风险。"); return true; }src/main/java/com/ghostchu/peerbanhelper/text/Lang.java (1)
501-501: 建议在文件末尾添加换行符为了符合代码规范,建议在文件末尾添加一个换行符。
DOWNLOADER_FAILED_REQUEST_TRACKER_LIST_ON_TORRENT, TRACKER_FAILED_TO_UPDATE_TRACKER, UTILITIES_TRACKER_REPLACED; +src/main/resources/lang/zh_cn/messages.yml (1)
566-566: 建议在文件末尾添加换行符为了符合 YAML 文件规范,建议在文件末尾添加一个换行符。
UTILITIES_TRACKER_REPLACED: "已成功替换 {} 个种子的 Tracker" +🧰 Tools
🪛 yamllint (1.35.1)
[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 (1)
569-569: 建议在文件末尾添加换行符为了符合 YAML 文件规范,建议在文件末尾添加一个换行符。
UTILITIES_TRACKER_REPLACED: "已成功替换 {} 个种子的 Tracker" +🧰 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/en_us/messages.yml (1)
569-569: 建议在文件末尾添加换行符为了符合 YAML 文件规范,建议在文件末尾添加一个换行符。
UTILITIES_TRACKER_REPLACED: "Successfully replaced {} torrent's tracker" +🧰 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/rule/ProgressCheatBlocker.java (1)
305-305: 建议优化配置检查逻辑使用 ExternalSwitch.parse 替代系统属性检查是个好的改进,但建议考虑以下几点:
- 可以将配置键名定义为常量,避免魔法字符串
- 建议添加配置项的默认值处理
-} else if (ExternalSwitch.parse("pbh.pcb.disable-completed-excessive") == null && completedSize > 0 && actualUploaded > completedSize) { +private static final String CONFIG_DISABLE_COMPLETED_EXCESSIVE = "pbh.pcb.disable-completed-excessive"; +} else if (ExternalSwitch.parse(CONFIG_DISABLE_COMPLETED_EXCESSIVE, false) && completedSize > 0 && actualUploaded > completedSize) {src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java (3)
Line range hint
133-137: 建议优化开关名称当前的开关名称过长且难以维护。建议重构为更简洁的名称,例如
pbh.downloader.transmission.suppress-warnings或pbh.downloader.transmission.acknowledge-risks。-if (ExternalSwitch.parse("pbh.downloader.transmission.i-know-transmission-is-discourage-and-could-be-removed-in-future-please-dont-show-require-take-actions-status-text-and-i-know-what-i-am-doing") != null) { +if (ExternalSwitch.parse("pbh.downloader.transmission.suppress-warnings") != null) {
170-185: 建议添加方法文档注释新增的 tracker 管理方法功能完整,但建议添加 JavaDoc 文档注释,说明:
- 方法的具体功能
- 参数要求
- tracker 列表格式要求
- 可能的异常情况
+/** + * 获取种子的 tracker 列表 + * + * @param torrent 目标种子 + * @return tracker 列表 + */ @Override public List<Tracker> getTrackers(Torrent torrent) { +/** + * 设置种子的 tracker 列表 + * + * @param torrent 目标种子 + * @param trackers 新的 tracker 列表 + * @throws RuntimeException 当 RPC 调用失败时抛出 + */ @Override public void setTrackers(Torrent torrent, List<Tracker> trackers) {
244-246: 建议添加日志记录当通过开关禁用种子重启功能时,建议添加日志记录,以便于问题排查。
if (ExternalSwitch.parse("pbh.transmission.disable-torrent-relaunch") != null) { + log.info("种子重启功能已通过开关禁用"); return; }src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java (1)
225-231: 改进异常处理,提供更详细的错误信息在捕获异常时,建议在抛出的
IllegalStateException中包含请求的URL和参数信息,以便于调试和定位问题。src/main/java/com/ghostchu/peerbanhelper/torrent/Tracker.java (1)
5-10: 考虑为接口方法提供默认实现在
Tracker接口中,可以为getLeadingTracker()方法提供默认实现,以减少实现类的重复代码,提高代码的可维护性。default String getLeadingTracker() { return getTrackersInGroup().isEmpty() ? null : getTrackersInGroup().get(0); }src/main/java/com/ghostchu/peerbanhelper/database/table/TorrentEntity.java (1)
22-23: 添加字段注释,提升代码可读性建议为
privateTorrent字段添加注释,说明其含义和用途,方便后续维护和阅读。src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentTorrentTrackers.java (1)
20-21: 建议为status字段添加文档说明建议添加JavaDoc注释来说明status字段可能的值及其含义,这将有助于其他开发者理解和使用这个类。
@JsonProperty("status") + /** + * Tracker状态码: + * 0 - 禁用 + * 1 - 未验证 + * 2 - 正在工作 + * 3 - 更新中 + * 4 - 未能更新 + */ private Integer status;src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/network/wrapper/DownloadRecord.java (1)
33-33: 建议为trackers字段的数据结构添加说明文档
List<List<String>>的嵌套结构暗示了tracker的分组,但缺少对这种结构的解释。建议添加JavaDoc来说明外层List和内层List各自代表什么,以及为什么需要这样的嵌套结构。+ /** + * Tracker列表,外层List代表tracker组,内层List包含每个组中的具体tracker URL + * 例如: + * [ + * ["http://tracker1.com", "http://tracker2.com"], // 第一组trackers + * ["http://tracker3.com"] // 第二组trackers + * ] + */ private List<List<String>> trackers;src/main/java/com/ghostchu/peerbanhelper/torrent/TrackerImpl.java (1)
38-46: 建议优化 parseFromTrackerList 方法当前实现可以进一步优化:
- 使用
List.of()替代Collections.emptyList()- 添加对输入字符串的 trim 处理
建议修改如下:
public static List<Tracker> parseFromTrackerList(String trackerList) { if (trackerList == null) { - return Collections.emptyList(); + return List.of(); } - return Stream.of(trackerList.split("\n\n")) + return Stream.of(trackerList.trim().split("\n\n")) .filter(str -> !str.isBlank()) .map(TrackerImpl::new) .collect(Collectors.toUnmodifiableList()); }src/main/java/com/ghostchu/peerbanhelper/downloader/Downloader.java (1)
Line range hint
83-110: 接口扩展设计合理新增的三个方法设计合理,并保持了一致的中文文档风格。建议考虑添加以下内容:
- 在
setTrackers方法文档中说明当操作失败时的异常处理- 在
getAllTorrents方法文档中说明返回列表是否可能为 nullsrc/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/Deluge.java (2)
161-164: 考虑添加文档注释getAllTorrents方法是getTorrents的别名,建议添加JavaDoc说明两者的区别。
建议添加如下文档注释:
+/** + * 获取所有种子,包括非活动的种子。 + * 注意:当前实现与{@link #getTorrents()}相同,返回所有活动的种子。 + * + * @return 所有种子的列表 + */ @Override public List<Torrent> getAllTorrents() { return getTorrents(); }
174-177: 实现getTrackers方法的实际功能当前返回空列表,建议实现实际的tracker获取功能。
需要我帮助实现完整的tracker获取功能吗?
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/AbstractQbittorrent.java (2)
Line range hint
192-214: 建议提取URL构建逻辑fetchTorrents方法中的URL构建逻辑可以提取为单独的方法。
建议重构如下:
+private String buildTorrentsUrl(boolean onlyActive) { + String url = apiEndpoint + "/torrents/info"; + if (onlyActive) { + url += "?filter=active"; + } + return url; +} private List<Torrent> fetchTorrents(boolean onlyActive, boolean includePrivate) { HttpResponse<String> request; try { - String url = apiEndpoint + "/torrents/info"; - if (onlyActive) { - url += "?filter=active"; - } - request = httpClient.send(MutableRequest.GET(url), HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + request = httpClient.send(MutableRequest.GET(buildTorrentsUrl(onlyActive)), + HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); } catch (Exception e) { throw new IllegalStateException(e); } // ... rest of the method }
216-241: 改进错误处理和日志记录getTrackers方法的错误处理可以更详细。
建议添加更多日志记录:
@Override public List<Tracker> getTrackers(Torrent torrent) { + log.debug("Fetching trackers for torrent: {}", torrent.getId()); HttpResponse<String> request; try { request = httpClient.send(MutableRequest.GET(apiEndpoint + "/torrents/trackers?hash=" + torrent.getId()), HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); } catch (Exception e) { + log.error("Failed to fetch trackers for torrent: {}", torrent.getId(), e); throw new IllegalStateException(e); } // ... rest of the method + log.debug("Successfully fetched {} trackers for torrent: {}", trackers.size(), torrent.getId()); return trackers; }src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java (3)
271-278: 建议添加方法文档注释建议添加 JavaDoc 注释说明此方法与
getTorrents()的区别,特别是:
- 此方法获取所有状态的种子
- 包含私有种子
+/** + * 获取所有种子,包括所有状态(活动、暂停等)和私有种子。 + * 与 {@link #getTorrents()} 的区别是不会过滤私有种子,且包含所有状态的种子。 + * + * @return 所有种子列表 + */ @Override public List<Torrent> getAllTorrents() {
Line range hint
281-331: 建议改进代码结构和文档
- 建议添加方法文档,说明参数含义和方法功能
- 建议将信号量限制提取为常量
+private static final int MAX_CONCURRENT_TORRENT_REQUESTS = 4; + +/** + * 获取种子列表 + * + * @param requirements 请求参数,包含 group_state、sort_key 等 + * @param includePrivate 是否包含私有种子 + * @return 种子列表 + * @throws IllegalStateException 当请求失败时抛出 + */ public List<Torrent> fetchTorrents(Map<String, String> requirements, boolean includePrivate) { // ... existing code ... - Semaphore semaphore = new Semaphore(4); + Semaphore semaphore = new Semaphore(MAX_CONCURRENT_TORRENT_REQUESTS); // ... rest of the code ...
333-358: 建议优化 Tracker URL 过滤逻辑建议将支持的 URL 方案提取为常量集合,使代码更易维护和理解。
+private static final Set<String> SUPPORTED_TRACKER_SCHEMES = Set.of("http", "https", "udp", "ws", "wss"); @Override public List<Tracker> getTrackers(Torrent torrent) { // ... existing code ... return trackers.getTrackers().stream() - .filter(t -> t.getName().startsWith("http") || t.getName().startsWith("udp") || t.getName().startsWith("ws")) + .filter(t -> SUPPORTED_TRACKER_SCHEMES.stream().anyMatch(scheme -> t.getName().startsWith(scheme))) .map(t -> (Tracker) new TrackerImpl(t.getName())).toList(); // ... rest of the code ...src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHUtilitiesController.java (3)
33-36: 建议使用构造函数注入来替代字段注入为了遵循Spring框架的最佳实践,建议将
@Autowired注解用于构造函数而不是字段。这将提高代码的可测试性和可维护性。可以按以下方式修改代码:
public class PBHUtilitiesController extends AbstractFeatureModule { - @Autowired - private JavalinWebContainer webContainer; - @Autowired - private AlertDao alertDao; + private final JavalinWebContainer webContainer; + private final AlertDao alertDao; + + @Autowired + public PBHUtilitiesController(JavalinWebContainer webContainer, AlertDao alertDao) { + this.webContainer = webContainer; + this.alertDao = alertDao; + }
62-65: 加强输入参数的验证在
handleReplaceTracker方法中,建议对dto.from()和dto.to()进行trim()处理,以防止仅包含空白字符的字符串通过验证。修改如下:
ReplaceTrackerDTO dto = context.bodyAsClass(ReplaceTrackerDTO.class); -if (dto == null || dto.from() == null || dto.to() == null || dto.from().isEmpty() || dto.to().isEmpty()) { +if (dto == null || dto.from() == null || dto.to() == null || dto.from().trim().isEmpty() || dto.to().trim().isEmpty()) { context.status(400); return; } +String from = dto.from().trim(); +String to = dto.to().trim();
83-84: 避免在日志中记录未经过滤的用户输入直接在日志中记录
torrent.getName()和downloader.getName(),如果这些值包含恶意字符,可能导致日志注入攻击。建议对这些值进行转义或清理,确保日志记录的安全性。Also applies to: 88-89
src/main/java/com/ghostchu/peerbanhelper/btn/ability/BtnAbilitySubmitHistory.java (1)
125-135: 改进避免无限循环的逻辑通过简单地将
lastRecordAt加1来避免无限循环可能不够可靠。建议在获取lastRecordAt后,确保时间戳递增,例如使用System.currentTimeMillis()或引入唯一的序列号,以避免时间戳冲突。src/main/java/com/ghostchu/peerbanhelper/BuildMeta.java (1)
20-21: 配置获取方式的改进使用
ExternalSwitch.parse替代直接的configuration.getString调用是一个很好的改进。这样可以通过系统属性覆盖配置文件中的值,提供了更灵活的配置管理方式。建议考虑添加日志记录,以便在系统属性覆盖配置值时进行追踪。
src/main/java/com/ghostchu/peerbanhelper/gui/impl/console/ConsoleGuiImpl.java (1)
12-12: 同步机制优化将
AtomicBoolean替换为CountDownLatch是一个很好的改进:
- 简化了同步逻辑
- 消除了可能的竞态条件
- 提供了更可靠的线程协调机制
建议添加以下改进:
- private final CountDownLatch countDownLatch = new CountDownLatch(1); + @SuppressWarnings("FieldCanBeLocal") + private final CountDownLatch countDownLatch = new CountDownLatch(1);Also applies to: 30-30, 35-35
src/main/java/com/ghostchu/peerbanhelper/ExternalSwitch.java (2)
8-15: 基础解析方法实现良好
parse方法的实现考虑周到:
- 优先使用系统属性
- 回退到环境变量
- 正确处理空值
建议添加参数验证:
public static String parse(String args, @Nullable String def) { + if (args == null || args.isEmpty()) { + throw new IllegalArgumentException("参数名不能为空"); + } var value = System.getProperty(args);
1-108: 建议添加缓存机制对于频繁访问的配置项,建议添加缓存机制以提高性能。
建议:
- 添加 LRU 缓存来存储常用配置
- 提供缓存刷新机制
- 添加配置变更监听功能
src/main/java/com/ghostchu/peerbanhelper/web/JavalinWebContainer.java (2)
48-48: 建议将用户代理黑名单配置外部化目前的扫描器黑名单是硬编码的,建议将其移至配置文件中,以便于后期维护和更新。
- private static final String[] blockUserAgent = new String[]{"censys", "shodan", "zoomeye", "threatbook", "fofa", "zmap", "nmap", "archive"}; + private String[] blockUserAgent; + + public JavalinWebContainer(ActivationManager activationManager) { + this.blockUserAgent = Main.getMainConfig().getStringList("security.blocked-user-agents").toArray(new String[0]);
165-175: 安全检查实现完善用户代理检查的实现逻辑合理,但建议添加日志记录以便追踪可疑访问:
private boolean securityCheck(Context ctx) { var userAgent = ctx.userAgent(); - if (userAgent == null) return false; - if (userAgent.isBlank()) return false; + if (userAgent == null || userAgent.isBlank()) { + log.warn("Blocked request with empty user agent from IP: {}", ctx.ip()); + return false; + } var ua = userAgent.toLowerCase(); for (String s : blockUserAgent) { if (ua.contains(s)) { + log.warn("Blocked suspicious user agent: {} from IP: {}", userAgent, ctx.ip()); return false; } } return true; }src/main/java/com/ghostchu/peerbanhelper/Main.java (1)
115-118: 统一使用 ExternalSwitch 进行配置管理将多处
System.getProperty替换为ExternalSwitch.parse有助于统一配置管理,提高可维护性。建议添加配置项的文档说明。建议:
- 为所有配置项添加注释说明用途
- 创建配置项清单文档
- 考虑添加配置项验证机制
Also applies to: 233-247, 255-259, 273-273, 341-341, 357-359
src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java (1)
200-201: 配置管理更新使用
ExternalSwitch.parse统一了配置管理方式,包括 release 和 token 的获取。建议:
- 考虑为敏感配置(如 token)添加加密支持
- 添加配置值的合法性验证
Also applies to: 387-389
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (49)
.github/workflows/jvm-ci.yml(2 hunks).github/workflows/jvm-release.yml(2 hunks)Dockerfile(1 hunks)Dockerfile-Release(1 hunks)pom.xml(2 hunks)src/main/java/com/ghostchu/peerbanhelper/BuildMeta.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/ExternalSwitch.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/Main.java(8 hunks)src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java(3 hunks)src/main/java/com/ghostchu/peerbanhelper/btn/ability/BtnAbilitySubmitHistory.java(5 hunks)src/main/java/com/ghostchu/peerbanhelper/btn/ping/BtnPeer.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/btn/ping/BtnPeerHistory.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/database/Database.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/database/DatabaseHelper.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/PeerRecordDao.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/TorrentDao.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/database/table/TorrentEntity.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/Downloader.java(3 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java(6 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/network/BiglyBTTorrent.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/network/wrapper/DownloadRecord.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BCEndpoint.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java(4 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/resp/BCTaskTrackersResponse.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/Deluge.java(3 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/AbstractQbittorrent.java(6 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentTorrentTrackers.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRTorrent.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java(7 hunks)src/main/java/com/ghostchu/peerbanhelper/gui/impl/console/ConsoleGuiImpl.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/metric/impl/persist/PersistMetrics.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/ExpressionRule.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/ProgressCheatBlocker.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHEasterEggController.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHGeneralController.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHUtilitiesController.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/text/Lang.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/torrent/Tracker.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/torrent/TrackerImpl.java(1 hunks)src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/util/network/DFSSLSocketFactory.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/web/JavalinWebContainer.java(5 hunks)src/main/java/com/ghostchu/peerbanhelper/wrapper/TorrentWrapper.java(2 hunks)src/main/java/raccoonfink/deluge/DelugeServer.java(0 hunks)src/main/resources/lang/en_us/messages.yml(1 hunks)src/main/resources/lang/messages_fallback.yml(1 hunks)src/main/resources/lang/zh_cn/messages.yml(1 hunks)webui/src/views/settings/components/config/components/btn.vue(2 hunks)
💤 Files with no reviewable changes (1)
- src/main/java/raccoonfink/deluge/DelugeServer.java
✅ Files skipped from review due to trivial changes (3)
- src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BCEndpoint.java
- webui/src/views/settings/components/config/components/btn.vue
- .github/workflows/jvm-release.yml
🧰 Additional context used
📓 Learnings (1)
src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHEasterEggController.java (1)
Learnt from: Ghost-chu
PR: PBH-BTN/PeerBanHelper#880
File: src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHEasterEggController.java:75-86
Timestamp: 2025-01-08T17:57:58.596Z
Learning: The playful implementation in PBHEasterEggController, including casual error messages and non-standard HTTP status codes, is intentionally designed as part of the easter egg functionality and should not be "professionalized".
🪛 yamllint (1.35.1)
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)
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)
🔇 Additional comments (34)
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRTorrent.java (1)
5-6: 导入声明看起来没有问题!新增的导入声明与新功能相关,并且都被正确使用。
src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java (1)
3-3: 导入更改看起来不错!新添加的 ExternalSwitch 导入符合项目的集中式配置管理方向。
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/resp/BCTaskTrackersResponse.java (1)
1-8: 代码结构清晰,导入合理!包名和导入声明符合Java命名规范,使用Lombok和Jackson库来简化开发。
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/ExpressionRule.java (1)
3-3: 导入语句修改正确!新增的 ExternalSwitch 导入语句位置恰当,且与重构方向一致。
src/main/java/com/ghostchu/peerbanhelper/text/Lang.java (2)
499-499: 枚举常量重新排序已确认!枚举常量的重新排序有助于代码组织,不会影响功能。
500-501: 新增的跟踪器操作相关枚举常量已确认!新增的常量增强了跟踪器操作的错误处理能力,命名清晰且符合现有模式。
src/main/java/com/ghostchu/peerbanhelper/util/network/DFSSLSocketFactory.java (2)
3-3: 导入语句变更正确!新增的 ExternalSwitch 导入语句与整体重构方向一致,用于集中化配置管理。
37-37: 请验证配置迁移的完整性和安全性将配置读取方式从 System.getProperty 改为 ExternalSwitch.parseBoolean 是个好的改进,但由于这涉及到域名前置(Domain Fronting)的安全特性,建议:
- 确保所有相关配置已经完全迁移到新系统
- 验证配置更改不会在运行时造成意外行为
✅ Verification successful
✅ 配置迁移验证完成
经过验证,配置迁移已经完全且正确地完成:
- 代码库中不存在任何遗留的 System.getProperty 调用
- 域名前置(Domain Fronting)配置仅在 DFSSLSocketFactory 中使用,保持了单一配置点
- 配置默认值保持不变,确保了行为一致性
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # 搜索可能遗留的相关系统属性使用 rg "System.getProperty.*pbh.domain-fronting" # 检查 ExternalSwitch 的其他使用位置,确保配置迁移的一致性 rg "ExternalSwitch.parseBoolean.*pbh.domain-fronting"Length of output: 252
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/ProgressCheatBlocker.java (2)
3-3: 新增 ExternalSwitch 导入声明引入 ExternalSwitch 类用于统一配置管理,这符合最佳实践。
Line range hint
305-318: 验证过量下载检测逻辑这段代码处理未完成种子的过量下载检测,建议验证以下几点:
- 检查
completedSize是否可能为负值- 确认
maxAllowedExcessiveThreshold的计算是否会溢出✅ Verification successful
验证结果:过量下载检测逻辑安全可靠
经过代码分析,确认:
completedSize经过> 0检查,确保为正值maxAllowedExcessiveThreshold的计算采用 double 中间值,不存在溢出风险- 实现包含了必要的安全检查,逻辑严谨
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # 搜索 completedSize 的计算逻辑,确保其总是非负值 ast-grep --pattern 'completedSize = $_'Length of output: 41
Script:
#!/bin/bash # Search for completedSize variable declarations and assignments ast-grep --pattern 'long completedSize' # Search for any references to completedSize rg "completedSize" -A 2 -B 2 # Search for excessiveThreshold to understand the multiplication context rg "excessiveThreshold" -A 2 -B 2Length of output: 12430
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java (1)
141-162: 代码重构改进了可重用性和可维护性重构后的代码结构清晰,通过
fetchTorrents()方法统一处理种子过滤逻辑,提高了代码的可重用性。过滤条件的处理也很清晰。src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentTorrentTrackers.java (1)
7-9: 代码结构清晰,使用了适当的注解!使用Lombok的
@Data和@NoArgsConstructor注解简化了代码,同时保持了类的简洁性。src/main/java/com/ghostchu/peerbanhelper/wrapper/TorrentWrapper.java (1)
17-17: 私有种子标记的实现完善!
privateTorrent字段的添加和初始化都很规范,能够正确地从Torrent对象中获取私有状态。Also applies to: 28-28
src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/TorrentDao.java (1)
46-49: 建议重新考虑privateTorrent的更新逻辑当前实现只允许从
null更新到非null值,这可能会阻止修正错误的privateTorrent值。建议考虑以下几点:
- 是否应该允许在值不正确时进行更新?
- 是否需要添加日志来记录值的变化?
建议修改为:
- if (entity.getPrivateTorrent() == null && data.getPrivateTorrent() != null) { + if (data.getPrivateTorrent() != null && !Objects.equals(entity.getPrivateTorrent(), data.getPrivateTorrent())) { entity.setPrivateTorrent(data.getPrivateTorrent()); + log.info("Updated privateTorrent status for torrent {}: {} -> {}", + entity.getInfoHash(), entity.getPrivateTorrent(), data.getPrivateTorrent()); anyUpdated = true; }✅ Verification successful
确认建议修改privateTorrent更新逻辑
经过代码库分析,发现:
- 当前的null值限制更新模式在代码库中并不常见
- 在重要状态变更时添加日志记录是项目的既定实践
建议采纳之前提出的代码修改建议,允许在值不正确时进行更新,并添加日志记录。这样可以:
- 提高数据正确性维护能力
- 增强运维可观测性
- 与项目整体代码模式保持一致
🏁 Scripts executed
The following scripts were executed for the analysis:
Error: No shell scripts found
Script:
#!/bin/bash # Search for similar update patterns in DAO implementations echo "=== Searching for similar update patterns ===" rg "if \(.*\.get.*\) == null && .*\.get.*\) != null\)" -t java echo -e "\n=== Searching for logging patterns in DAO updates ===" rg "log\.(info|debug|warn)\(.*update.*" -t java echo -e "\n=== Looking for other DAO implementations ===" fd ".*Dao\.java$"Length of output: 2591
src/main/java/com/ghostchu/peerbanhelper/btn/ping/BtnPeer.java (1)
27-28: 代码变更符合规范新增的
torrentIsPrivate字段遵循了现有的命名约定和序列化模式,实现正确。src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/PeerRecordDao.java (2)
59-60: LGTM:正确添加了privateTorrent参数TorrentEntity构造函数调用正确包含了privateTorrent字段。
50-50: 验证排序顺序变更的影响将lastTimeSeen的排序从降序改为升序可能会影响现有功能。
请运行以下脚本验证是否有依赖降序排序的代码:
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/AbstractQbittorrent.java (2)
184-190: LGTM:清晰的方法实现getTorrents和getAllTorrents方法实现清晰,正确处理了活动状态和隐私过滤。
457-458: LGTM:简洁的记录类定义TorrentProperties记录类定义清晰简洁。
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java (2)
268-269: 代码重构良好!重构后的代码通过调用
fetchTorrents()方法实现了更好的代码复用,同时保持了原有的私有种子过滤功能。
398-399: 版本兼容处理得当!代码很好地处理了不同 BitComet 版本的 group 名称差异,保持了良好的向后兼容性。
src/main/java/com/ghostchu/peerbanhelper/btn/ping/BtnPeerHistory.java (1)
24-25: 新增字段的序列化配置正确
torrentIsPrivate字段的添加和序列化配置正确。src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHEasterEggController.java (2)
70-71: 路由结构优化将 neuro 相关的端点统一归类到
/api/egg路径下,提高了 API 的组织性和可维护性。
77-77: 注意资源文件名称大小写敏感性资源文件名从 "neuro.png" 改为 "Neuro.png",在大小写敏感的文件系统中可能会导致问题。建议在访问资源文件时使用大小写不敏感的方式。
src/main/java/com/ghostchu/peerbanhelper/database/Database.java (1)
75-75: 配置管理优化将系统属性检查迁移到 ExternalSwitch 统一管理,提高了配置的一致性和可维护性:
pbh.database.disableSQLitePragmaSettingspbh.database.disableSQLiteVacuumAlso applies to: 83-83
src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java (1)
114-114: 端口映射重试配置优化将端口映射刷新失败重试的配置迁移到 ExternalSwitch,使用
pbh.portMapper.disableRefreshFailRetry进行控制,与系统其他配置保持一致。src/main/java/com/ghostchu/peerbanhelper/web/JavalinWebContainer.java (1)
162-163: 建议重新启用 robots.txt注释掉的 robots.txt 端点可能会导致搜索引擎和扫描器无限制地扫描所有端点。建议重新启用并使用更严格的爬虫规则。
src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHGeneralController.java (1)
164-164: 配置管理方式的改进将
System.getProperty替换为ExternalSwitch.parse是一个很好的改进,这样可以统一配置管理方式。运行以下脚本验证其他类似的配置获取方式是否也需要更新:
✅ Verification successful
配置管理方式验证完成
经过验证,代码库中其他使用
System.getProperty的地方主要用于获取 Java 系统属性(如os.name、user.home等),这些是合理的系统级调用,不需要改为ExternalSwitch.parse。当前的改动正确地将应用配置相关的属性迁移到了ExternalSwitch管理。🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # 描述:查找可能需要更新的 System.getProperty 调用 # 搜索 System.getProperty 的使用 rg "System\.getProperty" -l # 搜索已更新到 ExternalSwitch.parse 的使用 rg "ExternalSwitch\.parse" -lLength of output: 1733
Script:
#!/bin/bash # Check ExternalSwitch implementation cat src/main/java/com/ghostchu/peerbanhelper/ExternalSwitch.java # Check some example usages of System.getProperty rg "System\.getProperty" -A 2 src/main/java/com/ghostchu/peerbanhelper/Main.java rg "System\.getProperty" -A 2 src/main/java/com/ghostchu/peerbanhelper/BuildMeta.javaLength of output: 3635
src/main/java/com/ghostchu/peerbanhelper/Main.java (1)
100-100: 协议版本升级需要验证兼容性协议版本从 8 升级到 10 是一个重要变更,需要确保向后兼容性。
请确认:
- 是否有相应的迁移指南
- 是否需要更新文档
- 是否需要通知用户升级
src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java (1)
737-737: 新增模块注册添加了
PBHUtilitiesController模块的注册。请确认:
- 模块是否已完成测试
- 是否需要添加相关文档
- 是否需要更新配置示例
Dockerfile (1)
19-19: 改进了错误日志记录在
JAVA_OPTS中添加了-XX:ErrorFile=/app/data/hs_err_%p.log选项,有助于排查 JVM 崩溃问题。请确认:
/app/data目录是否已正确配置为 volume- 是否需要添加日志轮转机制
- 是否需要更新运维文档
.github/workflows/jvm-ci.yml (1)
66-66: Docker构建操作版本更新已审核通过!将 docker/build-push-action 从 v6.11.0 更新到 v6.12.0 是一个安全的小版本更新。
Also applies to: 101-101
pom.xml (2)
9-9: 版本号更新符合发布规范!从 7.3.2 升级到 7.3.3-RC1 表明这是一个发布候选版本,版本号的更新符合语义化版本规范。
435-435: BouncyCastle加密库更新建议!BouncyCastle库(bcprov-jdk18on和bcpg-jdk18on)从1.79更新到1.80版本。由于这些库负责处理加密相关功能,建议:
- 在测试环境中验证所有加密相关功能
- 确保与现有的加密数据兼容
Also applies to: 441-441
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java
Show resolved
Hide resolved
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java
Show resolved
Hide resolved
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java
Show resolved
Hide resolved
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java
Outdated
Show resolved
Hide resolved
src/main/java/com/ghostchu/peerbanhelper/database/table/TorrentEntity.java
Show resolved
Hide resolved
src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHUtilitiesController.java
Show resolved
Hide resolved
src/main/java/com/ghostchu/peerbanhelper/btn/ability/BtnAbilitySubmitHistory.java
Show resolved
Hide resolved
src/main/java/com/ghostchu/peerbanhelper/btn/ability/BtnAbilitySubmitHistory.java
Show resolved
Hide resolved
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
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
♻️ Duplicate comments (1)
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java (1)
210-214:⚠️ Potential issue需要添加空值检查以防止潜在的空指针异常
在调用 stream() 方法之前应该添加对 getTrackers() 返回值的空值检查。
- return biglyBTTorrent.getTrackers().stream().map(t -> (Tracker) new TrackerImpl(t)).toList(); + if (biglyBTTorrent.getTrackers() == null) { + return Collections.emptyList(); + } + return biglyBTTorrent.getTrackers().stream().map(t -> (Tracker) new TrackerImpl(t)).toList();
🧹 Nitpick comments (6)
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java (1)
175-179: 建议改进 URL 构建逻辑当前的 URL 构建方式可能在处理特殊字符时存在潜在问题。建议使用 URLEncoder 对参数进行编码。
- urlBuilder.append(String.join("&filter=", filtersUrlEncoded.stream().map(Object::toString).toArray(String[]::new))); + urlBuilder.append(String.join("&filter=", filtersUrlEncoded.stream() + .map(Object::toString) + .map(filter -> URLEncoder.encode(filter, StandardCharsets.UTF_8)) + .toArray(String[]::new)));src/main/java/com/ghostchu/peerbanhelper/torrent/TrackerImpl.java (4)
15-22: 建议增加 URL 验证和优化性能当前实现有以下可以改进的地方:
- 缺少对 tracker URL 格式的验证
- Stream 操作可以优化
建议修改如下:
public TrackerImpl(String string) { Objects.requireNonNull(string, "tracker string cannot be null"); this.trackers = Stream.of(string.split("\n")) .map(String::trim) .filter(s -> !s.isEmpty()) + .filter(this::isValidTrackerUrl) // 添加 URL 验证 .sorted() - .toList(); + .collect(Collectors.toList()); // 使用 collect 可能在某些情况下更高效 } + private boolean isValidTrackerUrl(String url) { + try { + new URL(url); + return true; + } catch (MalformedURLException e) { + return false; + } + }
29-32: 建议返回不可修改的列表视图直接返回内部列表可能导致外部修改影响类的内部状态。
建议修改如下:
@Override public List<String> getTrackersInGroup() { - return trackers; + return Collections.unmodifiableList(trackers); }
42-50: 建议添加日志记录对于无效的 tracker 组,添加日志记录有助于问题诊断。
建议修改如下:
+ private static final Logger logger = LoggerFactory.getLogger(TrackerImpl.class); + public static List<Tracker> parseFromTrackerList(String trackerList) { if (trackerList == null) { + logger.debug("Tracker list is null, returning empty list"); return Collections.emptyList(); } return Stream.of(trackerList.split("\n\n")) - .filter(str -> !str.isBlank()) + .filter(str -> { + if (str.isBlank()) { + logger.debug("Skipping blank tracker group"); + return false; + } + return true; + }) .map(TrackerImpl::new) .collect(Collectors.toUnmodifiableList()); }
57-60: 建议优化比较方法的性能当前的 compareTo 实现需要创建字符串,这可能影响性能。
建议修改如下:
@Override public int compareTo(@NotNull Tracker o) { - return toString().compareTo(o.toString()); + return getLeadingTracker().compareTo(o.getLeadingTracker()); }src/main/java/com/ghostchu/peerbanhelper/btn/ability/BtnAbilitySubmitHistory.java (1)
Line range hint
143-147: 完善错误处理机制当前的错误处理过于笼统,建议区分不同类型的异常并相应处理。
建议修改如下:
- } catch (Throwable e) { - log.error("Unable to submit peer histories", e); - setLastStatus(false, new TranslationComponent("Unknown Error: " + e.getClass().getName() + ": " + e.getMessage())); + } catch (IOException e) { + log.error("网络或文件操作错误", e); + setLastStatus(false, new TranslationComponent(Lang.BTN_NETWORK_ERROR, e.getMessage())); + } catch (IllegalStateException e) { + log.error("状态错误", e); + setLastStatus(false, new TranslationComponent(Lang.BTN_STATE_ERROR, e.getMessage())); + } catch (Exception e) { + log.error("未知错误", e); + setLastStatus(false, new TranslationComponent(Lang.BTN_UNKNOWN_ERROR, e.getMessage()));
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
src/main/java/com/ghostchu/peerbanhelper/btn/ability/BtnAbilitySubmitHistory.java(5 hunks)src/main/java/com/ghostchu/peerbanhelper/database/table/TorrentEntity.java(2 hunks)src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java(6 hunks)src/main/java/com/ghostchu/peerbanhelper/torrent/TrackerImpl.java(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- src/main/java/com/ghostchu/peerbanhelper/database/table/TorrentEntity.java
🔇 Additional comments (8)
src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java (4)
9-9: 导入声明看起来没有问题!新增的导入声明与新功能相匹配,没有发现未使用的导入。
Also applies to: 23-24
164-165: getTorrents() 方法实现合理!方法通过 fetchTorrents() 实现了更灵活的种子过滤机制,并正确处理了私有种子的过滤逻辑。
167-170: getAllTorrents() 实现简洁明了!通过传递空过滤器列表和包含私有种子的参数,正确实现了获取所有种子的功能。
300-300: 避免使用魔法数字,提升代码可读性建议将状态码 30 和 40 定义为具有描述性的常量。
+ private static final int PEER_STATE_CLOSING = 30; + private static final int PEER_STATE_CLOSED = 40; - peer.getState() != 30 && peer.getState() != 40 + peer.getState() != PEER_STATE_CLOSING && peer.getState() != PEER_STATE_CLOSEDsrc/main/java/com/ghostchu/peerbanhelper/torrent/TrackerImpl.java (2)
11-13: 实现看起来不错!类的设计遵循了不可变性原则,使用 final 修饰字段是个很好的做法。
34-40: 实现正确且安全!已经正确处理了空列表的情况,实现符合预期。
src/main/java/com/ghostchu/peerbanhelper/btn/ability/BtnAbilitySubmitHistory.java (2)
45-54: 确保数据目录存在在创建文件前需要确保父目录存在,否则可能会导致文件创建失败。
建议修改如下:
this.file = new File(Main.getDataDirectory(), "btn_submit_history_timestamp.dat"); +if (!this.file.getParentFile().exists()) { + this.file.getParentFile().mkdirs(); +} if (!this.file.exists()) { try { this.file.createNewFile();
152-156: 优化批量处理以防止内存溢出一次性加载5000条记录仍可能导致内存压力。建议实现流式处理或分批次处理数据。
建议修改如下:
- private List<BtnPeerHistory> generatePing(long lastSubmitAt) { - Pageable pageable = new Pageable(0, 5000); - return btnNetwork.getPeerRecordDao().getPendingSubmitPeerRecords(pageable, - new Timestamp(lastSubmitAt)).getResults().stream() - .map(BtnPeerHistory::from).collect(Collectors.toList()); + private List<BtnPeerHistory> generatePing(long lastSubmitAt) { + final int batchSize = 1000; + Pageable pageable = new Pageable(0, batchSize); + List<BtnPeerHistory> results = new ArrayList<>(); + while (true) { + List<BtnPeerHistory> batch = btnNetwork.getPeerRecordDao() + .getPendingSubmitPeerRecords(pageable, new Timestamp(lastSubmitAt)) + .getResults().stream() + .map(BtnPeerHistory::from) + .collect(Collectors.toList()); + if (batch.isEmpty()) break; + results.addAll(batch); + pageable = pageable.next(); + if (results.size() >= 5000) break; + } + return results; + }
Summary by CodeRabbit
版本发布说明
新功能
改进
Bug 修复
版本更新