chore: 统一为简体中文

This commit is contained in:
CrescentLeaf
2025-10-06 15:36:12 +08:00
parent bd857b840b
commit dced175d7a
23 changed files with 131 additions and 175 deletions

View File

@@ -75,17 +75,17 @@ export default class ApiManager {
socket.on('disconnect', (_reason) => {
if (clientInfo.userId == '')
console.log(chalk.yellow('[]') + ` ${ip} disconnected`)
console.log(chalk.yellow('[]') + ` ${ip} disconnected`)
else {
console.log(chalk.green('[]') + ` ${ip} disconnected`)
console.log(chalk.green('[]') + ` ${ip} disconnected`)
delete this.clients[clientInfo.userId][deviceId + '_' + sessionId]
}
})
console.log(chalk.yellow('[]') + ` ${ip} connected`)
console.log(chalk.yellow('[]') + ` ${ip} connected`)
socket.on("The_White_Silk", async (name: string, args: { [key: string]: unknown }, callback_: (ret: ApiCallbackMessage) => void) => {
function callback(ret: ApiCallbackMessage) {
console.log(chalk.blue('[]') + ` ${ip} <- ${ret.code == 200 ? chalk.green(ret.msg) : chalk.red(ret.msg)} [${ret.code}]${ret.data ? (' <extras: ' + stringifyNotIncludeArrayBuffer(ret.data) + '>') : ''}`)
console.log(chalk.blue('[]') + ` ${ip} <- ${ret.code == 200 ? chalk.green(ret.msg) : chalk.red(ret.msg)} [${ret.code}]${ret.data ? (' <extras: ' + stringifyNotIncludeArrayBuffer(ret.data) + '>') : ''}`)
return callback_(ret)
}
async function checkIsPromiseAndAwait(value: Promise<unknown> | unknown) {
@@ -106,11 +106,11 @@ export default class ApiManager {
})
} catch (e) {
const err = e as Error
console.log(chalk.yellow('[]') + ` ${err.message} (${err.stack})`)
console.log(chalk.yellow('[]') + ` ${err.message} (${err.stack})`)
try {
callback({
code: err instanceof DataWrongError ? 400 : 500,
msg: "錯誤: " + err.message
msg: "错误: " + err.message
})
} catch (_e) { }
}

View File

@@ -22,24 +22,24 @@ export default class ChatApi extends BaseApi {
*/
this.registerEvent("Chat.getInfo", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token', 'target'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const chat = Chat.findById(args.target as string)
if (chat == null) return {
code: 404,
msg: "對話不存在",
msg: "对话不存在",
}
if (!UserChatLinker.checkUserIsLinkedToChat(token.author, chat!.bean.id)) return {
code: 400,
msg: "用戶無權訪問該對話",
msg: "用户无权访问此对话",
}
// 私聊
@@ -83,24 +83,24 @@ export default class ChatApi extends BaseApi {
*/
this.registerEvent("Chat.sendMessage", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token', 'target', 'text'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const chat = Chat.findById(args.target as string)
if (chat == null) return {
code: 404,
msg: "對話不存在",
msg: "对话不存在",
}
if (!UserChatLinker.checkUserIsLinkedToChat(token.author, chat!.bean.id)) return {
code: 400,
msg: "用戶無權訪問該對話",
msg: "用户无权访问此对话",
}
const msg = {
@@ -142,24 +142,24 @@ export default class ChatApi extends BaseApi {
*/
this.registerEvent("Chat.getMessageHistory", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token', 'target', 'page'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const chat = Chat.findById(args.target as string)
if (chat == null) return {
code: 404,
msg: "對話不存在",
msg: "对话不存在",
}
if (!UserChatLinker.checkUserIsLinkedToChat(token.author, chat!.bean.id)) return {
code: 400,
msg: "用戶無權訪問該對話",
msg: "用户无权访问此对话",
}
return {
@@ -179,24 +179,24 @@ export default class ChatApi extends BaseApi {
*/
this.registerEvent("Chat.uploadFile", async (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token', 'target', 'data', 'file_name'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const chat = Chat.findById(args.target as string)
if (chat == null) return {
code: 404,
msg: "對話不存在",
msg: "对话不存在",
}
if (!UserChatLinker.checkUserIsLinkedToChat(token.author, chat!.bean.id)) return {
code: 400,
msg: "用戶無權訪問該對話",
msg: "用户无权访问此对话",
}
const file = await FileManager.uploadFile(args.file_name as string, args.data as Buffer<ArrayBufferLike>, args.target as string)
@@ -216,20 +216,20 @@ export default class ChatApi extends BaseApi {
*/
this.registerEvent("Chat.getIdForPrivate", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token', 'target'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const user = User.findById(token.author) as User
const targetUser = User.findById(args.target as string) as User
if (targetUser == null) {
return {
msg: "找不到用",
msg: "找不到用",
code: 404,
}
}
@@ -251,18 +251,18 @@ export default class ChatApi extends BaseApi {
*/
this.registerEvent("Chat.createGroup", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token', 'title'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
if (this.checkArgsEmpty(args, ['title'])) return {
msg: "參數不得空",
msg: "参数不得空",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const user = User.findById(token.author) as User
@@ -291,14 +291,14 @@ export default class ChatApi extends BaseApi {
*/
this.registerEvent("Chat.getAnotherUserIdFromPrivate", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token', 'target'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const user = User.findById(token.author) as User
@@ -306,11 +306,11 @@ export default class ChatApi extends BaseApi {
const chat = Chat.findById(args.target as string)
if (chat == null) return {
code: 404,
msg: "對話不存在",
msg: "对话不存在",
}
if (!UserChatLinker.checkUserIsLinkedToChat(token.author, chat!.bean.id)) return {
code: 400,
msg: "用戶無權訪問該對話",
msg: "用户无权访问此对话",
}
if (chat.bean.type == 'private')

View File

@@ -25,7 +25,7 @@ export default class EventStorer {
CREATE TABLE IF NOT EXISTS ${this.getTableName()} (
/* 序号 */ count INTEGER PRIMARY KEY AUTOINCREMENT,
/* 事件 */ event_name TEXT NOT NULL,
/* 數據 */ data TEXT NOT NULL,
/* 数据 */ data TEXT NOT NULL,
);
`)
}

View File

@@ -15,7 +15,7 @@ export default class UserApi extends BaseApi {
// 驗證
this.registerEvent("User.auth", (args, clientInfo) => {
if (this.checkArgsMissing(args, ['access_token'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const { deviceId, ip, socket, sessionId } = clientInfo
@@ -23,20 +23,20 @@ export default class UserApi extends BaseApi {
const access_token = TokenManager.decode(args.access_token as string)
if (access_token.expired_time < Date.now()) return {
msg: "登令牌失效",
msg: "登令牌失效",
code: 401,
}
if (!access_token.author || !User.findById(access_token.author)) return {
msg: "賬號不存在",
msg: "账号不存在",
code: 401,
}
if (access_token.device_id != deviceId) return {
msg: "驗證失敗",
msg: "验证失败",
code: 401,
}
clientInfo.userId = access_token.author
console.log(chalk.green('[]') + ` ${access_token.author} authed on Client ${deviceId} (ip = ${ip})`)
console.log(chalk.green('[]') + ` ${access_token.author} authed on Client ${deviceId} (ip = ${ip})`)
if (ApiManager.clients[clientInfo.userId] == null) ApiManager.clients[clientInfo.userId] = {
[deviceId + '_' + sessionId]: socket
}
@@ -50,7 +50,7 @@ export default class UserApi extends BaseApi {
const err = e as Error
if (err.message.indexOf("JSON") != -1)
return {
msg: "效的登錄令牌",
msg: "效的用户令牌",
code: 401,
}
else
@@ -60,17 +60,17 @@ export default class UserApi extends BaseApi {
// 登錄
this.registerEvent("User.login", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['account', 'password'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
if (this.checkArgsEmpty(args, ['account', 'password'])) return {
msg: "參數不得空",
msg: "参数不得空",
code: 400,
}
const user = User.findByAccount(args.account as string) as User
if (user == null) return {
msg: "賬號或密碼錯誤",
msg: "账号或密码错误",
code: 400,
}
@@ -83,18 +83,18 @@ export default class UserApi extends BaseApi {
}
return {
msg: "賬號或密碼錯誤",
msg: "账号或密码错误",
code: 400,
}
})
// 注冊
this.registerEvent("User.register", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['nickname', 'password'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
if (this.checkArgsEmpty(args, ['nickname', 'password'])) return {
msg: "參數不得空",
msg: "参数不得空",
code: 400,
}
@@ -120,17 +120,17 @@ export default class UserApi extends BaseApi {
// 更新頭像
this.registerEvent("User.setAvatar", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['avatar', 'token'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
if (!(args.avatar instanceof Buffer)) return {
msg: "參數不合法",
msg: "参数不合法",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const avatar: Buffer = args.avatar as Buffer
@@ -145,14 +145,14 @@ export default class UserApi extends BaseApi {
// 更新資料
this.registerEvent("User.updateProfile", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const user = User.findById(token.author)
@@ -169,14 +169,14 @@ export default class UserApi extends BaseApi {
// 獲取用戶信息
this.registerEvent("User.getMyInfo", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const user = User.findById(token.author)
@@ -195,14 +195,14 @@ export default class UserApi extends BaseApi {
// 獲取最近对话列表
this.registerEvent("User.getMyRecentChats", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const user = User.findById(token.author) as User
@@ -229,14 +229,14 @@ export default class UserApi extends BaseApi {
// 獲取聯絡人列表
this.registerEvent("User.getMyContacts", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const user = User.findById(token.author) as User
@@ -262,14 +262,14 @@ export default class UserApi extends BaseApi {
// 添加聯絡人
this.registerEvent("User.addContact", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token', 'target'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const user = User.findById(token.author) as User
@@ -300,14 +300,14 @@ export default class UserApi extends BaseApi {
// 獲取用戶信息
this.registerEvent("User.getInfo", (args, { deviceId }) => {
if (this.checkArgsMissing(args, ['token', 'target'])) return {
msg: "參數缺失",
msg: "参数缺失",
code: 400,
}
const token = TokenManager.decode(args.token as string)
if (!this.checkToken(token, deviceId)) return {
code: 401,
msg: "令牌效",
msg: "令牌效",
}
const user = User.findById(args.target as string)

View File

@@ -24,11 +24,10 @@ export default class Chat {
db.exec(`
CREATE TABLE IF NOT EXISTS ${Chat.table_name} (
/* 序号 */ count INTEGER PRIMARY KEY AUTOINCREMENT,
/* 型 */ type TEXT NOT NULL,
/* Chat ID */ id TEXT NOT NULL,
/* 標題 (群組) */ title TEXT,
/* 頭像 (群組) */ avatar BLOB,
/* 成員 */ members_list TEXT,
/* 型 */ type TEXT NOT NULL,
/* ID */ id TEXT NOT NULL,
/* 标题 */ title TEXT,
/* 头像 */ avatar BLOB,
/* 设置 */ settings TEXT NOT NULL
);
`)
@@ -50,7 +49,7 @@ export default class Chat {
static create(chatId: string, type: ChatType) {
if (this.findAllBeansByCondition('id = ?', chatId).length > 0)
throw new DataWrongError(`对话ID ${chatId} 已被使用`)
throw new DataWrongError(`对话 ID ${chatId} 已被使用`)
const chat = new Chat(
Chat.findAllBeansByCondition(
'count = ?',

View File

@@ -79,7 +79,7 @@ export default class FileManager {
/* 文件名称 */ name TEXT NOT NULL,
/* 文件哈希 */ hash TEXT NOT NULL,
/* MIME 类型 */ mime TEXT NOT NULL,
/* 来源 Chat, 可為空 */ chatid TEXT,
/* 来源对话 */ chatid TEXT,
/* 上传时间 */ upload_time INT8 NOT NULL,
/* 最后使用时间 */ last_used_time INT8 NOT NULL
);

View File

@@ -28,7 +28,7 @@ export default class MessagesManager {
/* 序号, MessageId */ id INTEGER PRIMARY KEY AUTOINCREMENT,
/* 消息文本 */ text TEXT NOT NULL,
/* 发送者 */ user_id TEXT NOT NULL,
/* 發送時間 */ time INT8 NOT NULL
/* 发送时间 */ time INT8 NOT NULL
);
`)
}

View File

@@ -32,13 +32,13 @@ export default class User {
CREATE TABLE IF NOT EXISTS ${User.table_name} (
/* 序号 */ count INTEGER PRIMARY KEY AUTOINCREMENT,
/* 用户 ID, UUID */ id TEXT,
/* 密碼, 哈希 */ password TEXT,
/* 注册时间, 时间戳 */ registered_time INT8 NOT NULL,
/* 用戶名, 可選 */ username TEXT,
/* 密码摘要 */ password TEXT,
/* 注册时间 */ registered_time INT8 NOT NULL,
/* 用户名 */ username TEXT,
/* 昵称 */ nickname TEXT NOT NULL,
/* 头像, 可选 */ avatar_file_hash TEXT,
/* 聯絡人列表 */ contacts_list TEXT NOT NULL,
/* 最近對話 */ recent_chats TEXT NOT NULL,
/* 对话列表 */ contacts_list TEXT NOT NULL,
/* 最近对话 */ recent_chats TEXT NOT NULL,
/* 设置 */ settings TEXT NOT NULL
);
`)
@@ -147,7 +147,7 @@ export default class User {
try {
return JSON.parse(this.bean.contacts_list) as string[]
} catch (e) {
console.log(chalk.yellow(`警告: 聯絡人組解析失: ${(e as Error).message}`))
console.log(chalk.yellow(`警告: 所有对话解析失: ${(e as Error).message}`))
return []
}
}

View File

@@ -70,10 +70,10 @@ ApiManager.initEvents()
ApiManager.initAllApis()
httpServer.listen(config.server.listen)
console.log(chalk.green("API & Web 服務已經開始運作"))
console.log(chalk.green("API & Web 服务已启动"))
function help() {
console.log(chalk.yellow("===== TheWhiteSilk Server ====="))
console.log(chalk.yellow("b - 重新編譯前端"))
console.log(chalk.yellow("===== LingChair Server ====="))
console.log(chalk.yellow("b - 重新编译前端"))
}
help()
@@ -83,11 +83,10 @@ const rl = readline.createInterface({
})
rl.on('line', (text) => {
if (text == 'b') {
console.log(chalk.green("重新編譯..."))
console.log(chalk.green("重新编译..."))
child_process.spawnSync("deno", ["task", "build"], {
stdio: [process.stdin, process.stdout, process.stderr]
})
console.log(chalk.green("✓ 編譯完畢"))
help()
}
})

View File

@@ -1,42 +0,0 @@
import { DatabaseSync } from "node:sqlite"
import fs from 'node:fs/promises'
await fs.mkdir('data', { recursive: true })
const db = new DatabaseSync("data/users.db")
const TABEL_NAME = "Users"
// 初始化表格
db.exec(
`
CREATE TABLE IF NOT EXISTS ${TABEL_NAME} (
/* 伺服器中 ID */ id INTEGER PRIMARY KEY AUTOINCREMENT,
/* 用戶名, 可選 */ username TEXT,
/* 姓名 */ nickname TEXT NOT NULL,
/* 头像, 可选 */ avatar BLOB
);
`,
)
// 插入测试数据
db.prepare(
`
INSERT INTO ${TABEL_NAME} (username, nickname, avatar) VALUES (?, ?, ?);
`,
).run("SisterWen", "文姐", null)
let rows = db.prepare(`SELECT id, username, nickname, avatar FROM ${TABEL_NAME}`).all();
for (const row of rows) {
console.log(row)
}
// 更新用户名
// 用户名要合规, 以免导致 SQL 注入!
db.prepare(`UPDATE ${TABEL_NAME} SET username = ? WHERE id = ?`).run("文姐", 1)
rows = db.prepare(`SELECT id, username, nickname, avatar FROM ${TABEL_NAME} WHERE username = ?`).all("文姐")
for (const row of rows) {
console.log(row)
}
db.close()