discord-voice-tracker 1.0.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.
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ // src/storage/JSONStorage.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.JSONStorage = void 0;
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ /**
8
+ * JSON file-based storage adapter
9
+ */
10
+ class JSONStorage {
11
+ dataDir;
12
+ guildsFile;
13
+ sessionsFile;
14
+ cache;
15
+ constructor(dataDir = './data') {
16
+ this.dataDir = dataDir;
17
+ this.guildsFile = (0, path_1.join)(dataDir, 'guilds.json');
18
+ this.sessionsFile = (0, path_1.join)(dataDir, 'sessions.json');
19
+ this.cache = new Map();
20
+ }
21
+ async init() {
22
+ // Create data directory if it doesn't exist
23
+ try {
24
+ await fs_1.promises.mkdir(this.dataDir, { recursive: true });
25
+ }
26
+ catch (error) {
27
+ // Directory already exists
28
+ }
29
+ // Initialize files
30
+ await this.ensureFile(this.guildsFile, '{}');
31
+ await this.ensureFile(this.sessionsFile, '[]');
32
+ // Load data into cache
33
+ await this.loadCache();
34
+ }
35
+ async ensureFile(path, defaultContent) {
36
+ try {
37
+ await fs_1.promises.access(path);
38
+ }
39
+ catch {
40
+ await fs_1.promises.writeFile(path, defaultContent, 'utf-8');
41
+ }
42
+ }
43
+ async loadCache() {
44
+ try {
45
+ const data = await fs_1.promises.readFile(this.guildsFile, 'utf-8');
46
+ const guilds = JSON.parse(data, this.dateReviver);
47
+ for (const [guildId, guildData] of Object.entries(guilds)) {
48
+ this.cache.set(guildId, this.deserializeGuild(guildData));
49
+ }
50
+ }
51
+ catch (error) {
52
+ console.error('Error loading cache:', error);
53
+ }
54
+ }
55
+ async saveCache() {
56
+ const guilds = {};
57
+ for (const [guildId, guildData] of this.cache) {
58
+ guilds[guildId] = this.serializeGuild(guildData);
59
+ }
60
+ await fs_1.promises.writeFile(this.guildsFile, JSON.stringify(guilds, null, 2), 'utf-8');
61
+ }
62
+ dateReviver(_key, value) {
63
+ if (typeof value === 'string') {
64
+ const datePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/;
65
+ if (datePattern.test(value)) {
66
+ return new Date(value);
67
+ }
68
+ }
69
+ return value;
70
+ }
71
+ serializeGuild(guildData) {
72
+ return {
73
+ guildId: guildData.guildId,
74
+ config: guildData.config,
75
+ users: Array.from(guildData.users.values()),
76
+ lastUpdated: guildData.lastUpdated,
77
+ };
78
+ }
79
+ deserializeGuild(data) {
80
+ const users = new Map();
81
+ if (Array.isArray(data.users)) {
82
+ for (const user of data.users) {
83
+ users.set(user.userId, user);
84
+ }
85
+ }
86
+ return {
87
+ guildId: data.guildId,
88
+ config: data.config,
89
+ users,
90
+ lastUpdated: new Date(data.lastUpdated),
91
+ };
92
+ }
93
+ async getGuild(guildId) {
94
+ return this.cache.get(guildId) || null;
95
+ }
96
+ async saveGuild(guildData) {
97
+ this.cache.set(guildData.guildId, guildData);
98
+ await this.saveCache();
99
+ }
100
+ async deleteGuild(guildId) {
101
+ this.cache.delete(guildId);
102
+ await this.saveCache();
103
+ }
104
+ async getUser(guildId, userId) {
105
+ const guild = this.cache.get(guildId);
106
+ if (!guild)
107
+ return null;
108
+ return guild.users.get(userId) || null;
109
+ }
110
+ async saveUser(guildId, userData) {
111
+ let guild = this.cache.get(guildId);
112
+ if (!guild) {
113
+ // Create guild if it doesn't exist
114
+ guild = {
115
+ guildId,
116
+ config: {}, // Will be set properly when config is saved
117
+ users: new Map(),
118
+ lastUpdated: new Date(),
119
+ };
120
+ this.cache.set(guildId, guild);
121
+ }
122
+ guild.users.set(userData.userId, userData);
123
+ guild.lastUpdated = new Date();
124
+ await this.saveCache();
125
+ }
126
+ async deleteUser(guildId, userId) {
127
+ const guild = this.cache.get(guildId);
128
+ if (guild) {
129
+ guild.users.delete(userId);
130
+ guild.lastUpdated = new Date();
131
+ await this.saveCache();
132
+ }
133
+ }
134
+ async getAllGuilds() {
135
+ return Array.from(this.cache.values());
136
+ }
137
+ async getLeaderboard(guildId, sortBy, limit, offset) {
138
+ const guild = this.cache.get(guildId);
139
+ if (!guild)
140
+ return [];
141
+ const users = Array.from(guild.users.values());
142
+ // Sort users
143
+ users.sort((a, b) => {
144
+ switch (sortBy) {
145
+ case 'voiceTime':
146
+ return b.totalVoiceTime - a.totalVoiceTime;
147
+ case 'xp':
148
+ return b.xp - a.xp;
149
+ case 'level':
150
+ return b.level - a.level || b.xp - a.xp; // Secondary sort by XP
151
+ default:
152
+ return 0;
153
+ }
154
+ });
155
+ // Apply pagination
156
+ const paginated = users.slice(offset, offset + limit);
157
+ // Create leaderboard entries with ranks
158
+ return paginated.map((user, index) => ({
159
+ userId: user.userId,
160
+ guildId: user.guildId,
161
+ voiceTime: user.totalVoiceTime,
162
+ xp: user.xp,
163
+ level: user.level,
164
+ rank: offset + index + 1,
165
+ }));
166
+ }
167
+ async saveSession(session) {
168
+ try {
169
+ const data = await fs_1.promises.readFile(this.sessionsFile, 'utf-8');
170
+ const sessions = JSON.parse(data);
171
+ sessions.push(session);
172
+ // Keep only last 10000 sessions
173
+ if (sessions.length > 10000) {
174
+ sessions.splice(0, sessions.length - 10000);
175
+ }
176
+ await fs_1.promises.writeFile(this.sessionsFile, JSON.stringify(sessions, null, 2), 'utf-8');
177
+ }
178
+ catch (error) {
179
+ console.error('Error saving session:', error);
180
+ }
181
+ }
182
+ async getSessions(guildId, userId, limit = 50) {
183
+ try {
184
+ const data = await fs_1.promises.readFile(this.sessionsFile, 'utf-8');
185
+ const sessions = JSON.parse(data, this.dateReviver);
186
+ return sessions
187
+ .filter((s) => s.guildId === guildId && s.userId === userId)
188
+ .sort((a, b) => b.startTime.getTime() - a.startTime.getTime())
189
+ .slice(0, limit);
190
+ }
191
+ catch (error) {
192
+ console.error('Error getting sessions:', error);
193
+ return [];
194
+ }
195
+ }
196
+ async close() {
197
+ await this.saveCache();
198
+ this.cache.clear();
199
+ }
200
+ }
201
+ exports.JSONStorage = JSONStorage;
202
+ //# sourceMappingURL=JSONStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONStorage.js","sourceRoot":"","sources":["../../src/storage/JSONStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { StorageAdapter, GuildData, UserData, SessionData, LeaderboardEntry } from '../types';
2
+ /**
3
+ * MongoDB storage adapter
4
+ */
5
+ export declare class MongoStorage implements StorageAdapter {
6
+ private client;
7
+ private db;
8
+ private guildsCollection;
9
+ private usersCollection;
10
+ private sessionsCollection;
11
+ private dbName;
12
+ constructor(connectionString: string, dbName?: string);
13
+ init(): Promise<void>;
14
+ private createIndexes;
15
+ getGuild(guildId: string): Promise<GuildData | null>;
16
+ saveGuild(guildData: GuildData): Promise<void>;
17
+ deleteGuild(guildId: string): Promise<void>;
18
+ getUser(guildId: string, userId: string): Promise<UserData | null>;
19
+ saveUser(guildId: string, userData: UserData): Promise<void>;
20
+ deleteUser(guildId: string, userId: string): Promise<void>;
21
+ getAllGuilds(): Promise<GuildData[]>;
22
+ getLeaderboard(guildId: string, sortBy: 'voiceTime' | 'xp' | 'level', limit: number, offset: number): Promise<LeaderboardEntry[]>;
23
+ saveSession(session: SessionData): Promise<void>;
24
+ getSessions(guildId: string, userId: string, limit?: number): Promise<SessionData[]>;
25
+ close(): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=MongoStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoStorage.d.ts","sourceRoot":"","sources":["../../src/storage/MongoStorage.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,cAAc,EACd,SAAS,EACT,QAAQ,EACR,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAiBlB;;GAEG;AACH,qBAAa,YAAa,YAAW,cAAc;IACjD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,MAAM,CAAS;gBAEX,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAE,MAAuB;IAK/D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAmBb,aAAa;IAerB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA0BpD,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC9C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAalE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1D,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IA6BpC,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,EACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAyBxB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhD,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC;IAkBnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ // src/storage/MongoStorage.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.MongoStorage = void 0;
5
+ const mongodb_1 = require("mongodb");
6
+ /**
7
+ * MongoDB storage adapter
8
+ */
9
+ class MongoStorage {
10
+ client;
11
+ db;
12
+ guildsCollection;
13
+ usersCollection;
14
+ sessionsCollection;
15
+ dbName;
16
+ constructor(connectionString, dbName = 'voicetracker') {
17
+ this.dbName = dbName;
18
+ this.client = new mongodb_1.MongoClient(connectionString);
19
+ }
20
+ async init() {
21
+ try {
22
+ await this.client.connect();
23
+ this.db = this.client.db(this.dbName);
24
+ this.guildsCollection = this.db.collection('guilds');
25
+ this.usersCollection = this.db.collection('users');
26
+ this.sessionsCollection = this.db.collection('sessions');
27
+ // Create indexes for better performance
28
+ await this.createIndexes();
29
+ console.log('✅ MongoDB connected successfully');
30
+ }
31
+ catch (error) {
32
+ console.error('❌ MongoDB connection error:', error);
33
+ throw error;
34
+ }
35
+ }
36
+ async createIndexes() {
37
+ // Guild indexes
38
+ await this.guildsCollection.createIndex({ guildId: 1 }, { unique: true });
39
+ // User indexes
40
+ await this.usersCollection.createIndex({ guildId: 1, userId: 1 }, { unique: true });
41
+ await this.usersCollection.createIndex({ guildId: 1, xp: -1 });
42
+ await this.usersCollection.createIndex({ guildId: 1, level: -1 });
43
+ await this.usersCollection.createIndex({ guildId: 1, totalVoiceTime: -1 });
44
+ // Session indexes
45
+ await this.sessionsCollection.createIndex({ guildId: 1, userId: 1 });
46
+ await this.sessionsCollection.createIndex({ startTime: -1 });
47
+ }
48
+ async getGuild(guildId) {
49
+ try {
50
+ const guildDoc = await this.guildsCollection.findOne({ guildId });
51
+ if (!guildDoc)
52
+ return null;
53
+ // Get all users for this guild
54
+ const users = await this.usersCollection.find({ guildId }).toArray();
55
+ const userMap = new Map();
56
+ for (const user of users) {
57
+ const { _id, ...userData } = user;
58
+ userMap.set(user.userId, userData);
59
+ }
60
+ return {
61
+ guildId: guildDoc.guildId,
62
+ config: guildDoc.config,
63
+ users: userMap,
64
+ lastUpdated: guildDoc.lastUpdated,
65
+ };
66
+ }
67
+ catch (error) {
68
+ console.error('Error getting guild:', error);
69
+ return null;
70
+ }
71
+ }
72
+ async saveGuild(guildData) {
73
+ try {
74
+ // Save guild config
75
+ await this.guildsCollection.updateOne({ guildId: guildData.guildId }, {
76
+ $set: {
77
+ guildId: guildData.guildId,
78
+ config: guildData.config,
79
+ lastUpdated: guildData.lastUpdated,
80
+ },
81
+ }, { upsert: true });
82
+ // Save all users
83
+ const bulkOps = Array.from(guildData.users.values()).map((user) => ({
84
+ updateOne: {
85
+ filter: { guildId: user.guildId, userId: user.userId },
86
+ update: { $set: user },
87
+ upsert: true,
88
+ },
89
+ }));
90
+ if (bulkOps.length > 0) {
91
+ await this.usersCollection.bulkWrite(bulkOps);
92
+ }
93
+ }
94
+ catch (error) {
95
+ console.error('Error saving guild:', error);
96
+ throw error;
97
+ }
98
+ }
99
+ async deleteGuild(guildId) {
100
+ try {
101
+ await this.guildsCollection.deleteOne({ guildId });
102
+ await this.usersCollection.deleteMany({ guildId });
103
+ await this.sessionsCollection.deleteMany({ guildId });
104
+ }
105
+ catch (error) {
106
+ console.error('Error deleting guild:', error);
107
+ throw error;
108
+ }
109
+ }
110
+ async getUser(guildId, userId) {
111
+ try {
112
+ const userDoc = await this.usersCollection.findOne({ guildId, userId });
113
+ if (!userDoc)
114
+ return null;
115
+ const { _id, ...userData } = userDoc;
116
+ return userData;
117
+ }
118
+ catch (error) {
119
+ console.error('Error getting user:', error);
120
+ return null;
121
+ }
122
+ }
123
+ async saveUser(guildId, userData) {
124
+ try {
125
+ await this.usersCollection.updateOne({ guildId, userId: userData.userId }, { $set: userData }, { upsert: true });
126
+ }
127
+ catch (error) {
128
+ console.error('Error saving user:', error);
129
+ throw error;
130
+ }
131
+ }
132
+ async deleteUser(guildId, userId) {
133
+ try {
134
+ await this.usersCollection.deleteOne({ guildId, userId });
135
+ }
136
+ catch (error) {
137
+ console.error('Error deleting user:', error);
138
+ throw error;
139
+ }
140
+ }
141
+ async getAllGuilds() {
142
+ try {
143
+ const guildDocs = await this.guildsCollection.find().toArray();
144
+ const guilds = [];
145
+ for (const guildDoc of guildDocs) {
146
+ const users = await this.usersCollection.find({ guildId: guildDoc.guildId }).toArray();
147
+ const userMap = new Map();
148
+ for (const user of users) {
149
+ const { _id, ...userData } = user;
150
+ userMap.set(user.userId, userData);
151
+ }
152
+ guilds.push({
153
+ guildId: guildDoc.guildId,
154
+ config: guildDoc.config,
155
+ users: userMap,
156
+ lastUpdated: guildDoc.lastUpdated,
157
+ });
158
+ }
159
+ return guilds;
160
+ }
161
+ catch (error) {
162
+ console.error('Error getting all guilds:', error);
163
+ return [];
164
+ }
165
+ }
166
+ async getLeaderboard(guildId, sortBy, limit, offset) {
167
+ try {
168
+ const sortField = sortBy === 'voiceTime' ? 'totalVoiceTime' : sortBy;
169
+ const users = await this.usersCollection
170
+ .find({ guildId })
171
+ .sort({ [sortField]: -1, xp: -1 }) // Secondary sort by XP
172
+ .skip(offset)
173
+ .limit(limit)
174
+ .toArray();
175
+ return users.map((user, index) => ({
176
+ userId: user.userId,
177
+ guildId: user.guildId,
178
+ voiceTime: user.totalVoiceTime,
179
+ xp: user.xp,
180
+ level: user.level,
181
+ rank: offset + index + 1,
182
+ }));
183
+ }
184
+ catch (error) {
185
+ console.error('Error getting leaderboard:', error);
186
+ return [];
187
+ }
188
+ }
189
+ async saveSession(session) {
190
+ try {
191
+ await this.sessionsCollection.insertOne(session);
192
+ }
193
+ catch (error) {
194
+ console.error('Error saving session:', error);
195
+ }
196
+ }
197
+ async getSessions(guildId, userId, limit = 50) {
198
+ try {
199
+ const sessions = await this.sessionsCollection
200
+ .find({ guildId, userId })
201
+ .sort({ startTime: -1 })
202
+ .limit(limit)
203
+ .toArray();
204
+ return sessions.map((session) => {
205
+ const { _id, ...sessionData } = session;
206
+ return sessionData;
207
+ });
208
+ }
209
+ catch (error) {
210
+ console.error('Error getting sessions:', error);
211
+ return [];
212
+ }
213
+ }
214
+ async close() {
215
+ await this.client.close();
216
+ console.log('✅ MongoDB connection closed');
217
+ }
218
+ }
219
+ exports.MongoStorage = MongoStorage;
220
+ //# sourceMappingURL=MongoStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoStorage.js","sourceRoot":"","sources":["../../src/storage/MongoStorage.ts"],"names":[],"mappings":"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"}