Skip to content

Commit

Permalink
继续适配Trss (#583)
Browse files Browse the repository at this point in the history
* fix: 修复星火api上下文

* 将无星火ck的情况降低为warn

* feat: 添加星火设定自定义代码功能

* 修复星火api模式的一些问题

* 修复导出配置问题

* feat:添加工具箱快捷登录接口

* 添加工具箱快捷登录指令

* 阻止群聊使用快捷登录

* 添加Azure配置支持,修复重复的配置项冲突

* 移除旧版本渲染和新版本帮助

* 添加工具箱

* 更新工具箱替换原有后台

* 更新工具箱适配代码

* 后台适配Trss

* 修复trss不支持sendPrivateMsg的问题

* 优化路由

* 修复路由

* 适配其他uin

* 添加bing第三方绘图

* 修复bing绘图第三方调用错误

* 添加bing第三方绘图采样配置

* 修复错误

* 添加bing第三方绘图图片大小配置

* 修复视图错误

* 使用ap替换第三方绘图

* 适配trss

* server 适配trss

* 修复错误的后台版本更新

* 添加锅巴用户数据

* 修复server初始化消息错误

* 添加锅巴插件适配

* 更新后台页面

* 添加锅巴代理接口

* 优化锅巴接口代理

* 修复锅巴代理参数

* 删除调试信息

* 修复headers

* 更新后台锅巴插件支持
  • Loading branch information
HalcyonAlcedo authored Oct 16, 2023
1 parent 6c171b3 commit c68a50e
Show file tree
Hide file tree
Showing 43 changed files with 214 additions and 173 deletions.
93 changes: 20 additions & 73 deletions server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import websocket from '@fastify/websocket'
import fs from 'fs'
import path from 'path'
import os from 'os'
import schedule from 'node-schedule'
import websocketclient from 'ws'

import { Config } from '../utils/config.js'
Expand All @@ -17,48 +16,14 @@ import { getPublicIP, getUserData, getMasterQQ, randomString, getUin } from '../
import webRoute from './modules/web_route.js'
import webUser from './modules/user.js'
import webPrompt from './modules/prompts.js'
import Guoba from './modules/guoba.js'
import SettingView from './modules/setting_view.js'

const __dirname = path.resolve()
const server = fastify({
logger: Config.debug
})

let Statistics = {
SystemAccess: {
count: 0,
oldCount: 0
},
CacheFile: {
count: 0,
oldCount: 0
},
WebAccess: {
count: 0,
oldCount: 0
},
SystemLoad: {
count: 0,
oldCount: 0
}
}

async function getLoad() {
// 获取当前操作系统平台
const platform = os.platform()
// 判断平台是Linux还是Windows
if (platform === 'linux') {
// 如果是Linux,使用os.loadavg()方法获取负载平均值
const loadAvg = os.loadavg()
return loadAvg[0] * 100
} else if (platform === 'win32') {
// 如果是Windows不获取性能
return 0
} else {
return 0
}
}

async function setUserData(qq, data) {
const dir = 'resources/ChatGPTCache/user'
const filename = `${qq}.json`
Expand All @@ -84,6 +49,7 @@ await server.register(webRoute)
await server.register(webUser)
await server.register(SettingView)
await server.register(webPrompt)
await server.register(Guoba)

// 无法访问端口的情况下创建与media的通讯
async function mediaLink() {
Expand Down Expand Up @@ -290,7 +256,6 @@ export async function createServer() {
time: data.time
})
await setUserData(body.qq, user)
Statistics.CacheFile.count += 1
reply.send({ file: body.entry, cacheUrl: `http://${ip}:${Config.serverPort || 3321}/page/${body.entry}` })
} catch (err) {
server.log.error(`用户生成缓存${body.entry}时发生错误: ${err}`)
Expand All @@ -299,12 +264,6 @@ export async function createServer() {
}
return reply
})
// 获取系统状态
server.post('/system-statistics', async (request, reply) => {
Statistics.SystemLoad.count = await getLoad()
reply.send(Statistics)
return reply
})

// 清除缓存数据
server.post('/cleanCache', async (request, reply) => {
Expand Down Expand Up @@ -333,6 +292,7 @@ export async function createServer() {
connection.socket.send(JSON.stringify(response))
})
connection.socket.on('message', async (message) => {
const isTrss = Array.isArray(Bot.uin)
try {
const data = JSON.parse(message)
const user = UserInfo(data.token)
Expand All @@ -344,10 +304,14 @@ export async function createServer() {
}
if (data.id && data.message) {
if (data.group) {
Bot.sendGroupMsg(parseInt(data.id), data.message, data.quotable)
if (isTrss) {
Bot[user.user].pickGroup(parseInt(data.id)).sendMsg(data.message)
} else {
Bot.sendGroupMsg(parseInt(data.id), data.message, data.quotable)
}
} else {
if (Array.isArray(Bot.uin)) {
Bot.pickFriend(parseInt(data.id)).sendMsg(data.message)
if (isTrss) {
Bot[user.user].pickFriend(parseInt(data.id)).sendMsg(data.message)
} else {
Bot.sendPrivateMsg(parseInt(data.id), data.message, data.quotable)
}
Expand All @@ -365,7 +329,6 @@ export async function createServer() {
}
break
case 'login': // 登录

if (user) {
clients[user.user] = connection.socket
connection.login = true
Expand All @@ -379,13 +342,17 @@ export async function createServer() {
await connection.socket.send(JSON.stringify({ command: data.command, state: false, error: '请先登录账号' }))
return
}
if (user.autho != 'admin') {
if (user?.autho != 'admin') {
await connection.socket.send(JSON.stringify({ command: data.command, state: true, error: '普通用户无需进行初始化' }))
return
}
const groupList = Bot.getGroupList()
let _Bot = Bot
if (isTrss) {
_Bot = Bot[user.user]
}
const groupList = await _Bot.getGroupList()
groupList.forEach(async (item) => {
const group = Bot.pickGroup(item.group_id)
const group = _Bot.pickGroup(item.group_id)
const groupMessages = await group.getChatHistory()
groupMessages.forEach(async (e) => {
const messageData = {
Expand All @@ -410,12 +377,14 @@ export async function createServer() {
await connection.socket.send(JSON.stringify(messageData))
})
})

break
default:
await connection.socket.send(JSON.stringify({ "data": data }))
break
}
} catch (error) {
console.error(error)
await connection.socket.send(JSON.stringify({ "error": error.message }))
}
})
Expand All @@ -432,7 +401,7 @@ export async function createServer() {
message: e.message,
sender: e.sender,
group: {
isGroup: e.isGroup,
isGroup: e.isGroup || e.group_id != undefined,
group_id: e.group_id,
group_name: e.group_name
},
Expand Down Expand Up @@ -606,28 +575,6 @@ export async function createServer() {
return reply
})

server.addHook('onRequest', (request, reply, done) => {
if (request.method == 'POST') { Statistics.SystemAccess.count += 1 }
if (request.method == 'GET') { Statistics.WebAccess.count += 1 }
done()
})
// 定时任务
let rule = new schedule.RecurrenceRule()
rule.hour = 0
rule.minute = 0
let job_Statistics = schedule.scheduleJob(rule, function () {
Statistics.SystemAccess.oldCount = Statistics.SystemAccess.count
Statistics.CacheFile.oldCount = Statistics.CacheFile.count
Statistics.WebAccess.oldCount = Statistics.WebAccess.count
Statistics.SystemAccess.count = 0
Statistics.CacheFile.count = 0
Statistics.WebAccess.count = 0
})
let job_Statistics_SystemLoad = schedule.scheduleJob('0 * * * *', async function () {
Statistics.SystemLoad.count = await getLoad()
Statistics.SystemLoad.oldCount = Statistics.SystemLoad.count
})

server.listen({
port: Config.serverPort || 3321,
host: '::'
Expand Down
72 changes: 72 additions & 0 deletions server/modules/guoba.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import { UserInfo } from './user_data.js'

async function Guoba(fastify, options) {
// 获取锅巴登陆链接
fastify.post('/guobaLogin', async (request, reply) => {
const token = request.cookies.token || request.body?.token || 'unknown'
let user = UserInfo(token)
if (user && user.autho == 'admin') {
try {
let { LoginService } = await import('../../../Guoba-Plugin/server/service/both/LoginService.js')
const guobaLoginService = new LoginService()
const guobaAPI = await guobaLoginService.setQuickLogin(user.user)
reply.send({ guoba: guobaAPI })
}
catch (err) {
console.error(err)
reply.send({ state: false, error: err })
}
} else {
reply.send({ state: false, error: '用户权限不足' })
}
return reply
})
// 代理锅巴接口
fastify.post('/guobaApi', async (request, reply) => {
const body = request.body || {}
const token = request.cookies.token || request.body?.token || 'unknown'
let user = UserInfo(token)
if (user && user.autho == 'admin' && body.guobaToken) {
try {
let { getAllWebAddress } = await import('../../../Guoba-Plugin/utils/common.js')
const { custom, local, remote } = await getAllWebAddress()
if (local.length > 0) {
const guobaOptions = {
method: body.post ? 'POST' : 'GET',
headers: {
'Content-Type': 'application/json',
'Guoba-Access-Token': body.guobaToken
}
}
if (body.data) {
if (body.post) {
guobaOptions.body = JSON.stringify(body.data)
} else {
let paramsArray = []
Object.keys(body.data).forEach(key => paramsArray.push(key + '=' + body.data[key]))
if (paramsArray.length > 0) {
body.path += '?' + paramsArray.join('&')
}
}
}
const response = await fetch(`${local[0]}/${body.path}`, guobaOptions)
if (response.ok) {
const json = await response.json()
reply.send(json)
}
} else {
reply.send({ state: false, error: '锅巴接口异常' })
}
}
catch (err) {
console.error(err)
reply.send({ state: false, error: err })
}
} else {
reply.send({ state: false, error: '用户权限不足' })
}
return reply
})
}

export default Guoba
20 changes: 18 additions & 2 deletions server/modules/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,27 @@ async function User(fastify, options) {
// 登录
fastify.post('/login', async (request, reply) => {
const body = request.body || {}
let guobaLoginService
let guobaAPI = ''
try {
let { LoginService } = await import('../../../Guoba-Plugin/server/service/both/LoginService.js')
let { getAllWebAddress } = await import('../../../Guoba-Plugin/utils/common.js')
guobaLoginService = new LoginService()
guobaAPI = await getAllWebAddress()
}
catch (err) {
console.error(err)
guobaLoginService = {
signToken: () => {return null}
}
}
if (body.qq && body.passwd) {
const token = randomString(32)
if (body.qq == getUin() && await redis.get('CHATGPT:ADMIN_PASSWD') == body.passwd) {
const guobaToken = await guobaLoginService.signToken(body.qq)
AddUser({ user: body.qq, token: token, autho: 'admin' })
reply.setCookie('token', token, { path: '/' })
reply.send({ login: true, autho: 'admin', token: token })
reply.send({ login: true, autho: 'admin', token: token, guobaToken: guobaToken, guoba: guobaAPI })
} else {
const user = await getUserData(body.qq)
if (user.passwd != '' && user.passwd === body.passwd) {
Expand All @@ -26,9 +41,10 @@ async function User(fastify, options) {
const token = randomString(32)
const opt = await redis.get(`CHATGPT:SERVER_QUICK`)
if (opt && body.otp == opt) {
const guobaToken = await guobaLoginService.signToken(getUin())
AddUser({ user: getUin(), token: token, autho: 'admin' })
reply.setCookie('token', token, { path: '/' })
reply.send({ login: true, autho: 'admin', token: token, user: getUin() })
reply.send({ login: true, autho: 'admin', token: token, user: getUin(), guobaToken: guobaToken, guoba: guobaAPI })
} else {
reply.send({ login: false, err: `快捷登录代码错误,请检查后重试` })
}
Expand Down
27 changes: 27 additions & 0 deletions server/static/assets/AutoSettings.a106e074.js

Large diffs are not rendered by default.

Loading

0 comments on commit c68a50e

Please sign in to comment.