Add some admin actions (ban, kick, unban)
This commit is contained in:
parent
73eca2407b
commit
08693a6875
@ -63,6 +63,27 @@ interface MembershipService {
|
|||||||
reason: String? = null,
|
reason: String? = null,
|
||||||
callback: MatrixCallback<Unit>): Cancelable
|
callback: MatrixCallback<Unit>): Cancelable
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ban a user from the room
|
||||||
|
*/
|
||||||
|
fun ban(userId: String,
|
||||||
|
reason: String? = null,
|
||||||
|
callback: MatrixCallback<Unit>): Cancelable
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unban a user from the room
|
||||||
|
*/
|
||||||
|
fun unban(userId: String,
|
||||||
|
reason: String? = null,
|
||||||
|
callback: MatrixCallback<Unit>): Cancelable
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kick a user from the room
|
||||||
|
*/
|
||||||
|
fun kick(userId: String,
|
||||||
|
reason: String? = null,
|
||||||
|
callback: MatrixCallback<Unit>): Cancelable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Join the room, or accept an invitation.
|
* Join the room, or accept an invitation.
|
||||||
*/
|
*/
|
||||||
|
@ -28,6 +28,7 @@ import im.vector.matrix.android.api.util.JsonDict
|
|||||||
import im.vector.matrix.android.internal.network.NetworkConstants
|
import im.vector.matrix.android.internal.network.NetworkConstants
|
||||||
import im.vector.matrix.android.internal.session.room.alias.RoomAliasDescription
|
import im.vector.matrix.android.internal.session.room.alias.RoomAliasDescription
|
||||||
import im.vector.matrix.android.internal.session.room.membership.RoomMembersResponse
|
import im.vector.matrix.android.internal.session.room.membership.RoomMembersResponse
|
||||||
|
import im.vector.matrix.android.internal.session.room.membership.admin.UserIdAndReason
|
||||||
import im.vector.matrix.android.internal.session.room.membership.joining.InviteBody
|
import im.vector.matrix.android.internal.session.room.membership.joining.InviteBody
|
||||||
import im.vector.matrix.android.internal.session.room.relation.RelationsResponse
|
import im.vector.matrix.android.internal.session.room.relation.RelationsResponse
|
||||||
import im.vector.matrix.android.internal.session.room.reporting.ReportContentBody
|
import im.vector.matrix.android.internal.session.room.reporting.ReportContentBody
|
||||||
@ -243,6 +244,33 @@ internal interface RoomAPI {
|
|||||||
fun leave(@Path("roomId") roomId: String,
|
fun leave(@Path("roomId") roomId: String,
|
||||||
@Body params: Map<String, String?>): Call<Unit>
|
@Body params: Map<String, String?>): Call<Unit>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ban a user from the given room.
|
||||||
|
*
|
||||||
|
* @param roomId the room id
|
||||||
|
* @param userIdAndReason the banned user object (userId and reason for ban)
|
||||||
|
*/
|
||||||
|
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/ban")
|
||||||
|
fun ban(@Path("roomId") roomId: String?, @Body userIdAndReason: UserIdAndReason): Call<Unit>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unban a user from the given room.
|
||||||
|
*
|
||||||
|
* @param roomId the room id
|
||||||
|
* @param userIdAndReason the unbanned user object (userId and reason for unban)
|
||||||
|
*/
|
||||||
|
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/unban")
|
||||||
|
fun unban(@Path("roomId") roomId: String?, @Body userIdAndReason: UserIdAndReason): Call<Unit>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kick a user from the given room.
|
||||||
|
*
|
||||||
|
* @param roomId the room id
|
||||||
|
* @param userIdAndReason the kicked user object (userId and reason for kicking)
|
||||||
|
*/
|
||||||
|
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/kick")
|
||||||
|
fun kick(@Path("roomId") roomId: String?, @Body userIdAndReason: UserIdAndReason): Call<Unit>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Strips all information out of an event which isn't critical to the integrity of the server-side representation of the room.
|
* Strips all information out of an event which isn't critical to the integrity of the server-side representation of the room.
|
||||||
* This cannot be undone.
|
* This cannot be undone.
|
||||||
|
@ -34,6 +34,8 @@ import im.vector.matrix.android.internal.session.room.directory.GetPublicRoomTas
|
|||||||
import im.vector.matrix.android.internal.session.room.directory.GetThirdPartyProtocolsTask
|
import im.vector.matrix.android.internal.session.room.directory.GetThirdPartyProtocolsTask
|
||||||
import im.vector.matrix.android.internal.session.room.membership.DefaultLoadRoomMembersTask
|
import im.vector.matrix.android.internal.session.room.membership.DefaultLoadRoomMembersTask
|
||||||
import im.vector.matrix.android.internal.session.room.membership.LoadRoomMembersTask
|
import im.vector.matrix.android.internal.session.room.membership.LoadRoomMembersTask
|
||||||
|
import im.vector.matrix.android.internal.session.room.membership.admin.DefaultMembershipAdminTask
|
||||||
|
import im.vector.matrix.android.internal.session.room.membership.admin.MembershipAdminTask
|
||||||
import im.vector.matrix.android.internal.session.room.membership.joining.DefaultInviteTask
|
import im.vector.matrix.android.internal.session.room.membership.joining.DefaultInviteTask
|
||||||
import im.vector.matrix.android.internal.session.room.membership.joining.DefaultJoinRoomTask
|
import im.vector.matrix.android.internal.session.room.membership.joining.DefaultJoinRoomTask
|
||||||
import im.vector.matrix.android.internal.session.room.membership.joining.InviteTask
|
import im.vector.matrix.android.internal.session.room.membership.joining.InviteTask
|
||||||
@ -142,6 +144,9 @@ internal abstract class RoomModule {
|
|||||||
@Binds
|
@Binds
|
||||||
abstract fun bindLeaveRoomTask(task: DefaultLeaveRoomTask): LeaveRoomTask
|
abstract fun bindLeaveRoomTask(task: DefaultLeaveRoomTask): LeaveRoomTask
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
abstract fun bindMembershipAdminTask(task: DefaultMembershipAdminTask): MembershipAdminTask
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
abstract fun bindLoadRoomMembersTask(task: DefaultLoadRoomMembersTask): LoadRoomMembersTask
|
abstract fun bindLoadRoomMembersTask(task: DefaultLoadRoomMembersTask): LoadRoomMembersTask
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ import im.vector.matrix.android.internal.database.model.RoomMemberSummaryEntity
|
|||||||
import im.vector.matrix.android.internal.database.model.RoomMemberSummaryEntityFields
|
import im.vector.matrix.android.internal.database.model.RoomMemberSummaryEntityFields
|
||||||
import im.vector.matrix.android.internal.di.UserId
|
import im.vector.matrix.android.internal.di.UserId
|
||||||
import im.vector.matrix.android.internal.query.process
|
import im.vector.matrix.android.internal.query.process
|
||||||
|
import im.vector.matrix.android.internal.session.room.membership.admin.MembershipAdminTask
|
||||||
import im.vector.matrix.android.internal.session.room.membership.joining.InviteTask
|
import im.vector.matrix.android.internal.session.room.membership.joining.InviteTask
|
||||||
import im.vector.matrix.android.internal.session.room.membership.joining.JoinRoomTask
|
import im.vector.matrix.android.internal.session.room.membership.joining.JoinRoomTask
|
||||||
import im.vector.matrix.android.internal.session.room.membership.leaving.LeaveRoomTask
|
import im.vector.matrix.android.internal.session.room.membership.leaving.LeaveRoomTask
|
||||||
@ -48,6 +49,7 @@ internal class DefaultMembershipService @AssistedInject constructor(
|
|||||||
private val inviteTask: InviteTask,
|
private val inviteTask: InviteTask,
|
||||||
private val joinTask: JoinRoomTask,
|
private val joinTask: JoinRoomTask,
|
||||||
private val leaveRoomTask: LeaveRoomTask,
|
private val leaveRoomTask: LeaveRoomTask,
|
||||||
|
private val membershipAdminTask: MembershipAdminTask,
|
||||||
@UserId
|
@UserId
|
||||||
private val userId: String
|
private val userId: String
|
||||||
) : MembershipService {
|
) : MembershipService {
|
||||||
@ -113,6 +115,33 @@ internal class DefaultMembershipService @AssistedInject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun ban(userId: String, reason: String?, callback: MatrixCallback<Unit>): Cancelable {
|
||||||
|
val params = MembershipAdminTask.Params(MembershipAdminTask.Type.BAN, roomId, userId, reason)
|
||||||
|
return membershipAdminTask
|
||||||
|
.configureWith(params) {
|
||||||
|
this.callback = callback
|
||||||
|
}
|
||||||
|
.executeBy(taskExecutor)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun unban(userId: String, reason: String?, callback: MatrixCallback<Unit>): Cancelable {
|
||||||
|
val params = MembershipAdminTask.Params(MembershipAdminTask.Type.UNBAN, roomId, userId, reason)
|
||||||
|
return membershipAdminTask
|
||||||
|
.configureWith(params) {
|
||||||
|
this.callback = callback
|
||||||
|
}
|
||||||
|
.executeBy(taskExecutor)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun kick(userId: String, reason: String?, callback: MatrixCallback<Unit>): Cancelable {
|
||||||
|
val params = MembershipAdminTask.Params(MembershipAdminTask.Type.KICK, roomId, userId, reason)
|
||||||
|
return membershipAdminTask
|
||||||
|
.configureWith(params) {
|
||||||
|
this.callback = callback
|
||||||
|
}
|
||||||
|
.executeBy(taskExecutor)
|
||||||
|
}
|
||||||
|
|
||||||
override fun invite(userId: String, reason: String?, callback: MatrixCallback<Unit>): Cancelable {
|
override fun invite(userId: String, reason: String?, callback: MatrixCallback<Unit>): Cancelable {
|
||||||
val params = InviteTask.Params(roomId, userId, reason)
|
val params = InviteTask.Params(roomId, userId, reason)
|
||||||
return inviteTask
|
return inviteTask
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.matrix.android.internal.session.room.membership.admin
|
||||||
|
|
||||||
|
import im.vector.matrix.android.internal.network.executeRequest
|
||||||
|
import im.vector.matrix.android.internal.session.room.RoomAPI
|
||||||
|
import im.vector.matrix.android.internal.task.Task
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
internal interface MembershipAdminTask : Task<MembershipAdminTask.Params, Unit> {
|
||||||
|
|
||||||
|
enum class Type {
|
||||||
|
BAN,
|
||||||
|
UNBAN,
|
||||||
|
KICK
|
||||||
|
}
|
||||||
|
|
||||||
|
data class Params(
|
||||||
|
val type: Type,
|
||||||
|
val roomId: String,
|
||||||
|
val userId: String,
|
||||||
|
val reason: String?
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class DefaultMembershipAdminTask @Inject constructor(private val roomAPI: RoomAPI) : MembershipAdminTask {
|
||||||
|
|
||||||
|
override suspend fun execute(params: MembershipAdminTask.Params) {
|
||||||
|
val userIdAndReason = UserIdAndReason(params.userId, params.reason)
|
||||||
|
executeRequest<Unit>(null) {
|
||||||
|
apiCall = when (params.type) {
|
||||||
|
MembershipAdminTask.Type.BAN -> roomAPI.ban(params.roomId, userIdAndReason)
|
||||||
|
MembershipAdminTask.Type.UNBAN -> roomAPI.unban(params.roomId, userIdAndReason)
|
||||||
|
MembershipAdminTask.Type.KICK -> roomAPI.kick(params.roomId, userIdAndReason)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package im.vector.matrix.android.internal.session.room.membership.admin
|
||||||
|
|
||||||
|
import com.squareup.moshi.Json
|
||||||
|
import com.squareup.moshi.JsonClass
|
||||||
|
|
||||||
|
@JsonClass(generateAdapter = true)
|
||||||
|
internal data class UserIdAndReason(
|
||||||
|
@Json(name = "user_id") val userId: String,
|
||||||
|
@Json(name = "reason") val reason: String? = null
|
||||||
|
)
|
@ -408,16 +408,16 @@ class RoomDetailViewModel @AssistedInject constructor(
|
|||||||
popDraft()
|
popDraft()
|
||||||
}
|
}
|
||||||
is ParsedCommand.UnbanUser -> {
|
is ParsedCommand.UnbanUser -> {
|
||||||
// TODO
|
handleUnbanSlashCommand(slashCommandResult)
|
||||||
_viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented)
|
popDraft()
|
||||||
}
|
}
|
||||||
is ParsedCommand.BanUser -> {
|
is ParsedCommand.BanUser -> {
|
||||||
// TODO
|
handleBanSlashCommand(slashCommandResult)
|
||||||
_viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented)
|
popDraft()
|
||||||
}
|
}
|
||||||
is ParsedCommand.KickUser -> {
|
is ParsedCommand.KickUser -> {
|
||||||
// TODO
|
handleKickSlashCommand(slashCommandResult)
|
||||||
_viewEvents.post(RoomDetailViewEvents.SlashCommandNotImplemented)
|
popDraft()
|
||||||
}
|
}
|
||||||
is ParsedCommand.JoinRoom -> {
|
is ParsedCommand.JoinRoom -> {
|
||||||
handleJoinToAnotherRoomSlashCommand(slashCommandResult)
|
handleJoinToAnotherRoomSlashCommand(slashCommandResult)
|
||||||
@ -603,23 +603,38 @@ class RoomDetailViewModel @AssistedInject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleChangeTopicSlashCommand(changeTopic: ParsedCommand.ChangeTopic) {
|
private fun handleChangeTopicSlashCommand(changeTopic: ParsedCommand.ChangeTopic) {
|
||||||
_viewEvents.post(RoomDetailViewEvents.SlashCommandHandled())
|
launchSlashCommandFlow {
|
||||||
|
room.updateTopic(changeTopic.topic, it)
|
||||||
room.updateTopic(changeTopic.topic, object : MatrixCallback<Unit> {
|
|
||||||
override fun onSuccess(data: Unit) {
|
|
||||||
_viewEvents.post(RoomDetailViewEvents.SlashCommandResultOk)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailure(failure: Throwable) {
|
|
||||||
_viewEvents.post(RoomDetailViewEvents.SlashCommandResultError(failure))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleInviteSlashCommand(invite: ParsedCommand.Invite) {
|
private fun handleInviteSlashCommand(invite: ParsedCommand.Invite) {
|
||||||
_viewEvents.post(RoomDetailViewEvents.SlashCommandHandled())
|
launchSlashCommandFlow {
|
||||||
|
room.invite(invite.userId, invite.reason, it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
room.invite(invite.userId, invite.reason, object : MatrixCallback<Unit> {
|
private fun handleKickSlashCommand(kick: ParsedCommand.KickUser) {
|
||||||
|
launchSlashCommandFlow {
|
||||||
|
room.kick(kick.userId, kick.reason, it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleBanSlashCommand(ban: ParsedCommand.BanUser) {
|
||||||
|
launchSlashCommandFlow {
|
||||||
|
room.ban(ban.userId, ban.reason, it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleUnbanSlashCommand(unban: ParsedCommand.UnbanUser) {
|
||||||
|
launchSlashCommandFlow {
|
||||||
|
room.unban(unban.userId, unban.reason, it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun launchSlashCommandFlow(lambda: (MatrixCallback<Unit>) -> Unit) {
|
||||||
|
_viewEvents.post(RoomDetailViewEvents.SlashCommandHandled())
|
||||||
|
val matrixCallback = object : MatrixCallback<Unit> {
|
||||||
override fun onSuccess(data: Unit) {
|
override fun onSuccess(data: Unit) {
|
||||||
_viewEvents.post(RoomDetailViewEvents.SlashCommandResultOk)
|
_viewEvents.post(RoomDetailViewEvents.SlashCommandResultOk)
|
||||||
}
|
}
|
||||||
@ -627,7 +642,8 @@ class RoomDetailViewModel @AssistedInject constructor(
|
|||||||
override fun onFailure(failure: Throwable) {
|
override fun onFailure(failure: Throwable) {
|
||||||
_viewEvents.post(RoomDetailViewEvents.SlashCommandResultError(failure))
|
_viewEvents.post(RoomDetailViewEvents.SlashCommandResultError(failure))
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
lambda.invoke(matrixCallback)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleSendReaction(action: RoomDetailAction.SendReaction) {
|
private fun handleSendReaction(action: RoomDetailAction.SendReaction) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user