Allow knocking if join failed and via matrix uris
This commit is contained in:
parent
6417dcd398
commit
6f8babc80b
@ -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::leftRoom, this, &ChatPage::removeRoom);
|
||||||
connect(this, &ChatPage::changeToRoom, this, &ChatPage::changeRoom, Qt::QueuedConnection);
|
connect(this, &ChatPage::changeToRoom, this, &ChatPage::changeRoom, Qt::QueuedConnection);
|
||||||
connect(this, &ChatPage::notificationsRetrieved, this, &ChatPage::sendNotifications);
|
connect(this, &ChatPage::notificationsRetrieved, this, &ChatPage::sendNotifications);
|
||||||
@ -659,17 +665,34 @@ ChatPage::trySync()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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();
|
const auto room_id = room.toStdString();
|
||||||
if (QMessageBox::Yes !=
|
bool confirmed = false;
|
||||||
QMessageBox::question(
|
reason = QInputDialog::getText(
|
||||||
nullptr, tr("Confirm knock"), tr("Do you really want to ask to join %1?").arg(room)))
|
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;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
http::client()->knock_room(
|
http::client()->knock_room(
|
||||||
room_id,
|
room_id,
|
||||||
{},
|
via,
|
||||||
[this, room_id](const mtx::responses::RoomId &, mtx::http::RequestErr err) {
|
[this, room_id](const mtx::responses::RoomId &, mtx::http::RequestErr err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
emit showNotification(tr("Failed to knock room: %1")
|
emit showNotification(tr("Failed to knock room: %1")
|
||||||
@ -704,10 +727,13 @@ ChatPage::joinRoomVia(const std::string &room_id,
|
|||||||
http::client()->join_room(
|
http::client()->join_room(
|
||||||
room_id,
|
room_id,
|
||||||
via,
|
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) {
|
if (err) {
|
||||||
emit showNotification(
|
if (err->matrix_error.errcode == mtx::errors::ErrorCode::M_FORBIDDEN)
|
||||||
tr("Failed to join room: %1").arg(QString::fromStdString(err->matrix_error.error)));
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1388,6 +1414,9 @@ ChatPage::handleMatrixUri(QString uri)
|
|||||||
if (action == u"join" || action.isEmpty()) {
|
if (action == u"join" || action.isEmpty()) {
|
||||||
joinRoomVia(targetRoomId, vias);
|
joinRoomVia(targetRoomId, vias);
|
||||||
return true;
|
return true;
|
||||||
|
} else if (action == u"knock" || action.isEmpty()) {
|
||||||
|
knockRoom(mxid1, vias);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} else if (sigil1 == u"r") {
|
} else if (sigil1 == u"r") {
|
||||||
@ -1409,6 +1438,9 @@ ChatPage::handleMatrixUri(QString uri)
|
|||||||
if (action == u"join" || action.isEmpty()) {
|
if (action == u"join" || action.isEmpty()) {
|
||||||
joinRoomVia(mxid1.toStdString(), vias);
|
joinRoomVia(mxid1.toStdString(), vias);
|
||||||
return true;
|
return true;
|
||||||
|
} else if (action == u"knock" || action.isEmpty()) {
|
||||||
|
knockRoom(mxid1, vias);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,11 @@ public slots:
|
|||||||
void leaveRoom(const QString &room_id, const QString &reason);
|
void leaveRoom(const QString &room_id, const QString &reason);
|
||||||
void createRoom(const mtx::requests::CreateRoom &req);
|
void createRoom(const mtx::requests::CreateRoom &req);
|
||||||
void joinRoom(const QString &room, const QString &reason = "");
|
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,
|
void joinRoomVia(const std::string &room_id,
|
||||||
const std::vector<std::string> &via,
|
const std::vector<std::string> &via,
|
||||||
bool promptForConfirmation = true,
|
bool promptForConfirmation = true,
|
||||||
@ -161,6 +165,11 @@ signals:
|
|||||||
void downloadedSecrets(mtx::secret_storage::AesHmacSha2KeyDescription keyDesc,
|
void downloadedSecrets(mtx::secret_storage::AesHmacSha2KeyDescription keyDesc,
|
||||||
const SecretsToDecrypt &secrets);
|
const SecretsToDecrypt &secrets);
|
||||||
|
|
||||||
|
void internalKnock(const QString &room,
|
||||||
|
const std::vector<std::string> &via,
|
||||||
|
QString reason = "",
|
||||||
|
bool failedJoin = false);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void logout();
|
void logout();
|
||||||
void removeRoom(const QString &room_id);
|
void removeRoom(const QString &room_id);
|
||||||
|
Loading…
Reference in New Issue
Block a user