mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
50579bb9e6 | ||
![]() |
50512ca63c | ||
![]() |
8b3577b216 | ||
![]() |
7553aab932 | ||
![]() |
5dacdcfe5e | ||
![]() |
8645a412b7 | ||
![]() |
acad07a588 | ||
![]() |
51bbb480bb | ||
![]() |
f0306cd10a | ||
![]() |
25253ad9e7 | ||
![]() |
51f2fb8e8b | ||
![]() |
9e8d650cbd | ||
![]() |
d222ccfa58 | ||
![]() |
9a05aaa906 | ||
![]() |
00fdce8876 | ||
![]() |
29b51adf7d | ||
![]() |
8e14b39969 |
@@ -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": [
|
||||||
{
|
{
|
||||||
|
@@ -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",
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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[]) {
|
||||||
|
@@ -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(
|
||||||
|
@@ -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>
|
||||||
|
@@ -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');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
10
src/onebot/action/go-cqhttp/SetModelShow.ts
Normal file
10
src/onebot/action/go-cqhttp/SetModelShow.ts
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
@@ -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,
|
||||||
|
@@ -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('获取失败');
|
||||||
}
|
}
|
||||||
|
@@ -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());
|
||||||
}
|
}
|
||||||
|
@@ -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());
|
||||||
|
10
src/onebot/action/guild/GetGuildProfile.ts
Normal file
10
src/onebot/action/guild/GetGuildProfile.ts
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
@@ -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) {
|
||||||
|
@@ -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 ('消息不存在');
|
||||||
}
|
}
|
||||||
|
@@ -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') {
|
||||||
|
@@ -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"
|
||||||
}
|
}
|
||||||
|
@@ -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 };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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,12 +80,12 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
this.connection.on('message', (data) => {
|
this.connection.on('message', (data) => {
|
||||||
this.handleMessage(data);
|
this.handleMessage(data);
|
||||||
|
@@ -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();
|
||||||
@@ -63,7 +63,7 @@ export class OB11PassiveWebSocketAdapter implements IOB11NetworkAdapter {
|
|||||||
});
|
});
|
||||||
}).on('error', (err) => this.logger.log('[OneBot] [WebSocket Server] Server Error:', err.message));
|
}).on('error', (err) => this.logger.log('[OneBot] [WebSocket Server] Server Error:', err.message));
|
||||||
}
|
}
|
||||||
|
|
||||||
connectEvent(core: NapCatCore, wsClient: WebSocket) {
|
connectEvent(core: NapCatCore, wsClient: WebSocket) {
|
||||||
try {
|
try {
|
||||||
this.checkStateAndReply<any>(new OB11LifeCycleEvent(core, LifeCycleSubType.CONNECT), wsClient);
|
this.checkStateAndReply<any>(new OB11LifeCycleEvent(core, LifeCycleSubType.CONNECT), wsClient);
|
||||||
|
@@ -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 指令指定快速登录,将使用二维码登录方式');
|
||||||
|
@@ -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.');
|
||||||
|
@@ -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',
|
||||||
|
@@ -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([
|
||||||
|
Reference in New Issue
Block a user