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';
8 const eventBuffer: CreatedEvent[] = [];
11 export async function flushBuffer() {
12 const events = eventBuffer.splice(0, maxToAdd);
14 await addEvents(events);
15 logger.log(`Flushed ${events.length} events`);
17 setTimeout(flushBuffer, EVENT_FLUSH_INTERVAL);
20 function bucketTime(date: Date): 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());
29 const s = date.getSeconds();
31 // round down to closest 5 second interval
32 d.setSeconds(s - (s%EVENT_SECOND_BUCKET));
37 export async function addEvent(event_name: EventName, player_id: string, props?: any, created?: Date) {
47 export async function addEvents(events: CreatedEvent[]) {
48 return db('events').insert(events);
51 export async function getEventHistory(player_id: string, event_name: EventName) {
52 return db.select('*').from<Event<any>>('events').where({
58 export async function getEventHistoryToday(player_id: string, event_name: EventName) {
59 return db.select('*').from<Event<any>>('events').where({
62 }).andWhere('created', '>=', db.raw('current_date::timestamp'));
66 export async function hasNeverHappenedBefeore(name: EventName, player_id: string, props?: any): Promise<boolean> {
67 return hasHappendXTimes(0, name, player_id, props);
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);
74 return res.filter(row => isEqual(row.props, props)).length === times;
76 return res.length === times;