Refactor and comment createTemporaryPowerLevels

This commit is contained in:
Neil Alexander 2022-04-04 10:15:00 +01:00
parent 63cf4ae416
commit df99cf6eaa
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -75,7 +75,6 @@ func (r *Upgrader) performRoomUpgrade(
Code: api.PerformErrorNotAllowed, Code: api.PerformErrorNotAllowed,
Msg: "You don't have permission to upgrade the room, power level too low.", Msg: "You don't have permission to upgrade the room, power level too low.",
} }
} }
// TODO (#267): Check room ID doesn't clash with an existing one, and we // TODO (#267): Check room ID doesn't clash with an existing one, and we
@ -602,37 +601,38 @@ func (r *Upgrader) makeHeaderedEvent(ctx context.Context, evTime time.Time, user
} }
func createTemporaryPowerLevels(powerLevelContent *gomatrixserverlib.PowerLevelContent, userID string) fledglingEvent { func createTemporaryPowerLevels(powerLevelContent *gomatrixserverlib.PowerLevelContent, userID string) fledglingEvent {
eventPowerLevels := powerLevelContent.Events // Work out what power level we need in order to be able to send events
stateDefaultPowerLevel := powerLevelContent.StateDefault // of all types into the room.
neededPowerLevel := stateDefaultPowerLevel neededPowerLevel := powerLevelContent.StateDefault
for _, powerLevel := range eventPowerLevels { for _, powerLevel := range powerLevelContent.Events {
if powerLevel > neededPowerLevel { if powerLevel > neededPowerLevel {
neededPowerLevel = powerLevel neededPowerLevel = powerLevel
} }
} }
tempPowerLevelContent := &gomatrixserverlib.PowerLevelContent{} // Make a copy of the existing power level content.
*tempPowerLevelContent = *powerLevelContent tempPowerLevelContent := *powerLevelContent
newUserPowerLevels := make(map[string]int64)
for key, value := range powerLevelContent.Users {
newUserPowerLevels[key] = value
}
tempPowerLevelContent.Users = newUserPowerLevels
if val, ok := tempPowerLevelContent.Users[userID]; ok { // At this point, the "Users", "Events" and "Notifications" keys are all
if val < neededPowerLevel { // pointing to the map of the original PL content, so we will specifically
tempPowerLevelContent.Users[userID] = neededPowerLevel // override the users map with a new one and duplicate the values deeply,
} // so that we can modify them without modifying the original.
} else { tempPowerLevelContent.Users = make(map[string]int64, len(powerLevelContent.Users))
if tempPowerLevelContent.UsersDefault < val { for key, value := range powerLevelContent.Users {
tempPowerLevelContent.UsersDefault = neededPowerLevel tempPowerLevelContent.Users[key] = value
}
} }
tempPowerLevelsEvent := fledglingEvent{
// If the user who is upgrading the room doesn't already have sufficient
// power, then elevate their power levels.
if val := tempPowerLevelContent.Users[userID]; val < neededPowerLevel {
tempPowerLevelContent.Users[userID] = neededPowerLevel
}
// Then return the temporary power levels event.
return fledglingEvent{
Type: gomatrixserverlib.MRoomPowerLevels, Type: gomatrixserverlib.MRoomPowerLevels,
Content: tempPowerLevelContent, Content: tempPowerLevelContent,
} }
return tempPowerLevelsEvent
} }
func (r *Upgrader) sendHeaderedEvent( func (r *Upgrader) sendHeaderedEvent(