Files
LingChair-V0/server_src/api-msgs.js
MoonLeeeaf 5b55ca77ec rebase
2024-05-25 16:34:17 +08:00

122 lines
3.7 KiB
JavaScript

/*
* ©2024 满月叶
* Github: MoonLeeeaf
* 通讯辅助类
*/
const io = require("./iolib")
const hash = require("./hashlib")
const vals = require("./val")
const users = require("./api-users")
let getSameHashedValue = (a, b) => {
let _a = [hash.md5(a) + hash.sha256(a), hash.md5(b) + hash.sha256(b)].sort()
let [_1, _2] = _a
return hash.sha256(hash.sha256(_1) + hash.sha256(_2))
}
let getSingleChatDir = (a, b) => {
return vals.LINGCHAIR_SINGLE_MESSAGE_DIR + "/" + getSameHashedValue(a, b)
}
let apis = {
// 储存单聊消息: 操作者, 访问密钥, 发送至, 消息内容
// 消息存储方式为计次直接储存, 每一个消息都有对应的 ID
// 读取某一段落时使用遍历方式
// @API
sendSingleMsg: (name, accessToken, target, msg) => {
if (!users.checkAccessToken(name, accessToken))
return { code: -1, msg: "访问令牌错误" }
if (!users.isUserExists(target))
return { code: -1, msg: "目标用户不存在" }
if (msg.trim() == "")
return { code: -1, msg: "不是有内容的消息我不要" }
let fileDir = getSingleChatDir(name, target)
io.mkdirs(fileDir)
let countFile = io.open(fileDir + "/count.txt", "rw")
if (!io.exists(fileDir + "/count.txt"))
countFile.write("0")
let count = parseInt(countFile.read())
count += 1
let time = Date.now()
io.open(fileDir + "/msg_" + count + ".json", "w").writeJson({
name: name,
msg: msg,
msgid: count,
time: time,
}).close()
countFile.write(count + "")
return { code: 0, msg: "成功", msgid: count, time: time }
},
// 读取消息记录
// 从起始点到结束点读取,由最新到最老(计次越大越新)
// 不提供 startId 则默认从最新计次往前数
// 若超过 limit 计次范围, 直接终止遍历
// @API
getSingleMsgHistroy: (name, accessToken, target, sid, limit) => {
if (!users.checkAccessToken(name, accessToken))
return { code: -1, msg: "访问令牌错误" }
if (!users.isUserExists(target))
return { code: -1, msg: "目标用户不存在" }
let fileDir = getSingleChatDir(name, target)
io.mkdirs(fileDir)
let countFile = io.open(fileDir + "/count.txt", "rw")
if (!io.exists(fileDir + "/count.txt"))
countFile.write("0")
let startId = sid
if (startId == null)
startId = parseInt(countFile.read().toString())
let list = []
let i = startId
let i2 = 0
let cfn
while(true) {
cfn = fileDir + "/msg_" + i + ".json"
// 1. 超过界限
// 2. 超过计次
// 3. 超过最大限度
if ((!io.exists(cfn)) || i2 > limit || i2 > 100) break
try {
let data = io.open(cfn, "r").readJson()
list.unshift(data)
} catch (e) {
return { code: -2, msg: e }
}
i--
i2++
}
return { code: 0, msg: "成功", histroy: list }
},
// 上传图片: 操作者, 访问密钥, 发送至, 图片
// 未来需要一些操作来删除未使用的图片文件
// @API
uploadImage: (name, accessToken, target, msg) => {
if (!users.checkAccessToken(name, accessToken))
return { code: -1, msg: "访问令牌错误" }
if (!users.isUserExists(target))
return { code: -1, msg: "目标用户不存在" }
let fileDir = getSingleChatDir(name, target) + "/images/"
io.mkdirs(fileDir)
},
}
module.exports = apis