Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
e2f14cd
增加文案优先获取群头衔
YUYUYUYU2147 Jun 16, 2026
2fbcb1a
feat: 合并发癫功能到戳一戳;艾特触发文案并反戳;权重改为百分比
Password-saver Jun 19, 2026
331cee6
feat: 戳一戳文案长文本自动合并转发(匿名模式)
Password-saver Jun 19, 2026
ad55acd
feat: sendReply 优先获取群头衔
Password-saver Jun 19, 2026
54de081
fix: 移除 bym 静态 reg 过滤,使配置动态生效
Password-saver Jun 19, 2026
3890adc
feat: 添加预估插件命令到帮助菜单
Password-saver Jun 19, 2026
0afa9db
增加文案优先获取群头衔
YUYUYUYU2147 Jun 16, 2026
ac897b3
feat: 合并发癫功能到戳一戳;艾特触发文案并反戳;权重改为百分比
Password-saver Jun 19, 2026
1015ddd
feat: 戳一戳文案长文本自动合并转发(匿名模式)
Password-saver Jun 19, 2026
a8c1ef7
feat: sendReply 优先获取群头衔
Password-saver Jun 19, 2026
30d7de8
fix: 移除 bym 静态 reg 过滤,使配置动态生效
Password-saver Jun 19, 2026
4203cbe
feat: 添加预估插件命令到帮助菜单
Password-saver Jun 19, 2026
09fddfe
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jun 21, 2026
5137a9d
revert: 移除帮助菜单中预估插件命令入口
Password-saver Jun 21, 2026
9c9c330
Merge branch 'v2' of https://github.com/YUYUYUYU2147/chatgpt-plugin i…
Password-saver Jun 21, 2026
c8ef579
fix: 重新移除帮助菜单预估插件入口
Password-saver Jun 21, 2026
9b191b8
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jun 24, 2026
e13db94
feat: #gpt偷图 -> #偷图, 新增偷图白名单, 适配锅巴
Password-saver Jun 28, 2026
bf89d07
修复meme无井号触发被抢占
Password-saver Jul 5, 2026
4f0fbcd
修复meme关键词误匹配普通对话
Password-saver Jul 5, 2026
4efb3be
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jul 5, 2026
34141c3
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jul 11, 2026
5bc6ab4
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jul 13, 2026
c9a7401
修复:偷表情识别失败兜底保存
Password-saver Jul 14, 2026
b9b0635
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jul 17, 2026
e1a4adb
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jul 20, 2026
a4ad2df
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jul 21, 2026
f0eeaff
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jul 22, 2026
aa5d9b4
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jul 23, 2026
a7f0c01
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Jul 26, 2026
b7ca62a
Merge branch 'misaka20002:v2' into v2
YUYUYUYU2147 Aug 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions apps/bym.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ import { customSplitRegex, filterResponseChunk } from '../utils/text.js'
import core, { roleMap } from '../model/core.js'
import { formatDate } from '../utils/common.js'

/** 使机器人可以对其第一人称回应 */
const reg_chatgpt_for_firstperson_call = Config.enableBYM ? Config.assistantLabel : `Chatgpt-plugin-bot-name-${Math.floor(10000 + Math.random() * 90000)}`;

export class bym extends plugin {
constructor() {
super({
Expand All @@ -18,7 +15,6 @@ export class bym extends plugin {
priority: 5000,
rule: [
{
reg: reg_chatgpt_for_firstperson_call,
fnc: 'bym',
priority: '-1000000',
log: false
Expand Down
38 changes: 33 additions & 5 deletions apps/tts_voice_help.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,8 @@ export class voicechangehelp extends plugin {
permission: 'master'
},
{
reg: /^#(chat)?gpt偷(图|表情包?)$/i,
reg: /^#(图|表情包?)$/i,
fnc: 'save_EmojiImg',
permission: 'master'
},
{
reg: /^#(chat)?gptsf语音模型(创建|删除|列表|上传|新增)$/i,
Expand Down Expand Up @@ -478,8 +477,34 @@ export class voicechangehelp extends plugin {
}
}

/** /^#(chat)?gpt偷(图|表情包?)$/i */
async checkStealImgWhitelist(e) {
let whitelist = Config.stealImgWhitelist || [];
if (typeof whitelist === 'string') {
whitelist = whitelist.length > 0 ? whitelist.split(',').map(item => item.trim()) : [];
}
if (whitelist.length === 0) return true;
if (e.isMaster) return true;

const userId = e.sender?.user_id?.toString() || '';
const groupId = e.isGroup && e.group_id ? e.group_id.toString() : '';
for (const item of whitelist) {
if (!item) continue;
if (item.startsWith('^')) {
if (item.slice(1) === userId) return true;
} else if (item.includes('^')) {
const [g, q] = item.split('^');
if (e.isGroup && g === groupId && q === userId) return true;
} else if (e.isGroup && item === groupId) {
return true;
}
}
e.reply('你没有使用该指令的权限', true);
return false;
}

/** /^#偷(图|表情包?)$/i */
async save_EmojiImg(e) {
if (!await this.checkStealImgWhitelist(e)) return false;
await parseSourceImg(e);
if (!e.img || !e.img.length) {
e.reply(`请引用图片或将图片一起发送后重试`, true);
Expand Down Expand Up @@ -517,8 +542,11 @@ export class voicechangehelp extends plugin {
}

if (!emotions.includes(emotion)) {
e.reply('未能确定该表情包类别\nError: ' + aiText, true);
return true;
// Gemini 在部分地区会返回 FAILED_PRECONDITION / User location is not supported。
// 偷表情不应该因此失败:识别失败时兜底保存到 cute 分类。
logger.warn(`[偷表情] 表情类别识别失败,已使用默认分类 cute:${aiText || '无返回'}`);
emotion = 'cute';
analysis = '识别失败,默认分类';
}

const directory = path.join(process.cwd(), 'data', 'chatgpt', 'sendEmojiTool', emotion);
Expand Down
19 changes: 11 additions & 8 deletions apps/派蒙meme.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ const baseUrl = Config.meme_baseUrl
* @type {boolean}
*/
const reply = Config.meme_reply
/**
* 是否强制使用#触发命令
*/
const forceSharp = Config.meme_forceSharp
/**
* 主人保护,撅主人时会被反撅 (暂时只支持QQ)
* @type {boolean}
Expand All @@ -50,6 +46,10 @@ let protectList = ['lash', 'do', 'beat_up', 'little_do', 'fast_do', 'qi', 'fast_
*/
const MEME_USAGE_REDIS_PREFIX = 'Yz:paimon_meme_usage:'

function escapeRegExp(str = '') {
return String(str).replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
}

export class memes extends plugin {
constructor() {
let option = {
Expand All @@ -60,7 +60,7 @@ export class memes extends plugin {
/** https://oicqjs.github.io/oicq/#events */
event: 'message',
/** 优先级,数字越小等级越高 */
priority: 5000,
priority: 1000,
rule: [
{
/** 命令正则匹配 */
Expand Down Expand Up @@ -98,7 +98,7 @@ export class memes extends plugin {

}
Object.keys(keyMap).forEach(key => {
let reg = forceSharp ? `^#${key}` : `^#?${key}`
let reg = `^\\s*#?${escapeRegExp(key)}`
option.rule.push({
/** 命令正则匹配 */
reg,
Expand Down Expand Up @@ -179,7 +179,7 @@ export class memes extends plugin {
}
let rules = []
Object.keys(keyMap).forEach(key => {
let reg = forceSharp ? `^#${key}` : `^#?${key}`
let reg = `^\\s*#?${escapeRegExp(key)}`
rules.push({
/** 命令正则匹配 */
reg,
Expand Down Expand Up @@ -366,6 +366,7 @@ export class memes extends plugin {
*/
async memes(e) {
if (Config.meme_turnOff) return false;
if (Config.meme_forceSharp && !String(e.msg || '').trimStart().startsWith('#')) return false;

// meme响应CD
let lastTime = await redis.get(`Yz:paimon_meme_cd:${e.group_id}:${e.sender.user_id || e.user_id}`);
Expand Down Expand Up @@ -396,7 +397,10 @@ export class memes extends plugin {
// 替换原有的硬编码匹配逻辑
let target = findLongestMatchingKey(msg, keyMap);

if (!target) return false
let targetCode = keyMap[target]
let info = infos[targetCode]
if (!info?.params_type) return false
// let target = e.msg.replace(/^#?meme(s)?/, '')
let text1 = _.trimStart(e.msg, '#').replace(target, '')
if (text1.trim() === '详情' || text1.trim() === '帮助') {
Expand All @@ -406,7 +410,6 @@ export class memes extends plugin {

let [text, args = ''] = text1.split('#')
let formData = new FormData()
let info = infos[targetCode]
let fileLoc

// 提取 @ 信息并获取用户详情缓存
Expand Down
Loading