51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
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<number, SetSetting>();
|
|
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<SetSetting>(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);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|