mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-16 21:37:11 +00:00
feat: 主动聊天功能
This commit is contained in:
parent
5cbd2cad15
commit
7a320bc772
4 changed files with 114 additions and 2 deletions
68
apps/entertainment.js
Normal file
68
apps/entertainment.js
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
import plugin from '../../../lib/plugins/plugin.js'
|
||||||
|
import { Config } from '../utils/config.js'
|
||||||
|
import { generateHello } from '../utils/randomMessage.js'
|
||||||
|
import { segment } from 'oicq'
|
||||||
|
import { generateAudio } from '../utils/tts.js'
|
||||||
|
|
||||||
|
export class Entertainment extends plugin {
|
||||||
|
constructor (e) {
|
||||||
|
super({
|
||||||
|
name: 'ChatGPT-Plugin娱乐小功能',
|
||||||
|
dsc: 'ChatGPT-Plugin娱乐小功能',
|
||||||
|
event: 'message',
|
||||||
|
priority: 500,
|
||||||
|
task: [
|
||||||
|
{
|
||||||
|
// 每半小时
|
||||||
|
cron: '*/30 * * * *',
|
||||||
|
name: 'ChatGPT主动随机说话',
|
||||||
|
fnc: 'sendRandomMessage'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
rule: [
|
||||||
|
{
|
||||||
|
reg: '^#(chatgpt|ChatGPT)打招呼',
|
||||||
|
fnc: 'sendMessage'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async sendMessage (e) {
|
||||||
|
let groupId = e.msg.replace(/^#(chatgpt|ChatGPT)打招呼/, '')
|
||||||
|
groupId = parseInt(groupId)
|
||||||
|
let message = await generateHello()
|
||||||
|
let sendable = message
|
||||||
|
logger.info(`打招呼给群聊${groupId}:` + message)
|
||||||
|
if (Config.defaultUseTTS) {
|
||||||
|
let audio = await generateAudio(message, '随机')
|
||||||
|
console.log(audio)
|
||||||
|
sendable = segment.record(audio)
|
||||||
|
}
|
||||||
|
if (!groupId) {
|
||||||
|
await e.reply(sendable)
|
||||||
|
} else {
|
||||||
|
await Bot.sendGroupMsg(groupId, sendable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async sendRandomMessage () {
|
||||||
|
let toSend = Config.initiativeChatGroups || []
|
||||||
|
for (let i = 0; i < toSend.length; i++) {
|
||||||
|
let groupId = parseInt(toSend[i])
|
||||||
|
if (Bot.gl[groupId]) {
|
||||||
|
if (Math.floor(Math.random() * 100) < 10) {
|
||||||
|
let message = await generateHello()
|
||||||
|
if (Config.defaultUseTTS) {
|
||||||
|
let audio = await generateAudio(message, '随机')
|
||||||
|
await Bot.sendGroupMsg(groupId, segment.record(audio))
|
||||||
|
} else {
|
||||||
|
await Bot.sendGroupMsg(groupId, message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.warn('机器人不在要发送的群组里,忽略群' + groupId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -351,6 +351,12 @@ export function supportGuoba () {
|
||||||
min: 0,
|
min: 0,
|
||||||
max: 2
|
max: 2
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'initiativeChatGroups',
|
||||||
|
label: '主动发起聊天群聊',
|
||||||
|
bottomHelpMessage: '在这些群聊里会不定时主动说一些随机的打招呼的话,用英文逗号隔开',
|
||||||
|
component: 'Input'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
// 获取配置数据方法(用于前端填充显示数据)
|
// 获取配置数据方法(用于前端填充显示数据)
|
||||||
|
|
@ -361,7 +367,7 @@ export function supportGuoba () {
|
||||||
setConfigData (data, { Result }) {
|
setConfigData (data, { Result }) {
|
||||||
for (let [keyPath, value] of Object.entries(data)) {
|
for (let [keyPath, value] of Object.entries(data)) {
|
||||||
// 处理黑名单
|
// 处理黑名单
|
||||||
if (keyPath === 'blockWords' || keyPath === 'promptBlockWords') { value = value.toString().split(/[,,;;\|]/) }
|
if (keyPath === 'blockWords' || keyPath === 'promptBlockWords' || keyPath === 'initiativeChatGroups') { value = value.toString().split(/[,,;;\|]/) }
|
||||||
if (Config[keyPath] != value) { Config[keyPath] = value }
|
if (Config[keyPath] != value) { Config[keyPath] = value }
|
||||||
}
|
}
|
||||||
return Result.ok({}, '保存成功~')
|
return Result.ok({}, '保存成功~')
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,8 @@ const defaultConfig = {
|
||||||
noiseScale: 0.6,
|
noiseScale: 0.6,
|
||||||
noiseScaleW: 0.668,
|
noiseScaleW: 0.668,
|
||||||
lengthScale: 1.2,
|
lengthScale: 1.2,
|
||||||
version: 'v2.0.18'
|
initiativeChatGroups: [],
|
||||||
|
version: 'v2.0.19'
|
||||||
}
|
}
|
||||||
const _path = process.cwd()
|
const _path = process.cwd()
|
||||||
let config = {}
|
let config = {}
|
||||||
|
|
|
||||||
37
utils/randomMessage.js
Normal file
37
utils/randomMessage.js
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
import { Config } from './config.js'
|
||||||
|
import { ChatGPTAPI } from 'chatgpt'
|
||||||
|
import { getMessageById, upsertMessage } from './common.js'
|
||||||
|
import fetch from 'node-fetch'
|
||||||
|
let proxy
|
||||||
|
if (Config.proxy) {
|
||||||
|
try {
|
||||||
|
proxy = (await import('https-proxy-agent')).default
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('未安装https-proxy-agent,请在插件目录下执行pnpm add https-proxy-agent')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const newFetch = (url, options = {}) => {
|
||||||
|
const defaultOptions = Config.proxy
|
||||||
|
? {
|
||||||
|
agent: proxy(Config.proxy)
|
||||||
|
}
|
||||||
|
: {}
|
||||||
|
|
||||||
|
const mergedOptions = {
|
||||||
|
...defaultOptions,
|
||||||
|
...options
|
||||||
|
}
|
||||||
|
|
||||||
|
return fetch(url, mergedOptions)
|
||||||
|
}
|
||||||
|
const question = '写一段话让大家来找我聊天。类似于“有人找我聊天吗?"这种风格,轻松随意一点控制在20个字以内'
|
||||||
|
|
||||||
|
export async function generateHello () {
|
||||||
|
let api = new ChatGPTAPI({
|
||||||
|
apiBaseUrl: Config.openAiBaseUrl,
|
||||||
|
apiKey: Config.apiKey,
|
||||||
|
fetch: newFetch
|
||||||
|
})
|
||||||
|
const res = await api.sendMessage(question)
|
||||||
|
return res.text
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue