1
1
import debug from 'debug' ;
2
2
import aquarius from '../..' ;
3
- import { ONE_WEEK } from '../helpers/times' ;
3
+ import { ONE_WEEK , ONE_HOUR } from '../helpers/times' ;
4
+ import { startOfWeek } from 'date-fns/esm' ;
4
5
5
- const log = debug ( 'GuildMetrics ' ) ;
6
+ const log = debug ( 'Guild Metrics ' ) ;
6
7
7
- // TODO: Implement
8
- export function saveSnapshot ( guild ) {
9
- console . log ( guild ) ;
10
- }
11
- // TODO: Implement
12
- export function saveSnapshots ( ) {
8
+ export async function saveSnapshots ( ) {
13
9
log ( 'Saving snapshots' ) ;
14
- aquarius . guilds . forEach ( guild => saveSnapshot ( guild ) ) ;
10
+
11
+ const bulk = aquarius . database . guildSnapshots . initializeOrderedBulkOp ( ) ;
12
+
13
+ aquarius . guilds . forEach ( guild => {
14
+ bulk . insert ( {
15
+ channels : guild . channels . size ,
16
+ users : guild . members . size ,
17
+ bots : guild . members . filter ( member => member . user . bot ) . size ,
18
+ date : Date . now ( ) ,
19
+ guildId : guild . id ,
20
+ name : guild . name ,
21
+ icon : guild . iconURL ,
22
+ ownerId : guild . ownerID ,
23
+ vip : ! ! guild . splash ,
24
+ verified : guild . verified ,
25
+ admin : aquarius . permissions . isGuildAdmin ( guild , guild . me ) ,
26
+ } ) ;
27
+ } ) ;
28
+
29
+ return bulk . execute ( ) ;
15
30
}
16
31
17
32
// TODO: Implement
@@ -25,7 +40,8 @@ export async function getGuildMetrics() {
25
40
const snapshot = await aquarius . database . guildSnapshots
26
41
. findAsCursor ( { guildId : guild . id } )
27
42
. sort ( { date : - 1 } )
28
- . limit ( 5 ) ;
43
+ . limit ( 5 )
44
+ . toArray ( ) ;
29
45
30
46
return {
31
47
name : guild . name ,
@@ -46,14 +62,33 @@ export async function getGuildMetrics() {
46
62
export async function setupWeeklyGuildLoop ( ) {
47
63
log ( 'Registering Metric Tracking' ) ;
48
64
49
- // TODO: Load from settings the last weekly snapshot
50
- const lastSnapshot = null ;
51
- const target = lastSnapshot . timestamp + ONE_WEEK - Date . now ( ) ;
65
+ // Retrieve the last time we updated
66
+ const [ lastSnapshot ] = await aquarius . database . guildSnapshots . findAsCursor ( )
67
+ . sort ( { date : - 1 } )
68
+ . limit ( 1 )
69
+ . toArray ( ) ;
70
+
71
+ let target = 0 ;
72
+
73
+ if ( lastSnapshot ) {
74
+ // We want to target 1:00 on Sunday of the next week
75
+ target = startOfWeek ( new Date ( lastSnapshot . date + ONE_WEEK ) ) . getTime ( ) + ONE_HOUR ;
76
+ }
77
+
78
+ // If we missed it, save immediately and push to next week
79
+ if ( target <= Date . now ( ) ) {
80
+ await saveSnapshots ( ) ;
81
+ target = startOfWeek ( new Date ( ) ) . getTime ( ) + ONE_WEEK + ONE_HOUR ;
82
+ }
52
83
84
+ // Create a loop that looks to further Sundays!
53
85
setTimeout ( ( ) => {
54
86
saveSnapshots ( ) ;
55
- setInterval ( saveSnapshots , ONE_WEEK ) ;
56
- } , target ) ;
87
+ setInterval (
88
+ saveSnapshots ,
89
+ ( ONE_WEEK + ONE_HOUR ) - ( Date . now ( ) - startOfWeek ( new Date ( ) ) . getTime ( ) )
90
+ ) ;
91
+ } , target - Date . now ( ) ) ;
57
92
}
58
93
59
94
export function getTotalGuildCount ( ) {
0 commit comments