11import Discord from 'discord.js' ;
22
3- import { getConfig } from '../config' ;
4- import { initDb , getKarmaCollection } from '../db' ;
5- import { offsetDateByWeeks } from '../utils' ;
6-
7- interface MemberTotalKarma {
8- readonly _id : string ;
9- readonly total : number ;
10- }
11-
12- const TYPE_OF_WEB_GUILD_ID = '440163731704643589' ;
13- const ROLE_NAME = 'AKTYWNI' ;
14-
15- const createKarmaRole = ( guild : Discord . Guild ) => {
16- return guild . roles . create ( {
17- data : {
18- name : ROLE_NAME ,
19- color : 'DARK_VIVID_PINK' ,
20- mentionable : false ,
21- hoist : true ,
22- } ,
23- reason : 'Most active' ,
24- } ) ;
25- } ;
26-
27- const fetchKarmaRole = async ( guild : Discord . Guild ) => {
3+ const fetchRole = async ( guild : Discord . Guild , roleName : string ) => {
284 const roles = await guild . roles . fetch ( undefined , false ) ;
29- return roles . cache . find ( ( role ) => role . name === ROLE_NAME ) ;
5+ return roles . cache . find ( ( role ) => role . name === roleName ) ;
306} ;
317
32- const fetchOrCreateKarmaRole = async ( guild : Discord . Guild ) => {
33- const role = await fetchKarmaRole ( guild ) ;
8+ export const fetchOrCreateRole = async (
9+ guild : Discord . Guild ,
10+ roleName : string ,
11+ createRole : ( guild : Discord . Guild ) => Promise < Discord . Role > ,
12+ ) => {
13+ const role = await fetchRole ( guild , roleName ) ;
3414 if ( ! role ) {
35- return createKarmaRole ( guild ) ;
15+ return createRole ( guild ) ;
3616 }
3717 return role ;
3818} ;
@@ -47,31 +27,6 @@ const removeRole = (member: Discord.GuildMember, role: Discord.Role) => {
4727 return member . roles . remove ( role . id ) ;
4828} ;
4929
50- const getBestKarmaMemberIds = async (
51- fromDate = offsetDateByWeeks ( new Date ( ) , 2 ) ,
52- toDate = new Date ( ) ,
53- ) => {
54- const db = await initDb ( ) ;
55- const karmaCollection = getKarmaCollection ( db ) ;
56-
57- const agg = await karmaCollection
58- . aggregate < MemberTotalKarma > ( [
59- { $match : { createdAt : { $gte : fromDate , $lte : toDate } } } ,
60- { $group : { _id : '$to' , total : { $sum : '$value' } } } ,
61- { $sort : { total : - 1 } } ,
62- { $limit : 10 } ,
63- ] )
64- . toArray ( ) ;
65-
66- return agg ;
67- } ;
68-
69- const getBestMembers = async ( guild : Discord . Guild ) => {
70- const ids = await getBestKarmaMemberIds ( ) ;
71-
72- return Promise . all ( ids . map ( ( { _id } ) => guild . members . fetch ( _id ) ) ) ;
73- } ;
74-
7530const assignMembersRoles = async ( members : Discord . GuildMember [ ] , role : Discord . Role ) => {
7631 return Promise . all ( members . map ( ( member ) => giveRole ( member , role ) ) ) ;
7732} ;
@@ -83,25 +38,16 @@ const removeMembersRoles = (
8338 return Promise . all ( members . map ( ( member ) => removeRole ( member , role ) ) ) ;
8439} ;
8540
86- export const updateKarmaRoles = async ( ) => {
87- const client = new Discord . Client ( ) ;
88- await client . login ( getConfig ( 'DISCORD_BOT_TOKEN' ) ) ;
89-
90- const guild = await client . guilds . fetch ( TYPE_OF_WEB_GUILD_ID ) ;
91- const [ karmaRole , bestKarmaMembers ] = await Promise . all ( [
92- fetchOrCreateKarmaRole ( guild ) ,
93- getBestMembers ( guild ) ,
94- ] ) ;
95-
96- const currentKarmaMembers = karmaRole . members ;
41+ export const updateRoles = async ( role : Discord . Role , futureRoleMembers : Discord . GuildMember [ ] ) => {
42+ const currentRoleMembers = role . members ;
9743
98- const membersToRemove = currentKarmaMembers . filter (
99- ( m ) => ! bestKarmaMembers . find ( ( bm ) => bm . id === m . id ) ,
44+ const membersToRemove = currentRoleMembers . filter (
45+ ( m ) => ! futureRoleMembers . find ( ( bm ) => bm . id === m . id ) ,
10046 ) ;
101- const membersToAdd = bestKarmaMembers . filter (
102- ( bm ) => ! currentKarmaMembers . find ( ( m ) => m . id === bm . id ) ,
47+ const membersToAdd = futureRoleMembers . filter (
48+ ( bm ) => ! currentRoleMembers . find ( ( m ) => m . id === bm . id ) ,
10349 ) ;
10450
105- await removeMembersRoles ( membersToRemove , karmaRole ) ;
106- await assignMembersRoles ( membersToAdd , karmaRole ) ;
51+ await removeMembersRoles ( membersToRemove , role ) ;
52+ await assignMembersRoles ( membersToAdd , role ) ;
10753} ;
0 commit comments