chore(release): 0.4.1
[risinglegends.git] / src / server / events.ts
1 import { db } from './lib/db';
2 import { version } from '../../package.json';
3 import { CreatedEvent, Event, EventName } from '../shared/event';
4 import { isEqual } from 'lodash';
5 import { logger } from './lib/logger';
6 import { EVENT_FLUSH_INTERVAL, EVENT_SECOND_BUCKET } from '../shared/constants';
7
8 const eventBuffer: CreatedEvent[] = [];
9 const maxToAdd = 10;
10
11 export async function flushBuffer() {
12   const events = eventBuffer.splice(0, maxToAdd);
13   if(events.length) {
14     await addEvents(events);
15     logger.log(`Flushed ${events.length} events`);
16   }
17   setTimeout(flushBuffer, EVENT_FLUSH_INTERVAL);
18 }
19
20 function bucketTime(date: Date): Date {
21   const d = new Date();
22   d.setFullYear(date.getFullYear());
23   d.setMonth(date.getMonth());
24   d.setDate(date.getDate());
25   d.setHours(date.getHours());
26   d.setMinutes(date.getMinutes());
27   d.setMilliseconds(0);
28
29   const s = date.getSeconds();
30
31   // round down to closest 5 second interval
32   d.setSeconds(s - (s%EVENT_SECOND_BUCKET));
33   return d;
34 }
35
36
37 export async function addEvent(event_name: EventName, player_id: string, props?: any, created?: Date) {
38   eventBuffer.push({
39     event_name,
40     player_id,
41     app_version: version,
42     props: props,
43     created
44   });
45 }
46
47 export async function addEvents(events: CreatedEvent[]) {
48   return db('events').insert(events);
49 }
50
51 export async function getEventHistory(player_id: string, event_name: EventName) {
52   return db.select('*').from<Event<any>>('events').where({
53     player_id,
54     event_name
55   });
56 }
57
58 export async function getEventHistoryToday(player_id: string, event_name: EventName) {
59   return db.select('*').from<Event<any>>('events').where({
60     player_id,
61     event_name
62   }).andWhere('created', '>=', db.raw('current_date::timestamp'));
63
64 }
65
66 export async function hasNeverHappenedBefeore(name: EventName, player_id: string, props?: any): Promise<boolean> {
67   return hasHappendXTimes(0, name, player_id, props);
68 }
69
70 export async function hasHappendXTimes(times: number, event_name: EventName, player_id: string, props?: any): Promise<boolean> {
71   const res: Event<any>[] = await getEventHistory(player_id, event_name);
72
73   if(props) {
74     return res.filter(row => isEqual(row.props, props)).length === times;
75   }
76   return res.length === times;
77 }