Skip to content
Snippets Groups Projects
Verified Commit 6f8babc8 authored by Nicolas Werner's avatar Nicolas Werner
Browse files

Allow knocking if join failed and via matrix uris

parent 6417dcd3
No related branches found
No related tags found
No related merge requests found
Pipeline #2927 failed
......@@ -127,6 +127,12 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent)
}
});
connect(this,
&ChatPage::internalKnock,
this,
qOverload<const QString &, const std::vector<std::string> &, QString, bool>(
&ChatPage::knockRoom),
Qt::QueuedConnection);
connect(this, &ChatPage::leftRoom, this, &ChatPage::removeRoom);
connect(this, &ChatPage::changeToRoom, this, &ChatPage::changeRoom, Qt::QueuedConnection);
connect(this, &ChatPage::notificationsRetrieved, this, &ChatPage::sendNotifications);
......@@ -659,17 +665,34 @@ ChatPage::trySync()
}
void
ChatPage::knockRoom(const QString &room, const QString &reason)
ChatPage::knockRoom(const QString &room,
const std::vector<std::string> &via,
QString reason,
bool failedJoin)
{
const auto room_id = room.toStdString();
if (QMessageBox::Yes !=
QMessageBox::question(
nullptr, tr("Confirm knock"), tr("Do you really want to ask to join %1?").arg(room)))
bool confirmed = false;
reason = QInputDialog::getText(
nullptr,
tr("Knock on room"),
failedJoin
? tr(
"You failed to join %1. You can try to knock, so that others can invite you in. Do you "
"want to do so?\nYou may optionally provide a reason for others to accept your knock:")
.arg(room)
: tr("Do you really want to knock on %1? You may optionally provide a reason for others to "
"accept your knock:")
.arg(room),
QLineEdit::Normal,
reason,
&confirmed);
if (!confirmed) {
return;
}
http::client()->knock_room(
room_id,
{},
via,
[this, room_id](const mtx::responses::RoomId &, mtx::http::RequestErr err) {
if (err) {
emit showNotification(tr("Failed to knock room: %1")
......@@ -704,10 +727,13 @@ ChatPage::joinRoomVia(const std::string &room_id,
http::client()->join_room(
room_id,
via,
[this, room_id](const mtx::responses::RoomId &, mtx::http::RequestErr err) {
[this, room_id, reason, via](const mtx::responses::RoomId &, mtx::http::RequestErr err) {
if (err) {
emit showNotification(
tr("Failed to join room: %1").arg(QString::fromStdString(err->matrix_error.error)));
if (err->matrix_error.errcode == mtx::errors::ErrorCode::M_FORBIDDEN)
emit internalKnock(QString::fromStdString(room_id), via, reason, true);
else
emit showNotification(tr("Failed to join room: %1")
.arg(QString::fromStdString(err->matrix_error.error)));
return;
}
......@@ -1388,6 +1414,9 @@ ChatPage::handleMatrixUri(QString uri)
if (action == u"join" || action.isEmpty()) {
joinRoomVia(targetRoomId, vias);
return true;
} else if (action == u"knock" || action.isEmpty()) {
knockRoom(mxid1, vias);
return true;
}
return false;
} else if (sigil1 == u"r") {
......@@ -1409,6 +1438,9 @@ ChatPage::handleMatrixUri(QString uri)
if (action == u"join" || action.isEmpty()) {
joinRoomVia(mxid1.toStdString(), vias);
return true;
} else if (action == u"knock" || action.isEmpty()) {
knockRoom(mxid1, vias);
return true;
}
return false;
}
......
......@@ -84,7 +84,11 @@ public slots:
void leaveRoom(const QString &room_id, const QString &reason);
void createRoom(const mtx::requests::CreateRoom &req);
void joinRoom(const QString &room, const QString &reason = "");
void knockRoom(const QString &room, const QString &reason = "");
void knockRoom(const QString &room, QString reason = "") { knockRoom(room, {}, reason, false); }
void knockRoom(const QString &room,
const std::vector<std::string> &via,
QString reason = "",
bool failedJoin = false);
void joinRoomVia(const std::string &room_id,
const std::vector<std::string> &via,
bool promptForConfirmation = true,
......@@ -161,6 +165,11 @@ signals:
void downloadedSecrets(mtx::secret_storage::AesHmacSha2KeyDescription keyDesc,
const SecretsToDecrypt &secrets);
void internalKnock(const QString &room,
const std::vector<std::string> &via,
QString reason = "",
bool failedJoin = false);
private slots:
void logout();
void removeRoom(const QString &room_id);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment