Skip to content

Commit 78d125b

Browse files
committed
fix: Fix blinking roles
1 parent 47c7505 commit 78d125b

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

src/cron/roles.ts

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,7 @@ const fetchOrCreateKarmaRole = async (guild: Discord.Guild) => {
3737
return role;
3838
};
3939

40-
const giveRole = async (guild: Discord.Guild, role: Discord.Role, memberId: string) => {
41-
const member = await guild.members.fetch(memberId);
42-
if (!member) {
43-
console.error(`Member with id ${memberId} doesn't exists!`);
44-
return;
45-
}
46-
40+
const giveRole = async (member: Discord.GuildMember, role: Discord.Role) => {
4741
console.debug(`Adding role ${role.name} to member ${member.displayName}!`);
4842
return member.roles.add(role);
4943
};
@@ -53,11 +47,14 @@ const removeRole = (member: Discord.GuildMember, role: Discord.Role) => {
5347
return member.roles.remove(role.id);
5448
};
5549

56-
const getBestMembers = async (fromDate: Date, toDate = new Date()) => {
50+
const getBestKarmaMemberIds = async (
51+
fromDate = offsetDateByWeeks(new Date(), 2),
52+
toDate = new Date(),
53+
) => {
5754
const db = await initDb();
5855
const karmaCollection = getKarmaCollection(db);
5956

60-
const agg = karmaCollection
57+
const agg = await karmaCollection
6158
.aggregate<MemberTotalKarma>([
6259
{ $match: { createdAt: { $gte: fromDate, $lte: toDate } } },
6360
{ $group: { _id: '$to', total: { $sum: '$value' } } },
@@ -69,31 +66,42 @@ const getBestMembers = async (fromDate: Date, toDate = new Date()) => {
6966
return agg;
7067
};
7168

72-
const assignMembersRoles = async (guild: Discord.Guild, role: Discord.Role) => {
73-
const startDate = offsetDateByWeeks(new Date(), 2);
74-
const bestKarmaMembers = await getBestMembers(startDate);
75-
76-
console.log(bestKarmaMembers);
69+
const getBestMembers = async (guild: Discord.Guild) => {
70+
const ids = await getBestKarmaMemberIds();
7771

78-
return Promise.all(bestKarmaMembers.map(({ _id }) => giveRole(guild, role, _id)));
72+
return Promise.all(ids.map(({ _id }) => guild.members.fetch(_id)));
7973
};
8074

81-
const removeMembersRoles = (role: Discord.Role) => {
82-
if (role.members.size > 0) {
83-
return Promise.all(role.members.map((member) => removeRole(member, role)));
84-
}
75+
const assignMembersRoles = async (members: Discord.GuildMember[], role: Discord.Role) => {
76+
return Promise.all(members.map((member) => giveRole(member, role)));
77+
};
8578

86-
console.error(`Members with role don't exists!`);
87-
return;
79+
const removeMembersRoles = (
80+
members: Discord.Collection<string, Discord.GuildMember>,
81+
role: Discord.Role,
82+
) => {
83+
return Promise.all(members.map((member) => removeRole(member, role)));
8884
};
8985

9086
export const updateKarmaRoles = async () => {
9187
const client = new Discord.Client();
9288
await client.login(getConfig('DISCORD_BOT_TOKEN'));
9389

9490
const guild = await client.guilds.fetch(TYPE_OF_WEB_GUILD_ID);
95-
const karmaRole = await fetchOrCreateKarmaRole(guild);
96-
97-
await removeMembersRoles(karmaRole);
98-
await assignMembersRoles(guild, karmaRole);
91+
const [karmaRole, bestKarmaMembers] = await Promise.all([
92+
fetchOrCreateKarmaRole(guild),
93+
getBestMembers(guild),
94+
]);
95+
96+
const currentKarmaMembers = karmaRole.members;
97+
98+
const membersToRemove = currentKarmaMembers.filter(
99+
(m) => !bestKarmaMembers.find((bm) => bm.id === m.id),
100+
);
101+
const membersToAdd = bestKarmaMembers.filter(
102+
(bm) => !currentKarmaMembers.find((m) => m.id === bm.id),
103+
);
104+
105+
await removeMembersRoles(membersToRemove, karmaRole);
106+
await assignMembersRoles(membersToAdd, karmaRole);
99107
};

0 commit comments

Comments
 (0)