Skip to content

Commit

Permalink
Rewrite Guild Utils
Browse files Browse the repository at this point in the history
  • Loading branch information
Kathund committed Oct 6, 2024
1 parent 04f22f5 commit e78f034
Show file tree
Hide file tree
Showing 8 changed files with 161 additions and 46 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"prettier": "npx prettier --write src/",
"build": "npx tsc",
"test": "npx vitest run",
"test:coverage": "npx vitest run --coverage",
"test:coverage": "npx vitest run --coverage && mv coverage/clover.xml .github/coverageData.xml && npx tsx .github/checkCoverage.ts",
"test:ui": "npx vitest --ui --coverage"
},
"engines": {
Expand Down
61 changes: 61 additions & 0 deletions src/structures/Guild/Guild.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import Color from '../Color.js';
import Game from '../Game.js';
import Guild from './Guild.js';
import GuildMember from './GuildMember.js';
import GuildRank from './GuildRank.js';
import { ExpHistory } from '../../utils/Guild.js';
import { expect, expectTypeOf, test } from 'vitest';

test('Guild', () => {
const data = new Guild({ stats: 'meow' });
expect(data).toBeDefined();
expect(data).toBeInstanceOf(Guild);
expectTypeOf(data).toEqualTypeOf<Guild>();
expect(data.id).toBeDefined();
expectTypeOf(data.id).toEqualTypeOf<string>();
expect(data.name).toBeDefined();
expectTypeOf(data.name).toEqualTypeOf<string>();
expect(data.description).toBeDefined();
expectTypeOf(data.description).toEqualTypeOf<string>();
expect(data.experience).toBeDefined();
expectTypeOf(data.experience).toEqualTypeOf<number>();
expect(data.level).toBeDefined();
expectTypeOf(data.level).toEqualTypeOf<number>();
expect(data.members).toBeDefined();
expectTypeOf(data.members).toEqualTypeOf<GuildMember[]>();
expect(data.me).toBeDefined();
expectTypeOf(data.me).toEqualTypeOf<GuildMember | null>();
expect(data.ranks).toBeDefined();
expectTypeOf(data.ranks).toEqualTypeOf<GuildRank[]>();
expect(data.totalWeeklyGexp).toBeDefined();
expectTypeOf(data.totalWeeklyGexp).toEqualTypeOf<number>();
expect(data.createdAtTimestamp).toBeDefined();
expectTypeOf(data.createdAtTimestamp).toEqualTypeOf<number | null>();
expect(data.createdAt).toBeDefined();
expectTypeOf(data.createdAt).toEqualTypeOf<Date | null>();
expect(data.joinable).toBeDefined();
expectTypeOf(data.joinable).toEqualTypeOf<boolean>();
expect(data.publiclyListed).toBeDefined();
expectTypeOf(data.publiclyListed).toEqualTypeOf<boolean>();
expect(data.chatMuteUntilTimestamp).toBeDefined();
expectTypeOf(data.chatMuteUntilTimestamp).toEqualTypeOf<number | null>();
expect(data.chatMuteUntil).toBeDefined();
expectTypeOf(data.chatMuteUntil).toEqualTypeOf<Date | null>();
expect(data.banner).toBeDefined();
expectTypeOf(data.banner).toEqualTypeOf<{ Pattern: string; Color: string }[]>();
expect(data.tag).toBeDefined();
expectTypeOf(data.tag).toEqualTypeOf<string>();
expect(data.tagColor).toBeDefined();
expectTypeOf(data.tagColor).toEqualTypeOf<Color | null>();
expect(data.expHistory).toBeDefined();
expectTypeOf(data.expHistory).toEqualTypeOf<ExpHistory[]>();
expect(data.achievements).toBeDefined();
expectTypeOf(data.achievements).toEqualTypeOf<{ winners: number; experienceKings: number; onlinePlayers: number }>();
expect(data.preferredGames).toBeDefined();
expectTypeOf(data.preferredGames).toEqualTypeOf<Game[]>();
expect(data.toString()).toBeDefined();
expect(data.toString()).toBe(data.name);
expectTypeOf(data.toString()).toEqualTypeOf<string>();
expect(data.guildMaster).toBeDefined();
expectTypeOf(data.guildMaster()).toEqualTypeOf<GuildMember | undefined>();
});
28 changes: 14 additions & 14 deletions src/structures/Guild/Guild.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ class Guild {
me: GuildMember | null;
ranks: GuildRank[];
totalWeeklyGexp: number;
createdAtTimestamp: string;
createdAt: Date;
createdAtTimestamp: number | null;
createdAt: Date | null;
joinable: boolean;
publiclyListed: boolean;
chatMuteUntilTimestamp: number | null;
Expand All @@ -28,29 +28,29 @@ class Guild {
preferredGames: Game[];
constructor(data: Record<string, any>, uuid?: string) {
// eslint-disable-next-line no-underscore-dangle
this.id = data._id;
this.name = data.name;
this.id = data._id || 'Unknown';
this.name = data.name || 'Unknown';
this.description = data.description ?? '';
this.experience = data.exp || 0;
this.level = getGuildLevel(this.experience);
this.members = members(data);
this.members = members(data?.members || []);
this.me = uuid ? (this.members.find((member) => member.uuid === uuid) as GuildMember) : null;
this.ranks = ranks(data);
this.totalWeeklyGexp = totalWeeklyGexp(data);
this.createdAtTimestamp = data.created;
this.createdAt = new Date(this.createdAtTimestamp);
this.totalWeeklyGexp = totalWeeklyGexp(this.members);
this.createdAtTimestamp = data.created || null;
this.createdAt = this.createdAtTimestamp ? new Date(this.createdAtTimestamp) : null;
this.joinable = data.joinable ?? false;
this.publiclyListed = Boolean(data.publiclyListed);
this.chatMuteUntilTimestamp = data.chatMute ?? null;
this.chatMuteUntil = this.chatMuteUntilTimestamp ? new Date(this.chatMuteUntilTimestamp) : null;
this.banner = data.banner ?? null;
this.tag = data.tag ?? null;
this.tagColor = data.tagColor ? new Color(data.tagColor) : null;
this.expHistory = calculateExpHistory(data);
this.expHistory = calculateExpHistory(this.members);
this.achievements = {
winners: data.achievements.WINNERS ?? 0,
experienceKings: data.achievements.EXPERIENCE_KINGS ?? 0,
onlinePlayers: data.achievements.ONLINE_PLAYERS ?? 0
winners: data?.achievements?.WINNERS || 0,
experienceKings: data?.achievements?.EXPERIENCE_KINGS || 0,
onlinePlayers: data?.achievements?.ONLINE_PLAYERS || 0
};
this.preferredGames = data.preferredGames ? data.preferredGames.map((g: any) => new Game(g)) : [];
}
Expand All @@ -59,8 +59,8 @@ class Guild {
return this.name;
}

guildMaster(): GuildMember {
return this.members.find((member) => 'Guild Master' === member.rank) as GuildMember;
guildMaster(): GuildMember | undefined {
return this.members.find((member) => 'Guild Master' === member.rank);
}
}

Expand Down
31 changes: 31 additions & 0 deletions src/structures/Guild/GuildMember.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import GuildMember from './GuildMember.js';
import { ExpHistory } from '../../utils/Guild.js';
import { expect, expectTypeOf, test } from 'vitest';

test('Guild Member', () => {
const data = new GuildMember({ stats: 'meow' });
expect(data).toBeDefined();
expect(data).toBeInstanceOf(GuildMember);
expectTypeOf(data).toEqualTypeOf<GuildMember>();
expect(data.uuid).toBeDefined();
expectTypeOf(data.uuid).toEqualTypeOf<string>();
expect(data.joinedAtTimestamp).toBeDefined();
expectTypeOf(data.joinedAtTimestamp).toEqualTypeOf<number | null>();
expect(data.joinedAt).toBeDefined();
expectTypeOf(data.joinedAt).toEqualTypeOf<Date | null>();
expect(data.questParticipation).toBeDefined();
expectTypeOf(data.questParticipation).toEqualTypeOf<number>();
expect(data.rank).toBeDefined();
expectTypeOf(data.rank).toEqualTypeOf<string>();
expect(data.mutedUntilTimestamp).toBeDefined();
expectTypeOf(data.mutedUntilTimestamp).toEqualTypeOf<number | null>();
expect(data.mutedUntil).toBeDefined();
expectTypeOf(data.mutedUntil).toEqualTypeOf<Date | null>();
expect(data.expHistory).toBeDefined();
expectTypeOf(data.expHistory).toEqualTypeOf<ExpHistory[]>();
expect(data.weeklyExperience).toBeDefined();
expectTypeOf(data.weeklyExperience).toEqualTypeOf<number>();
expect(data.toString()).toBeDefined();
expect(data.toString()).toBe(data.uuid);
expectTypeOf(data.toString()).toEqualTypeOf<string>();
});
20 changes: 10 additions & 10 deletions src/structures/Guild/GuildMember.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,24 @@ import { ExpHistory, parseHistory } from '../../utils/Guild.js';

class GuildMember {
uuid: string;
joinedAtTimestamp: number;
joinedAt: Date;
joinedAtTimestamp: number | null;
joinedAt: Date | null;
questParticipation: number;
rank: string;
mutedUntilTimestamp: number | null;
mutedUntil: Date | null;
expHistory: ExpHistory[];
weeklyExperience: number;
constructor(data: Record<string, any>) {
this.uuid = data.uuid;
this.joinedAtTimestamp = data.joined;
this.joinedAt = new Date(data.joined);
this.questParticipation = data.questParticipation || 0;
this.rank = data.rank;
this.mutedUntilTimestamp = data.mutedTill ?? null;
this.mutedUntil = data.mutedTill ? new Date(data.mutedTill) : null;
this.uuid = data.uuid || '';
this.joinedAtTimestamp = data?.joined || null;
this.joinedAt = this.joinedAtTimestamp ? new Date(this.joinedAtTimestamp) : null;
this.questParticipation = data?.questParticipation || 0;
this.rank = data?.rank || 'Member';
this.mutedUntilTimestamp = data?.mutedTill || null;
this.mutedUntil = this.mutedUntilTimestamp ? new Date(this.mutedUntilTimestamp) : null;
const xpCheck = data.expHistory && 'number' === typeof Object.values(data.expHistory)[0];
this.expHistory = parseHistory(data.expHistory);
this.expHistory = parseHistory(data?.expHistory || {});
this.weeklyExperience = xpCheck
? Number(Object.values(data.expHistory).reduce((pV: any, cV: any) => pV + cV, 0))
: 0;
Expand Down
24 changes: 24 additions & 0 deletions src/structures/Guild/GuildRank.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import GuildRank from './GuildRank.js';
import { expect, expectTypeOf, test } from 'vitest';

test('Guild Rank', () => {
const data = new GuildRank({ stats: 'meow' });
expect(data).toBeDefined();
expect(data).toBeInstanceOf(GuildRank);
expectTypeOf(data).toEqualTypeOf<GuildRank>();
expect(data.name).toBeDefined();
expectTypeOf(data.name).toEqualTypeOf<string>();
expect(data.default).toBeDefined();
expectTypeOf(data.default).toEqualTypeOf<boolean>();
expect(data.tag).toBeDefined();
expectTypeOf(data.tag).toEqualTypeOf<string | null>();
expect(data.createdAtTimestamp).toBeDefined();
expectTypeOf(data.createdAtTimestamp).toEqualTypeOf<number | null>();
expect(data.createdAt).toBeDefined();
expectTypeOf(data.createdAt).toEqualTypeOf<Date | null>();
expect(data.priority).toBeDefined();
expectTypeOf(data.priority).toEqualTypeOf<number>();
expect(data.toString()).toBeDefined();
expect(data.toString()).toBe(data.name);
expectTypeOf(data.toString()).toEqualTypeOf<string>();
});
16 changes: 8 additions & 8 deletions src/structures/Guild/GuildRank.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ class GuildRank {
name: string;
default: boolean;
tag: string | null;
createdAtTimestamp: number;
createdAt: Date;
createdAtTimestamp: number | null;
createdAt: Date | null;
priority: number;
constructor(data: Record<string, any>) {
this.name = data.name;
this.default = data.default;
this.tag = data.tag ?? null;
this.createdAtTimestamp = data.created ?? data.createdAtTimestamp;
this.createdAt = new Date(this.createdAtTimestamp);
this.priority = data.priority;
this.name = data.name || '';
this.default = data.default || false;
this.tag = data.tag || null;
this.createdAtTimestamp = data.created || data.createdAtTimestamp || null;
this.createdAt = this.createdAtTimestamp ? new Date(this.createdAtTimestamp) : null;
this.priority = data?.priority || 0;
}

toString() {
Expand Down
25 changes: 12 additions & 13 deletions src/utils/Guild.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,24 +67,23 @@ export function expLimit(exp: number) {
return 2e5 < exp ? (7e5 < exp ? 2.5e5 + Math.round(exp * 0.03) : 2e5 + Math.round((exp - 2e5) / 10)) : exp;
}

export function calculateExpHistory(data: Record<string, any>): ExpHistory[] {
const finalObj: any = {};
for (const day of Object.keys(data.members[0].expHistory)) {
export function calculateExpHistory(data: GuildMember[]): ExpHistory[] {
const finalObj: Record<string, number> = {};
if (undefined === data[0]?.expHistory) return [];
Object.keys(data[0].expHistory).forEach((day, index) => {
let gexp = 0;
for (const member of data.members) {
gexp += member.expHistory[day] || 0;
}
finalObj[day] = expLimit(gexp);
}
data.forEach((member) => (gexp += member.expHistory?.[index]?.exp || 0));
finalObj[data[0]?.expHistory[index]?.day || 'Unknown'] = expLimit(gexp);
});
return parseHistory(finalObj);
}

export function members(data: Record<string, any>): GuildMember[] {
return data.members.length ? data.members.map((m: Record<string, any>) => new GuildMember(m)) : [];
return data.length ? data.map((m: Record<string, any>) => new GuildMember(m)) : [];
}

export function totalWeeklyGexp(data: Record<string, any>) {
return members(data)
.map((m) => m.weeklyExperience)
.reduce((acc: number, cur: number) => acc + cur);
export function totalWeeklyGexp(data: GuildMember[]): number {
let gexp: number = 0;
data.forEach((member) => (gexp += member.weeklyExperience));
return gexp;
}

0 comments on commit e78f034

Please sign in to comment.