@@ -452,7 +452,9 @@ function setBotOptions(event: MessageEvent<any>, roomId: string, userId: string)
452452 } ) ; 
453453} 
454454
455- function  setBotPower ( event : MessageEvent < any > ,  roomId : string ,  userId : string ,  level : number ) : void   { 
455+ async  function  setBotPower ( 
456+  event : MessageEvent < any > ,  roomId : string ,  userId : string ,  level : number ,  ignoreIfGreater ?: boolean , 
457+ ) : Promise < void >  { 
456458 if  ( ! ( Number . isInteger ( level )  &&  level  >=  0 ) )  { 
457459 sendError ( event ,  _t ( 'Power level must be positive integer.' ) ) ; 
458460 return ; 
@@ -465,22 +467,34 @@ function setBotPower(event: MessageEvent<any>, roomId: string, userId: string, l
465467 return ; 
466468 } 
467469
468-  client . getStateEvent ( roomId ,  "m.room.power_levels" ,  "" ) . then ( ( powerLevels )  =>  { 
469-  const  powerEvent  =  new  MatrixEvent ( 
470+  try  { 
471+  const  powerLevels  =  await  client . getStateEvent ( roomId ,  "m.room.power_levels" ,  "" ) ; 
472+ 
473+  // If the PL is equal to or greater than the requested PL, ignore. 
474+  if  ( ignoreIfGreater  ===  true )  { 
475+  // As per https://matrix.org/docs/spec/client_server/r0.6.0#m-room-power-levels 
476+  const  currentPl  =  ( 
477+  powerLevels . content . users  &&  powerLevels . content . users [ userId ] 
478+  )  ||  powerLevels . content . users_default  ||  0 ; 
479+ 
480+  if  ( currentPl  >=  level )  { 
481+  return  sendResponse ( event ,  { 
482+  success : true , 
483+  } ) ; 
484+  } 
485+  } 
486+  await  client . setPowerLevel ( roomId ,  userId ,  level ,  new  MatrixEvent ( 
470487 { 
471488 type : "m.room.power_levels" , 
472489 content : powerLevels , 
473490 } , 
474-  ) ; 
475- 
476-  client . setPowerLevel ( roomId ,  userId ,  level ,  powerEvent ) . then ( ( )  =>  { 
477-  sendResponse ( event ,  { 
478-  success : true , 
479-  } ) ; 
480-  } ,  ( err )  =>  { 
481-  sendError ( event ,  err . message  ? err . message  : _t ( 'Failed to send request.' ) ,  err ) ; 
491+  ) ) ; 
492+  return  sendResponse ( event ,  { 
493+  success : true , 
482494 } ) ; 
483-  } ) ; 
495+  }  catch  ( err )  { 
496+  sendError ( event ,  err . message  ? err . message  : _t ( 'Failed to send request.' ) ,  err ) ; 
497+  } 
484498} 
485499
486500function  getMembershipState ( event : MessageEvent < any > ,  roomId : string ,  userId : string ) : void   { 
@@ -678,7 +692,7 @@ const onMessage = function(event: MessageEvent<any>): void {
678692 setBotOptions ( event ,  roomId ,  userId ) ; 
679693 break ; 
680694 case  Action . SetBotPower :
681-  setBotPower ( event ,  roomId ,  userId ,  event . data . level ) ; 
695+  setBotPower ( event ,  roomId ,  userId ,  event . data . level ,   event . data . ignoreIfGreater ) ; 
682696 break ; 
683697 default :
684698 console . warn ( "Unhandled postMessage event with action '"  +  event . data . action  + "'" ) ; 
0 commit comments