mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-17 05:47:11 +00:00
fix: 闭嘴功能
This commit is contained in:
parent
ce6559b644
commit
156a669ec6
5 changed files with 208 additions and 3 deletions
|
|
@ -412,6 +412,11 @@ export class chatgpt extends plugin {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let groupId = e.isGroup ? e.group.group_id : ''
|
||||||
|
if (await redis.get('CHATGPT:SHUT_UP:ALL') || await redis.get(`CHATGPT:SHUT_UP:${groupId}`)) {
|
||||||
|
logger.info('chatgpt闭嘴中,不予理会')
|
||||||
|
return false
|
||||||
|
}
|
||||||
let userSetting = await redis.get(`CHATGPT:USER:${e.sender.user_id}`)
|
let userSetting = await redis.get(`CHATGPT:USER:${e.sender.user_id}`)
|
||||||
if (userSetting) {
|
if (userSetting) {
|
||||||
userSetting = JSON.parse(userSetting)
|
userSetting = JSON.parse(userSetting)
|
||||||
|
|
|
||||||
15
apps/help.js
15
apps/help.js
|
|
@ -61,6 +61,21 @@ let helpData = [
|
||||||
title: '#chatgpt对话列表',
|
title: '#chatgpt对话列表',
|
||||||
desc: '查询当前哪些人正在与机器人聊天.目前API3模式下支持切换对话'
|
desc: '查询当前哪些人正在与机器人聊天.目前API3模式下支持切换对话'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
icon: 'destroy',
|
||||||
|
title: '#chatgpt(本群)?(群xxx)?闭嘴(x秒/分钟/小时)',
|
||||||
|
desc: '让机器人在本群/某群闭嘴。不指定群时认为全局闭嘴。'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: 'chat',
|
||||||
|
title: '#chatgpt(本群)?(群xxx)?(张嘴|开口|说话|上班)',
|
||||||
|
desc: '让机器人在本群/某群重新可以说话。不指定群时认为全局开口。'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: 'chat',
|
||||||
|
title: '#chatgpt查看闭嘴',
|
||||||
|
desc: '查看当前闭嘴情况。'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
icon: 'switch',
|
icon: 'switch',
|
||||||
title: '#chatgpt切换对话+对话id',
|
title: '#chatgpt切换对话+对话id',
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import plugin from '../../../lib/plugins/plugin.js'
|
||||||
import { Config } from '../utils/config.js'
|
import { Config } from '../utils/config.js'
|
||||||
import { BingAIClient } from '@waylaidwanderer/chatgpt-api'
|
import { BingAIClient } from '@waylaidwanderer/chatgpt-api'
|
||||||
import { exec } from 'child_process'
|
import { exec } from 'child_process'
|
||||||
import { checkPnpm } from '../utils/common.js'
|
import { checkPnpm, formatDuration, parseDuration } from '../utils/common.js'
|
||||||
|
|
||||||
export class ChatgptManagement extends plugin {
|
export class ChatgptManagement extends plugin {
|
||||||
constructor (e) {
|
constructor (e) {
|
||||||
|
|
@ -64,6 +64,21 @@ export class ChatgptManagement extends plugin {
|
||||||
{
|
{
|
||||||
reg: '^#chatgpt(强制)?更新$',
|
reg: '^#chatgpt(强制)?更新$',
|
||||||
fnc: 'updateChatGPTPlugin'
|
fnc: 'updateChatGPTPlugin'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
reg: '^#chatgpt(本群)?(群\\d+)?闭嘴',
|
||||||
|
fnc: 'shutUp',
|
||||||
|
permission: 'master'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
reg: '^#chatgpt(本群)?(群\\d+)?(张嘴|开口|说话|上班)',
|
||||||
|
fnc: 'openMouth',
|
||||||
|
permission: 'master'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
reg: '^#chatgpt查看闭嘴',
|
||||||
|
fnc: 'listShutUp',
|
||||||
|
permission: 'master'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|
@ -280,4 +295,119 @@ export class ChatgptManagement extends plugin {
|
||||||
`
|
`
|
||||||
await this.reply(message)
|
await this.reply(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async shutUp (e) {
|
||||||
|
let duration = e.msg.replace(/^#chatgpt(本群)?(群\d+)?闭嘴/, '')
|
||||||
|
let scope
|
||||||
|
let time = 3600000
|
||||||
|
if (duration === '永久') {
|
||||||
|
time = 0
|
||||||
|
} else if (duration) {
|
||||||
|
time = parseDuration(duration)
|
||||||
|
}
|
||||||
|
const match = e.msg.match(/#chatgpt群(\d+)闭嘴(.*)/)
|
||||||
|
if (e.msg.indexOf('本群') > -1) {
|
||||||
|
if (e.isGroup) {
|
||||||
|
scope = e.group.group_id
|
||||||
|
if (await redis.get(`CHATGPT:SHUT_UP:${scope}`)) {
|
||||||
|
await redis.del(`CHATGPT:SHUT_UP:${scope}`)
|
||||||
|
await redis.set(`CHATGPT:SHUT_UP:${scope}`, '1', { EX: time })
|
||||||
|
await e.reply(`好的,从现在开始我会在当前群聊闭嘴${formatDuration(time)}`)
|
||||||
|
} else {
|
||||||
|
await redis.set(`CHATGPT:SHUT_UP:${scope}`, '1', { EX: time })
|
||||||
|
await e.reply(`好的,从现在开始我会在当前群聊闭嘴${formatDuration(time)}`)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await e.reply('本群是指?你也没在群聊里让我闭嘴啊?')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else if (match) {
|
||||||
|
const groupId = parseInt(match[1], 10)
|
||||||
|
if (Bot.getGroupList().get(groupId)) {
|
||||||
|
if (await redis.get(`CHATGPT:SHUT_UP:${groupId}`)) {
|
||||||
|
await redis.del(`CHATGPT:SHUT_UP:${groupId}`)
|
||||||
|
await redis.set(`CHATGPT:SHUT_UP:${groupId}`, '1', { EX: time })
|
||||||
|
await e.reply(`好的,从现在开始我会在群聊${groupId}闭嘴${formatDuration(time)}`)
|
||||||
|
} else {
|
||||||
|
await redis.set(`CHATGPT:SHUT_UP:${groupId}`, '1', { EX: time })
|
||||||
|
await e.reply(`好的,从现在开始我会在群聊${groupId}闭嘴${formatDuration(time)}`)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await e.reply('这是什么群?')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (await redis.get('CHATGPT:SHUT_UP:ALL')) {
|
||||||
|
await redis.del('CHATGPT:SHUT_UP:ALL')
|
||||||
|
await redis.set('CHATGPT:SHUT_UP:ALL', '1', { EX: time })
|
||||||
|
await e.reply(`好的,我会再闭嘴${formatDuration(time)}`)
|
||||||
|
} else {
|
||||||
|
await redis.set('CHATGPT:SHUT_UP:ALL', '1', { EX: time })
|
||||||
|
await e.reply(`好的,我会闭嘴${formatDuration(time)}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async openMouth (e) {
|
||||||
|
const match = e.msg.match(/^#chatgpt群(\d+)/)
|
||||||
|
if (e.msg.indexOf('本群') > -1) {
|
||||||
|
if (await redis.get('CHATGPT:SHUT_UP:ALL')) {
|
||||||
|
await e.reply('主人,我现在全局闭嘴呢,你让我在这个群张嘴咱也不敢张啊')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (e.isGroup) {
|
||||||
|
let scope = e.group.group_id
|
||||||
|
if (await redis.get(`CHATGPT:SHUT_UP:${scope}`)) {
|
||||||
|
await redis.del(`CHATGPT:SHUT_UP:${scope}`)
|
||||||
|
await e.reply('好的主人,我终于又可以在本群说话了')
|
||||||
|
} else {
|
||||||
|
await e.reply('啊?我也没闭嘴啊?')
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await e.reply('本群是指?你也没在群聊里让我张嘴啊?')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else if (match) {
|
||||||
|
if (await redis.get('CHATGPT:SHUT_UP:ALL')) {
|
||||||
|
await e.reply('主人,我现在全局闭嘴呢,你让我在那个群张嘴咱也不敢张啊')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
const groupId = parseInt(match[1], 10)
|
||||||
|
if (Bot.getGroupList().get(groupId)) {
|
||||||
|
if (await redis.get(`CHATGPT:SHUT_UP:${groupId}`)) {
|
||||||
|
await redis.del(`CHATGPT:SHUT_UP:${groupId}`)
|
||||||
|
await e.reply(`好的主人,我终于又可以在群${groupId}说话了`)
|
||||||
|
} else {
|
||||||
|
await e.reply(`啊?我也没在群${groupId}闭嘴啊?`)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await e.reply('这是什么群?')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (await redis.get('CHATGPT:SHUT_UP:ALL')) {
|
||||||
|
await redis.del('CHATGPT:SHUT_UP:ALL')
|
||||||
|
await e.reply('好的,我会结束全局闭嘴')
|
||||||
|
} else {
|
||||||
|
await e.reply('啊?我也没全局闭嘴啊?')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async listShutUp () {
|
||||||
|
let keys = await redis.keys('CHATGPT:SHUT_UP:*')
|
||||||
|
if (!keys || keys.length === 0) {
|
||||||
|
await this.reply('我没有在任何群闭嘴', true)
|
||||||
|
} else {
|
||||||
|
let list = []
|
||||||
|
for (let i = 0; i < keys.length; i++) {
|
||||||
|
let key = keys[i]
|
||||||
|
let groupId = key.replace('CHATGPT:SHUT_UP:', '')
|
||||||
|
let ttl = await redis.ttl(key)
|
||||||
|
let ttlFormat = formatDuration(ttl)
|
||||||
|
list.push({ groupId, ttlFormat })
|
||||||
|
}
|
||||||
|
await this.reply(list.map(item => item.groupId !== 'ALL' ? `群聊${item.groupId}: ${item.ttlFormat}` : `全局: ${item.ttlFormat}`).join('\n'))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import lodash from 'lodash'
|
||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
import puppeteer from '../../../lib/puppeteer/puppeteer.js'
|
import puppeteer from '../../../lib/puppeteer/puppeteer.js'
|
||||||
import {Config} from "./config.js";
|
import { Config } from './config.js'
|
||||||
// export function markdownToText (markdown) {
|
// export function markdownToText (markdown) {
|
||||||
// return remark()
|
// return remark()
|
||||||
// .use(stripMarkdown)
|
// .use(stripMarkdown)
|
||||||
|
|
@ -296,3 +296,58 @@ export function getDefaultUserSetting () {
|
||||||
ttsRole: Config.defaultTTSRole
|
ttsRole: Config.defaultTTSRole
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function parseDuration (duration) {
|
||||||
|
const timeMap = {
|
||||||
|
秒: 1000,
|
||||||
|
分: 60 * 1000,
|
||||||
|
小时: 60 * 60 * 1000
|
||||||
|
}
|
||||||
|
|
||||||
|
// 去掉多余的空格并将单位转化为小写字母
|
||||||
|
duration = duration.trim().toLowerCase()
|
||||||
|
|
||||||
|
// 去掉末尾的 "钟" 字符
|
||||||
|
if (duration.endsWith('钟')) {
|
||||||
|
duration = duration.slice(0, -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取数字和单位
|
||||||
|
const match = duration.match(/^(\d+)\s*([\u4e00-\u9fa5]+)$/)
|
||||||
|
|
||||||
|
if (!match) {
|
||||||
|
throw new Error('Invalid duration string: ' + duration)
|
||||||
|
}
|
||||||
|
|
||||||
|
const num = parseInt(match[1], 10)
|
||||||
|
const unit = match[2]
|
||||||
|
|
||||||
|
if (!(unit in timeMap)) {
|
||||||
|
throw new Error('Unknown time unit: ' + unit)
|
||||||
|
}
|
||||||
|
|
||||||
|
return num * timeMap[unit]
|
||||||
|
}
|
||||||
|
|
||||||
|
export function formatDuration (duration) {
|
||||||
|
const timeMap = {
|
||||||
|
小时: 60 * 60 * 1000,
|
||||||
|
分钟: 60 * 1000,
|
||||||
|
秒钟: 1000
|
||||||
|
}
|
||||||
|
|
||||||
|
const units = Object.keys(timeMap)
|
||||||
|
let result = ''
|
||||||
|
|
||||||
|
for (let i = 0; i < units.length; i++) {
|
||||||
|
const unit = units[i]
|
||||||
|
const value = Math.floor(duration / timeMap[unit])
|
||||||
|
|
||||||
|
if (value > 0) {
|
||||||
|
result += value + unit
|
||||||
|
duration -= value * timeMap[unit]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result || '0秒钟'
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ const defaultConfig = {
|
||||||
noiseScaleW: 0.668,
|
noiseScaleW: 0.668,
|
||||||
lengthScale: 1.2,
|
lengthScale: 1.2,
|
||||||
initiativeChatGroups: [],
|
initiativeChatGroups: [],
|
||||||
version: 'v2.0.19'
|
version: 'v2.0.20'
|
||||||
}
|
}
|
||||||
const _path = process.cwd()
|
const _path = process.cwd()
|
||||||
let config = {}
|
let config = {}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue