@@ -32,10 +32,27 @@ func (pe *PolicyEvaluator) IsProtectedRoom(roomID id.RoomID) bool {
3232	return  protected 
3333}
3434
35+ func  (pe  * PolicyEvaluator ) GetProtectedRoomCreateEvent (roomID  id.RoomID ) * event.CreateEventContent  {
36+ 	pe .protectedRoomsLock .RLock ()
37+ 	meta , ok  :=  pe .protectedRooms [roomID ]
38+ 	pe .protectedRoomsLock .RUnlock ()
39+ 	if  ! ok  {
40+ 		return  nil 
41+ 	}
42+ 	return  meta .Create 
43+ }
44+ 
3545func  (pe  * PolicyEvaluator ) HandleProtectedRoomMeta (ctx  context.Context , evt  * event.Event ) {
3646	switch  evt .Type  {
3747	case  event .StatePowerLevels :
3848		pe .handleProtectedRoomPowerLevels (ctx , evt )
49+ 	case  event .StateCreate :
50+ 		pe .protectedRoomsLock .Lock ()
51+ 		meta , ok  :=  pe .protectedRooms [evt .RoomID ]
52+ 		if  ok  {
53+ 			meta .Create  =  evt .Content .AsCreate ()
54+ 		}
55+ 		pe .protectedRoomsLock .Unlock ()
3956	case  event .StateRoomName :
4057		pe .protectedRoomsLock .Lock ()
4158		meta , ok  :=  pe .protectedRooms [evt .RoomID ]
@@ -142,15 +159,16 @@ func (pe *PolicyEvaluator) tryProtectingRoom(ctx context.Context, joinedRooms *m
142159			return  nil , fmt .Sprintf ("* Bot is not in protected room [%s](%s) and joining failed: %v" , roomID , roomID .URI ().MatrixToURL (), err )
143160		}
144161	}
162+ 	createEvt , err  :=  pe .Bot .FullStateEvent (ctx , roomID , event .StateCreate , "" )
163+ 	if  err  !=  nil  {
164+ 		return  nil , fmt .Sprintf ("* Failed to get create event for [%s](%s): %v" , roomID , roomID .URI ().MatrixToURL (), err )
165+ 	}
145166	var  powerLevels  event.PowerLevelsEventContent 
146167	err  =  pe .Bot .StateEvent (ctx , roomID , event .StatePowerLevels , "" , & powerLevels )
147168	if  err  !=  nil  {
148169		return  nil , fmt .Sprintf ("* Failed to get power levels for [%s](%s): %v" , roomID , roomID .URI ().MatrixToURL (), err )
149170	}
150- 	powerLevels .CreateEvent , err  =  pe .Bot .FullStateEvent (ctx , roomID , event .StateCreate , "" )
151- 	if  err  !=  nil  {
152- 		return  nil , fmt .Sprintf ("* Failed to get creation content for [%s](%s): %v" , roomID , roomID .URI ().MatrixToURL (), err )
153- 	}
171+ 	powerLevels .CreateEvent  =  createEvt 
154172	ownLevel  :=  powerLevels .GetUserLevel (pe .Bot .UserID )
155173	minLevel  :=  max (powerLevels .Ban (), powerLevels .Redact ())
156174	if  ownLevel  <  minLevel  &&  ! pe .DryRun  {
@@ -171,7 +189,7 @@ func (pe *PolicyEvaluator) tryProtectingRoom(ctx context.Context, joinedRooms *m
171189		zerolog .Ctx (ctx ).Warn ().Err (err ).Stringer ("room_id" , roomID ).Msg ("Failed to get server ACL" )
172190	}
173191	slices .Sort (acl .Deny )
174- 	pe .markAsProtectedRoom (roomID , name .Name , & acl , members .Chunk )
192+ 	pe .markAsProtectedRoom (roomID , name .Name , & acl , createEvt . Content . AsCreate (),  members .Chunk )
175193	if  doReeval  {
176194		memberIDs  :=  make ([]id.UserID , len (members .Chunk ))
177195		for  i , member  :=  range  members .Chunk  {
@@ -247,10 +265,21 @@ func (pe *PolicyEvaluator) markAsWantToProtect(roomID id.RoomID) {
247265	pe .wantToProtect [roomID ] =  struct {}{}
248266}
249267
250- func  (pe  * PolicyEvaluator ) markAsProtectedRoom (roomID  id.RoomID , name  string , acl  * event.ServerACLEventContent , evts  []* event.Event ) {
268+ func  (pe  * PolicyEvaluator ) markAsProtectedRoom (
269+ 	roomID  id.RoomID ,
270+ 	name  string ,
271+ 	acl  * event.ServerACLEventContent ,
272+ 	create  * event.CreateEventContent ,
273+ 	evts  []* event.Event ,
274+ ) {
251275	pe .protectedRoomsLock .Lock ()
252276	defer  pe .protectedRoomsLock .Unlock ()
253- 	pe .protectedRooms [roomID ] =  & protectedRoomMeta {Name : name , ACL : acl , ApplyACL : ! slices .Contains (pe .skipACLForRooms , roomID )}
277+ 	pe .protectedRooms [roomID ] =  & protectedRoomMeta {
278+ 		Name :     name ,
279+ 		ACL :      acl ,
280+ 		Create :   create ,
281+ 		ApplyACL : ! slices .Contains (pe .skipACLForRooms , roomID ),
282+ 	}
254283	delete (pe .wantToProtect , roomID )
255284	for  _ , evt  :=  range  evts  {
256285		pe .unlockedUpdateUser (id .UserID (evt .GetStateKey ()), evt .RoomID , evt .Content .AsMember ().Membership )
0 commit comments