add feature flag stuff

Signed-off-by: Katalina Okano <git@kat.cafe>
This commit is contained in:
41666 2021-07-27 23:03:00 -04:00
parent 3074db0a21
commit dde05c402e
4 changed files with 53 additions and 0 deletions

View file

@ -0,0 +1,38 @@
import { hasFeature } from '@roleypoly/misc-utils/hasFeature';
import { Features, Guild, GuildData } from '@roleypoly/types';
const flagPercents: Record<Features, { percent: number; rotation: number }> = {
[Features.AuditLogging]: { percent: 0, rotation: 0 },
[Features.AccessControl]: { percent: 0, rotation: 33 },
};
const testingGroup: Guild['id'][] = [
'386659935687147521', // Roleypoly
];
const ONE_HUNDRED = BigInt(100);
export const getFeatureFlags = (
feature: Features,
guildData: GuildData
): Record<Features, boolean> => {
const flags = Object.entries(flagPercents).map(([flag, value]) => {
const intFlag = Number(flag);
const intGuildID = BigInt(guildData.id);
const rotation = BigInt(value.rotation);
const percent = BigInt(value.percent);
if (testingGroup.includes(guildData.id)) {
return [intFlag, true];
}
const percentValue = (intGuildID + rotation) % ONE_HUNDRED;
if (percentValue >= percent) {
return [intFlag, true];
}
return [intFlag, hasFeature(feature, intFlag)];
});
return Object.fromEntries(flags);
};

View file

@ -0,0 +1,8 @@
import { Features } from '@roleypoly/types';
import { hasFeature } from './hasFeature';
it('correctly matches against features', () => {
const features = Features.LegacyGuild;
expect(hasFeature(Features.LegacyGuild, features)).toBe(true);
expect(hasFeature(Features.LegacyGuild, Features.None)).toBe(false);
});

View file

@ -0,0 +1,5 @@
import { Features } from '@roleypoly/types';
export const hasFeature = (feature: Features, features: number): boolean => {
return (features & feature) === feature;
};

View file

@ -13,6 +13,8 @@ export enum Features {
None = 0,
Preview = None,
LegacyGuild = 1 << 1,
AccessControl = 1 << 2,
AuditLogging = 1 << 3,
}
export type GuildData = {