import {GroupModel} from "../Database/Models/GroupModel"; import {ConfigurationHandler, PathConfigurationFrom} from "./ConfigurationHandler"; import {GroupConfigurationProvider} from "./Groups/GroupConfigurationProvider"; import {Container} from "../Container/Container"; import {GroupConfigurationRepository} from "../Database/Repositories/GroupConfigurationRepository"; import {ServerConfigurationProvider} from "./Server/ServerConfigurationProvider"; import {Snowflake, time} from "discord.js"; import {ServerConfigurationRepository} from "../Database/Repositories/ServerConfigurationRepository"; import tzdata from 'tzdata'; import {Nullable} from "../types/Nullable"; export type Timezone = { zone: string, gmt: string, name: string, } export enum TimezoneSaveTarget { Server, Group } export class TimezoneHandler { public static ALL_TIMEZONES: string[] = Object.keys(tzdata.zones) constructor( private readonly serverid: Snowflake, private readonly group: GroupModel|null = null ) { } public use(callback: () => TReturn): TReturn { const previousTZ = process.env.TZ; process.env.TZ = this.getCurrentTimezone(); const result = callback(); process.env.TZ = previousTZ; return result; } public getCurrentTimezone(): string { const configs = [ this.getGroupConfiguration(), this.getServerConfiguration() ]; for (const config of configs) { if (!config) { continue; } const timezone = config.getConfigurationByPath('timezone'); if (timezone.from === PathConfigurationFrom.Default) { continue; } return timezone.value; } return process.env.TZ ?? "Europe/London"; } public save(timezone: string, target: TimezoneSaveTarget) { const config = target === TimezoneSaveTarget.Server ? this.getServerConfiguration() : this.getGroupConfiguration(); if (!config) { return; } config.save('timezone', timezone); } private getGroupConfiguration(): Nullable { if (!this.group) { return null; } return new ConfigurationHandler( new GroupConfigurationProvider( Container.get(GroupConfigurationRepository.name), this.group ) ); } private getServerConfiguration(): ConfigurationHandler { return new ConfigurationHandler( new ServerConfigurationProvider( Container.get(ServerConfigurationRepository.name), this.serverid ) ) } }