@@ -5,14 +5,12 @@ import { unwrap } from "../utils/misc.js";
55import { M } from "../utils/debugging-and-logging.js" ;
66import { BotComponent } from "../bot-component.js" ;
77import { CommandSetBuilder } from "../command-abstractions/command-set-builder.js" ;
8- import { skill_roles_order , skill_roles_order_id , Wheatley } from "../wheatley.js" ;
98import { set_interval } from "../utils/node.js" ;
109import { build_description } from "../utils/strings.js" ;
1110
12- type user_role_entry = {
11+ export type user_role_entry = {
1312 user_id : string ;
1413 roles : string [ ] ;
15- last_known_skill_role : string | null ;
1614} ;
1715
1816type role_check = ( member : Discord . GuildMember ) => Promise < void > ;
@@ -23,7 +21,6 @@ type role_update_listener = {
2321} ;
2422
2523export default class RoleManager extends BotComponent {
26- private skill_role_log ! : Discord . TextChannel ;
2724 private staff_member_log ! : Discord . TextChannel ;
2825 interval : NodeJS . Timeout | null = null ;
2926
@@ -49,7 +46,6 @@ export default class RoleManager extends BotComponent {
4946 }
5047
5148 override async setup ( commands : CommandSetBuilder ) {
52- this . skill_role_log = await this . utilities . get_channel ( this . wheatley . channels . skill_role_log ) ;
5349 this . staff_member_log = await this . utilities . get_channel ( this . wheatley . channels . staff_member_log ) ;
5450 }
5551
@@ -85,20 +81,13 @@ export default class RoleManager extends BotComponent {
8581 this . wheatley . roles . linked_github . id ,
8682 ] ) ;
8783
88- this . register_role_check ( this . check_skill_roles . bind ( this ) ) ;
89- this . register_role_update_listener ( new Set ( skill_roles_order_id ) , this . check_for_skill_role_bump . bind ( this ) ) ;
90-
9184 const check = ( ) => {
9285 this . check_members ( ) . catch ( this . wheatley . critical_error . bind ( this . wheatley ) ) ;
9386 } ;
9487 check ( ) ;
9588 this . interval = set_interval ( check , HOUR ) ;
9689 }
9790
98- get_highest_skill_role ( roles : string [ ] ) {
99- return skill_roles_order_id . filter ( id => roles . includes ( id ) ) . at ( - 1 ) ?? null ;
100- }
101-
10291 async check_member_roles ( member : Discord . GuildMember ) {
10392 for ( const check of this . role_checks ) {
10493 await check ( member ) ;
@@ -108,10 +97,9 @@ export default class RoleManager extends BotComponent {
10897 const diff = old_roles ?. symmetricDifference ( current_roles ) ;
10998 if ( diff === undefined || diff . size > 0 ) {
11099 const role_ids = current_roles . map ( role => role . id ) ;
111- const skill_role = this . get_highest_skill_role ( member . roles . cache . map ( role => role . id ) ) ;
112100 await this . database . user_roles . findOneAndUpdate (
113101 { user_id : member . id } ,
114- { $set : skill_role ? { roles : role_ids , last_known_skill_role : skill_role } : { roles : role_ids } } ,
102+ { $set : { roles : role_ids } } ,
115103 { upsert : true } ,
116104 ) ;
117105 const new_roles = new Set ( role_ids ) ;
@@ -124,53 +112,6 @@ export default class RoleManager extends BotComponent {
124112 }
125113 }
126114
127- async check_skill_roles ( member : Discord . GuildMember ) {
128- const skill_roles = member . roles . cache . filter ( role =>
129- Object . values ( this . wheatley . skill_roles ) . some ( skill_role => role . id == skill_role . id ) ,
130- ) ;
131- if ( skill_roles . size > 1 ) {
132- M . log ( "removing duplicate skill roles for" , member . user . tag ) ;
133- skill_roles . sort ( ( a , b ) => b . rawPosition - a . rawPosition ) ;
134- M . debug ( skill_roles . map ( x => x . name ) ) ;
135- M . debug ( skill_roles . map ( x => x . name ) . slice ( 1 ) ) ;
136- for ( const role of skill_roles . map ( x => x ) . slice ( 1 ) ) {
137- await member . roles . remove ( role ) ;
138- }
139- }
140- }
141-
142- async check_for_skill_role_bump ( member : Discord . GuildMember ) {
143- const roles_entry = await this . database . user_roles . findOne ( { user_id : member . id } ) ;
144- const last_known_skill_level =
145- roles_entry && roles_entry . last_known_skill_role
146- ? this . wheatley . get_skill_role_index ( roles_entry . last_known_skill_role )
147- : - 1 ;
148- const current_skill_role = this . get_highest_skill_role ( member . roles . cache . map ( role => role . id ) ) ;
149- const current_skill_level = current_skill_role ? this . wheatley . get_skill_role_index ( current_skill_role ) : - 1 ;
150- if (
151- current_skill_level > skill_roles_order . indexOf ( "beginner" ) &&
152- current_skill_level > last_known_skill_level
153- ) {
154- assert ( current_skill_role ) ;
155- M . log ( "Detected skill level increase for" , member . user . tag ) ;
156- await this . skill_role_log . send ( {
157- embeds : [
158- new Discord . EmbedBuilder ( )
159- . setAuthor ( {
160- name : member . displayName ,
161- iconURL : member . displayAvatarURL ( ) ,
162- } )
163- . setColor ( unwrap ( await this . wheatley . guild . roles . fetch ( current_skill_role ) ) . color )
164- . setDescription (
165- roles_entry ?. last_known_skill_role
166- ? `<@&${ roles_entry . last_known_skill_role } > -> <@&${ current_skill_role } >`
167- : `<@&${ current_skill_role } >` ,
168- ) ,
169- ] ,
170- } ) ;
171- }
172- }
173-
174115 async check_members ( ) {
175116 M . log ( "Starting role checks" ) ;
176117 try {
0 commit comments