Add report message functionality

This commit is contained in:
Loren Burkholder 2023-07-24 19:07:45 -04:00
parent bbfbba30b0
commit bb971b0575
No known key found for this signature in database
GPG key ID: AB62CB312CEC2BBC
6 changed files with 114 additions and 2 deletions

View file

@ -595,7 +595,7 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare( FetchContent_Declare(
MatrixClient MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
GIT_TAG 8936559c00542528a7776d774fccb7ff674c9c7f GIT_TAG f878e29420c037f45b575fbd29a11cabce3c010a
) )
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "") set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "") set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
@ -772,6 +772,7 @@ set(QML_SOURCES
resources/qml/dialogs/RawMessageDialog.qml resources/qml/dialogs/RawMessageDialog.qml
resources/qml/dialogs/ReadReceipts.qml resources/qml/dialogs/ReadReceipts.qml
resources/qml/dialogs/ReCaptchaDialog.qml resources/qml/dialogs/ReCaptchaDialog.qml
resources/qml/dialogs/ReportMessage.qml
resources/qml/dialogs/RoomDirectory.qml resources/qml/dialogs/RoomDirectory.qml
resources/qml/dialogs/RoomMembers.qml resources/qml/dialogs/RoomMembers.qml
resources/qml/dialogs/AllowedRoomsSettingsDialog.qml resources/qml/dialogs/AllowedRoomsSettingsDialog.qml

View file

@ -214,7 +214,7 @@ modules:
buildsystem: cmake-ninja buildsystem: cmake-ninja
name: mtxclient name: mtxclient
sources: sources:
- commit: 8936559c00542528a7776d774fccb7ff674c9c7f - commit: 6e01c75fccc2724fcdfe7a7b1a13547522eb8753
#tag: v0.9.2 #tag: v0.9.2
type: git type: git
url: https://github.com/Nheko-Reborn/mtxclient.git url: https://github.com/Nheko-Reborn/mtxclient.git

View file

@ -415,6 +415,12 @@ Item {
} }
} }
} }
Component {
id: reportDialog
ReportMessage {}
}
Platform.MenuItem { Platform.MenuItem {
enabled: visible enabled: visible
text: qsTr("Go to &message") text: qsTr("Go to &message")
@ -521,6 +527,16 @@ Item {
timelineRoot.destroyOnClose(dialog); timelineRoot.destroyOnClose(dialog);
} }
} }
Platform.MenuItem {
text: qsTr("Report message")
enabled: visible
onTriggered: function () {
var dialog = reportDialog.createObject(timelineRoot, {"eventId": messageContextMenu.eventId});
dialog.show();
dialog.forceActiveFocus();
timelineRoot.destroyOnClose(dialog);
}
}
Platform.MenuItem { Platform.MenuItem {
enabled: visible enabled: visible
text: qsTr("&Save as") text: qsTr("&Save as")

View file

@ -0,0 +1,85 @@
// SPDX-FileCopyrightText: Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import im.nheko
ApplicationWindow {
required property string eventId
width: 400
height: gl.implicitHeight + 2 * Nheko.paddingMedium
title: qsTr("Report message")
GridLayout {
id: gl
columnSpacing: Nheko.paddingMedium
rowSpacing: Nheko.paddingMedium
columns: 2
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
Label {
Layout.columnSpan: 2
Layout.fillWidth: true
wrapMode: Label.WordWrap
text: qsTr("This message you are reporting will be sent to your server administrator for review. Please note that not all server administrators review reported content. You should also ask a room moderator to remove the content if necessary.")
}
Label {
text: qsTr("Enter your reason for reporting:")
}
TextField {
id: reason
Layout.fillWidth: true
}
Label {
text: qsTr("How bad is the message?")
}
Slider {
id: score
from: 0
to: -100
stepSize: 25
snapMode: Slider.SnapAlways
Layout.fillWidth: true
}
Item {}
Label {
text: {
if (score.value === 0)
return qsTr("Not bad")
else if (score.value === -25)
return qsTr("Mild")
else if (score.value === -50)
return qsTr("Bad")
else if (score.value === -75)
return qsTr("Serious")
else if (score.value === -100)
return qsTr("Extremely serious")
}
}
DialogButtonBox {
Layout.columnSpan: 2
Layout.alignment: Qt.AlignRight
standardButtons: DialogButtonBox.Ok | DialogButtonBox.Cancel
onAccepted: {
room.reportEvent(eventId, reason.text, score.value);
close();
}
onRejected: close()
}
}
}

View file

@ -1607,6 +1607,14 @@ TimelineModel::redactAllFromUser(const QString &userid, const QString &reason)
std::this_thread::sleep_for(std::chrono::milliseconds(50)); std::this_thread::sleep_for(std::chrono::milliseconds(50));
} }
} }
void
TimelineModel::reportEvent(const QString &eventId, const QString &reason, const int score)
{
http::client()->report_event(
room_id_.toStdString(), eventId.toStdString(), reason.toStdString(), score);
}
void void
TimelineModel::redactEvent(const QString &id, const QString &reason) TimelineModel::redactEvent(const QString &id, const QString &reason)
{ {

View file

@ -333,6 +333,8 @@ public:
Q_INVOKABLE void showReadReceipts(const QString &id); Q_INVOKABLE void showReadReceipts(const QString &id);
Q_INVOKABLE void redactEvent(const QString &id, const QString &reason = ""); Q_INVOKABLE void redactEvent(const QString &id, const QString &reason = "");
Q_INVOKABLE void redactAllFromUser(const QString &userid, const QString &reason = ""); Q_INVOKABLE void redactAllFromUser(const QString &userid, const QString &reason = "");
Q_INVOKABLE void
reportEvent(const QString &eventId, const QString &reason = {}, const int score = -50);
Q_INVOKABLE int idToIndex(const QString &id) const; Q_INVOKABLE int idToIndex(const QString &id) const;
Q_INVOKABLE QString indexToId(int index) const; Q_INVOKABLE QString indexToId(int index) const;
Q_INVOKABLE void openMedia(const QString &eventId); Q_INVOKABLE void openMedia(const QString &eventId);