cyberbot-core
Version:
cyberbot, 基于napcat-ts, nodejs,轻量qq机器人框架。
386 lines • 14 kB
TypeScript
import { NCWebsocket, Structs, type AllHandlers, type Send } from "node-napcat-ts";
import axios from "axios";
import { Logger } from "./logger.js";
export { Structs, Send, NCWebsocket, AllHandlers, CyberPluginContext, axios as http };
export declare function getConfig(): Config;
export interface Config {
baseUrl: string;
accessToken: string;
throwPromise: boolean;
reconnection: {
enable: boolean;
attempts: number;
delay: number;
debug: boolean;
};
bot: number;
master: Array<number>;
admins: Array<number>;
plugins: {
system: Array<string>;
user: Array<string>;
};
logger: {
level: string;
maxSize: string;
maxDays: number;
};
}
export declare const log: Logger;
export declare class Bot {
private bot;
private config;
private pluginManager;
private plugins;
constructor();
start(): Promise<void>;
/**
* 向所有主人发送机器人上线通知
*/
private sendOnlineNotificationToMasters;
stop(): Promise<void>;
}
export declare function definePlugin(plugin: CyberPlugin): CyberPlugin;
interface PluginInfo {
version: string;
description: string;
type: 'system' | 'user';
setup: {
enable: boolean;
listeners: Array<listener>;
cron: Array<any>;
};
}
interface listener {
event: keyof AllHandlers;
fn: any;
}
interface pluginUtil {
getPlugins: () => Map<string, PluginInfo>;
onPlugin: (pluginName: string) => string;
offPlugin: (pluginName: string) => string;
reloadPlugin: (pluginName: string) => Promise<string>;
getPluginsFromDir: () => string[];
loadPlugin: (pluginName: string) => Promise<string>;
}
export type ExtendedEvent = {
reply: (content: string | number | any[] | any, quote?: boolean) => Promise<{
message_id: number;
}>;
kick: (user_id: number, reject_add_request?: boolean) => Promise<void>;
};
export interface BaseMessageEvent {
raw_message: string;
message_id: number;
user_id: number;
message_type: 'private' | 'group';
sender: {
user_id: number;
};
}
export interface GroupMessageEvent extends BaseMessageEvent {
message_type: 'group';
group_id: number;
}
export interface PrivateMessageEvent extends BaseMessageEvent {
message_type: 'private';
}
export type MessageEvent = GroupMessageEvent | PrivateMessageEvent;
export type CyberMessageEvent = AllHandlers['message'] & ExtendedEvent;
interface CyberPluginContext {
config: Config;
/** axios 实例 */
http: typeof axios;
bot: NCWebsocket;
bot_uin: number;
plugin: pluginUtil;
/** cron 定时任务
* @param cronTasks - 定时任务配置
* 支持两种格式:
* 1. 单个任务: cron("* * * * * *", () => {})
* 2. 多个任务数组: cron([
* ['* * * * * *', async (ctx, e) => { e.reply("task1") }],
* ['0 * * * * *', async (ctx, e) => { e.reply("task2") }]
* ])
*/
cron: (cronTasks: string | Array<[string, (ctx: CyberPluginContext, e: MessageEvent & ExtendedEvent) => any]>, func?: () => any) => any;
/** 注册事件处理器 */
handle: <EventName extends keyof AllHandlers>(eventName: EventName, handler: EventName extends "message" | "message.group" | "message.private" ? (e: CyberMessageEvent) => any : (e: AllHandlers[EventName] & ExtendedEvent) => any) => any;
/** 是否为主人 */
isMaster: (id: number | {
sender: {
user_id: number;
};
}) => boolean;
/** 是否为管理员 */
isAdmin: (id: number | {
sender: {
user_id: number;
};
}) => boolean;
/**
* 检查用户是否有权限。
*
* @param user_id - 用户的ID。
* @returns 如果用户是管理员或主人,则返回 `true`,否则返回 `false`。
*/
hasRight: (user_id: number) => boolean;
/**
* 发送私聊消息。
*
* @param user_id - 目标ID。
* @param message - 要发送的消息内容,可以是字符串、数字或消息段数组。
* @returns - 返回发送消息的结果,包含消息ID。
* @throws - 如果发送消息失败,抛出错误。
*/
sendPrivateMessage: (user_id: number, message: string | number | Array<any>) => Promise<{
message_id: number;
}>;
/**
* 发送消息到指定的群组。
*
* @param group_id - 目标群组的ID。
* @param message - 要发送的消息内容,可以是字符串、数字或消息段数组。
* @returns - 返回发送消息的结果,包含消息ID。
* @throws - 如果发送消息失败,抛出错误。
*/
sendGroupMessage: (group_id: number, message: string | number | Array<any>) => Promise<{
message_id: number;
}>;
/**
* 撤回指定的消息。
*
* @param message_id - 要撤回的消息的ID。
* @throws - 如果撤回消息失败,抛出错误。
*/
delete_msg: (message_id: number) => Promise<void>;
/**
* 将指定用户从群组中踢出。
*
* @param group_id - 群ID。
* @param user_id - 要踢出的用户的ID。
* @param reject_add_request - 是否拒绝该用户的加群请求。默认值为 `false`。
* @throws - 如果踢出用户失败,抛出错误。
*/
kick: (group_id: number, user_id: number, reject_add_request?: boolean) => Promise<void>;
/**
* 将指定用户在群组中禁言。
*
* @param group_id - 群ID。
* @param user_id - 要禁言的用户的ID。
* @param duration - 禁言时长,单位为秒。默认值为 `30` 秒。
* @throws - 如果禁言用户失败,抛出错误。
*/
ban: (group_id: number, user_id: number, duration?: number) => Promise<void>;
/**
* 设置群组全员禁言状态。
*
* @param group_id - 群ID。
* @param enable - 是否开启全员禁言。默认值为 `false`,即关闭全员禁言。
* @throws - 如果设置全员禁言状态失败,抛出错误。
*/
banAll: (group_id: number, enable: boolean) => Promise<void>;
/**
* 设置群组名称。
*
* @param group_id - 群ID。
* @param name - 要设置的群组名称。
* @throws - 如果设置群组名称失败,抛出错误。
*/
setGroupName: (group_id: number, name: string) => Promise<void>;
/**
* 设置群组管理员。
*
* @param group_id - 群ID。
* @param user_id - 要设置或取消管理员权限的用户的ID。
* @param enable - 是否设置为管理员。默认值为 `true`,即设置为管理员。
* @throws - 如果设置管理员权限失败,抛出错误。
*/
setAdmin: (group_id: number, user_id: number, enable: boolean) => Promise<void>;
/**
* 设置群组成员的特殊头衔。
*
* @param group_id - 群ID。
* @param user_id - 要设置特殊头衔的用户的ID。
* @param title - 要设置的特殊头衔。
* @throws - 如果设置特殊头衔失败,抛出错误。
*/
setTitle: (group_id: number, user_id: number, title: string) => Promise<void>;
/**
* 处理群组加入请求,自动同意请求。
* @param flag - 从上报消息获取
* @throws - 如果处理请求失败,抛出错误。
*/
aprroveGroup: (flag: string) => Promise<void>;
/**
* 处理群组加入请求,自动拒绝请求。
*
* @param flag - 从上报消息获取
* @throws - 如果处理请求失败,抛出错误。
*/
rejectGroup: (flag: string) => Promise<void>;
/**
* 检查用户是否是群组管理员或群主。
*
* @param group_id - 群ID。
* @param user_id - 用户的ID。
* @returns 如果用户是群组管理员或群主,则返回 `true`,否则返回 `false`。
* @throws - 如果获取群组成员信息失败,抛出错误。
*/
isGroupAdmin: (group_id: number, user_id: number) => Promise<boolean>;
/**
* 检查用户是否是群组群主。
*
* @param group_id - 群ID。
* @param user_id - 用户的ID。
* @returns 如果用户是群组群主,则返回 `true`,否则返回 `false`。
* @throws - 如果获取群组成员信息失败,抛出错误。
*/
isGroupOwner: (group_id: number, user_id: number) => Promise<boolean>;
/**
* MD5 加密
* @param {string} text 待 MD5 加密数据
* @return {string} MD5 加密后的 hex 字符串
*/
md5: (text: string) => string;
/**
* 生成随机整数
* @param {number} min 最小值
* @param {number} max 最大值
* @return {number} 随机范围内的整数
*/
randomInt: (min: number, max: number) => number;
/**
* 取数组内随机一项
* @param {Array<T>} array 待操作数组
* @return {T} 数组内的随机一项
*/
randomItem: <T>(array: T[]) => T;
/**
* 获取群组头像链接
* @param group_id 群组ID
* @param size 头像大小,可选值为40、64、100、200
* @return 群组头像链接
*/
getGroupAvatarLink: (group_id: number, size?: number) => string;
/**
* 获取QQ头像链接
* @param user_id QQ号
* @param size 头像大小,可选值为40、64、100、200
* @return QQ头像链接
*/
getQQAvatarLink: (user_id: number, size?: number) => string;
/**
* 获取图片链接
* @param e 原始消息
* @return 图片链接
*/
getImageLink: (e: CyberMessageEvent) => string;
/**
* 替换 URL 中的 rkey 参数, 获取直链
* @param url - 原始 URL
* @returns 替换 rkey 后的新 URL
*/
getDirectLink: (url: string) => Promise<string>;
/**
* 从消息内容中提取回复消息的ID。
* 该方法使用正则表达式从传入的 `raw_message` 中提取 `[CQ:reply,id=...]` 格式的回复消息ID。
* 如果找到回复消息ID,则返回该ID;否则,返回空字符串。
*
* @param e - 包含回复消息信息的原始消息。
* @returns 提取的回复消息ID字符串,如果未找到则返回空字符串。
* @throws 如果在提取过程中发生错误,记录错误日志并返回空字符串。
*/
getReplyMessageId: (e: CyberMessageEvent) => string;
/**
* 从消息内容中提取 @ 消息的 ID。
* 该方法使用正则表达式从传入的 `raw_message` 中提取 `[CQ:at,qq=...]` 格式的 @ 消息ID。
* 如果找到 @ 消息ID,则返回该ID;否则,返回空字符串。
*
* @param e - 原始消息字符串。
* @returns 提取的 @ 消息ID字符串,如果未找到则返回空字符串。
* @throws 如果在提取过程中发生错误,记录错误日志并返回空字符串。
*/
getMessageAt: (e: CyberMessageEvent) => number[];
/**
* 从消息内容中提取纯文本内容。
* 该方法使用正则表达式从传入的 `raw_message` 中移除所有的 CQ 码,并返回剩余的纯文本内容。
*
* @param e - 原始消息对象。
* @returns 提取的纯文本内容字符串。
* @throws 如果在提取过程中发生错误,记录错误日志并抛出错误。
*/
getText: (e: CyberMessageEvent) => string;
/**
* 从消息内容中提取被回复的消息内容。
* 该方法使用正则表达式从传入的 `raw_message` 中提取被回复的消息内容。
*
* @param e - 包含被回复消息信息的原始消息。
* @returns 提取的被回复消息内容字符串。
* @throws 如果在提取过程中发生错误,记录错误日志并抛出错误。
*/
getQuotedText: (e: CyberMessageEvent) => Promise<string>;
/**
* 发送伪造消息。
*
* @param target_id - 目标用户的ID(如果是私聊)或群组的ID(如果是群聊)。
* @param message - 要发送的消息内容,格式为 `Send['node'][]`。
* @param isGroup - 是否发送到群组。默认值为 `true`。
* @returns - 返回发送消息的结果,包含消息ID和资源ID。
* @throws - 如果发送消息失败,抛出错误。
*/
fakeMessage: (target_id: number, message: Send['node'][], isGroup: boolean) => Promise<{
message_id: number;
res_id: string;
}>;
/** 工具函数 */
utils: {
/** 为事件对象添加reply方法 */
addReplyMethod: <T extends any>(e: T) => T & ExtendedEvent;
};
}
interface CyberPlugin {
/** 插件 ID */
name: string;
/** 插件版本 */
version?: string;
/** 插件描述 */
description?: string;
/** 插件初始化,可返回一个函数用于清理 */
setup?: (ctx: CyberPluginContext) => any;
}
export declare class PluginManager {
plugins: Map<string, PluginInfo>;
bot: NCWebsocket;
private pluginCtxProxies;
private sharedMethodWrappers;
private pluginErrorHandlers;
ctx: CyberPluginContext;
private tempListener;
private tempCronJob;
private jiti;
private cronTaskPool;
constructor(bot: NCWebsocket, config: Config);
private createPluginContextProxy;
init(): Promise<Map<string, PluginInfo>>;
getPluginsFromDir(): string[];
loadPlugin(pluginName: string): Promise<any>;
getPlugins(): Map<string, PluginInfo>;
/**
* 保存配置到文件
* @param pluginName 插件名称
* @param isEnabled 是否启用
* @private
*/
private saveConfig;
offPlugin(pluginName: string): string;
onPlugin(pluginName: string): string;
reloadPlugin(pluginName: string): Promise<any>;
private cleanPluginModuleCache;
/**
* 释放插件相关的所有资源
* @param pluginName 插件名称
*/
private releasePluginResources;
}
//# sourceMappingURL=index.d.ts.map