Giter VIP home page Giter VIP logo

contentgrabbingji's Introduction

About Me

LamGC's github stats
Most used programming languages
osu-stats

“这不是开发的技术,这是开发的艺术!” ——《飞驰人生》(有更改)

Contact

KeyBase:KeyBase@LamGC
主要联系邮箱(Main contact email):[email protected]
工作专用邮箱(Work specific email):[email protected]

警告:请不要 向我的任何邮箱发送垃圾邮件包括但不限于 广告、非我本人订阅的邮件),我将会对相关邮件的发送者或来源地址进行封禁!
另外,请不要向我的工作专用邮箱发送与工作(或开发)无任何关系的内容(如果是咨询或闲聊等可发送至主要联系邮箱)。

GPG 公钥(如果需要验证签名,或与我保密通讯)(Get from KeyBase):LamGC <[email protected]> <[email protected]>
GPG Fingerpint:7EF5 FB1E 65C1 A6C6 D02D FCDF CE57 746D 7E5E E6EF


Profile visitcount


Profile visitcount By Visit Count Pro
Github Readme Stats By anuraghazra/github-readme-stats
Format specification By sparanoid/chinese-copywriting-guidelines
osu! stats card By solstice23/osu-stats-signature

contentgrabbingji's People

Contributors

dependabot[bot] avatar lamgc avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

contentgrabbingji's Issues

让应用支持动图的发送

功能

  • getImageById支持动图发送, 并能通过illustId得知作品类型并自动选择是否以动图形式返回。

增加多语言支持

让机器人的消息能够通过语言文件来调整!(只是个计划,稍后补充细节。)

升级SpringCQ框架:适配不兼容更新

主要改动

  • 弃用CQGlobal的修改
    • SpringCQ: 删除CQGlobal中的pluginList, 改用spring properties文件配置 SpringCQ:5f053cf
    • SpringCQ: 删除CQGlobal中的executor, 改用Spring Properties文件配置 SpringCQ:f32592d

对应用的影响

升级SpringCQ后,原有对executor的修改将失效,plugin注册失效,将导致SpringCQ框架不可用。

将 Report 和 NoSaft 功能从 BotCommandProcess 分离

计划将 BotCommandProcess 类的 Report 功能(用户报告功能,涉及方法:reportisReported)和 NoSaft(不良内容检查,涉及方法:isNoSafe)功能从BotCommandProcess中分离,这将有助于降低各类对 BotCommandProcess 类的耦合性(即使耦合性较小)和分离与命令处理关系不大的功能。
(预计该改动有利于项目后续所计划的重构。)

重新调整接入框架对应用的启动方式

变更理由

目前框架通过net.lamgc.cgj.bot.event.BotEventHandler作为启动应用功能的入口,后续可能会重新调整类访问权,故计划增加用于提供给框架,启动应用的一个启动类。

计划更改

  • 增加net.lamgc.cgj.bot.boot包,包含启用应用的相关类;
  • 增加net.lamgc.cgj.bot.boot.BotApplication类,用于提供给框架作为启动应用功能的类;
  • 增加net.lamgc.cgj.bot.BotGlobal类,用于共享应用机器人数据;

在下一次正式发布中附带一个快速部署包

由于色图姬部署上较为繁琐,计划在正式发布中附带一个包含:

  • 启动脚本(bat, cmd, sh)
  • 该版本的色图姬主程序Jar
  • 带有配置项注释的配置文件
  • 结构齐全的数据目录
    的快速部署压缩包。

优化'getImageById'从文件读入缓存时, 检查图片完整性的速度

目前每次启动后,第一次读取已下载图片时,都会通过HEAD请求来确定文件大小是否正确,但这样对每次启动的第一次已缓存命令的处理速度还是有些慢,所以需要对通过HEAD请求获得的Content-Length进行缓存,以尝试提升处理速度。

使 Multi Properties 支持私聊配置

计划在原有的群组配置上增加私聊配置,目前可以用以下方案来增加支持:

  • 在群组配置文件group.群组Id.properties基础上增加私聊配置文件private.QQId.properties
  • 增加getPrivateProperties(long),移除getProperties(long),开放已有方法getGroupProperties(long)
  • 更改Properties的获取方式,让需要限定Properties作用域的方法能够更清晰的选定类型;

增加Framework接口,分离Framework-API模块

该改动目的为减小框架与应用的耦合性,通过api模块连接框架与应用。
改动包含:

  • 增加Framework接口
  • 增加Event用于为框架提供事件传入
  • 将禁言相关处理转移到框架,应用专注于功能实现
  • 将现有框架转移到单独的模块(?)

RandomIntervalSendTimer在高版本Java中因非法反射导致应用异常终止

Environmental information

OS(e.g: Windows 10 1909): Centos 7 (DockerImage: openjdk:14)
Java(e.g: Oracle Jdk 8.242): OpenJdk 14.0.1
Issue version(versionTag or commitId): v2.5.2-20200630.2-SNAPSHOT

Problem description

RandomIntervalSendTimer在高版本Jdk中因非法反射导致程序终止。
日志:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by net.lamgc.cgj.bot.RandomIntervalSendTimer (jar:file:/CGJ.jar!/BOOT-INF/classes!/) to field java.util.TimerTask.state
WARNING: Please consider reporting this to the maintainers of net.lamgc.cgj.bot.RandomIntervalSendTimer
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations

Expected behavior

定时器应该正常的通过反射重置State,然后继续运行。

Actual behavior

在高版本Jdk中,因反射非法导致被终止程序。

Recurrence steps

  1. 为某个群设置定时作品推送
  2. 等待该推送触发
  3. 推送发送后,应用尝试重置TimerTask中待final属性的state字段时发生错误。

需要重新考虑 CacheStoreBuilder 的实例提供方式。

CacheStoreFactory 增加了 initial 方法,但该方法需要跟随 ContentGrabbingJi 的数据目录,该问题的产生由于设计初尚未妥善考虑初始化环节导致,目前需要进行的事项:

  • 排查有哪些组件需要用到 CacheStore;
  • 考虑用新的方式提供 CacheStoreBuilder;

目前设计所遇到的问题

项目目前必要模块的开发状况

  • 框架接口
  • 框架实现
  • 缓存组件
  • 事件系统
  • 消息模板
  • 功能命令
  • Pixiv功能(需 功能命令 作为模块前置)

就目前的开发进度来讲,很难说能在 2021 年 4 月开发出可用的 Alpha 版。

目前模块开发所遇到的问题

框架模块 & 框架实现

  • FAL 适配存在一定难度,以不同平台间的差异消除和后续扩展能力有限为主;
  • 是否需要让框架组件提供对指定 Sender 的获取,或提供对 MessageSource 相关信息获取的接口?(用于订阅类功能)

消息模板

  • 目前暂定 Velocity 作为模板引擎;(Issue #33
  • 尚未完成默认模板;
  • 需定义消息模板专用的 BotCode 格式,以消除模板间的差异;

事件系统

  • 目前已完成一种基于线程池,以事件为执行粒度的事件执行器;
  • 正在设计【事件取消】功能;(Issue #35

功能命令

  • 对于命令解析、命令执行、命令处理的相关接口仍在设计阶段;
    • 命令解析部分,原计划参照 Apache Common-cli 工具库的命令解析设计,但由于复杂度过高且官方延缓或停止对其的维护,不得不另外设计
    • 命令解析中的参数解析,暂定支持将参数解析后通过 参数名参数索引 获取;
    • 命令处理接口在设计上仍有争议,目前计划设计一种可以支持 TelegramBots Ability 命令定义形式的命令处理接口,但在对命令来源相关信息的获取上尚未设计完成;
    • 命令执行部分预计仅用于结合命令解析与处理,不作其他行为;

Pixiv 功能

  • 需等待功能命令模块的完成;
  • 需设计一种兼容各 Pixiv API 的调用器(例如 Aliyun 的 API Client);

在图片缓存失败的情况下,getImageToBotCode依然会尝试从缓存获取图片File对象导致NPE

预期情况

在图片获取失败的情况下,getImageById应该返回图片获取失败的消息,而不是继续调用getImageToBotCode

实际情况

获取图片失败后,getImageById不清楚图片获取失败,继续调用getImageToBotCode引发NPE。

复现过程

  1. 寻找往期排行榜中含有已失效作品的排行榜信息,并使用消息指令获取
  2. 应用在尝试下载失效作品的图片时会发生Http 404,导致图片下载失败,文件不存在
  3. getImageById以为已经完成下载,尝试通过getImageToBotCode获取图片BotCode(但传入targetFilenull
  4. getImageToBotCode尝试读取值为nulltargetFile参数引发NPE

Bug所在版本

v2.5.2-20200522.1-SNAPSHOT

个别作品使用image命令查不到图片时会发生异常,而不是返回图片未找到

Environmental information

OS(e.g: Windows 10 1909): Centos 7 (DockerImage: openjdk:14)
Java(e.g: Oracle Jdk 8.242): OpenJdk 14.0.1
Issue version(versionTag or commitId): v2.5.2-20200709.1-SNAPSHOT

Problem description

目前发现该问题的相关作品:

  • 82906885

使用image命令获取个别作品的原图时,会返回网络异常的消息,但是查日志的真实原因是该作品已被删除
使用info命令似乎依然能查到该作品的信息。
相关日志:

[13:38:09.469 DEBUG][net.lamgc.cgj.bot.event.BotEventHandler.processMessage():198][CommandProcess-2]: 传入参数: [.cgj, image, -id, 82906885]
[13:38:09.469  INFO][net.lamgc.cgj.bot.event.BotEventHandler.processMessage():206][CommandProcess-2]: 正在处理命令...
[13:38:09.469 DEBUG][net.lamgc.cgj.bot.cache.CacheStoreCentral.getImageById():128][CommandProcess-2]: IllustId: 82906885, Quality: ORIGINAL, PageIndex: 1
[13:38:09.603  WARN][net.lamgc.cgj.pixiv.PixivDownload.getIllustAllPageDownload():404][CommandProcess-2]: 作品页面接口请求错误, 错误信息: 该作品已被删除,或作品ID不存在。
[13:38:09.603 ERROR][net.lamgc.cgj.bot.cache.CacheStoreCentral.getImageById():151][CommandProcess-2]: 获取下载链接列表时发生异常
java.io.IOException: Stream closed
	at java.util.zip.GZIPInputStream.ensureOpen(GZIPInputStream.java:62) ~[?:?]
	at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:113) ~[?:?]
	at org.apache.http.client.entity.LazyDecompressingInputStream.read(LazyDecompressingInputStream.java:70) ~[httpclient-4.5.12.jar!/:4.5.12]
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297) ~[?:?]
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339) ~[?:?]
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188) ~[?:?]
	at java.io.InputStreamReader.read(InputStreamReader.java:181) ~[?:?]
	at java.io.Reader.read(Reader.java:229) ~[?:?]
	at org.apache.http.util.EntityUtils.toString(EntityUtils.java:227) ~[httpcore-4.4.13.jar!/:4.4.13]
	at org.apache.http.util.EntityUtils.toString(EntityUtils.java:308) ~[httpcore-4.4.13.jar!/:4.4.13]
	at net.lamgc.cgj.exception.HttpRequestException.<init>(HttpRequestException.java:19) ~[classes!/:?]
	at net.lamgc.cgj.pixiv.PixivDownload.getIllustAllPageDownload(PixivDownload.java:405) ~[classes!/:?]
	at net.lamgc.cgj.bot.cache.CacheStoreCentral.getIllustPages(CacheStoreCentral.java:327) ~[classes!/:?]
	at net.lamgc.cgj.bot.cache.CacheStoreCentral.getImageById(CacheStoreCentral.java:149) ~[classes!/:?]
	at net.lamgc.cgj.bot.BotCommandProcess.getImageById(BotCommandProcess.java:500) ~[classes!/:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:564) ~[?:?]
	at net.lamgc.utils.base.runner.ArgumentsRunner.run(ArgumentsRunner.java:187) ~[java-utils-1.3.1.jar!/:?]
	at net.lamgc.utils.base.runner.ArgumentsRunner.run(ArgumentsRunner.java:131) ~[java-utils-1.3.1.jar!/:?]
	at net.lamgc.cgj.bot.event.BotEventHandler.processMessage(BotEventHandler.java:218) ~[classes!/:?]
	at jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) ~[?:?]
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:564) ~[?:?]
	at net.lamgc.utils.event.EventExecutor.lambda$createEventTask$9(EventExecutor.java:230) ~[java-utils-1.3.1.jar!/:?]
	at net.lamgc.utils.event.EventExecutor.lambda$executeEvent$7(EventExecutor.java:195) ~[java-utils-1.3.1.jar!/:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) [?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) [?:?]
	at java.lang.Thread.run(Thread.java:832) [?:?]

Expected behavior

正常情况下,如果返回作品被删除等信息,应该返回作品未找到消息。

Actual behavior

由于引发异常,导致被误判为网络异常。

Recurrence steps

  1. 使用上面提到的目前发现该问题的相关作品中的相关作品,并使用infoimage命令查询该作品;
  2. 如果返回网络异常消息,则代表该问题已成功复现;

调整 MapCacheStore 在值类型泛型上的设计

当前 MapCacheStore 在值泛型上出现了一些问题:

  • 限制了字段值的类型
  • 不适用当前的 Converter 设计
    • Converter 很难适用于 Map 这种分字段可多类型的设计,因为不方便(做不到类似于 Gson 的转换,Converter 针对的是单个值而不是一个 Map)

这些问题对 MapCacheStore 的实际使用造成了一定影响,需要尽快处理。

为部分命令【增加/优化】翻页功能

需要优化翻页功能的命令:

  • search - 将固定60份作品翻页调整为按配置所选数量翻页

需要增加翻页功能的命令:

  • ranking - 增加基于配置所设作品数量的翻页功能

搜索命令的翻页功能有些鸡肋,是通过接口进行翻页的,这个效果不是很好,应该要改成按返回作品量翻页。
另外,给排行榜命令也加上一个,方便查看后续排名的作品。

尝试利用【搜索推荐接口】优化搜索结果的相关性 - 讨论

目前已进行了尝试:Branch - optimize-search
目前尝试利用搜索推荐接口(即关键词推荐),向PixivSearchLinkBuilder补充相关关键词。
接口相关文档:Pixiv搜索推荐候选接口.md
根据尝试,该接口在部分搜索内容中表现良好(能够明确的设置相关性强的关键词):
明确的返回
(搜索"标枪"能获得碧蓝航线中的角色"ジャベリン"的标签)
但如果出现了重名较多的情况,将会导致搜索推荐显得混乱,有可能导致搜索结果与用户想要的比优化前的不符:
示例2
(排在前列的三个推荐,分别是翻译,和两部作品的角色,导致搜索结果混乱)
目前对搜索推荐关键词的加入,主要是使用关键词补充数量来控制,当范围过大时,将会把不相关的标签加入,所以该优化功能需重新调整才能正式采纳。
(当然这个Issue是为了征求意见/想法的。)

调整Logger Name以统一Logger Name格式

目前Logger的名称混杂着模块名和限定类名,CGJ所使用的日志框架实现为Log4j2,支持包过滤设定Logger所使用的Append,所以决定作出以下调整:

  • 将CGJ内所有Logger以限定类名作为Logger Name;

是否需要为 MessageEvent 添加协程设计?

消息事件添加对协程的支持有利于通过不同的交互方式向用户提供服务,但是会增加框架的实现复杂度,因此本问题暂留。
目前的计划细节:

  • 【尽可能】 实现时只能作为可被支持,而不允许强制支持(就像 Event 模块中,EventObjectCancelable 的关系)
  • 【问题】 该功能主要用于等待用户下一个事件(例如搜图功能中,可以先发送**“/搜图”**,随后再发送一张图片),这部分会增加框架的适配难度。

更多细节稍后补充。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.