feat: member表支持角色

This commit is contained in:
digua
2026-01-08 23:00:34 +08:00
committed by digua
parent 70e76e21d9
commit 2ef81fff8f
6 changed files with 56 additions and 20 deletions
+5 -3
View File
@@ -84,7 +84,8 @@ function createDatabase(sessionId: string): Database.Database {
account_name TEXT,
group_nickname TEXT,
aliases TEXT DEFAULT '[]',
avatar TEXT
avatar TEXT,
roles TEXT DEFAULT '[]'
);
CREATE TABLE IF NOT EXISTS member_name_history (
@@ -174,7 +175,7 @@ export function importData(parseResult: ParseResult): string {
)
const insertMember = db.prepare(`
INSERT OR IGNORE INTO member (platform_id, account_name, group_nickname, avatar) VALUES (?, ?, ?, ?)
INSERT OR IGNORE INTO member (platform_id, account_name, group_nickname, avatar, roles) VALUES (?, ?, ?, ?, ?)
`)
const getMemberId = db.prepare(`
SELECT id FROM member WHERE platform_id = ?
@@ -187,7 +188,8 @@ export function importData(parseResult: ParseResult): string {
member.platformId,
member.accountName || null,
member.groupNickname || null,
member.avatar || null
member.avatar || null,
member.roles ? JSON.stringify(member.roles) : '[]'
)
const row = getMemberId.get(member.platformId) as { id: number }
memberIdMap.set(member.platformId, row.id)
+14 -10
View File
@@ -34,7 +34,7 @@ export interface MigrationInfo {
}
/** 当前 schema 版本(最新迁移的版本号) */
export const CURRENT_SCHEMA_VERSION = 1
export const CURRENT_SCHEMA_VERSION = 2
/**
* 迁移脚本列表
@@ -54,15 +54,19 @@ const migrations: Migration[] = [
}
},
},
// 未来的迁移示例:
// {
// version: 2,
// description: '添加 xxx 字段',
// userMessage: '新功能说明',
// up: (db) => {
// db.exec('ALTER TABLE xxx ADD COLUMN yyy TEXT')
// },
// },
{
version: 2,
description: '添加 roles 字段到 member 表',
userMessage: '支持成员角色(群主、管理员等)',
up: (db) => {
// 检查 roles 列是否已存在(防止重复执行)
const tableInfo = db.prepare('PRAGMA table_info(member)').all() as Array<{ name: string }>
const hasRolesColumn = tableInfo.some((col) => col.name === 'roles')
if (!hasRolesColumn) {
db.exec("ALTER TABLE member ADD COLUMN roles TEXT DEFAULT '[]'")
}
},
},
]
/**
+2
View File
@@ -73,6 +73,7 @@ interface ChatLabMember {
groupNickname?: string // 群昵称
aliases?: string[]
avatar?: string // 头像(base64 Data URL
roles?: Array<{ id: string; name?: string }> // 成员角色
}
// ==================== 解析器实现 ====================
@@ -159,6 +160,7 @@ async function* parseChatLab(options: ParseOptions): AsyncGenerator<ParseEvent,
accountName: m.accountName,
groupNickname: m.groupNickname,
avatar: m.avatar,
roles: m.roles,
})
}
}
+8 -6
View File
@@ -150,7 +150,7 @@ function createDatabaseWithoutIndexes(sessionId: string): Database.Database {
group_id TEXT,
group_avatar TEXT,
owner_id TEXT,
schema_version INTEGER DEFAULT 1
schema_version INTEGER DEFAULT 2
);
CREATE TABLE IF NOT EXISTS member (
@@ -159,7 +159,8 @@ function createDatabaseWithoutIndexes(sessionId: string): Database.Database {
account_name TEXT,
group_nickname TEXT,
aliases TEXT DEFAULT '[]',
avatar TEXT
avatar TEXT,
roles TEXT DEFAULT '[]'
);
CREATE TABLE IF NOT EXISTS member_name_history (
@@ -263,7 +264,7 @@ export async function streamImport(filePath: string, requestId: string): Promise
INSERT INTO meta (name, platform, type, imported_at, group_id, group_avatar, owner_id) VALUES (?, ?, ?, ?, ?, ?, ?)
`)
const insertMember = db.prepare(`
INSERT OR IGNORE INTO member (platform_id, account_name, group_nickname, avatar) VALUES (?, ?, ?, ?)
INSERT OR IGNORE INTO member (platform_id, account_name, group_nickname, avatar, roles) VALUES (?, ?, ?, ?, ?)
`)
const getMemberId = db.prepare(`SELECT id FROM member WHERE platform_id = ?`)
const insertMessage = db.prepare(`
@@ -400,7 +401,8 @@ export async function streamImport(filePath: string, requestId: string): Promise
member.platformId,
member.accountName || null,
member.groupNickname || null,
member.avatar || null
member.avatar || null,
member.roles ? JSON.stringify(member.roles) : '[]'
)
const row = getMemberId.get(member.platformId) as { id: number } | undefined
if (row) {
@@ -434,8 +436,8 @@ export async function streamImport(filePath: string, requestId: string): Promise
// 确保成员存在
let t0 = Date.now()
if (!memberIdMap.has(msg.senderPlatformId)) {
// 消息中没有头像信息,设为 null
insertMember.run(msg.senderPlatformId, msg.senderAccountName || null, msg.senderGroupNickname || null, null)
// 消息中没有头像和角色信息,设为默认值
insertMember.run(msg.senderPlatformId, msg.senderAccountName || null, msg.senderGroupNickname || null, null, '[]')
const row = getMemberId.get(msg.senderPlatformId) as { id: number } | undefined
if (row) {
memberIdMap.set(msg.senderPlatformId, row.id)