Skip to content

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 - #1

Open
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe
Open

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针#1
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe

Conversation

@AnnaofArendelle

Copy link
Copy Markdown

问题

InterAction.chat_type 声明为 Integer,而 getEnvType() 中写的是 chat_type == 0,会触发自动拆箱。QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NPE。

崩溃发生在 Events.onEvent日志格式化路径上:

logger.info(String.format("Bot(%s) post(%s) from %s", bot.getInfo().getUsername(), event, event.getClassName()));
// ^^^^^ toString()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at java.base/java.util.Formatter$FormatSpecifier.printString(Formatter.java:3292)
...
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
at io.github.kloping.qqbot.network.Events.lambda$onReceive$0(Events.java:51)

事件本身在这一行之前就已分发完毕,功能不受影响,但每收到一次这类事件就会向 stderr 打印一次完整堆栈。

复现

在真实环境中稳定出现:机器人接入 QQ 群后,群内 @ 机器人或触发交互组件时,日志中周期性出现上述堆栈。本次是在一台 Minecraft 服务端上跑机器人时发现的,一个会话内出现 4 次。

改动

getEnvType() 先判空;chat_type 缺失时回退到 scene 字段 —— 按类上 Javadoc 引用的官方文档,二者承载同一信息(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为保持一致。

chat_type 非空时行为完全不变,不影响任何现有调用方。

@OverridepublicEnvTypegetEnvType() {
if (chat_type != null) {
returnchat_type == 0 ? EnvType.GUILD : EnvType.GROUP;
}
// chat_type 并非每次都会下发;scene 字段承载同一信息(guild / group / c2c),// 两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。returnSCENE_GUILD.equals(scene) ? EnvType.GUILD : EnvType.GROUP;
}

验证

已在引入本仓库源码的项目中编译通过(compileJava BUILD SUCCESSFUL)。

备注

刻意保持最小改动,没有一并处理 chat_type == 2(单聊)目前被归入 GROUP 分支、以及 getCid() 在单聊场景返回 group_openid 的问题 —— 那涉及语义判断,留给维护者定夺。

chat_type 声明为 Integer,getEnvType() 中的 `chat_type == 0` 会触发拆箱。
QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NullPointerException。
崩溃点在 Events.onEvent 的日志格式化路径:
logger.info(String.format("Bot(%s) post(%s) from %s", ..., event, ...));
-> BaseInterActionEvent.toString() -> InterAction.getCid() -> getEnvType()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()"
because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
事件本身已分发完毕,功能不受影响,但每次都会向 stderr 打印一次堆栈。
改为先判空;chat_type 缺失时回退到 scene 字段——按官方文档,二者承载同一信息
(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。
chat_type 非空时行为完全不变。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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.

1 participant

@AnnaofArendelle
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 by AnnaofArendelle · Pull Request #1 · HuHoBot/qqpd-bot-java · GitHub
Skip to content

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 - #1

Open
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe
Open

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针#1
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe

Conversation

@AnnaofArendelle

Copy link
Copy Markdown

问题

InterAction.chat_type 声明为 Integer,而 getEnvType() 中写的是 chat_type == 0,会触发自动拆箱。QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NPE。

崩溃发生在 Events.onEvent日志格式化路径上:

logger.info(String.format("Bot(%s) post(%s) from %s", bot.getInfo().getUsername(), event, event.getClassName()));
// ^^^^^ toString()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at java.base/java.util.Formatter$FormatSpecifier.printString(Formatter.java:3292)
...
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
at io.github.kloping.qqbot.network.Events.lambda$onReceive$0(Events.java:51)

事件本身在这一行之前就已分发完毕,功能不受影响,但每收到一次这类事件就会向 stderr 打印一次完整堆栈。

复现

在真实环境中稳定出现:机器人接入 QQ 群后,群内 @ 机器人或触发交互组件时,日志中周期性出现上述堆栈。本次是在一台 Minecraft 服务端上跑机器人时发现的,一个会话内出现 4 次。

改动

getEnvType() 先判空;chat_type 缺失时回退到 scene 字段 —— 按类上 Javadoc 引用的官方文档,二者承载同一信息(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为保持一致。

chat_type 非空时行为完全不变,不影响任何现有调用方。

@OverridepublicEnvTypegetEnvType() {
if (chat_type != null) {
returnchat_type == 0 ? EnvType.GUILD : EnvType.GROUP;
}
// chat_type 并非每次都会下发;scene 字段承载同一信息(guild / group / c2c),// 两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。returnSCENE_GUILD.equals(scene) ? EnvType.GUILD : EnvType.GROUP;
}

验证

已在引入本仓库源码的项目中编译通过(compileJava BUILD SUCCESSFUL)。

备注

刻意保持最小改动,没有一并处理 chat_type == 2(单聊)目前被归入 GROUP 分支、以及 getCid() 在单聊场景返回 group_openid 的问题 —— 那涉及语义判断,留给维护者定夺。

chat_type 声明为 Integer,getEnvType() 中的 `chat_type == 0` 会触发拆箱。
QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NullPointerException。
崩溃点在 Events.onEvent 的日志格式化路径:
logger.info(String.format("Bot(%s) post(%s) from %s", ..., event, ...));
-> BaseInterActionEvent.toString() -> InterAction.getCid() -> getEnvType()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()"
because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
事件本身已分发完毕,功能不受影响,但每次都会向 stderr 打印一次堆栈。
改为先判空;chat_type 缺失时回退到 scene 字段——按官方文档,二者承载同一信息
(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。
chat_type 非空时行为完全不变。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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.

1 participant

@AnnaofArendelle
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 by AnnaofArendelle · Pull Request #1 · HuHoBot/qqpd-bot-java · GitHub
Skip to content

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 - #1

Open
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe
Open

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针#1
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe

Conversation

@AnnaofArendelle

Copy link
Copy Markdown

问题

InterAction.chat_type 声明为 Integer,而 getEnvType() 中写的是 chat_type == 0,会触发自动拆箱。QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NPE。

崩溃发生在 Events.onEvent日志格式化路径上:

logger.info(String.format("Bot(%s) post(%s) from %s", bot.getInfo().getUsername(), event, event.getClassName()));
// ^^^^^ toString()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at java.base/java.util.Formatter$FormatSpecifier.printString(Formatter.java:3292)
...
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
at io.github.kloping.qqbot.network.Events.lambda$onReceive$0(Events.java:51)

事件本身在这一行之前就已分发完毕,功能不受影响,但每收到一次这类事件就会向 stderr 打印一次完整堆栈。

复现

在真实环境中稳定出现:机器人接入 QQ 群后,群内 @ 机器人或触发交互组件时,日志中周期性出现上述堆栈。本次是在一台 Minecraft 服务端上跑机器人时发现的,一个会话内出现 4 次。

改动

getEnvType() 先判空;chat_type 缺失时回退到 scene 字段 —— 按类上 Javadoc 引用的官方文档,二者承载同一信息(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为保持一致。

chat_type 非空时行为完全不变,不影响任何现有调用方。

@OverridepublicEnvTypegetEnvType() {
if (chat_type != null) {
returnchat_type == 0 ? EnvType.GUILD : EnvType.GROUP;
}
// chat_type 并非每次都会下发;scene 字段承载同一信息(guild / group / c2c),// 两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。returnSCENE_GUILD.equals(scene) ? EnvType.GUILD : EnvType.GROUP;
}

验证

已在引入本仓库源码的项目中编译通过(compileJava BUILD SUCCESSFUL)。

备注

刻意保持最小改动,没有一并处理 chat_type == 2(单聊)目前被归入 GROUP 分支、以及 getCid() 在单聊场景返回 group_openid 的问题 —— 那涉及语义判断,留给维护者定夺。

chat_type 声明为 Integer,getEnvType() 中的 `chat_type == 0` 会触发拆箱。
QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NullPointerException。
崩溃点在 Events.onEvent 的日志格式化路径:
logger.info(String.format("Bot(%s) post(%s) from %s", ..., event, ...));
-> BaseInterActionEvent.toString() -> InterAction.getCid() -> getEnvType()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()"
because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
事件本身已分发完毕,功能不受影响,但每次都会向 stderr 打印一次堆栈。
改为先判空;chat_type 缺失时回退到 scene 字段——按官方文档,二者承载同一信息
(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。
chat_type 非空时行为完全不变。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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.

1 participant

@AnnaofArendelle
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 by AnnaofArendelle · Pull Request #1 · HuHoBot/qqpd-bot-java · GitHub
Skip to content

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 - #1

Open
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe
Open

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针#1
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe

Conversation

@AnnaofArendelle

Copy link
Copy Markdown

问题

InterAction.chat_type 声明为 Integer,而 getEnvType() 中写的是 chat_type == 0,会触发自动拆箱。QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NPE。

崩溃发生在 Events.onEvent日志格式化路径上:

logger.info(String.format("Bot(%s) post(%s) from %s", bot.getInfo().getUsername(), event, event.getClassName()));
// ^^^^^ toString()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at java.base/java.util.Formatter$FormatSpecifier.printString(Formatter.java:3292)
...
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
at io.github.kloping.qqbot.network.Events.lambda$onReceive$0(Events.java:51)

事件本身在这一行之前就已分发完毕,功能不受影响,但每收到一次这类事件就会向 stderr 打印一次完整堆栈。

复现

在真实环境中稳定出现:机器人接入 QQ 群后,群内 @ 机器人或触发交互组件时,日志中周期性出现上述堆栈。本次是在一台 Minecraft 服务端上跑机器人时发现的,一个会话内出现 4 次。

改动

getEnvType() 先判空;chat_type 缺失时回退到 scene 字段 —— 按类上 Javadoc 引用的官方文档,二者承载同一信息(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为保持一致。

chat_type 非空时行为完全不变,不影响任何现有调用方。

@OverridepublicEnvTypegetEnvType() {
if (chat_type != null) {
returnchat_type == 0 ? EnvType.GUILD : EnvType.GROUP;
}
// chat_type 并非每次都会下发;scene 字段承载同一信息(guild / group / c2c),// 两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。returnSCENE_GUILD.equals(scene) ? EnvType.GUILD : EnvType.GROUP;
}

验证

已在引入本仓库源码的项目中编译通过(compileJava BUILD SUCCESSFUL)。

备注

刻意保持最小改动,没有一并处理 chat_type == 2(单聊)目前被归入 GROUP 分支、以及 getCid() 在单聊场景返回 group_openid 的问题 —— 那涉及语义判断,留给维护者定夺。

chat_type 声明为 Integer,getEnvType() 中的 `chat_type == 0` 会触发拆箱。
QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NullPointerException。
崩溃点在 Events.onEvent 的日志格式化路径:
logger.info(String.format("Bot(%s) post(%s) from %s", ..., event, ...));
-> BaseInterActionEvent.toString() -> InterAction.getCid() -> getEnvType()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()"
because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
事件本身已分发完毕,功能不受影响,但每次都会向 stderr 打印一次堆栈。
改为先判空;chat_type 缺失时回退到 scene 字段——按官方文档,二者承载同一信息
(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。
chat_type 非空时行为完全不变。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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.

1 participant

@AnnaofArendelle
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 by AnnaofArendelle · Pull Request #1 · HuHoBot/qqpd-bot-java · GitHub
Skip to content

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 - #1

Open
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe
Open

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针#1
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe

Conversation

@AnnaofArendelle

Copy link
Copy Markdown

问题

InterAction.chat_type 声明为 Integer,而 getEnvType() 中写的是 chat_type == 0,会触发自动拆箱。QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NPE。

崩溃发生在 Events.onEvent日志格式化路径上:

logger.info(String.format("Bot(%s) post(%s) from %s", bot.getInfo().getUsername(), event, event.getClassName()));
// ^^^^^ toString()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at java.base/java.util.Formatter$FormatSpecifier.printString(Formatter.java:3292)
...
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
at io.github.kloping.qqbot.network.Events.lambda$onReceive$0(Events.java:51)

事件本身在这一行之前就已分发完毕,功能不受影响,但每收到一次这类事件就会向 stderr 打印一次完整堆栈。

复现

在真实环境中稳定出现:机器人接入 QQ 群后,群内 @ 机器人或触发交互组件时,日志中周期性出现上述堆栈。本次是在一台 Minecraft 服务端上跑机器人时发现的,一个会话内出现 4 次。

改动

getEnvType() 先判空;chat_type 缺失时回退到 scene 字段 —— 按类上 Javadoc 引用的官方文档,二者承载同一信息(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为保持一致。

chat_type 非空时行为完全不变,不影响任何现有调用方。

@OverridepublicEnvTypegetEnvType() {
if (chat_type != null) {
returnchat_type == 0 ? EnvType.GUILD : EnvType.GROUP;
}
// chat_type 并非每次都会下发;scene 字段承载同一信息(guild / group / c2c),// 两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。returnSCENE_GUILD.equals(scene) ? EnvType.GUILD : EnvType.GROUP;
}

验证

已在引入本仓库源码的项目中编译通过(compileJava BUILD SUCCESSFUL)。

备注

刻意保持最小改动,没有一并处理 chat_type == 2(单聊)目前被归入 GROUP 分支、以及 getCid() 在单聊场景返回 group_openid 的问题 —— 那涉及语义判断,留给维护者定夺。

chat_type 声明为 Integer,getEnvType() 中的 `chat_type == 0` 会触发拆箱。
QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NullPointerException。
崩溃点在 Events.onEvent 的日志格式化路径:
logger.info(String.format("Bot(%s) post(%s) from %s", ..., event, ...));
-> BaseInterActionEvent.toString() -> InterAction.getCid() -> getEnvType()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()"
because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
事件本身已分发完毕,功能不受影响,但每次都会向 stderr 打印一次堆栈。
改为先判空;chat_type 缺失时回退到 scene 字段——按官方文档,二者承载同一信息
(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。
chat_type 非空时行为完全不变。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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.

1 participant

@AnnaofArendelle
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 by AnnaofArendelle · Pull Request #1 · HuHoBot/qqpd-bot-java · GitHub
Skip to content

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 - #1

Open
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe
Open

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针#1
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe

Conversation

@AnnaofArendelle

Copy link
Copy Markdown

问题

InterAction.chat_type 声明为 Integer,而 getEnvType() 中写的是 chat_type == 0,会触发自动拆箱。QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NPE。

崩溃发生在 Events.onEvent日志格式化路径上:

logger.info(String.format("Bot(%s) post(%s) from %s", bot.getInfo().getUsername(), event, event.getClassName()));
// ^^^^^ toString()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at java.base/java.util.Formatter$FormatSpecifier.printString(Formatter.java:3292)
...
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
at io.github.kloping.qqbot.network.Events.lambda$onReceive$0(Events.java:51)

事件本身在这一行之前就已分发完毕,功能不受影响,但每收到一次这类事件就会向 stderr 打印一次完整堆栈。

复现

在真实环境中稳定出现:机器人接入 QQ 群后,群内 @ 机器人或触发交互组件时,日志中周期性出现上述堆栈。本次是在一台 Minecraft 服务端上跑机器人时发现的,一个会话内出现 4 次。

改动

getEnvType() 先判空;chat_type 缺失时回退到 scene 字段 —— 按类上 Javadoc 引用的官方文档,二者承载同一信息(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为保持一致。

chat_type 非空时行为完全不变,不影响任何现有调用方。

@OverridepublicEnvTypegetEnvType() {
if (chat_type != null) {
returnchat_type == 0 ? EnvType.GUILD : EnvType.GROUP;
}
// chat_type 并非每次都会下发;scene 字段承载同一信息(guild / group / c2c),// 两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。returnSCENE_GUILD.equals(scene) ? EnvType.GUILD : EnvType.GROUP;
}

验证

已在引入本仓库源码的项目中编译通过(compileJava BUILD SUCCESSFUL)。

备注

刻意保持最小改动,没有一并处理 chat_type == 2(单聊)目前被归入 GROUP 分支、以及 getCid() 在单聊场景返回 group_openid 的问题 —— 那涉及语义判断,留给维护者定夺。

chat_type 声明为 Integer,getEnvType() 中的 `chat_type == 0` 会触发拆箱。
QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NullPointerException。
崩溃点在 Events.onEvent 的日志格式化路径:
logger.info(String.format("Bot(%s) post(%s) from %s", ..., event, ...));
-> BaseInterActionEvent.toString() -> InterAction.getCid() -> getEnvType()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()"
because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
事件本身已分发完毕,功能不受影响,但每次都会向 stderr 打印一次堆栈。
改为先判空;chat_type 缺失时回退到 scene 字段——按官方文档,二者承载同一信息
(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。
chat_type 非空时行为完全不变。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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.

1 participant

@AnnaofArendelle
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 by AnnaofArendelle · Pull Request #1 · HuHoBot/qqpd-bot-java · GitHub
Skip to content

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针 - #1

Open
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe
Open

fix(entities): 修复 InterAction.getEnvType 对 chat_type 的空指针#1
AnnaofArendelle wants to merge 1 commit into
HuHoBot:masterfrom
AnnaofArendelle:fix/interaction-chat-type-npe

Conversation

@AnnaofArendelle

Copy link
Copy Markdown

问题

InterAction.chat_type 声明为 Integer,而 getEnvType() 中写的是 chat_type == 0,会触发自动拆箱。QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NPE。

崩溃发生在 Events.onEvent日志格式化路径上:

logger.info(String.format("Bot(%s) post(%s) from %s", bot.getInfo().getUsername(), event, event.getClassName()));
// ^^^^^ toString()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at java.base/java.util.Formatter$FormatSpecifier.printString(Formatter.java:3292)
...
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
at io.github.kloping.qqbot.network.Events.lambda$onReceive$0(Events.java:51)

事件本身在这一行之前就已分发完毕,功能不受影响,但每收到一次这类事件就会向 stderr 打印一次完整堆栈。

复现

在真实环境中稳定出现:机器人接入 QQ 群后,群内 @ 机器人或触发交互组件时,日志中周期性出现上述堆栈。本次是在一台 Minecraft 服务端上跑机器人时发现的,一个会话内出现 4 次。

改动

getEnvType() 先判空;chat_type 缺失时回退到 scene 字段 —— 按类上 Javadoc 引用的官方文档,二者承载同一信息(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为保持一致。

chat_type 非空时行为完全不变,不影响任何现有调用方。

@OverridepublicEnvTypegetEnvType() {
if (chat_type != null) {
returnchat_type == 0 ? EnvType.GUILD : EnvType.GROUP;
}
// chat_type 并非每次都会下发;scene 字段承载同一信息(guild / group / c2c),// 两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。returnSCENE_GUILD.equals(scene) ? EnvType.GUILD : EnvType.GROUP;
}

验证

已在引入本仓库源码的项目中编译通过(compileJava BUILD SUCCESSFUL)。

备注

刻意保持最小改动,没有一并处理 chat_type == 2(单聊)目前被归入 GROUP 分支、以及 getCid() 在单聊场景返回 group_openid 的问题 —— 那涉及语义判断,留给维护者定夺。

chat_type 声明为 Integer,getEnvType() 中的 `chat_type == 0` 会触发拆箱。
QQ 下发的 InterAction 事件并非总是携带该字段,此时抛出 NullPointerException。
崩溃点在 Events.onEvent 的日志格式化路径:
logger.info(String.format("Bot(%s) post(%s) from %s", ..., event, ...));
-> BaseInterActionEvent.toString() -> InterAction.getCid() -> getEnvType()
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()"
because "this.chat_type" is null
at io.github.kloping.qqbot.entities.qqpd.InterAction.getEnvType(InterAction.java:75)
at io.github.kloping.qqbot.entities.qqpd.InterAction.getCid(InterAction.java:65)
at io.github.kloping.qqbot.impl.BaseInterActionEvent.toString(BaseInterActionEvent.java:69)
at io.github.kloping.qqbot.network.Events.onEvent(Events.java:115)
事件本身已分发完毕,功能不受影响,但每次都会向 stderr 打印一次堆栈。
改为先判空;chat_type 缺失时回退到 scene 字段——按官方文档,二者承载同一信息
(guild / group / c2c)。两者皆缺失时按群聊处理,与 chat_type 非 0 时的既有行为一致。
chat_type 非空时行为完全不变。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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.

1 participant

@AnnaofArendelle