mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-16 21:37:11 +00:00
feat: 支持claude单人对话;注意:需要重新设置slack权限和配置插件
This commit is contained in:
parent
3dee3ccec7
commit
c1599e4f34
4 changed files with 115 additions and 33 deletions
|
|
@ -94,8 +94,9 @@ const defaultConfig = {
|
|||
ttsRegex: '/匹配规则/匹配模式',
|
||||
slackUserToken: '',
|
||||
slackBotUserToken: '',
|
||||
slackChannelId: '',
|
||||
// slackChannelId: '',
|
||||
slackSigningSecret: '',
|
||||
slackClaudeUserId: '',
|
||||
version: 'v2.5.3'
|
||||
}
|
||||
const _path = process.cwd()
|
||||
|
|
|
|||
|
|
@ -29,40 +29,120 @@ export class SlackClaudeClient {
|
|||
}
|
||||
}
|
||||
|
||||
async sendMessage (prompt) {
|
||||
let sendResponse = await this.app.client.chat.postMessage({
|
||||
as_user: true,
|
||||
text: `${prompt}`,
|
||||
async sendMessage (prompt, e, t = 0) {
|
||||
if (t > 10) {
|
||||
return 'claude 未响应'
|
||||
}
|
||||
let qq = e.sender.user_id
|
||||
let channels = await this.app.client.conversations.list({
|
||||
token: this.config.slackUserToken,
|
||||
channel: this.config.slackChannelId
|
||||
types: 'public_channel,private_channel'
|
||||
})
|
||||
let ts = sendResponse.ts
|
||||
let response = '_Typing…_'
|
||||
let tryTimes = 0
|
||||
while (response.trim().endsWith('_Typing…_')) {
|
||||
let replies = await this.app.client.conversations.history({
|
||||
let channel = channels.channels.filter(c => c.name === '' + qq)
|
||||
if (!channel || channel.length === 0) {
|
||||
let createChannelResponse = await this.app.client.conversations.create({
|
||||
token: this.config.slackUserToken,
|
||||
channel: this.config.slackChannelId,
|
||||
limit: 1,
|
||||
oldest: ts
|
||||
name: qq + '',
|
||||
is_private: true
|
||||
})
|
||||
if (replies.messages.length > 0 && replies.messages[0].bot_profile) {
|
||||
response = replies.messages[0].text
|
||||
if (Config.debug) {
|
||||
let text = response.replace('_Typing…_', '')
|
||||
if (text) {
|
||||
logger.info(response.replace('_Typing…_', ''))
|
||||
channel = createChannelResponse.channel
|
||||
await this.app.client.conversations.invite({
|
||||
token: this.config.slackUserToken,
|
||||
channel: channel.id,
|
||||
users: 'U053NDP2YRF'
|
||||
})
|
||||
await delay(1000)
|
||||
} else {
|
||||
channel = channel[0]
|
||||
}
|
||||
let conversationId = await redis.get(`CHATGPT:SLACK_CONVERSATION:${qq}`)
|
||||
if (!conversationId) {
|
||||
let sendResponse = await this.app.client.chat.postMessage({
|
||||
as_user: true,
|
||||
text: `<@${Config.slackClaudeUserId}> ${prompt}`,
|
||||
token: this.config.slackUserToken,
|
||||
channel: channel.id
|
||||
})
|
||||
let ts = sendResponse.ts
|
||||
let response = '_Typing…_'
|
||||
let tryTimes = 0
|
||||
while (response.trim().endsWith('_Typing…_')) {
|
||||
let replies = await this.app.client.conversations.replies({
|
||||
token: this.config.slackUserToken,
|
||||
channel: channel.id,
|
||||
limit: 1000,
|
||||
ts: ts
|
||||
})
|
||||
await await redis.set(`CHATGPT:SLACK_CONVERSATION:${qq}`, `${ts}`)
|
||||
if (replies.messages.length > 0) {
|
||||
let formalMessages = replies.messages.filter(m => m.text.indexOf('Acceptable Use Policy') === -1)
|
||||
if (!formalMessages[formalMessages.length - 1].bot_profile) {
|
||||
// 问题的下一句不是bot回复的,这属于意料之外的问题,可能是多人同时问问题导致 再问一次吧
|
||||
return await this.sendMessage(prompt, e, t + 1)
|
||||
}
|
||||
let reply = formalMessages[formalMessages.length - 1]
|
||||
if (reply.text !== `<@${Config.slackClaudeUserId}> ${prompt}`) {
|
||||
response = reply.text
|
||||
if (Config.debug) {
|
||||
let text = response.replace('_Typing…_', '')
|
||||
if (text) {
|
||||
logger.info(response.replace('_Typing…_', ''))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
await delay(500)
|
||||
tryTimes++
|
||||
if (tryTimes > 10 && response === '_Typing…_') {
|
||||
// 过了5秒还没任何回复,就重新发一下试试
|
||||
logger.warn('claude没有响应,重试中')
|
||||
return await this.sendMessage(prompt, e, t + 1)
|
||||
}
|
||||
}
|
||||
await delay(500)
|
||||
tryTimes++
|
||||
if (tryTimes > 10 && response === '_Typing…_') {
|
||||
// 过了5秒还没任何回复,就重新发一下试试
|
||||
logger.warn('claude没有响应,重试中')
|
||||
return await this.sendMessage(prompt)
|
||||
return response
|
||||
} else {
|
||||
await this.app.client.chat.postMessage({
|
||||
as_user: true,
|
||||
text: `<@${Config.slackClaudeUserId}> ${prompt}`,
|
||||
token: this.config.slackUserToken,
|
||||
channel: channel.id,
|
||||
thread_ts: conversationId
|
||||
})
|
||||
let response = '_Typing…_'
|
||||
let tryTimes = 0
|
||||
while (response.trim().endsWith('_Typing…_')) {
|
||||
let replies = await this.app.client.conversations.replies({
|
||||
token: this.config.slackUserToken,
|
||||
channel: channel.id,
|
||||
limit: 1000,
|
||||
ts: conversationId
|
||||
})
|
||||
if (replies.messages.length > 0) {
|
||||
let formalMessages = replies.messages.filter(m => m.text.indexOf('Acceptable Use Policy') === -1)
|
||||
if (!formalMessages[formalMessages.length - 1].bot_profile) {
|
||||
// 问题的下一句不是bot回复的,这属于意料之外的问题,可能是多人同时问问题导致 再问一次吧
|
||||
return await this.sendMessage(prompt, e, t + 1)
|
||||
}
|
||||
let reply = formalMessages[formalMessages.length - 1]
|
||||
if (reply.text !== `<@${Config.slackClaudeUserId}> ${prompt}`) {
|
||||
response = reply.text
|
||||
if (Config.debug) {
|
||||
let text = response.replace('_Typing…_', '')
|
||||
if (text) {
|
||||
logger.info(response.replace('_Typing…_', ''))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
await delay(500)
|
||||
tryTimes++
|
||||
if (tryTimes > 10 && response === '_Typing…_') {
|
||||
// 过了5秒还没任何回复,就重新发一下试试
|
||||
logger.warn('claude没有响应,重试中')
|
||||
return await this.sendMessage(prompt, e, t + 1)
|
||||
}
|
||||
}
|
||||
return response
|
||||
}
|
||||
return response
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue