Skip to content
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

Merged
merged 191 commits into from
Jan 9, 2025
Merged

v7.3.0 #880

merged 191 commits into from
Jan 9, 2025

Conversation

Ghost-chu
Copy link
Collaborator

@Ghost-chu Ghost-chu commented Jan 8, 2025

新功能

优化

错误修复

其它更改

  • Peer 是否已握手现在由各个下载器实现自行管理以更快更精准的判断 Peer 的握手状态 @Ghost-chu

Sparkle BTN 更新

  • 改善程序和数据库性能、优化分析过程,解决引发 Sparkle 两周停机的多项性能和网络瓶颈。之前暂停停止的 Peers 提交、过量下载分析和客户端发现功能现在恢复正常运行 @Ghost-chu
  • 用户应用程序页新增 “创建时间” 列,并按创建顺序倒序排序;新增 “状态” 列,指示 UserApplication 的封禁状态 @Ghost-chu
  • 新增个人资料页,显示账号基本信息(头像、昵称、电子邮件地址、帐号状态)以及账号积分信息 @Ghost-chu
  • 新增积分系统和积分(Bytes),用以衡量用户在 Sparkle BTN 上做出的贡献 @Ghost-chu
  • 新增 BTN 网络统计仪表盘,可登录 BTN 后在首页查看或者 点此跳转 @Ghost-chu
    • 可以自由选择时间区间以查看不同时间段的 BTN 网络整体状态,但大部分数据仅保留 30 天或者更短
    • 可查看封禁网段排行榜,以快速对比 IP 段之间的恶意活动强度
    • 新增 GeoIP 排行榜,分析不同地区的恶意活动强度
    • 新增封禁趋势图,帮助快速了解不同时段封禁的趋势,可通过 “封禁计数、封禁唯一 IP 数、会话数、GeoIP 地区、客户端名称” 等多个维度分析目前的恶意活动
    • 新增网络类型跟踪,可根据运营商和所属网络类型分析当前 BTN 网络上的恶意活动
    • 新增全球网络概览图,以便可视化查看不同国家/地区的恶意活动强度
    • 新增 Sparkle BTN 实时日志,按时间倒序查看、或者根据特定字段过滤最近的 Sparkle BTN 提交数据
    • 新增 Sparkle BTN 审计图表,可查看 BTN 上用户活动(仅部分审计操作对普通用户开放)
  • 改进 BTN-Collected-Rules 规则生成模块 @Ghost-chu
    • Tracker 分析、不受信任 IP 地址和过量下载三大模块支持透明度更新
      • 在每个被封禁的 IP 地址上方的注释行中现在详细显示 Peer 特征、不信任投票数和 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 列表中:

https://sparkle.ghostchu-services.top/announce

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 中。

现有规则更改

  • Tracker 分析、不受信任 IP 地址和过量下载三大模块支持透明度更新
    • 在每个被封禁的 IP 地址上方的注释行中现在详细显示 Peer 特征、不信任投票数和 BTN 网络统计的过量下载数据信息
  • multi-dial.txt 规则清理
    • 清理了一部分过期、无效、重复和不值得再按段封禁的规则

尾言

在本次问卷调查中,我们收到了很多伙伴们的建设性建议。其中一部分建议已在本次更新中加入 PeerBanHelper 中,但仍有部分留言由于系统限制无法回复。我们在此统一对这些问题进行回答:

  • 土豆不能熟
    • 我们已经采取了一系列措施改进服务器的稳定性,本周以来 Sparkle 的服务稳定性已经显著提升,会在未来持续优化
  • 江苏南通ip的Gopeed dev无法封禁,一直提示已在封禁列表,但始终无法封禁,希望可以改进
    • 经过测试无法复现这个问题
  • 误封好严重,建议添加一个能力开关或者到一定的上传量再封禁
    • 本次更新也对规则进行了一次性里,可以看看误封情况是否有所好转
  • 封禁列表支持按条件搜索
    • 本次更新已新增了对封禁列表的任意搜索功能,可搜索任意字段的任意内容
  • 如果使用的存储设备为flash设备,最好内置读写计数,帮助用户评估磨损情况
    • 读写是不可控的,并且由于目前有内存缓存功能,实际上读写次数不会太多了
  • 同ip端口不同种子合并下载上传总量统计
    • 底层代码限制,短时间内是搞不了了
  • 加入根据封禁原因筛选封禁记录的功能
    • 封禁日志由于底层代码限制,搜索功能受限,我们还在寻找解决方案
  • 目前已经非常满意,如果可能希望减少资源占用
    • 其实大部分时候内存 PBH 并没有在使用,但是 JVM 更倾向于先申请这些内存以备不时之需。本次更新已调低了这部分阈值,但由于 JVM 的设计,它可能还是很会倾向于申请一些内存自己囤着
  • 建议BTN的前端恢复装修前的封禁记录查询,并加上历史记录查询、图表(如各个地区各个客户端的封禁量柱状图折线图之类的)等比较直观的数据查看方式 另外,建议PBH加上对BTN各个能力的自定义开关(ClientName封禁、PeerID封禁这些)避免误封,最近在下海盗湾的种子时有很多用libtorrent名字的客户端连上来,然后立刻被PBH封了:(
    • 我们已在本版本改善了一部分的误封情况,数据查看和图表已推出新的 Sparkle Dashboard 作为过渡方案
    1. 封禁名单 或 封禁日志 能用更多的方式筛选(客户端、封禁原因等) 2. 能在PBH客户端管理BTN启用的能力,实现只上报数据,而不使用BTN下发的规则。原因有:我不想屏蔽掉Transmission 4.0.6客户端;我想知道peer被屏蔽的原因(而不仅仅因为该peer在ip封禁列表中)
      1. 封禁列表已在本版本中得到优化 2. 此功能可以在设置中禁用使用云端规则,而不会影响提交数据
  • 如果可行,希望可以减少对SSD的写入量。
    • 已经有内存缓存了~ 并不是暴力 I/O 的 SSD 捏
  • 希望能支持Aria2
    • 得 aria2 自己努力才行,它根本无法封禁 IP 地址,而且作者明确不想加 blocklist 功能
  • PeerBanHelper:希望在Linux端的RPM包中引入全局配置目录,便于升级时不会覆盖部分自定义参数。 Sparkle(BTN网络):希望提供自建BTN网络的相关文档和软件包/代码包,并希望可以实现BTN网络节点联盟的构想,实现超级节点向边缘节点定期分发规则和封禁数据以及边缘节点向超级节点的数据上报功能,降低目前单中心处理能力不足导致的功能受限的影响。 PS:我这边有双路AMD 9754 1TB内存的服务器,应该处理性能不成问题?
      1. 更改数据目录:-Dpbh.datadir=/path/to/data 单独更改配置目录:-Dpbh.configdir=/path/to/config 单独更改日志目录:-Dpbh.logsdir=/path/to/logs
    • 暂不考虑网络节点联盟问题
    • 谢谢,我们暂不接受服务器捐赠。根据隐私政策所述,我们不得将数据提供给第三方,使用他人捐赠服务器实质上还是将数据传输给了第三方
  • 建议开发一键解封ip
    • 本版已添加 “解封全部IP地址” 功能,点击即可解封封禁列表的所有 IP 地址,感谢您的建议
  • pbh可以说对我相当有帮助,我一开始本着分享原则,能不给上传限速就不限,导致上传带宽天天被占满,以至于没法正常上网。用了pbh上传从20m降到平均几百k,我才知道以前基本全是给吸血上传。不过因为我不是非常了解屏蔽的原理,其实我有时候还是有些担心会误封一些真正下载人的账号,请问这部分是否可以根据违反规则情况给每个封禁IP分级,来使用户更加了解其是否具有较大危害?
    • 谢谢,建议已收到。我们会考虑根据动态分数计算来封禁 IP,但是涉及到底层代码修改,短期内暂时不会看到这个功能
    • Sparkle BTN 内部已经是如此工作了,现在新增的封禁原因备注也有望改善封禁透明度问题
  • 可能要对libertorrent的规则做一些调整,现在这样全杀不太好。还有对做种上传的应该存在误封
    • 我们正在对 libtorrent 的情况展开调查,在调查完成前我们施加了一个临时的措施。在情况明了后就会做出更进一步的举措
  • 为开发团队的大量付出致敬。 与恶意吸血客户端的斗争还在继续。希望各个被全量封禁的地区能尽快恢复正常。
    • 谢谢,我们已解除了这部分地区的一部分 IP 地址;但由于部分 IP 段仍然疯狂进行恶意活动,仍有大量 IP 段未得到解封
  • github更新不便,BTN链接不便
    • 我们会考虑添加国内分发源,BTN 现在提交数据已经是国内 CDN 了,但是页面浏览可能会被 302 到全球节点,我们会考虑改善这个问题
  • peer id、client name规则提供注释,说明是哪款软件 提供白名单规则,例如:只允许XX的peer连接
    • 感谢建议,已添加
  • 超量下载(进度回退)再智能一些
    • 它已经是不跑 AI 大模型的情况下比较智能的状态了
  • 能否优化一下peerbanhelper长期运行的表现?我的peerbanhelper是跑在旧电脑改造的服务器上的,但是经常不过几天pbh就完全卡死不能工作,不管是gui mode还是控制台模式,都是一样的结果。希望能加以改进,我相信pbh还是有很多需求是长期稳定运行的。除此之外,这个软件非常完美,就是这个问题让人很难受。
    • 请升级版本,不要继续使用 6.x 了
  • PeerBanHelper 应取得更加广泛的运用才可以更好得从用户端遏制PCDN的猖獗,但是现阶段对于配置 PeerBanHelper 和 Sparkle(BTN网络)的门槛依旧较高,不适合吸纳更加广泛的用户加入进来。
    • 谢谢,我们会在有空闲的时候优化用户体验
  • 内存占用过高 peerbanhelper 0.08% 787.4MiB / 15.54GiB
    • 你升级了吗?
  • 增加复制webui链接到剪贴板的功能,我不希望我的密码直接暴露在浏览器的历史记录里
    • 你可以使用随机密码的,登陆一次就记住了
    • 试试看浏览器的一个传奇功能:网页收藏夹
  • 希望btn服务器能更加稳定,不要经常无法连接
    • Powered by GLaDOS (Potato Edition),它已经很努力了
  • 希望可以推出季度報告等方式介紹最近的封鎖效果,總是覺得好像效果不太好但又不肯定 RAM和CPU的佔用未至於影響使用,但確實有點偏高,希望可以改善。
    • 已经有图表了
    • 封禁效果取决于所有人共同的努力,考虑加入 BTN 网络帮助一起改善封禁效果吧

转眼又是新的一年,转眼 PeerBanHelper 就快要一周年啦(2 月 7 日)。
时间飞逝,希望有 PeerBanHelper 陪伴下,今年也会是快乐 BT 的一年。提前拜个早年,2025 新年快乐~

已知问题

  • 封禁备注为空、奇怪的文本
    • BTN-Collected-Rules 仍未完成改造,属于正常现象

Docker

DockerHub: ghostchu/peerbanhelper:v7.3.0
阿里云国内镜像加速: registry.cn-hangzhou.aliyuncs.com/ghostchu/peerbanhelper:v7.3.0

renovate bot and others added 30 commits December 9, 2024 04:02
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
Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 参数配置合理,但建议考虑以下优化:

  1. 考虑根据系统内存动态调整 -Xmx
  2. 添加 GC 日志相关参数以便问题排查
  3. 考虑添加 -XX:+HeapDumpOnOutOfMemoryError 参数
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c4c9258 and fd8a95e.

📒 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: 服务停止操作添加正确!

在卸载过程中添加服务停止操作,确保了卸载过程的清洁性和完整性。

install4j/project.install4j Show resolved Hide resolved
@Gaojianli Gaojianli enabled auto-merge (squash) January 9, 2025 12:38
Copy link
Contributor

@coderabbitai coderabbitai bot left a 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() 方法实现得很完整,建议进一步优化

方法实现包含了所有必要的字段,并正确处理了本地化组件。不过建议考虑以下优化:

  1. 可以考虑使用 StringBuilder 来提高性能
  2. 建议为时间戳(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 参数增加了更严格的空值检查,这样可以避免空指针异常,提高了代码的健壮性。

建议考虑以下优化:

  1. 可以将这些检查逻辑抽取到一个单独的辅助方法中,以提高代码的可重用性
  2. 建议添加日志记录,以便于问题排查
+    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 目标中提到的新功能(如下载暂停、全局暂停等),建议对国际化系统进行以下架构改进:

  1. 引入缓存机制以提高性能
  2. 支持动态重载以适应运行时语言切换
  3. 添加事件系统以支持语言变更通知
  4. 考虑使用建造者模式重构 TranslationComponent 的创建过程

这些改进将使系统更好地支持新功能的本地化需求。

src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java (1)

26-32: 建议改进翻译组件的构造方式

当前实现中的 "Hit-" 和规则的字符串拼接("Hit-" + rule)可能不是最佳的国际化实践。建议:

  1. 为这些前缀创建专门的翻译键
  2. 使用参数化的翻译消息

建议按如下方式修改:

-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: 性能优化建议

搜索实现的功能完整,支持地址和元数据的不区分大小写搜索。但考虑到以下几点建议:

  1. 对于大数据集,多重过滤器链可能影响性能
  2. 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

📥 Commits

Reviewing files that changed from the base of the PR and between fd8a95e and 62ff6c9.

📒 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: 改进了禁止原因的显示方式!

代码改进使用了规则的 matcherNamecomment 来提供更详细的禁止原因,这样可以让用户更清楚地了解为什么某个 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 issue

setData 方法中也需要修复 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 2

Length 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 2

Length 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,建议在使用前添加空值检查或提供默认值。

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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: 建议添加字段的非空保证!

字段 hitmiss 现在没有直接初始化,虽然在构造函数中设置了值,但从代码分析的角度来看可能为空。建议添加 @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 方法的可读性

当前实现可以通过以下方式改进:

  1. 使用更具描述性的变量名替代 matchResult
  2. 考虑提取匹配逻辑到单独的私有方法
  3. 添加方法级别的 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: 建议改进脚本执行的错误处理

虽然使用虚拟线程来执行脚本是个很好的性能优化,但错误处理还可以改进:

  1. 建议为不同类型的异常提供更具体的错误信息
  2. 考虑添加重试机制处理临时性故障
  3. 添加更详细的日志记录,包括失败的脚本标识符
 } 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: 总体代码质量评价

代码整体结构清晰,有以下亮点:

  1. 使用虚拟线程优化性能
  2. 完善的配置状态报告
  3. 统一的规则处理架构

建议改进的方面:

  1. 统一规则匹配的处理方式
  2. 加强空值检查
  3. 改进错误处理的粒度
src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java (1)

53-70: 建议改进配置命名和API路径构建方式

建议将以下内容改进:

  1. 将配置名称移至常量中,避免硬编码
  2. 使用统一的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

📥 Commits

Reviewing files that changed from the base of the PR and between 62ff6c9 and eb26641.

📒 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: 字段声明改进合理!

hitmiss 从静态字段改为实例字段是很好的改进:

  • 每个实例可以有自己的匹配结果
  • 避免了静态字段可能带来的并发问题
  • 更符合面向对象的设计原则

26-33: 构造函数中存在潜在问题需要改进

当前实现存在以下问题:

  1. 没有对 syntax.get() 的返回值进行空值检查
  2. 消息格式不一致(默认初始化使用 rule,自定义初始化使用 "Hit-" + rule)
  3. 字符串拼接可以优化

建议按如下方式修改:

-        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 接口提供了良好的可重载性。

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 来格式化错误信息是个很好的改进,但建议添加重试机制。

建议添加以下功能:

  1. 实现指数退避重试
  2. 记录重试次数
  3. 在达到最大重试次数后通知管理员
+ 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 方法,但建议考虑更细粒度的锁定机制。

建议考虑以下优化:

  1. 使用 ReentrantLock 替代 synchronized 以获得更好的灵活性
  2. 将配置读取和更新分开锁定
  3. 添加超时机制
+ 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

📥 Commits

Reviewing files that changed from the base of the PR and between eb26641 and 272d479.

📒 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: 配置重置逻辑更完善

重置 configSuccessconfigResult 的顺序很合理,确保了配置状态的一致性。


105-105: 调度器延迟设置需要考虑影响

将初始延迟设置为0可能会导致系统启动时立即执行配置检查。建议考虑是否需要一个小的初始延迟来避免启动时的资源竞争。

建议验证在高负载情况下是否会对系统启动性能造成影响。

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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

📥 Commits

Reviewing files that changed from the base of the PR and between 272d479 and 011400d.

📒 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 次要架构的构建配置完整,标签后缀设置正确。

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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

📥 Commits

Reviewing files that changed from the base of the PR and between 011400d and 330b104.

📒 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 heapsize

Length 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
fi

Length of output: 1086

Dockerfile-Release Show resolved Hide resolved
Dockerfile Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 issue

ENTRYPOINT配置存在安全隐患

当前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

📥 Commits

Reviewing files that changed from the base of the PR and between 330b104 and b011945.

📒 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

@Ghost-chu Ghost-chu disabled auto-merge January 9, 2025 17:46
@Ghost-chu
Copy link
Collaborator Author

@coderabbitai resolve

Copy link
Contributor

coderabbitai bot commented Jan 9, 2025

✅ Actions performed

Comments resolved and changes approved.

@Ghost-chu Ghost-chu merged commit 4d0cdf3 into release Jan 9, 2025
16 checks passed
This was referenced Jan 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants