mirror of
https://github.com/roleypoly/roleypoly.git
synced 2025-04-24 19:39:11 +00:00
add feature flag stuff
Signed-off-by: Katalina Okano <git@kat.cafe>
This commit is contained in:
parent
3074db0a21
commit
dde05c402e
4 changed files with 53 additions and 0 deletions
38
packages/api/utils/feature-flags.ts
Normal file
38
packages/api/utils/feature-flags.ts
Normal 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);
|
||||||
|
};
|
8
packages/misc-utils/hasFeature.spec.ts
Normal file
8
packages/misc-utils/hasFeature.spec.ts
Normal 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);
|
||||||
|
});
|
5
packages/misc-utils/hasFeature.ts
Normal file
5
packages/misc-utils/hasFeature.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import { Features } from '@roleypoly/types';
|
||||||
|
|
||||||
|
export const hasFeature = (feature: Features, features: number): boolean => {
|
||||||
|
return (features & feature) === feature;
|
||||||
|
};
|
|
@ -13,6 +13,8 @@ export enum Features {
|
||||||
None = 0,
|
None = 0,
|
||||||
Preview = None,
|
Preview = None,
|
||||||
LegacyGuild = 1 << 1,
|
LegacyGuild = 1 << 1,
|
||||||
|
AccessControl = 1 << 2,
|
||||||
|
AuditLogging = 1 << 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
export type GuildData = {
|
export type GuildData = {
|
||||||
|
|
Loading…
Add table
Reference in a new issue