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,
|
||||
max: 2
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'initiativeChatGroups',
|
||||
label: '主动发起聊天群聊',
|
||||
bottomHelpMessage: '在这些群聊里会不定时主动说一些随机的打招呼的话,用英文逗号隔开',
|
||||
component: 'Input'
|
||||
}
|
||||
],
|
||||
// 获取配置数据方法(用于前端填充显示数据)
|
||||
|
|
@ -361,7 +367,7 @@ export function supportGuoba () {
|
|||
setConfigData (data, { Result }) {
|
||||
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 }
|
||||
}
|
||||
return Result.ok({}, '保存成功~')
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@ const defaultConfig = {
|
|||
noiseScale: 0.6,
|
||||
noiseScaleW: 0.668,
|
||||
lengthScale: 1.2,
|
||||
version: 'v2.0.18'
|
||||
initiativeChatGroups: [],
|
||||
version: 'v2.0.19'
|
||||
}
|
||||
const _path = process.cwd()
|
||||
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