koishi-plugin-bind-bot 2.2.9 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,14 +10,12 @@ class NicknameService {
10
10
  logger;
11
11
  config;
12
12
  normalizeQQId;
13
- validateBUID;
14
13
  getBilibiliOfficialUserInfo;
15
14
  updateBuidInfoOnly;
16
- constructor(logger, config, normalizeQQId, validateBUID, getBilibiliOfficialUserInfo, updateBuidInfoOnly) {
15
+ constructor(logger, config, normalizeQQId, getBilibiliOfficialUserInfo, updateBuidInfoOnly) {
17
16
  this.logger = logger;
18
17
  this.config = config;
19
18
  this.normalizeQQId = normalizeQQId;
20
- this.validateBUID = validateBUID;
21
19
  this.getBilibiliOfficialUserInfo = getBilibiliOfficialUserInfo;
22
20
  this.updateBuidInfoOnly = updateBuidInfoOnly;
23
21
  }
@@ -33,8 +31,8 @@ class NicknameService {
33
31
  return nickname === expectedFormat;
34
32
  }
35
33
  /**
36
- * 使用四层判断逻辑获取最准确的B站用户名
37
- * 优先级:官方API > ZMINFO > 数据库
34
+ * 获取最准确的B站用户名
35
+ * 优先级:官方API > 数据库
38
36
  */
39
37
  async getLatestBuidUsername(buidUid, currentDbUsername) {
40
38
  // 1. 尝试获取B站官方API的用户信息(最权威)
@@ -53,40 +51,16 @@ class NicknameService {
53
51
  catch (officialError) {
54
52
  this.logger.warn('群昵称设置', `[层1-官方API] ❌ 查询出错: ${officialError.message}`);
55
53
  }
56
- // 2. 尝试获取ZMINFO API的用户信息(可能有缓存)
57
- let zminfoUserData = null;
58
- try {
59
- this.logger.debug('群昵称设置', '正在查询ZMINFO API...');
60
- zminfoUserData = await this.validateBUID(buidUid);
61
- if (zminfoUserData && zminfoUserData.username) {
62
- this.logger.debug('群昵称设置', `[层2-ZMINFO] "${zminfoUserData.username}"`);
63
- }
64
- else {
65
- this.logger.warn('群昵称设置', '[层2-ZMINFO] 查询失败');
66
- }
67
- }
68
- catch (zminfoError) {
69
- this.logger.warn('群昵称设置', `[层2-ZMINFO] 查询出错: ${zminfoError.message}`);
70
- }
71
- // 3. 根据优先级返回结果
54
+ // 2. 根据优先级返回结果
72
55
  if (officialUsername) {
73
56
  this.logger.info('群昵称设置', `🎯 采用官方API结果: "${officialUsername}"`, true);
74
57
  return {
75
58
  username: officialUsername,
76
- source: 'official',
77
- zminfoData: zminfoUserData || undefined
78
- };
79
- }
80
- else if (zminfoUserData && zminfoUserData.username) {
81
- this.logger.info('群昵称设置', `⚠️ 官方API不可用,降级使用ZMINFO: "${zminfoUserData.username}"`, true);
82
- return {
83
- username: zminfoUserData.username,
84
- source: 'zminfo',
85
- zminfoData: zminfoUserData
59
+ source: 'official'
86
60
  };
87
61
  }
88
62
  else {
89
- this.logger.warn('群昵称设置', `⚠️ 官方API和ZMINFO都不可用,使用数据库名称: "${currentDbUsername}"`);
63
+ this.logger.warn('群昵称设置', `⚠️ 官方API不可用,使用数据库名称: "${currentDbUsername}"`);
90
64
  return {
91
65
  username: currentDbUsername,
92
66
  source: 'database'
@@ -94,19 +68,14 @@ class NicknameService {
94
68
  }
95
69
  }
96
70
  /**
97
- * 同步数据库中的B站用户信息
71
+ * 同步数据库中的B站用户名
98
72
  */
99
- async syncDatabaseIfNeeded(normalizedUserId, latestUsername, currentDbUsername, zminfoData) {
73
+ async syncDatabaseIfNeeded(normalizedUserId, latestUsername, currentDbUsername) {
100
74
  if (latestUsername === currentDbUsername) {
101
75
  return; // 无需更新
102
76
  }
103
- if (!zminfoData) {
104
- this.logger.debug('群昵称设置', '无ZMINFO数据,跳过数据库同步');
105
- return;
106
- }
107
77
  try {
108
- const updatedData = { ...zminfoData, username: latestUsername };
109
- await this.updateBuidInfoOnly(normalizedUserId, updatedData);
78
+ await this.updateBuidInfoOnly(normalizedUserId, { username: latestUsername });
110
79
  this.logger.info('群昵称设置', `已同步数据库: "${currentDbUsername}" → "${latestUsername}"`, true);
111
80
  }
112
81
  catch (updateError) {
@@ -178,7 +147,7 @@ class NicknameService {
178
147
  const result = await this.getLatestBuidUsername(buidUid, buidUsername);
179
148
  latestBuidUsername = result.username;
180
149
  // 尝试同步数据库
181
- await this.syncDatabaseIfNeeded(normalizedUserId, latestBuidUsername, buidUsername, result.zminfoData);
150
+ await this.syncDatabaseIfNeeded(normalizedUserId, latestBuidUsername, buidUsername);
182
151
  }
183
152
  // 生成目标昵称
184
153
  const targetNickname = `${latestBuidUsername}(ID:${mcInfo})`;
@@ -15,13 +15,12 @@ class ServiceContainer {
15
15
  constructor(ctx, config, logger, mcidbindRepo, normalizeQQId) {
16
16
  // 1. 实例化 API 服务(无依赖)
17
17
  this.api = new api_service_1.ApiService(logger.createChild('API服务'), {
18
- zminfoApiUrl: config.zminfoApiUrl,
19
18
  SESSDATA: config.forceBindSessdata
20
19
  });
21
20
  // 2. 实例化数据库服务(依赖 API 服务)
22
21
  this.database = new database_service_1.DatabaseService(ctx, logger.createChild('数据库服务'), mcidbindRepo, normalizeQQId, (uuid) => this.api.getUsernameByUuid(uuid));
23
22
  // 3. 实例化群昵称服务(依赖 API 和数据库服务)
24
- this.nickname = new nickname_service_1.NicknameService(logger.createChild('群昵称服务'), { autoNicknameGroupId: config.autoNicknameGroupId }, normalizeQQId, (buid) => this.api.validateBUID(buid), (uid) => this.api.getBilibiliOfficialUserInfo(uid), (userId, buidUser) => this.database.updateBuidInfoOnly(userId, buidUser));
23
+ this.nickname = new nickname_service_1.NicknameService(logger.createChild('群昵称服务'), { autoNicknameGroupId: config.autoNicknameGroupId }, normalizeQQId, (uid) => this.api.getBilibiliOfficialUserInfo(uid), (userId, buidUser) => this.database.updateBuidInfoOnly(userId, buidUser));
25
24
  }
26
25
  }
27
26
  exports.ServiceContainer = ServiceContainer;
@@ -35,8 +35,6 @@ export interface Config {
35
35
  showAvatar: boolean;
36
36
  /** 是否显示MC皮肤渲染 */
37
37
  showMcSkin: boolean;
38
- /** ZMINFO API 地址 (用于获取B站用户信息) */
39
- zminfoApiUrl: string;
40
38
  /** 是否启用天选播报功能 */
41
39
  enableLotteryBroadcast: boolean;
42
40
  /** 天选播报目标群ID (为空则不播报到群) */
@@ -53,6 +51,10 @@ export interface Config {
53
51
  forceBindTargetRoomId: number;
54
52
  /** 强制绑定目标粉丝牌名称 */
55
53
  forceBindTargetMedalName: string;
54
+ /** Supabase项目URL */
55
+ supabaseUrl: string;
56
+ /** Supabase API Key */
57
+ supabaseKey: string;
56
58
  /** 入群申请审批功能配置 */
57
59
  groupRequestReview?: GroupRequestReviewConfig;
58
60
  }
@@ -112,7 +114,6 @@ export interface ServerConfig {
112
114
  */
113
115
  export interface ForceBindConfig {
114
116
  SESSDATA: string;
115
- zminfoApiUrl: string;
116
117
  targetUpUid: number;
117
118
  targetRoomId: number;
118
119
  targetMedalName: string;
@@ -24,9 +24,7 @@
24
24
  * buidUid: '87654321',
25
25
  * buidUsername: 'B站用户名',
26
26
  * guardLevel: 3,
27
- * guardLevelText: '舰长',
28
27
  * maxGuardLevel: 3,
29
- * maxGuardLevelText: '舰长',
30
28
  * medalName: '粉丝牌',
31
29
  * medalLevel: 20,
32
30
  * wealthMedalLevel: 15,
@@ -60,12 +58,8 @@ export interface MCIDBIND {
60
58
  buidUsername: string | null;
61
59
  /** 当前舰长等级 (0=无, 1=总督, 2=提督, 3=舰长) */
62
60
  guardLevel: number;
63
- /** 当前舰长等级文本 (例: '舰长', '提督', '总督') */
64
- guardLevelText: string;
65
61
  /** 历史最高舰长等级 */
66
62
  maxGuardLevel: number;
67
- /** 历史最高舰长等级文本 */
68
- maxGuardLevelText: string;
69
63
  /** 粉丝牌名称 */
70
64
  medalName: string;
71
65
  /** 粉丝牌等级 */
@@ -54,9 +54,7 @@ export interface UpdateMcBindData {
54
54
  * buidUid: '87654321',
55
55
  * buidUsername: 'B站用户名',
56
56
  * guardLevel: 3,
57
- * guardLevelText: '舰长',
58
57
  * maxGuardLevel: 3,
59
- * maxGuardLevelText: '舰长',
60
58
  * medalName: '粉丝牌',
61
59
  * medalLevel: 20,
62
60
  * wealthMedalLevel: 15,
@@ -72,12 +70,8 @@ export interface UpdateBuidBindData {
72
70
  buidUsername?: string | null;
73
71
  /** 当前舰长等级 */
74
72
  guardLevel?: number;
75
- /** 当前舰长等级文本 */
76
- guardLevelText?: string;
77
73
  /** 历史最高舰长等级 */
78
74
  maxGuardLevel?: number;
79
- /** 历史最高舰长等级文本 */
80
- maxGuardLevelText?: string;
81
75
  /** 粉丝牌名称 */
82
76
  medalName?: string;
83
77
  /** 粉丝牌等级 */
@@ -104,7 +98,6 @@ export interface UpdateBuidBindData {
104
98
  * {
105
99
  * buidUsername: '新用户名',
106
100
  * guardLevel: 3,
107
- * guardLevelText: '舰长',
108
101
  * medalLevel: 21
109
102
  * }
110
103
  * ```
@@ -114,12 +107,8 @@ export interface UpdateBuidInfoData {
114
107
  buidUsername?: string;
115
108
  /** 当前舰长等级 */
116
109
  guardLevel?: number;
117
- /** 当前舰长等级文本 */
118
- guardLevelText?: string;
119
110
  /** 历史最高舰长等级 */
120
111
  maxGuardLevel?: number;
121
- /** 历史最高舰长等级文本 */
122
- maxGuardLevelText?: string;
123
112
  /** 粉丝牌名称 */
124
113
  medalName?: string;
125
114
  /** 粉丝牌等级 */
@@ -89,15 +89,7 @@ export declare function levenshteinDistance(str1: string, str2: string): number;
89
89
  * @returns 相似度值(0到1之间,1表示完全相同)
90
90
  */
91
91
  export declare function calculateSimilarity(str1: string, str2: string): number;
92
- /**
93
- * 规范化 Minecraft 用户名(统一小写,用于存储和比较)
94
- * Minecraft 用户名不区分大小写,但 Mojang 返回的是规范大小写
95
- * 为避免 "Notch" 和 "notch" 被视为不同用户,统一转小写存储
96
- *
97
- * @param username MC 用户名
98
- * @param logger Koishi Logger实例(用于日志)
99
- * @returns 规范化后的用户名(小写)
100
- */
92
+ export declare function getGuardLevelText(level: number): string;
101
93
  export declare function normalizeUsername(username: string, logger?: Logger): string;
102
94
  /**
103
95
  * 比较两个 Minecraft 用户名是否相同(不区分大小写)
@@ -11,6 +11,7 @@ exports.escapeRegExp = escapeRegExp;
11
11
  exports.cleanUserInput = cleanUserInput;
12
12
  exports.levenshteinDistance = levenshteinDistance;
13
13
  exports.calculateSimilarity = calculateSimilarity;
14
+ exports.getGuardLevelText = getGuardLevelText;
14
15
  exports.normalizeUsername = normalizeUsername;
15
16
  exports.isSameUsername = isSameUsername;
16
17
  exports.extractBuidUsernameFromNickname = extractBuidUsernameFromNickname;
@@ -369,6 +370,10 @@ function calculateSimilarity(str1, str2) {
369
370
  * @param logger Koishi Logger实例(用于日志)
370
371
  * @returns 规范化后的用户名(小写)
371
372
  */
373
+ const GUARD_LEVEL_TEXT = { 1: '总督', 2: '提督', 3: '舰长' };
374
+ function getGuardLevelText(level) {
375
+ return GUARD_LEVEL_TEXT[level] || '';
376
+ }
372
377
  function normalizeUsername(username, logger) {
373
378
  if (!username) {
374
379
  logger?.warn('[用户名规范化] 收到空用户名');
@@ -18,17 +18,13 @@ export declare class MessageUtils {
18
18
  private config;
19
19
  private logger;
20
20
  private getBindingSessionFn;
21
- private validateBUID?;
22
- private updateBuidInfoOnly?;
23
21
  /**
24
22
  * 创建消息工具实例
25
23
  * @param config 消息工具配置
26
24
  * @param logger 日志服务
27
25
  * @param getBindingSessionFn 获取绑定会话的函数
28
- * @param validateBUID 验证B站UID的函数(可选)
29
- * @param updateBuidInfoOnly 更新B站信息的函数(可选)
30
26
  */
31
- constructor(config: MessageUtilsConfig, logger: LoggerService, getBindingSessionFn: (userId: string, channelId: string) => BindingSession | null, validateBUID?: (uid: string) => Promise<any>, updateBuidInfoOnly?: (qqId: string, buidUser: any) => Promise<boolean>);
27
+ constructor(config: MessageUtilsConfig, logger: LoggerService, getBindingSessionFn: (userId: string, channelId: string) => BindingSession | null);
32
28
  /**
33
29
  * 发送消息并处理自动撤回
34
30
  * @param session Koishi Session对象
@@ -11,22 +11,16 @@ class MessageUtils {
11
11
  config;
12
12
  logger;
13
13
  getBindingSessionFn;
14
- validateBUID;
15
- updateBuidInfoOnly;
16
14
  /**
17
15
  * 创建消息工具实例
18
16
  * @param config 消息工具配置
19
17
  * @param logger 日志服务
20
18
  * @param getBindingSessionFn 获取绑定会话的函数
21
- * @param validateBUID 验证B站UID的函数(可选)
22
- * @param updateBuidInfoOnly 更新B站信息的函数(可选)
23
19
  */
24
- constructor(config, logger, getBindingSessionFn, validateBUID, updateBuidInfoOnly) {
20
+ constructor(config, logger, getBindingSessionFn) {
25
21
  this.config = config;
26
22
  this.logger = logger;
27
23
  this.getBindingSessionFn = getBindingSessionFn;
28
- this.validateBUID = validateBUID;
29
- this.updateBuidInfoOnly = updateBuidInfoOnly;
30
24
  }
31
25
  /**
32
26
  * 发送消息并处理自动撤回
@@ -184,68 +178,7 @@ class MessageUtils {
184
178
  this.logger.info('群昵称设置', `QQ(${normalizedUserId})群昵称已经是"${newNickname}",跳过修改`);
185
179
  return;
186
180
  }
187
- // 昵称不一致,先尝试获取最新的B站用户信息
188
- if (buidUid && this.validateBUID && this.updateBuidInfoOnly) {
189
- this.logger.debug('群昵称设置', `检测到昵称不一致,尝试获取B站UID ${buidUid} 的最新信息...`);
190
- // 1. 提取当前群昵称中的B站用户名
191
- const currentNicknameUsername = (0, helpers_1.extractBuidUsernameFromNickname)(currentNickname);
192
- this.logger.debug('群昵称设置', `从当前群昵称"${currentNickname}"中提取到B站名称: ${currentNicknameUsername || '(无法提取)'}`);
193
- try {
194
- const latestBuidUser = await this.validateBUID(buidUid);
195
- if (latestBuidUser && latestBuidUser.username) {
196
- this.logger.debug('群昵称设置', `API返回B站用户名: "${latestBuidUser.username}"`);
197
- // 2. 智能三层判断
198
- // 情况A: API返回 == 当前群昵称中的名称
199
- if (currentNicknameUsername &&
200
- latestBuidUser.username === currentNicknameUsername) {
201
- this.logger.info('群昵称设置', `✅ 当前群昵称"${currentNickname}"已包含正确的B站名称"${currentNicknameUsername}"`);
202
- // 群昵称已经正确,仅需更新数据库(如果数据库是旧的)
203
- if (latestBuidUser.username !== buidUsername) {
204
- this.logger.info('群昵称设置', `数据库中的B站名称需要更新: "${buidUsername}" → "${latestBuidUser.username}"`);
205
- try {
206
- await this.updateBuidInfoOnly(normalizedUserId, latestBuidUser);
207
- this.logger.info('群昵称设置', '已更新数据库中的B站用户名');
208
- }
209
- catch (updateError) {
210
- this.logger.warn('群昵称设置', `更新数据库失败: ${updateError.message}`);
211
- }
212
- }
213
- else {
214
- this.logger.debug('群昵称设置', '数据库中的B站名称已是最新,无需更新');
215
- }
216
- // 跳过群昵称修改
217
- this.logger.info('群昵称设置', '群昵称格式正确且名称最新,跳过修改');
218
- return;
219
- }
220
- // 情况B: API返回 == 数据库(都是旧的)
221
- if (latestBuidUser.username === buidUsername) {
222
- this.logger.warn('群昵称设置', `⚠️ API返回的B站名称"${latestBuidUser.username}"与数据库一致,但与群昵称不符`);
223
- this.logger.warn('群昵称设置', '可能是API缓存未刷新,采用保守策略:不修改群昵称');
224
- return;
225
- }
226
- // 情况C: API返回新数据(!= 群昵称 且 != 数据库)
227
- this.logger.info('群昵称设置', `检测到B站用户名已更新: "${buidUsername}" → "${latestBuidUser.username}"`);
228
- currentBuidUsername = latestBuidUser.username;
229
- // 更新数据库中的B站信息
230
- try {
231
- await this.updateBuidInfoOnly(normalizedUserId, latestBuidUser);
232
- this.logger.info('群昵称设置', `已更新数据库中的B站用户名为: ${currentBuidUsername}`);
233
- }
234
- catch (updateError) {
235
- this.logger.warn('群昵称设置', `更新数据库中的B站用户名失败: ${updateError.message}`);
236
- // 即使更新数据库失败,也继续使用最新的用户名设置昵称
237
- }
238
- }
239
- else {
240
- this.logger.warn('群昵称设置', `获取最新B站用户信息失败,使用数据库中的用户名: ${currentBuidUsername}`);
241
- }
242
- }
243
- catch (validateError) {
244
- this.logger.warn('群昵称设置', `获取最新B站用户信息时出错: ${validateError.message},使用数据库中的用户名: ${currentBuidUsername}`);
245
- // API调用失败时降级处理,使用数据库中的旧名称
246
- }
247
- }
248
- // 使用(可能已更新的)用户名重新生成昵称
181
+ // 使用数据库中的用户名生成昵称(数据由触发器自动刷新)
249
182
  const finalNickname = `${currentBuidUsername}(ID:${mcInfo})`;
250
183
  // 昵称不一致,执行修改
251
184
  this.logger.debug('群昵称设置', `昵称不一致,正在修改群昵称为: "${finalNickname}"`);
@@ -272,39 +205,6 @@ class MessageUtils {
272
205
  this.logger.warn('群昵称设置', `获取QQ(${normalizedUserId})当前群昵称失败: ${getInfoError.message}`);
273
206
  this.logger.warn('群昵称设置', `错误详情: ${JSON.stringify(getInfoError)}`);
274
207
  this.logger.debug('群昵称设置', '将直接尝试设置新昵称...');
275
- // 如果传入了 buidUid,尝试获取最新的B站用户信息
276
- if (buidUid && this.validateBUID && this.updateBuidInfoOnly) {
277
- this.logger.debug('群昵称设置', `尝试获取B站UID ${buidUid} 的最新信息...`);
278
- try {
279
- const latestBuidUser = await this.validateBUID(buidUid);
280
- if (latestBuidUser && latestBuidUser.username) {
281
- this.logger.debug('群昵称设置', `API返回B站用户名: "${latestBuidUser.username}"`);
282
- // 智能判断:API返回 == 数据库(都是旧的)
283
- if (latestBuidUser.username === buidUsername) {
284
- this.logger.warn('群昵称设置', `⚠️ API返回的B站名称"${latestBuidUser.username}"与数据库一致`);
285
- this.logger.warn('群昵称设置', '可能是API缓存未刷新,且无法获取当前群昵称,采用保守策略:跳过修改');
286
- return;
287
- }
288
- // API返回新数据(!= 数据库)
289
- this.logger.info('群昵称设置', `检测到B站用户名已更新: "${buidUsername}" → "${latestBuidUser.username}"`);
290
- currentBuidUsername = latestBuidUser.username;
291
- // 更新数据库
292
- try {
293
- await this.updateBuidInfoOnly(normalizedUserId, latestBuidUser);
294
- this.logger.info('群昵称设置', `已更新数据库中的B站用户名为: ${currentBuidUsername}`);
295
- }
296
- catch (updateError) {
297
- this.logger.warn('群昵称设置', `更新数据库失败: ${updateError.message}`);
298
- }
299
- }
300
- else {
301
- this.logger.warn('群昵称设置', '获取最新B站用户信息失败');
302
- }
303
- }
304
- catch (validateError) {
305
- this.logger.warn('群昵称设置', `获取最新B站用户信息失败: ${validateError.message}`);
306
- }
307
- }
308
208
  try {
309
209
  // 使用(可能已更新的)用户名生成昵称
310
210
  const nicknameToSet = `${currentBuidUsername}(ID:${mcInfo})`;
@@ -0,0 +1,14 @@
1
+ export interface SupabaseConfig {
2
+ url: string;
3
+ key: string;
4
+ }
5
+ export declare class SupabaseClient {
6
+ private config;
7
+ private client;
8
+ constructor(config: SupabaseConfig);
9
+ get<T>(table: string, query?: string): Promise<T[]>;
10
+ post<T>(table: string, body: object | object[]): Promise<T>;
11
+ postMany<T>(table: string, body: object[]): Promise<T[]>;
12
+ patch(table: string, query: string, body: object): Promise<void>;
13
+ del(table: string, query: string): Promise<number>;
14
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SupabaseClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ class SupabaseClient {
9
+ config;
10
+ client;
11
+ constructor(config) {
12
+ this.config = config;
13
+ this.client = axios_1.default.create({
14
+ baseURL: `${config.url}/rest/v1`,
15
+ headers: {
16
+ apikey: config.key,
17
+ Authorization: `Bearer ${config.key}`,
18
+ 'Content-Type': 'application/json',
19
+ Prefer: 'return=representation',
20
+ },
21
+ });
22
+ }
23
+ async get(table, query = '') {
24
+ const url = query ? `/${table}?${query}` : `/${table}`;
25
+ const { data } = await this.client.get(url);
26
+ return data;
27
+ }
28
+ async post(table, body) {
29
+ const { data } = await this.client.post(`/${table}`, body);
30
+ return Array.isArray(data) ? data[0] : data;
31
+ }
32
+ async postMany(table, body) {
33
+ const { data } = await this.client.post(`/${table}`, body);
34
+ return data;
35
+ }
36
+ async patch(table, query, body) {
37
+ await this.client.patch(`/${table}?${query}`, body);
38
+ }
39
+ async del(table, query) {
40
+ const { data } = await this.client.delete(`/${table}?${query}`);
41
+ return Array.isArray(data) ? data.length : 0;
42
+ }
43
+ }
44
+ exports.SupabaseClient = SupabaseClient;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-bind-bot",
3
3
  "description": "[WittF自用] BIND-BOT - 账号绑定管理机器人,支持Minecraft账号和B站账号绑定与管理。",
4
- "version": "2.2.9",
4
+ "version": "2.4.0",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [