@@ -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
9086export 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