mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 11:00:48 +03:00
Upload filter automatically and use filter_id (#201)
When a custom filter is inserted into nheko.conf or there was no filter defined yet the default filter gets automatically uploaded. After a successful upload the server-side generated filter-id is used. This is done async as it is just an enhancement and it is not required to upload the filter before the first request.
This commit is contained in:
parent
396becbaa7
commit
f87b8fe817
2 changed files with 57 additions and 0 deletions
|
@ -64,6 +64,7 @@ public:
|
|||
void uploadAudio(const QString &roomid,
|
||||
const QSharedPointer<QIODevice> data,
|
||||
const QString &filename);
|
||||
void uploadFilter(const QString &filter) noexcept;
|
||||
void joinRoom(const QString &roomIdOrAlias);
|
||||
void leaveRoom(const QString &roomId);
|
||||
void sendTypingNotification(const QString &roomid, int timeoutInMillis = 20000);
|
||||
|
|
|
@ -226,6 +226,13 @@ MatrixClient::registerUser(const QString &user, const QString &pass, const QStri
|
|||
void
|
||||
MatrixClient::sync() noexcept
|
||||
{
|
||||
// the filter is not uploaded yet (so it is a json with { at the beginning)
|
||||
// ignore for now that the filter might be uploaded multiple times as we expect
|
||||
// servers to do deduplication
|
||||
if (filter_.startsWith("{")) {
|
||||
uploadFilter(filter_);
|
||||
}
|
||||
|
||||
QUrlQuery query;
|
||||
query.addQueryItem("set_presence", "online");
|
||||
query.addQueryItem("filter", filter_);
|
||||
|
@ -967,6 +974,55 @@ MatrixClient::uploadAudio(const QString &roomid,
|
|||
});
|
||||
}
|
||||
|
||||
void
|
||||
MatrixClient::uploadFilter(const QString &filter) noexcept
|
||||
{
|
||||
// validate that filter is a Json-String
|
||||
QJsonDocument doc = QJsonDocument::fromJson(filter.toUtf8());
|
||||
if (doc.isNull() || !doc.isObject()) {
|
||||
qWarning() << "Input which should be uploaded as filter is no JsonObject";
|
||||
return;
|
||||
}
|
||||
|
||||
QSettings settings;
|
||||
auto userid = settings.value("auth/user_id", "").toString();
|
||||
|
||||
QUrlQuery query;
|
||||
query.addQueryItem("access_token", token_);
|
||||
|
||||
QUrl endpoint(server_);
|
||||
endpoint.setPath(clientApiUrl_ + QString("/user/%1/filter").arg(userid));
|
||||
endpoint.setQuery(query);
|
||||
|
||||
QNetworkRequest request(endpoint);
|
||||
request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/json");
|
||||
|
||||
auto reply = post(request, doc.toJson(QJsonDocument::Compact));
|
||||
|
||||
connect(reply, &QNetworkReply::finished, this, [this, reply]() {
|
||||
reply->deleteLater();
|
||||
|
||||
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
|
||||
if (status == 0 || status >= 400) {
|
||||
qWarning() << reply->errorString() << "42";
|
||||
return;
|
||||
}
|
||||
|
||||
auto data = reply->readAll();
|
||||
auto response = QJsonDocument::fromJson(data);
|
||||
auto filter_id = response.object()["filter_id"].toString();
|
||||
|
||||
qDebug() << "Filter with ID" << filter_id << "created.";
|
||||
QSettings settings;
|
||||
settings.setValue("client/sync_filter", filter_id);
|
||||
settings.sync();
|
||||
|
||||
// set the filter_ var so following syncs will use it
|
||||
filter_ = filter_id;
|
||||
});
|
||||
}
|
||||
|
||||
void
|
||||
MatrixClient::joinRoom(const QString &roomIdOrAlias)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue