Compare commits

...

17 Commits

Author SHA1 Message Date
手瓜一十雪
50579bb9e6 fix: 修复某个笨蛋写的 2024-08-14 10:46:59 +08:00
手瓜一十雪
50512ca63c Merge pull request #250 from cnxysoft/upmain
fix: 二维码登录
2024-08-14 10:42:46 +08:00
手瓜一十雪
8b3577b216 Merge pull request #249 from DiheChen/patch-1
🐛 generating QR code when quick login fails
2024-08-14 10:42:33 +08:00
Alen
7553aab932 fix: 二维码登录
修复在没找到登陆历史记录后不加载二维码的问题
2024-08-14 10:32:39 +08:00
DiheChen
5dacdcfe5e 🐛 generating QR code when quick login fails 2024-08-14 10:31:28 +08:00
手瓜一十雪
8645a412b7 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-14 09:35:14 +08:00
手瓜一十雪
acad07a588 release: 2.0.18 2024-08-14 09:33:52 +08:00
手瓜一十雪
51bbb480bb Merge pull request #248 from cnxysoft/upmain
fix: GetCookie容错
2024-08-14 01:41:38 +08:00
Alen
f0306cd10a fix: GetCookie容错
修改 API提交不可用域名或不含skey返回时的容错
2024-08-14 01:32:32 +08:00
手瓜一十雪
25253ad9e7 fix: 异常 2024-08-14 01:22:08 +08:00
手瓜一十雪
51f2fb8e8b release: 2.0.17 2024-08-14 00:57:09 +08:00
手瓜一十雪
9e8d650cbd chore: 提高对trss兼容性 2024-08-14 00:56:42 +08:00
手瓜一十雪
d222ccfa58 fix: GetGuildProfile 2024-08-14 00:54:14 +08:00
手瓜一十雪
9a05aaa906 chore: 兼容guild api 2024-08-14 00:53:52 +08:00
手瓜一十雪
00fdce8876 style&&chore: lint 2024-08-14 00:47:50 +08:00
手瓜一十雪
29b51adf7d style&&chore: 逐步清退老版本代码 2024-08-14 00:47:31 +08:00
手瓜一十雪
8e14b39969 release: 2.0.16 2024-08-14 00:38:04 +08:00
30 changed files with 176 additions and 162 deletions

View File

@@ -4,7 +4,7 @@
"name": "NapCat", "name": "NapCat",
"slug": "NapCat", "slug": "NapCat",
"description": "现代化的 OneBot 11 协议实现", "description": "现代化的 OneBot 11 协议实现",
"version": "2.0.15", "version": "2.0.19",
"icon": "./logo.png", "icon": "./logo.png",
"authors": [ "authors": [
{ {

View File

@@ -2,7 +2,7 @@
"name": "napcat", "name": "napcat",
"private": true, "private": true,
"type": "module", "type": "module",
"version": "2.0.15", "version": "2.0.19",
"scripts": { "scripts": {
"build:framework": "vite build --mode framework", "build:framework": "vite build --mode framework",
"build:shell": "vite build --mode shell", "build:shell": "vite build --mode shell",

View File

@@ -2,7 +2,7 @@ import path, { dirname } from 'path';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import fs from 'fs'; import fs from 'fs';
export const napcat_version = '2.0.15'; export const napcat_version = '2.0.19';
export class NapCatPathWrapper { export class NapCatPathWrapper {
binaryPath: string; binaryPath: string;

View File

@@ -117,31 +117,31 @@ export class NTQQFileApi {
filePath: string filePath: string
}) => Promise<unknown>, }) => Promise<unknown>,
(fileTransNotifyInfo: OnRichMediaDownloadCompleteParams) => void (fileTransNotifyInfo: OnRichMediaDownloadCompleteParams) => void
>( >(
'NodeIKernelMsgService/downloadRichMedia', 'NodeIKernelMsgService/downloadRichMedia',
'NodeIKernelMsgListener/onRichMediaDownloadComplete', 'NodeIKernelMsgListener/onRichMediaDownloadComplete',
1, 1,
timeout, timeout,
(arg: OnRichMediaDownloadCompleteParams) => { (arg: OnRichMediaDownloadCompleteParams) => {
if (arg.msgId === msgId) { if (arg.msgId === msgId) {
return true; return true;
} }
return false; return false;
}, },
{ {
fileModelId: '0', fileModelId: '0',
downloadSourceType: 0, downloadSourceType: 0,
triggerType: 1, triggerType: 1,
msgId: msgId, msgId: msgId,
chatType: chatType, chatType: chatType,
peerUid: peerUid, peerUid: peerUid,
elementId: elementId, elementId: elementId,
thumbSize: 0, thumbSize: 0,
downloadType: 1, downloadType: 1,
filePath: thumbPath, filePath: thumbPath,
}, },
); );
let msg = await this.core.apis.MsgApi.getMsgsByMsgId({ const msg = await this.core.apis.MsgApi.getMsgsByMsgId({
guildId: '', guildId: '',
chatType: chatType, chatType: chatType,
peerUid: peerUid, peerUid: peerUid,
@@ -150,13 +150,13 @@ export class NTQQFileApi {
return data[1].filePath; return data[1].filePath;
} }
//获取原始消息 //获取原始消息
let FileElements = msg?.msgList[0]?.elements?.find(e => e.elementId === elementId); const FileElements = msg?.msgList[0]?.elements?.find(e => e.elementId === elementId);
if (!FileElements) { if (!FileElements) {
//失败则就乱来 Todo //失败则就乱来 Todo
return data[1].filePath; return data[1].filePath;
} }
//从原始消息获取文件路径 //从原始消息获取文件路径
let filePath = const filePath =
FileElements?.fileElement?.filePath || FileElements?.fileElement?.filePath ||
FileElements?.pttElement?.filePath || FileElements?.pttElement?.filePath ||
FileElements?.videoElement?.filePath || FileElements?.videoElement?.filePath ||
@@ -280,10 +280,10 @@ export class NTQQFileApi {
let id = ''; let id = '';
const Listener = this.core.eventWrapper.RegisterListen<(params: OnListener) => void> const Listener = this.core.eventWrapper.RegisterListen<(params: OnListener) => void>
( (
'NodeIKernelSearchListener/onSearchFileKeywordsResult', 'NodeIKernelSearchListener/onSearchFileKeywordsResult',
1, 1,
20000, 20000,
(params) => id !== '' && params.searchId == id, (params) => id !== '' && params.searchId == id,
); );
id = await Event!(keys, 12); id = await Event!(keys, 12);
const [ret] = (await Listener); const [ret] = (await Listener);

View File

@@ -83,12 +83,12 @@ export class NTQQFriendApi {
async getFriends(forced = false): Promise<User[]> { async getFriends(forced = false): Promise<User[]> {
const [_retData, _BuddyArg] = await this.core.eventWrapper.CallNormalEvent<(force: boolean) => Promise<any>, (arg: OnBuddyChangeParams) => void> const [_retData, _BuddyArg] = await this.core.eventWrapper.CallNormalEvent<(force: boolean) => Promise<any>, (arg: OnBuddyChangeParams) => void>
( (
'NodeIKernelBuddyService/getBuddyList', 'NodeIKernelBuddyService/getBuddyList',
'NodeIKernelBuddyListener/onBuddyListChange', 'NodeIKernelBuddyListener/onBuddyListChange',
1, 1,
5000, 5000,
() => true, () => true,
forced, forced,
); );
const friends: User[] = []; const friends: User[] = [];
for (const categoryItem of _BuddyArg) { for (const categoryItem of _BuddyArg) {

View File

@@ -103,18 +103,18 @@ export class NTQQMsgApi {
const data = await this.core.eventWrapper.CallNormalEvent< const data = await this.core.eventWrapper.CallNormalEvent<
(GroupCode: string, params: GetFileListParam) => Promise<unknown>, (GroupCode: string, params: GetFileListParam) => Promise<unknown>,
(groupFileListResult: onGroupFileInfoUpdateParamType) => void (groupFileListResult: onGroupFileInfoUpdateParamType) => void
>( >(
'NodeIKernelRichMediaService/getGroupFileList', 'NodeIKernelRichMediaService/getGroupFileList',
'NodeIKernelMsgListener/onGroupFileInfoUpdate', 'NodeIKernelMsgListener/onGroupFileInfoUpdate',
1, 1,
5000, 5000,
(groupFileListResult: onGroupFileInfoUpdateParamType) => { (groupFileListResult: onGroupFileInfoUpdateParamType) => {
//Developer Mlikiowa Todo: 此处有问题 无法判断是否成功 //Developer Mlikiowa Todo: 此处有问题 无法判断是否成功
return true; return true;
}, },
GroupCode, GroupCode,
params, params,
); );
return data[1].item; return data[1].item;
} }
@@ -155,24 +155,24 @@ export class NTQQMsgApi {
const data = await this.core.eventWrapper.CallNormalEvent< const data = await this.core.eventWrapper.CallNormalEvent<
(msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map<any, any>) => Promise<unknown>, (msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map<any, any>) => Promise<unknown>,
(msgList: RawMessage[]) => void (msgList: RawMessage[]) => void
>( >(
'NodeIKernelMsgService/sendMsg', 'NodeIKernelMsgService/sendMsg',
'NodeIKernelMsgListener/onMsgInfoListUpdate', 'NodeIKernelMsgListener/onMsgInfoListUpdate',
1, 1,
timeout, timeout,
(msgRecords: RawMessage[]) => { (msgRecords: RawMessage[]) => {
for (const msgRecord of msgRecords) { for (const msgRecord of msgRecords) {
if (msgRecord.msgId === msgId && msgRecord.sendStatus === 2) { if (msgRecord.msgId === msgId && msgRecord.sendStatus === 2) {
return true; return true;
}
} }
} return false;
return false; },
}, msgId,
msgId, peer,
peer, msgElements,
msgElements, new Map(),
new Map(), );
);
const retMsg = data[1].find(msgRecord => { const retMsg = data[1].find(msgRecord => {
if (msgRecord.msgId === msgId) { if (msgRecord.msgId === msgId) {
return true; return true;
@@ -186,7 +186,7 @@ export class NTQQMsgApi {
} }
async PrepareTempChat(toUserUid: string, GroupCode: string, nickname: string) { async PrepareTempChat(toUserUid: string, GroupCode: string, nickname: string) {
//By Jadx/Ida Mlikiowa //By Jadx/Ida Mlikiowa
let TempGameSession = { const TempGameSession = {
nickname: "", nickname: "",
gameAppId: "", gameAppId: "",
selfTinyId: "", selfTinyId: "",
@@ -210,7 +210,7 @@ export class NTQQMsgApi {
async sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000) { async sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000) {
//唉? !我有个想法 //唉? !我有个想法
if (peer.chatType === ChatType.temp && peer.guildId && peer.guildId !== '') { if (peer.chatType === ChatType.temp && peer.guildId && peer.guildId !== '') {
let member = await this.core.apis.GroupApi.getGroupMember(peer.guildId, peer.peerUid!); const member = await this.core.apis.GroupApi.getGroupMember(peer.guildId, peer.peerUid!);
if (member) { if (member) {
await this.PrepareTempChat(peer.peerUid, peer.guildId, member.nick); await this.PrepareTempChat(peer.peerUid, peer.guildId, member.nick);
} }
@@ -220,24 +220,24 @@ export class NTQQMsgApi {
const data = await this.core.eventWrapper.CallNormalEvent< const data = await this.core.eventWrapper.CallNormalEvent<
(msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map<any, any>) => Promise<unknown>, (msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map<any, any>) => Promise<unknown>,
(msgList: RawMessage[]) => void (msgList: RawMessage[]) => void
>( >(
'NodeIKernelMsgService/sendMsg', 'NodeIKernelMsgService/sendMsg',
'NodeIKernelMsgListener/onMsgInfoListUpdate', 'NodeIKernelMsgListener/onMsgInfoListUpdate',
1, 1,
timeout, timeout,
(msgRecords: RawMessage[]) => { (msgRecords: RawMessage[]) => {
for (const msgRecord of msgRecords) { for (const msgRecord of msgRecords) {
if (msgRecord.guildId === msgId && msgRecord.sendStatus === 2) { if (msgRecord.guildId === msgId && msgRecord.sendStatus === 2) {
return true; return true;
}
} }
} return false;
return false; },
}, '0',
'0', peer,
peer, msgElements,
msgElements, new Map(),
new Map(), );
);
const retMsg = data[1].find(msgRecord => { const retMsg = data[1].find(msgRecord => {
if (msgRecord.guildId === msgId) { if (msgRecord.guildId === msgId) {
return true; return true;
@@ -272,25 +272,25 @@ export class NTQQMsgApi {
const data = await this.core.eventWrapper.CallNormalEvent< const data = await this.core.eventWrapper.CallNormalEvent<
(msgInfo: typeof msgInfos, srcPeer: Peer, destPeer: Peer, comment: Array<any>, attr: Map<any, any>) => Promise<unknown>, (msgInfo: typeof msgInfos, srcPeer: Peer, destPeer: Peer, comment: Array<any>, attr: Map<any, any>) => Promise<unknown>,
(msgList: RawMessage[]) => void (msgList: RawMessage[]) => void
>( >(
'NodeIKernelMsgService/multiForwardMsgWithComment', 'NodeIKernelMsgService/multiForwardMsgWithComment',
'NodeIKernelMsgListener/onMsgInfoListUpdate', 'NodeIKernelMsgListener/onMsgInfoListUpdate',
1, 1,
5000, 5000,
(msgRecords: RawMessage[]) => { (msgRecords: RawMessage[]) => {
for (const msgRecord of msgRecords) { for (const msgRecord of msgRecords) {
if (msgRecord.peerUid == destPeer.peerUid && msgRecord.senderUid == this.core.selfInfo.uid) { if (msgRecord.peerUid == destPeer.peerUid && msgRecord.senderUid == this.core.selfInfo.uid) {
return true; return true;
}
} }
} return false;
return false; },
}, msgInfos,
msgInfos, srcPeer,
srcPeer, destPeer,
destPeer, [],
[], new Map(),
new Map(), );
);
for (const msg of data[1]) { for (const msg of data[1]) {
const arkElement = msg.elements.find(ele => ele.arkElement); const arkElement = msg.elements.find(ele => ele.arkElement);
if (!arkElement) { if (!arkElement) {

View File

@@ -155,16 +155,10 @@ export class NTQQUserApi {
//需要异常处理 //需要异常处理
async getCookies(domain: string) { async getCookies(domain: string) {
const ClientKeyData = await this.forceFetchClientKey(); const ClientKeyData = await this.forceFetchClientKey();
const requestUrl = `https://ssl.ptlogin2.qq.com/jump?${ const requestUrl = 'https://ssl.ptlogin2.qq.com/jump?ptlang=1033&clientuin=' + this.core.selfInfo.uin +
new URLSearchParams({ '&clientkey=' + ClientKeyData.clientKey + '&u1=https%3A%2F%2F' + domain + '%2F' + this.core.selfInfo.uin + '%2Finfocenter&keyindex=19%27';
ptlang: '1033', const cookies: { [key: string]: string; } = await RequestUtil.HttpsGetCookies(requestUrl);
clientuin: this.core.selfInfo.uin, return cookies;
clientkey: ClientKeyData.clientKey,
u1: `https://user.qzone.qq.com/${this.core.selfInfo.uin}/infocenter`,
keyindex: '19',
})
}`;
return await RequestUtil.HttpsGetCookies(requestUrl);
} }
async getPSkey(domainList: string[]) { async getPSkey(domainList: string[]) {

View File

@@ -13,7 +13,7 @@ import { NapCatOneBot11Adapter } from '@/onebot';
//Framework ES入口文件 //Framework ES入口文件
export async function getWebUiUrl() { export async function getWebUiUrl() {
let WebUiConfigData = (await WebUiConfig.GetWebUIConfig()); const WebUiConfigData = (await WebUiConfig.GetWebUIConfig());
return "http://127.0.0.1:" + WebUiConfigData.port + '/webui/?token=' + WebUiConfigData.token; return "http://127.0.0.1:" + WebUiConfigData.port + '/webui/?token=' + WebUiConfigData.token;
} }
export async function NCoreInitFramework( export async function NCoreInitFramework(

View File

@@ -13,7 +13,7 @@ export const onSettingWindowCreated = async (view) => {
// //iframe.scrolling = "no"; // //iframe.scrolling = "no";
// //有滚动条何尝不是一种美 // //有滚动条何尝不是一种美
// view.appendChild(iframe); // view.appendChild(iframe);
let webui = await window.napcat.getWebUiUrl() let webui = await window.napcat.getWebUiUrl();
let panel = ` let panel = `
<setting-section data-title=""> <setting-section data-title="">
<setting-panel> <setting-panel>

View File

@@ -6,14 +6,9 @@ export class GetFriendWithCategory extends BaseAction<void, any> {
actionName = ActionName.GetFriendsWithCategory; actionName = ActionName.GetFriendsWithCategory;
async _handle(payload: void) { async _handle(payload: void) {
if (this.CoreContext.context.basicInfoWrapper.requireMinNTQQBuild('26702')) { return (await this.CoreContext.apis.FriendApi.getBuddyV2ExWithCate(true)).map(category => ({
//全新逻辑 ...category,
return (await this.CoreContext.apis.FriendApi.getBuddyV2ExWithCate(true)).map(category => ({ buddyList: OB11Constructor.friendsV2(category.buddyList),
...category, }));
buddyList: OB11Constructor.friendsV2(category.buddyList),
}));
} else {
throw new Error('this ntqq version not support, must be 26702 or later');
}
} }
} }

View File

@@ -5,7 +5,6 @@ export class GetRobotUinRange extends BaseAction<void, Array<any>> {
actionName = ActionName.GetRobotUinRange; actionName = ActionName.GetRobotUinRange;
async _handle(payload: void) { async _handle(payload: void) {
// console.log(await NTQQUserApi.getRobotUinRange());
const NTQQUserApi = this.CoreContext.apis.UserApi; const NTQQUserApi = this.CoreContext.apis.UserApi;
return await NTQQUserApi.getRobotUinRange(); return await NTQQUserApi.getRobotUinRange();
} }

View File

@@ -0,0 +1,10 @@
import BaseAction from '../BaseAction';
import { ActionName } from '../types';
export default class SetModelShow extends BaseAction<null, null> {
actionName = ActionName.SetModelShow;
async _handle(payload: null): Promise<null> {
return null;
}
}

View File

@@ -20,9 +20,7 @@ export default class DelEssenceMsg extends BaseAction<Payload, any> {
async _handle(payload: Payload): Promise<any> { async _handle(payload: Payload): Promise<any> {
const NTQQGroupApi = this.CoreContext.apis.GroupApi; const NTQQGroupApi = this.CoreContext.apis.GroupApi;
const msg = MessageUnique.getMsgIdAndPeerByShortId(parseInt(payload.message_id.toString())); const msg = MessageUnique.getMsgIdAndPeerByShortId(parseInt(payload.message_id.toString()));
if (!msg) { if (!msg) throw new Error('msg not found');
throw new Error('msg not found');
}
return await NTQQGroupApi.removeGroupEssence( return await NTQQGroupApi.removeGroupEssence(
msg.Peer.peerUid, msg.Peer.peerUid,
msg.MsgId, msg.MsgId,

View File

@@ -9,7 +9,7 @@ const SchemaData = {
group_id: { type: ['number', 'string'] }, group_id: { type: ['number', 'string'] },
pages: { type: 'number' }, pages: { type: 'number' },
}, },
required: ['group_id', 'pages'], required: ['group_id'],
} as const satisfies JSONSchema; } as const satisfies JSONSchema;
type Payload = FromSchema<typeof SchemaData>; type Payload = FromSchema<typeof SchemaData>;
@@ -20,7 +20,7 @@ export class GetGroupEssence extends BaseAction<Payload, GroupEssenceMsgRet> {
async _handle(payload: Payload) { async _handle(payload: Payload) {
const NTQQWebApi = this.CoreContext.apis.WebApi; const NTQQWebApi = this.CoreContext.apis.WebApi;
const ret = await NTQQWebApi.getGroupEssenceMsg(payload.group_id.toString(), payload.pages.toString()); const ret = await NTQQWebApi.getGroupEssenceMsg(payload.group_id.toString(), (payload.pages || "0").toString());
if (!ret) { if (!ret) {
throw new Error('获取失败'); throw new Error('获取失败');
} }

View File

@@ -69,7 +69,7 @@ class GetGroupMemberInfo extends BaseAction<Payload, OB11GroupMember> {
} }
} }
} else { } else {
// Mlikiowa V2.0.15 Refactor Todo // Mlikiowa V2.0.19 Refactor Todo
// retMember.last_sent_time = parseInt((await getGroupMember(payload.group_id.toString(), retMember.user_id))?.lastSpeakTime || date.toString()); // retMember.last_sent_time = parseInt((await getGroupMember(payload.group_id.toString(), retMember.user_id))?.lastSpeakTime || date.toString());
// retMember.join_time = parseInt((await getGroupMember(payload.group_id.toString(), retMember.user_id))?.joinTime || date.toString()); // retMember.join_time = parseInt((await getGroupMember(payload.group_id.toString(), retMember.user_id))?.joinTime || date.toString());
} }

View File

@@ -83,7 +83,7 @@ class GetGroupMemberList extends BaseAction<Payload, OB11GroupMember[]> {
} }
} }
} else { } else {
// Mlikiowa V2.0.15 Refactor Todo // Mlikiowa V2.0.19 Refactor Todo
// _groupMembers.forEach(async item => { // _groupMembers.forEach(async item => {
// item.last_sent_time = parseInt((await getGroupMember(payload.group_id.toString(), item.user_id))?.lastSpeakTime || date.toString()); // item.last_sent_time = parseInt((await getGroupMember(payload.group_id.toString(), item.user_id))?.lastSpeakTime || date.toString());
// item.join_time = parseInt((await getGroupMember(payload.group_id.toString(), item.user_id))?.joinTime || date.toString()); // item.join_time = parseInt((await getGroupMember(payload.group_id.toString(), item.user_id))?.joinTime || date.toString());

View File

@@ -0,0 +1,10 @@
import BaseAction from '../BaseAction';
import { ActionName } from '../types';
export default class GetGuildProfile extends BaseAction<null, null> {
actionName = ActionName.GetGuildProfile;
async _handle(payload: null): Promise<null> {
return null;
}
}

View File

@@ -23,7 +23,7 @@ import GoCQHTTPGetStrangerInfo from './go-cqhttp/GetStrangerInfo';
import SendLike from './user/SendLike'; import SendLike from './user/SendLike';
import SetGroupAddRequest from './group/SetGroupAddRequest'; import SetGroupAddRequest from './group/SetGroupAddRequest';
import SetGroupLeave from './group/SetGroupLeave'; import SetGroupLeave from './group/SetGroupLeave';
import GetGuildList from './group/GetGuildList'; import GetGuildList from './guild/GetGuildList';
import SetFriendAddRequest from './user/SetFriendAddRequest'; import SetFriendAddRequest from './user/SetFriendAddRequest';
import SetGroupWholeBan from './group/SetGroupWholeBan'; import SetGroupWholeBan from './group/SetGroupWholeBan';
import SetGroupName from './group/SetGroupName'; import SetGroupName from './group/SetGroupName';
@@ -76,6 +76,8 @@ import { FetchEmojiLike } from './extends/FetchEmojiLike';
import { NapCatCore } from '@/core'; import { NapCatCore } from '@/core';
import { NapCatOneBot11Adapter } from '@/onebot'; import { NapCatOneBot11Adapter } from '@/onebot';
import GetGuildProfile from './guild/GetGuildProfile';
import SetModelShow from './go-cqhttp/SetModelShow';
export type ActionMap = Map<string, BaseAction<any, any>>; export type ActionMap = Map<string, BaseAction<any, any>>;
@@ -161,6 +163,8 @@ export function createActionMap(onebotContext: NapCatOneBot11Adapter, coreContex
new SetGroupHeader(onebotContext, coreContext), new SetGroupHeader(onebotContext, coreContext),
new FetchCustomFace(onebotContext, coreContext), new FetchCustomFace(onebotContext, coreContext),
new GoCQHTTPUploadPrivateFile(onebotContext, coreContext), new GoCQHTTPUploadPrivateFile(onebotContext, coreContext),
new GetGuildProfile(onebotContext, coreContext),
new SetModelShow(onebotContext, coreContext),
]; ];
const actionMap = new Map(); const actionMap = new Map();
for (const action of actionHandlers) { for (const action of actionHandlers) {

View File

@@ -28,8 +28,8 @@ class GetMsg extends BaseAction<Payload, OB11Message> {
if (!payload.message_id) { if (!payload.message_id) {
throw Error('参数message_id不能为空'); throw Error('参数message_id不能为空');
} }
const MsgShortId = await MessageUnique.getShortIdByMsgId(payload.message_id.toString()); const MsgShortId = MessageUnique.getShortIdByMsgId(payload.message_id.toString());
const msgIdWithPeer = await MessageUnique.getMsgIdAndPeerByShortId(MsgShortId || parseInt(payload.message_id.toString())); const msgIdWithPeer = MessageUnique.getMsgIdAndPeerByShortId(MsgShortId || parseInt(payload.message_id.toString()));
if (!msgIdWithPeer) { if (!msgIdWithPeer) {
throw ('消息不存在'); throw ('消息不存在');
} }

View File

@@ -56,7 +56,7 @@ const _handlers: {
if (atQQ === 'all') return SendMsgElementConstructor.at(coreContext, atQQ, atQQ, AtType.atAll, '全体成员'); if (atQQ === 'all') return SendMsgElementConstructor.at(coreContext, atQQ, atQQ, AtType.atAll, '全体成员');
// then the qq is a group member // then the qq is a group member
// Mlikiowa V2.0.15 Refactor Todo // Mlikiowa V2.0.19 Refactor Todo
const uid = await coreContext.apis.UserApi.getUidByUinV2(atQQ); const uid = await coreContext.apis.UserApi.getUidByUinV2(atQQ);
if (!uid) throw new Error('Get Uid Error'); if (!uid) throw new Error('Get Uid Error');
return SendMsgElementConstructor.at(coreContext, atQQ, uid, AtType.atUser, ''); return SendMsgElementConstructor.at(coreContext, atQQ, uid, AtType.atUser, '');
@@ -161,7 +161,7 @@ const _handlers: {
} else { } else {
postData = data; postData = data;
} }
// Mlikiowa V2.0.15 Refactor Todo // Mlikiowa V2.0.19 Refactor Todo
const signUrl = obContext.configLoader.configData.musicSignUrl; const signUrl = obContext.configLoader.configData.musicSignUrl;
if (!signUrl) { if (!signUrl) {
if (data.type === 'qq') { if (data.type === 'qq') {

View File

@@ -104,5 +104,7 @@ export enum ActionName {
FetchCustomFace = 'fetch_custom_face', FetchCustomFace = 'fetch_custom_face',
GOCQHTTP_UploadPrivateFile = 'upload_private_file', GOCQHTTP_UploadPrivateFile = 'upload_private_file',
TestApi01 = 'test_api_01', TestApi01 = 'test_api_01',
FetchEmojiLike = 'fetch_emoji_like' FetchEmojiLike = 'fetch_emoji_like',
GetGuildProfile = "get_guild_service_profile",
SetModelShow = "_set_model_show"
} }

View File

@@ -67,7 +67,7 @@ export class GetCookies extends BaseAction<Payload, Response> {
const cookiesObject = await NTQQUserApi.getCookies(payload.domain); const cookiesObject = await NTQQUserApi.getCookies(payload.domain);
//把获取到的cookiesObject转换成 k=v; 格式字符串拼接在一起 //把获取到的cookiesObject转换成 k=v; 格式字符串拼接在一起
const cookies = Object.entries(cookiesObject).map(([key, value]) => `${key}=${value}`).join('; '); const cookies = Object.entries(cookiesObject).map(([key, value]) => `${key}=${value}`).join('; ');
const bkn = NTQQWebApi.getBknFromCookie(cookiesObject); const bkn = cookiesObject?.skey ? NTQQWebApi.getBknFromCookie(cookiesObject) : '';
return { cookies, bkn }; return { cookies, bkn };
} }
} }

View File

@@ -52,7 +52,7 @@ export class OB11Constructor {
messagePostFormat: string = obcore.configLoader.configData.messagePostFormat messagePostFormat: string = obcore.configLoader.configData.messagePostFormat
): Promise<OB11Message | undefined> { ): Promise<OB11Message | undefined> {
if (msg.senderUin == "0" || msg.senderUin == "") return; if (msg.senderUin == "0" || msg.senderUin == "") return;
if (msg.peerUin == "0" || msg.peerUin) return; if (msg.peerUin == "0" || msg.peerUin == "") return;
//跳过空消息 //跳过空消息
const NTQQGroupApi = core.apis.GroupApi; const NTQQGroupApi = core.apis.GroupApi;
const NTQQUserApi = core.apis.UserApi; const NTQQUserApi = core.apis.UserApi;
@@ -286,13 +286,13 @@ export class OB11Constructor {
chatType: msg.chatType, chatType: msg.chatType,
guildId: '', guildId: '',
}, },
msg.msgId, msg.msgId,
msg.msgSeq, msg.msgSeq,
msg.senderUid, msg.senderUid,
element.elementId, element.elementId,
element.elementType.toString(), element.elementType.toString(),
element.pttElement.fileSize || '0', element.pttElement.fileSize || '0',
element.pttElement.fileUuid || '', element.pttElement.fileUuid || '',
); );
//以uuid作为文件名 //以uuid作为文件名
} else if (element.arkElement) { } else if (element.arkElement) {
@@ -417,7 +417,7 @@ export class OB11Constructor {
return; return;
} }
//log("group msg", msg); //log("group msg", msg);
// Mlikiowa V2.0.15 Refactor Todo // Mlikiowa V2.0.19 Refactor Todo
// if (msg.senderUin && msg.senderUin !== '0') { // if (msg.senderUin && msg.senderUin !== '0') {
// const member = await getGroupMember(msg.peerUid, msg.senderUin); // const member = await getGroupMember(msg.peerUid, msg.senderUin);
// if (member && member.cardName !== msg.sendMemberName) { // if (member && member.cardName !== msg.sendMemberName) {

View File

@@ -70,6 +70,7 @@ export class OB11ActiveWebSocketAdapter implements IOB11NetworkAdapter {
let isClosedByError = false; let isClosedByError = false;
this.connection = new WebSocket(this.url, { this.connection = new WebSocket(this.url, {
maxPayload: 1024 * 1024 * 1024,
headers: { headers: {
'X-Self-ID': this.coreContext.selfInfo.uin, 'X-Self-ID': this.coreContext.selfInfo.uin,
'Authorization': `Bearer ${this.token}`, 'Authorization': `Bearer ${this.token}`,
@@ -79,9 +80,9 @@ export class OB11ActiveWebSocketAdapter implements IOB11NetworkAdapter {
}); });
this.connection.on('open', () => { this.connection.on('open', () => {
try{ try {
this.connectEvent(this.coreContext); this.connectEvent(this.coreContext);
}catch(e){ } catch (e) {
this.logger.logError('[OneBot] [WebSocket Client] 发送连接生命周期失败', e); this.logger.logError('[OneBot] [WebSocket Client] 发送连接生命周期失败', e);
} }

View File

@@ -36,8 +36,8 @@ export class OB11PassiveWebSocketAdapter implements IOB11NetworkAdapter {
this.logger = coreContext.context.logger; this.logger = coreContext.context.logger;
this.heartbeatInterval = heartbeatInterval; this.heartbeatInterval = heartbeatInterval;
this.wsServer = new WebSocketServer({ port: port, host: ip }); this.wsServer = new WebSocketServer({ port: port, host: ip, maxPayload: 1024 * 1024 * 1024, });
let core = coreContext; const core = coreContext;
this.wsServer.on('connection', async (wsClient, wsReq) => { this.wsServer.on('connection', async (wsClient, wsReq) => {
if (!this.isOpen) { if (!this.isOpen) {
wsClient.close(); wsClient.close();

View File

@@ -183,6 +183,7 @@ export async function NCoreInitShell() {
}, 1000); }, 1000);
} else { } else {
logger.logError('快速登录失败,未找到该 QQ 历史登录记录,将使用二维码登录方式'); logger.logError('快速登录失败,未找到该 QQ 历史登录记录,将使用二维码登录方式');
loginService.getQRCodePicture();
} }
} else { } else {
logger.log('没有 -q 指令指定快速登录,将使用二维码登录方式'); logger.log('没有 -q 指令指定快速登录,将使用二维码登录方式');

View File

@@ -19,7 +19,7 @@ export let webUiPathWrapper: NapCatPathWrapper;
export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapper) { export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapper) {
webUiPathWrapper = pathWrapper; webUiPathWrapper = pathWrapper;
WebUiConfig = new WebUiConfigWrapper(); WebUiConfig = new WebUiConfigWrapper();
let log = logger.log.bind(logger); const log = logger.log.bind(logger);
const config = await WebUiConfig.GetWebUIConfig(); const config = await WebUiConfig.GetWebUIConfig();
if (config.port == 0) { if (config.port == 0) {
log('[NapCat] [WebUi] Current WebUi is not run.'); log('[NapCat] [WebUi] Current WebUi is not run.');

View File

@@ -30,7 +30,7 @@ async function onSettingWindowCreated(view: Element) {
SettingItem( SettingItem(
'<span id="napcat-update-title">Napcat</span>', '<span id="napcat-update-title">Napcat</span>',
undefined, undefined,
SettingButton('V2.0.15', 'napcat-update-button', 'secondary'), SettingButton('V2.0.19', 'napcat-update-button', 'secondary'),
), ),
]), ]),
SettingList([ SettingList([
@@ -180,12 +180,12 @@ async function onSettingWindowCreated(view: Element) {
'Telegram 群', 'Telegram 群',
'https://t.me/+nLZEnpne-pQ1OWFl', 'https://t.me/+nLZEnpne-pQ1OWFl',
SettingButton('进去逛逛', 'open-telegram') SettingButton('进去逛逛', 'open-telegram')
), ),
SettingItem( SettingItem(
'QQ 群', 'QQ 群',
'518662028', '518662028',
SettingButton('我要进去', 'open-qq-group') SettingButton('我要进去', 'open-qq-group')
), ),
'</div>', '</div>',
].join(''), ].join(''),
'text/html', 'text/html',

View File

@@ -164,7 +164,7 @@ async function onSettingWindowCreated(view) {
SettingItem( SettingItem(
'<span id="napcat-update-title">Napcat</span>', '<span id="napcat-update-title">Napcat</span>',
void 0, void 0,
SettingButton("V2.0.15", "napcat-update-button", "secondary") SettingButton("V2.0.19", "napcat-update-button", "secondary")
) )
]), ]),
SettingList([ SettingList([