Initial ping-pong with TDLib :)

This commit is contained in:
Sebastian J. Wolf 2020-08-12 23:51:09 +02:00
parent 26a885400d
commit 154113afc4
4 changed files with 135 additions and 7 deletions

View file

@ -52,6 +52,10 @@ void TDLibReceiver::processUpdateOption(const QVariantMap &receivedInformation)
QString detectedVersion = receivedInformation.value("value").toMap().value("value").toString();
qDebug() << "[TDLibReceiver] TD Lib version detected: " << detectedVersion;
emit versionDetected(detectedVersion);
} else {
QVariant currentValue = receivedInformation.value("value").toMap().value("value");
qDebug() << "[TDLibReceiver] Option updated: " << currentOption << currentValue;
emit optionUpdated(currentOption, currentValue);
}
}

View file

@ -20,6 +20,7 @@ public:
signals:
void versionDetected(const QString &version);
void authorizationStateChanged(const QString &authorizationState);
void optionUpdated(const QString &optionName, const QVariant &optionValue);
private:
void *tdLibClient;

View file

@ -18,6 +18,11 @@
*/
#include "tdlibwrapper.h"
#include "tdlibsecrets.h"
#include <QDir>
#include <QLocale>
#include <QSysInfo>
#include <QSettings>
TDLibWrapper::TDLibWrapper(QObject *parent) : QObject(parent)
{
@ -25,8 +30,15 @@ TDLibWrapper::TDLibWrapper(QObject *parent) : QObject(parent)
this->tdLibClient = td_json_client_create();
this->tdLibReceiver = new TDLibReceiver(this->tdLibClient, this);
QString tdLibDatabaseDirectoryPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/tdlib";
QDir tdLibDatabaseDirectory(tdLibDatabaseDirectoryPath);
if (!tdLibDatabaseDirectory.exists()) {
tdLibDatabaseDirectory.mkpath(tdLibDatabaseDirectoryPath);
}
connect(this->tdLibReceiver, SIGNAL(versionDetected(QString)), this, SLOT(handleVersionDetected(QString)));
connect(this->tdLibReceiver, SIGNAL(authorizationStateChanged(QString)), this, SLOT(handleAuthorizationStateChanged(QString)));
connect(this->tdLibReceiver, SIGNAL(optionUpdated(QString, QVariant)), this, SLOT(handleOptionUpdated(QString, QVariant)));
this->tdLibReceiver->start();
}
@ -41,12 +53,19 @@ TDLibWrapper::~TDLibWrapper()
td_json_client_destroy(this->tdLibClient);
}
void TDLibWrapper::sendRequest(const QVariantMap &requestObject)
{
qDebug() << "[TDLibWrapper] Sending request to TD Lib, object type name: " << requestObject.value("@type").toString();
QJsonDocument requestDocument = QJsonDocument::fromVariant(requestObject);
td_json_client_send(this->tdLibClient, requestDocument.toJson().constData());
}
QString TDLibWrapper::getVersion()
{
return this->version;
}
QString TDLibWrapper::getAuthorizationState()
TDLibWrapper::AuthorizationState TDLibWrapper::getAuthorizationState()
{
return this->authorizationState;
}
@ -59,7 +78,89 @@ void TDLibWrapper::handleVersionDetected(const QString &version)
void TDLibWrapper::handleAuthorizationStateChanged(const QString &authorizationState)
{
this->authorizationState = authorizationState;
emit authorizationStateChanged(authorizationState);
if (authorizationState == "authorizationStateClosed") {
this->authorizationState = AuthorizationState::Closed;
}
if (authorizationState == "authorizationStateClosing") {
this->authorizationState = AuthorizationState::Closing;
}
if (authorizationState == "authorizationStateLoggingOut") {
this->authorizationState = AuthorizationState::LoggingOut;
}
if (authorizationState == "authorizationStateReady") {
this->authorizationState = AuthorizationState::Ready;
}
if (authorizationState == "authorizationStateWaitCode") {
this->authorizationState = AuthorizationState::WaitCode;
}
if (authorizationState == "authorizationStateWaitEncryptionKey") {
this->setEncryptionKey();
this->authorizationState = AuthorizationState::WaitEncryptionKey;
}
if (authorizationState == "authorizationStateWaitOtherDeviceConfirmation") {
this->authorizationState = AuthorizationState::WaitOtherDeviceConfirmation;
}
if (authorizationState == "authorizationStateWaitPassword") {
this->authorizationState = AuthorizationState::WaitPassword;
}
if (authorizationState == "authorizationStateWaitPhoneNumber") {
this->authorizationState = AuthorizationState::WaitPhoneNumber;
}
if (authorizationState == "authorizationStateWaitRegistration") {
this->authorizationState = AuthorizationState::WaitRegistration;
}
if (authorizationState == "authorizationStateWaitTdlibParameters") {
this->setInitialParameters();
this->authorizationState = AuthorizationState::WaitTdlibParameters;
}
emit authorizationStateChanged(this->authorizationState);
}
void TDLibWrapper::handleOptionUpdated(const QString &optionName, const QVariant &optionValue)
{
this->options.insert(optionName, optionValue);
emit optionUpdated(optionName, optionValue);
}
void TDLibWrapper::setInitialParameters()
{
qDebug() << "[TDLibWrapper] Sending initial parameters to TD Lib";
QVariantMap requestObject;
requestObject.insert("@type", "setTdlibParameters");
QVariantMap initialParameters;
initialParameters.insert("api_id", TDLIB_API_ID);
initialParameters.insert("api_hash", TDLIB_API_HASH);
initialParameters.insert("database_directory", QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/tdlib");
initialParameters.insert("use_message_database", true);
initialParameters.insert("use_secret_chats", false);
initialParameters.insert("system_language_code", QLocale::system().name());
QSettings hardwareSettings("/etc/hw-release", QSettings::NativeFormat);
initialParameters.insert("device_model", hardwareSettings.value("NAME", "Unknown Mobile Device").toString());
initialParameters.insert("system_version", QSysInfo::prettyProductName());
initialParameters.insert("application_version", "0.1");
requestObject.insert("parameters", initialParameters);
this->sendRequest(requestObject);
}
void TDLibWrapper::setEncryptionKey()
{
qDebug() << "[TDLibWrapper] Setting database encryption key";
QVariantMap requestObject;
requestObject.insert("@type", "checkDatabaseEncryptionKey");
// see https://github.com/tdlib/td/issues/188#issuecomment-379536139
requestObject.insert("encryption_key", "");
this->sendRequest(requestObject);
}

View file

@ -4,6 +4,8 @@
#include <QCoreApplication>
#include <QObject>
#include <QDebug>
#include <QJsonDocument>
#include <QStandardPaths>
#include <td/telegram/td_json_client.h>
#include "tdlibreceiver.h"
@ -14,23 +16,43 @@ public:
explicit TDLibWrapper(QObject *parent = nullptr);
~TDLibWrapper();
enum AuthorizationState {
Closed,
Closing,
LoggingOut,
Ready,
WaitCode,
WaitEncryptionKey,
WaitOtherDeviceConfirmation,
WaitPassword,
WaitPhoneNumber,
WaitRegistration,
WaitTdlibParameters
};
Q_INVOKABLE void sendRequest(const QVariantMap &requestObject);
Q_INVOKABLE QString getVersion();
Q_INVOKABLE QString getAuthorizationState();
Q_INVOKABLE TDLibWrapper::AuthorizationState getAuthorizationState();
signals:
void versionDetected(const QString &version);
void authorizationStateChanged(const QString &authorizationState);
void authorizationStateChanged(const TDLibWrapper::AuthorizationState &authorizationState);
void optionUpdated(const QString &optionName, const QVariant &optionValue);
public slots:
void handleVersionDetected(const QString &version);
void handleAuthorizationStateChanged(const QString &authorizationState);
void handleOptionUpdated(const QString &optionName, const QVariant &optionValue);
private:
void *tdLibClient;
TDLibReceiver *tdLibReceiver;
QString version;
QString authorizationState;
TDLibWrapper::AuthorizationState authorizationState;
QVariantMap options;
void setInitialParameters();
void setEncryptionKey();
};