import { OnPlayerJoined } from "@common/shared/modding/players"; import SettingsFile from "@common/shared/settings"; import { SetSetting, SettingTypeChecker } from "@common/shared/typings/settings"; import { OnStart, Service } from "@flamework/core"; import { Events, Functions } from "../network"; import { DataService, Store } from "./data"; /** * The Setting Manager service */ @Service() export class SettingsService implements OnPlayerJoined, OnStart { cache = new Map(); store: Store; /** * @param dataService The instance of the DataService. */ constructor(private dataService: DataService) { this.store = this.dataService.getStore("UserSettings"); } /** * @inheritdoc */ onPlayerJoined(player: Player): void { const store: SetSetting = this.store.get(tostring(player.UserId)) ?? new Map(); this.cache.set(player.UserId, store); } /** * @inheritdoc */ onStart(): void { Functions.settings.GetVersion.setCallback(() => SettingsFile.version); Functions.settings.GetSettings.setCallback((player) => { return this.cache.get(player.UserId) ?? this.store.get(tostring(player.UserId)) ?? new Map(); }); Events.settings.SetSettings.connect((player, section, settings) => { settings.forEach((value, key) => { const setting = SettingsFile[section]?.find((sett) => sett.id === key); if (setting === undefined) return; if (typeIs(value, SettingTypeChecker[setting.type])) { // TODO Better checker this.cache.get(player.UserId)?.get(section)?.set(key, value); } }); }); } }