Handle `/op` and `/deop` commands (#12)

Also when resetting power level, remove from list of user instead of setting the default value.
This commit is contained in:
Benoit Marty 2020-06-26 23:31:19 +02:00
parent 0d9a10f5fa
commit 8a1a772ab7
5 changed files with 27 additions and 5 deletions

View File

@ -7,6 +7,7 @@ Features ✨:
Improvements 🙌:
- "Add Matrix app" menu is now always visible (#1495)
- Handle `/op` and `/deop` commands (#12)
Bugfix 🐛:
- Fix dark theme issue on login screen (#1097)

View File

@ -232,7 +232,7 @@ object CommandParser {
val userId = messageParts[1]
if (MatrixPatterns.isUserId(userId)) {
ParsedCommand.SetUserPowerLevel(userId, 0)
ParsedCommand.SetUserPowerLevel(userId, null)
} else {
ParsedCommand.ErrorSyntax(Command.SET_USER_POWER_LEVEL)
}

View File

@ -39,7 +39,7 @@ sealed class ParsedCommand {
class SendRainbowEmote(val message: CharSequence) : ParsedCommand()
class BanUser(val userId: String, val reason: String?) : ParsedCommand()
class UnbanUser(val userId: String, val reason: String?) : ParsedCommand()
class SetUserPowerLevel(val userId: String, val powerLevel: Int) : ParsedCommand()
class SetUserPowerLevel(val userId: String, val powerLevel: Int?) : ParsedCommand()
class Invite(val userId: String, val reason: String?) : ParsedCommand()
class JoinRoom(val roomAlias: String, val reason: String?) : ParsedCommand()
class PartRoom(val roomAlias: String, val reason: String?) : ParsedCommand()

View File

@ -41,6 +41,7 @@ import im.vector.matrix.android.api.session.file.FileService
import im.vector.matrix.android.api.session.homeserver.HomeServerCapabilities
import im.vector.matrix.android.api.session.room.members.roomMemberQueryParams
import im.vector.matrix.android.api.session.room.model.Membership
import im.vector.matrix.android.api.session.room.model.PowerLevelsContent
import im.vector.matrix.android.api.session.room.model.RoomMemberSummary
import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.matrix.android.api.session.room.model.message.MessageContent
@ -448,8 +449,8 @@ class RoomDetailViewModel @AssistedInject constructor(
popDraft()
}
is ParsedCommand.SetUserPowerLevel -> {
// TODO
_viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented)
handleSetUserPowerLevel(slashCommandResult)
popDraft()
}
is ParsedCommand.ClearScalarToken -> {
// TODO
@ -668,6 +669,22 @@ class RoomDetailViewModel @AssistedInject constructor(
}
}
private fun handleSetUserPowerLevel(setUserPowerLevel: ParsedCommand.SetUserPowerLevel) {
val currentPowerLevelsContent = room.getStateEvent(EventType.STATE_ROOM_POWER_LEVELS)
?.content
?.toModel<PowerLevelsContent>() ?: return
launchSlashCommandFlow {
if (setUserPowerLevel.powerLevel == null) {
currentPowerLevelsContent.users.remove(setUserPowerLevel.userId)
} else {
currentPowerLevelsContent.users[setUserPowerLevel.userId] = setUserPowerLevel.powerLevel
}
room.sendStateEvent(EventType.STATE_ROOM_POWER_LEVELS, null, currentPowerLevelsContent.toContent(), it)
}
}
private fun handleKickSlashCommand(kick: ParsedCommand.KickUser) {
launchSlashCommandFlow {
room.kick(kick.userId, kick.reason, it)

View File

@ -162,7 +162,11 @@ class RoomMemberProfileViewModel @AssistedInject constructor(@Assisted private v
} else if (action.askForValidation && state.isMine) {
_viewEvents.post(RoomMemberProfileViewEvents.ShowPowerLevelDemoteWarning(action.previousValue, action.newValue))
} else {
currentPowerLevelsContent.users[state.userId] = action.newValue
if (action.newValue == currentPowerLevelsContent.usersDefault) {
currentPowerLevelsContent.users.remove(state.userId)
} else {
currentPowerLevelsContent.users[state.userId] = action.newValue
}
viewModelScope.launch {
_viewEvents.post(RoomMemberProfileViewEvents.Loading())
try {