@@ -11,10 +11,10 @@ class Member extends SnowFlake {
1111 static already = { } ;
1212 owner : Guild ;
1313 user : User ;
14- roles : Role [ ] = [ ] ;
14+ roles = new Set < Role > ( ) ;
1515 nick ! : string ;
16- avatar : void | string = undefined ;
17- banner : void | string = undefined ;
16+ avatar ?: string ;
17+ banner ?: string ;
1818 communication_disabled_until ?: Date ;
1919 private constructor ( memberjson : memberjson , owner : Guild ) {
2020 super ( memberjson . id ) ;
@@ -99,7 +99,7 @@ class Member extends SnowFlake {
9999 banner : this . banner as string | undefined ,
100100 //TODO presence
101101 nick : this . nick ,
102- roles : this . roles . map ( ( _ ) => _ . id ) ,
102+ roles : [ ... this . roles . keys ( ) ] . map ( ( _ ) => _ . id ) ,
103103 joined_at : this . joined_at ,
104104 premium_since : this . premium_since ,
105105 deaf : this . deaf ,
@@ -358,20 +358,20 @@ class Member extends SnowFlake {
358358 memberjson . roles = ( memberjson . roles as any [ ] ) . map ( ( _ ) => _ . id ) ;
359359 console . error ( "Member role is incorrectly sent as role object instead of role ID" ) ;
360360 }
361- this . roles = [ ] ;
361+ this . roles . clear ( ) ;
362362 for ( const strrole of memberjson . roles ) {
363363 const role = this . guild . roleids . get ( strrole ) ;
364364 if ( ! role ) {
365365 console . warn ( strrole + " is not in " , this . guild . roleids ) ;
366366 continue ;
367367 }
368- this . roles . push ( role ) ;
368+ this . roles . add ( role ) ;
369369 }
370370
371371 if ( ! this . user . bot ) {
372372 const everyone = this . guild . roleids . get ( this . guild . id ) ;
373- if ( everyone && this . roles . indexOf ( everyone ) === - 1 ) {
374- this . roles . push ( everyone ) ;
373+ if ( everyone && ! this . roles . has ( everyone ) ) {
374+ this . roles . add ( everyone ) ;
375375 }
376376 }
377377 continue ;
@@ -384,13 +384,10 @@ class Member extends SnowFlake {
384384 }
385385
386386 const everyone = this . guild . roleids . get ( this . guild . id ) ;
387- if ( everyone && this . roles . indexOf ( everyone ) === - 1 ) {
388- this . roles . push ( everyone ) ;
387+ if ( everyone && this . roles . has ( everyone ) ) {
388+ this . roles . add ( everyone ) ;
389389 }
390390
391- this . roles . sort ( ( a , b ) => {
392- return this . guild . roles . indexOf ( a ) - this . guild . roles . indexOf ( b ) ;
393- } ) ;
394391 if ( changeNick ) {
395392 this . nameChange ( ) ;
396393 }
@@ -668,7 +665,7 @@ class Member extends SnowFlake {
668665 menu . show ( ) ;
669666 }
670667 addRole ( role : Role ) {
671- const roles = this . roles . map ( ( _ ) => _ . id ) ;
668+ const roles = [ ... this . roles ] . map ( ( _ ) => _ . id ) ;
672669 roles . push ( role . id ) ;
673670 fetch ( this . info . api + "/guilds/" + this . guild . id + "/members/" + this . id , {
674671 method : "PATCH" ,
@@ -677,7 +674,7 @@ class Member extends SnowFlake {
677674 } ) ;
678675 }
679676 removeRole ( role : Role ) {
680- let roles = this . roles . map ( ( _ ) => _ . id ) ;
677+ let roles = [ ... this . roles ] . map ( ( _ ) => _ . id ) ;
681678 roles = roles . filter ( ( _ ) => _ !== role . id ) ;
682679 fetch ( this . info . api + "/guilds/" + this . guild . id + "/members/" + this . id , {
683680 method : "PATCH" ,
@@ -693,6 +690,9 @@ class Member extends SnowFlake {
693690 headers,
694691 } ) ;
695692 }
693+ get inOrderRoles ( ) {
694+ return this . guild . roles . filter ( ( _ ) => this . roles . has ( _ ) ) ;
695+ }
696696 hasPermission ( name : string , adminOver = true ) : boolean {
697697 if ( this . isAdmin ( ) && adminOver ) {
698698 return true ;
@@ -703,7 +703,7 @@ class Member extends SnowFlake {
703703 return false ;
704704 }
705705 }
706- for ( const thing of this . roles ) {
706+ for ( const thing of this . inOrderRoles ) {
707707 if ( thing . permissions . getPermission ( name ) ) {
708708 return true ;
709709 }
0 commit comments