diff --git a/src/channel/Channel.ts b/src/channel/Channel.ts new file mode 100644 index 0000000..a8ccb48 --- /dev/null +++ b/src/channel/Channel.ts @@ -0,0 +1,11 @@ +// TODO Load channel config file + +export class Channel { + constructor(private _id: string) {} + + getID() { + return this._id; + } + + isLobby() {} +} diff --git a/src/channel/settings.ts b/src/channel/settings.ts new file mode 100644 index 0000000..882cb5d --- /dev/null +++ b/src/channel/settings.ts @@ -0,0 +1,65 @@ +import { ChannelSettings } from "../util/types"; + +type Validator = "boolean" | "string" | "number" | ((val: any) => boolean); + +const validationRecord: Record = { + // Brandon + lobby: "boolean", + visible: "boolean", + chat: "boolean", + crownsolo: "boolean", + "no cussing": "boolean", + "lyrical notes": "boolean", + color: val => { + return typeof val === "string" && !!val.match(/^#[0-9a-f]{6}$/i); + }, + color2: val => { + return typeof val === "string" && !!val.match(/^#[0-9a-f]{6}$/i); + }, + owner_id: "string", + + // MPPClone (why?) + limit: "number", + noindex: "boolean" +}; + +/** + * Check the validity of channel settings + * @param set Unknown data + * @returns Record of which settings are correct + */ +export function validateChannelSettings(set: Partial) { + // Create record + let keys = Object.keys(validationRecord); + let record: Partial> = {}; + + for (const key of Object.keys(set)) { + let val = (set as Record)[key]; + let validator = ( + validationRecord as Record + )[key]; + + // Do we have a validator? + if (!validator) { + // Skip setting + continue; + } + + // Set valid status + record[key as keyof ChannelSettings] = validate(val, validator); + } + + return record; +} + +function validate(value: any, validator: Validator) { + // What type of validator? + if (typeof validator == "function") { + // We are copying Zod's functionality + return validator(value) === true; + } else if (typeof value === validator) { + return true; + } + + return false; +}