kaffeine / telegram-qt Goto Github PK
View Code? Open in Web Editor NEWQt-based library for Telegram network
License: GNU Lesser General Public License v2.1
Qt-based library for Telegram network
License: GNU Lesser General Public License v2.1
It seems Chat IDs can change when adding (and maybe removing also) groups. I added a new group and it came up with id 4 and the old "chat4" became "chat5".
The generated code diff should look like:
quint64 CTelegramConnection::messagesSendMessage(quint32 flags, const TLInputPeer &peer...
{
QByteArray output;
CTelegramStream outputStream(&output, /* write */ true);
outputStream << TLValue::MessagesSendMessage;
outputStream << flags;
- if (flags & 1 << 1) {
+ if (flags & 1 << 1) { // no_webpage
outputStream << TLTrue();
}
- if (flags & 1 << 4) {
+ if (flags & 1 << 4) { // broadcast
outputStream << TLTrue();
}
outputStream << peer;
- if (flags & 1 << 0) {
+ if (flags & 1 << 0) { // reply_to_msg_id
outputStream << replyToMsgId;
}
Hi Alexander!
I'm a BlackBerry 10 dev (as a hobby) and looking for some useful libs which could help me to build Telegram client for BB 10. Is it possible with your lib? I mean I want to implement fully-featured (or almost) client, or at least messaging with all features: text, smiles, stickers etc.
Also, if so, BB 10 supports only Qt 4.8, not greater. Is it will be very big effort to compile your lib for qt 4.8 with some patches? I need only stable backend, all native UI and BB 10 look and feel I can implement without any problems.
Thanks!
Hi,
Is it possible to send messages to other Telegram client apps using your library?
I could send and receive messages only between 2 Telegram-qt testapp, but those messages aren't displayed at mobile and win apps.
BR,
Aleks
Depends on #36
Sorry if you think I have not made enough research and shouldn't ask this question, but here goes.
I use telegram on Linux. I don't know much about qt. Do I benefit from installing your thing?
Saw it on the Arch Linux community/telegram-qt
, so I though it must be something pretty dope. But I don't understand what it does. Your README is probably fine for anyone that already knows what this does, but for a layman like me that's just browsing for cool programs, it's not very informative.
When i type make -j4
it spits out a few lines without a problem but then there is the following error:
(As i couldn't get the formatting right i moved the error to pastebin: http://pastebin.com/jKiAkrsj)
This is a proposal that I'm already working. Basically is to change the .pro and mount a directory to reference the openssl.
Hello,
I'm unable to build telegram-qt on Debian Stretch/Testing, it alway fails with following error when I use cmake telegram-qt
(within repo)
CMake Error at CMakeLists.txt:68 (QT5_WRAP_CPP):
Unknown CMake command "QT5_WRAP_CPP".
CMake Warning (dev) in CMakeLists.txt:
No cmake_minimum_required command is present. A line of code such as
cmake_minimum_required(VERSION 3.3)
should be added at the top of the file. The version specified may be lower
if you wish to support older CMake versions for this project. For more
information run "cmake --help-policy CMP0000".
This warning is for project developers. Use -Wno-dev to suppress it.
-- Configuring incomplete, errors occurred!
Have installed qt5.
cmake .
in repo throws
CMake Error at /usr/share/cmake-3.3/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES
OPENSSL_INCLUDE_DIR)
Call Stack (most recent call first):
/usr/share/cmake-3.3/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-3.3/Modules/FindOpenSSL.cmake:334 (find_package_handle_standard_args)
CMakeLists.txt:37 (find_package)
-- Configuring incomplete, errors occurred!
I have openssl installed.
Thx
initConnection(), restoreConnection() and closeConnection() are not intuitive names.
hey guys,
Just a bit newbie in these kind of issues.. Would you please help me with compiling ?
I need Cmake, Open SS, MySQl ( not sure) also I have full installation of Visual Studio 2012 /
but when I just use cmake to generate project file , I get errors like this :
Would you please give a good and step by step guide to compile it?
The C compiler identification is unknown
The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:1 (project):
No CMAKE_C_COMPILER could be found.
CMake Error at CMakeLists.txt:1 (project):
No CMAKE_CXX_COMPILER could be found.
Configuring incomplete, errors occurred!
See also "D:/bot/testg/CMakeFiles/CMakeOutput.log".
See also "D:/bot/testg/CMakeFiles/CMakeError.log".
Telegram-qt (or telepathy-morse) got stuck while travelling through an area with bad reception. Here is the log https://gist.github.com/TemeV/0a342c80d1d45a376b1f
Maybe some timeout to connection phase could be added to make sure that the connection is either established or changed to disconnected state, not stuck somewhere in between.
Hi there,
I've been using the testApp to develop my client and maybe I'm missing something. When I register following the USAGE file I manage to connect and see the messages. Then I save the secretfile and log out. However when I use the secretfile to connect again, I get 401 AUTH_KEY_UNREGISTERED errors. I'm not sure it is related with a bad understanding or due to QT4.7 incompatibility. Did you see this behavior already?
Thanks for your time!
Thanks for this great library!
Could you please make a SIP package for PyQt5 to be used in Python apps? :-)
It would be useful to show key fingerprint in (settings) UI, especially in case of a custom key.
Expected result:
Q_PROPERTY(QString fingerprint READ fingerprint NOTIFY fingerprintChanged)
in DeclarativeRsaKey
Expected fingerprint value is a string such as "0x6f4fb0abf4f43172
". Please take care of constant string size and add leading zeros if needed.
Invalid keys should have null (constructed by default) string fingerprint.
CTelegramDispatcher::whenConnectionStatusChanged doesn't seem to do anything when disconnecting happens and reason is not ConnectionStatusReasonTimeout.
I had this in my log:
void CTelegramDispatcher::whenConnectionStatusChanged(int, int, quint32) status 0 reason 0 dc 2
After that Morse was still "online" but did not receive any messages. Switching Morse to offline and back online got the messages flowing again.
Generated Telegram API methods implementation can reserve the exact amount of memory in the output byte array.
The generated code should be readable, so:
Commits:
Bonus:
Expected diff would look like:
quint64 CTelegramConnection::accountCheckUsername(const QString &username)
{
QByteArray output;
+ output.reserve(4 /* AccountCheckUsername */
+ + username.size() + 4 /* size bytes */);
CTelegramStream outputStream(&output, /* write */ true);
outputStream << TLValue::AccountCheckUsername;
outputStream << username;
return sendEncryptedPackage(output);
}
...
quint64 CTelegramConnection::accountReportPeer(const TLInputPeer &peer,
const TLReportReason &reason)
{
QByteArray output;
+ output.reserve(4 /* AccountReportPeer */ + peer.sizeInBytes() + reason.sizeInBytes());
CTelegramStream outputStream(&output, /* write */ true);
outputStream << TLValue::AccountReportPeer;
outputStream << peer;
outputStream << reason;
return sendEncryptedPackage(output);
}
quint64 CTelegramConnection::accountResetAuthorization(quint64 hash)
{
QByteArray output;
+ output.reserve(4 /* AccountResetAuthorization */ + 8 /* hash */);
CTelegramStream outputStream(&output, /* write */ true);
outputStream << TLValue::AccountResetAuthorization;
outputStream << hash;
return sendEncryptedPackage(output);
}
quint64 CTelegramConnection::authBindTempAuthKey(quint64 permAuthKeyId, quint64 nonce,
quint32 expiresAt,
const QByteArray &encryptedMessage)
{
QByteArray output;
+ output.reserve(4 /* AuthBindTempAuthKey */ + 8 /* permAuthKeyId */ + 8 /* nonce */
+ + 4 /* expiresAt */
+ + encryptedMessage.size() + 4 /* size bytes */);
CTelegramStream outputStream(&output, /* write */ true);
outputStream << TLValue::AuthBindTempAuthKey;
outputStream << permAuthKeyId;
outputStream << nonce;
outputStream << expiresAt;
outputStream << encryptedMessage;
return sendEncryptedPackage(output);
}
Ping does not work since 1967d6a
See here to get an idea of qt-pods:
https://github.com/cybercatalyst/qt-pods
If you need assistance, don't hesitate to ask. My time is limited since I am helping on-boarding a couple of other projects, too, but I am glad if I can help.
Depends on #32: Implement channel support
We need link an executable to check that there are no missing (unexported or not compiled at all) symbols.
A chat object from Updates
typically has a subset of Chat properties from that of GetDialogs.
Especially an object from Updates
has no AccessHash and currently it breaks any further access to that chat.
Updates received after GetDialogs override accessHash making the chat inaccessible. We have to properly process such Updates
and probably update only the needed values.
Update:
TLUpdates(Updates) {
updates: QVector(TLUpdate(UpdateEditChannelMessage) {
message: TLMessage(Message) {
flags: 58560
id: 277
toId: TLPeer(PeerChannel) {
channelId: 1374347484
}
date: 1546154527
message: <text>
replyMarkup: TLReplyMarkup(ReplyInlineMarkup) {
rows: QVector(TLKeyboardButtonRow(KeyboardButtonRow) {
buttons: QVector(TLKeyboardButton(KeyboardButtonCallback) {
text: 1 317
data: 73656e645f7265616374696f6e5f30
}, TLKeyboardButton(KeyboardButtonCallback) {
text: 2 2.3K
data: 73656e645f7265616374696f6e5f31
}, TLKeyboardButton(KeyboardButtonCallback) {
text: 3 266
data: 73656e645f7265616374696f6e5f32
})
})
}
entities: QVector(TLMessageEntity(MessageEntityTextUrl) {
offset: 57
length: 5
url: http://t.me/address/111
})
views: 999
editDate: 1546203087
}
pts: 22222
ptsCount: 1
})
users: QVector()
chats: QVector(TLChat(Channel) {
flags: 4192
id: 1374347484
title: Chat title
username: chatname
photo: TLChatPhoto(ChatPhoto) {
photoSmall: TLFileLocation(FileLocation) {
dcId: 2
volumeId: 235137777
localId: 266666
secret: 7354674039851243333
}
photoBig: TLFileLocation(FileLocation) {
dcId: 2
volumeId: 235134444
localId: 264444
secret: 11777733401610977766
}
}
date: 1514566666
version: 0
})
date: 1546207777
seq: 0
}
Typical chat object in the getDialogs respond:
TLChat(Channel) {
flags: 8288
id: 1007454380
accessHash: 12585072710627688359
title: Reddit
username: RedditTop
photo: TLChatPhoto(ChatPhoto) {
photoSmall: TLFileLocation(FileLocation) {
dcId: 2
volumeId: 713315988
localId: 61305
secret: 17238258621322230518
}
photoBig: TLFileLocation(FileLocation) {
dcId: 2
volumeId: 713315988
localId: 61307
secret: 429123949706685596
}
}
date: 1527080586
version: 0
}
I am trying to package telegram-qt
but the cmake config file contains wrong paths:
$ cat $(nix-build -A libsForQt5.telegram)/lib/cmake/TelegramQt5/TelegramQt5Config.cmake
# TelegramQt5Config.cmake is generated by CMake from telegram-qt/TelegramQtConfig.cmake.in.
# Any changed value in this file will be overwritten by CMake.
# set the version number
set(TELEGRAM_QT5_VERSION_MAJOR 0)
set(TELEGRAM_QT5_VERSION_MINOR 1)
set(TELEGRAM_QT5_VERSION_PATCH 0)
set(TELEGRAM_QT5_VERSION 0.1.0)
# set the directories
if(NOT TELEGRAM_QT5_INSTALL_DIR)
set(TELEGRAM_QT5_INSTALL_DIR "/nix/store/fd2vy5svxj51f2g67sqs1wcm6223r48b-telegram-qt-0.1.0")
endif(NOT TELEGRAM_QT5_INSTALL_DIR)
set(TELEGRAM_QT5_INCLUDE_DIR "${TELEGRAM_QT5_INSTALL_DIR}//nix/store/fd2vy5svxj51f2g67sqs1wcm6223r48b-telegram-qt-0.1.0/include/telegram-qt5")
set(TELEGRAM_QT5_LIB_DIR "${TELEGRAM_QT5_INSTALL_DIR}//nix/store/fd2vy5svxj51f2g67sqs1wcm6223r48b-telegram-qt-0.1.0/lib")
set(TELEGRAM_QT5_LIBRARIES -L${TELEGRAM_QT5_LIB_DIR} -ltelegram-qt5)
For example, TELEGRAM_QT5_LIB_DIR
resolves to /nix/store/90m1a9961hcag9pspws53qk246gkg5hj-telegram-qt-0.1.0//nix/store/90m1a9961hcag9pspws53qk246gkg5hj-telegram-qt-0.1.0/lib
.
I use the following cmake flags:
-DCMAKE_BUILD_TYPE=Release -DCMAKE_SKIP_BUILD_RPATH=ON -DCMAKE_INSTALL_INCLUDEDIR=/nix/store/90m1a9961hcag9pspws53qk246gkg5hj-telegram-qt-0.1.0/include -DCMAKE_INSTALL_LIBDIR=/nix/store/90m1a9961hcag9pspws53qk246gkg5hj-telegram-qt-0.1.0/lib -DCMAKE_INSTALL_NAME_DIR=/nix/store/90m1a9961hcag9pspws53qk246gkg5hj-telegram-qt-0.1.0/lib -DCMAKE_INSTALL_PREFIX=/nix/store/90m1a9961hcag9pspws53qk246gkg5hj-telegram-qt-0.1.0
Comparing the TelegramQtConfig.cmake.in
file
telegram-qt/TelegramQt/TelegramQtConfig.cmake.in
Lines 15 to 16 in 175dfa4
with a similar one from telepathy-qt
tells me, the issue is probably here.
Добрый день, с Вами можно общаться по-русски?
Good afternoon.
I want to use libTelegramQt. I perform operations just as it is made in testApp. Authorization takes place successfully, the status of connection becomes ConnectionStateAuthenticated. But at any requests which demand auth_key_id I receive an error of RPC Error 401: AUTH_KEY_UNREGISTERED.
In the console of debugging I watch, auth_key successfully remains at authorization and goes when sending requests.
Prompt what to pay attention to what I can incorrectly do?
I cause restoreConnection, connection is restored, auth_key remains, further getInitialUsers automatically is caused (), both inquiries return mistakes. My also any other calls of methods.
What do these variables in Utis.cpp mean?
static const QByteArray s_hardcodedRsaDataKey ("0c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b53813"
"5a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4"
"bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6"
"dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6"
"c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449a"
"f7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b"
"210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0"
"db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59b"
"a5c75506373e7130f9042da922179251f");
static const QByteArray s_hardcodedRsaDataExp("010001");
static const quint64 s_hardcodedRsaDataFingersprint(0xc3b42b026ce86b21);
How to change their value? In case of application registration I was given out only RSA PUBLIC KEY which differs on length from hardcodedRsaDataKey. If I add the RSA PUBLIC KEY instead of hardcodedRsaDataKey, then at me there does not take place connection with the server.
Thanks.
I apply a conclusion from the debugging console.
Отладка запущена
&"warning: GDB: Failed to set controlling terminal: \320\235\320\265\320\277\321\200\320\270\320\274\320\265\320\275\320\270\320\274\321\213\320\271 \320\272 \320\264\320\260\320\275\320\275\320\276\320\274\321\203 \321\203\321\201\321\202\321\200\320\276\320\271\321\201\321\202\320\262\321\203 ioctl\n"
bool CTelegramDispatcher::restoreConnection(const QByteArray&) Format version: 4
bool CTelegramDispatcher::restoreConnection(const QByteArray&) "149.154.167.50"
restoreConnection установил authKey= "\x91\x06\xA1""9\xC8\xB5\xE7\x8C\x9C\xD9o\x94h6\xAC\xDB\x04\x87\xA7\xF4\x8F\xCD\xAD!\x90\x8E\xC7\xB7,\xB9\xBB\x19\x9E\x9E\x85\xE2 \xB4\xDB\x17\xC1\xDFkC\xE1\x89v~P\xDEi\xC7\xA2\x96v!Fto\x1D\xF7\xB5V\xA6o\xCB;'\x8D{\xA1Y\x00\xF9hsJsQb\xB7\xE7Zq\xE3\x82\xFB\xBC=q\x98\xA9\xAB\x04\xF7SP\xC4\xB0\xB5)\xF6\xF0\xFC&\xE6\x1E\x97\xE7T'\xD3""A\x05\x83.\x8A\x83.\xE7\xB6V\x98\xBE\x02hD\f\x01""B\x8D\xB4\xEE{\x18\xBB\xC2LE\xE8""5\xFA\x9C@]\xF8=\xF4Ko\xB3\xB6\x0E\x14\xAC\x92\xA7\xE8\x91zJ\x05\xC6\x0B\x10x\xE4@\xB8\\V1\x07QIw\x04\xC4\x88\x89\xE9/\xE9q\x95\xAE\xD8\x8F\xA5\xA3\x03}\xB2\xD2\xFC\xA9xb\x9C\x16\xC2.\xB4\xD0\x10\xD6uOr\xB9T\x1BM\xF9\xDD^k\x8D""1t\x8B\xEE&qA\xCB\xF5\xC6\xB5p\x97$\xFD\xAB""dD;\x16""3\x13RMe\x98\xCA""d\x99T\xF9\xC1'C\xFF\xFA\xF5v"
CTelegramConnection* CTelegramDispatcher::createConnection(const TLDcOption&) 2 "149.154.167.50" 443
void CTelegramConnection::setAuthKey(const QByteArray&) key: "9106a139c8b5e78c9cd96f946836acdb0487a7f48fcdad21908ec7b72cb9bb199e9e85e220b4db17c1df6b43e189767e50de69c7a296762146746f1df7b556a66fcb3b278d7ba15900f968734a735162b7e75a71e382fbbc3d7198a9ab04f75350c4b0b529f6f0fc26e61e97e75427d34105832e8a832ee7b65698be0268440c01428db4ee7b18bbc24c45e835fa9c405df83df44b6fb3b60e14ac92a7e8917a4a05c60b1078e440b85c56310751497704c48889e92fe97195aed88fa5a3037db2d2fca978629c16c22eb4d010d6754f72b9541b4df9dd5e6b8d31748bee267141cbf5c6b5709724fdab64443b163313524d6598ca649954f9c12743fffaf576" keyId: 5415603553999387343 auxHash: 15739787217883350970
void CTelegramDispatcher::setConnectionState(TelegramNamespace::ConnectionState) TelegramNamespace::ConnectionState(ConnectionStateConnecting)
void CTelegramDispatcher::onConnectionStatusChanged(int, int, quint32) status CTelegramConnection::ConnectionStatus(ConnectionStatusConnecting) reason CTelegramConnection::ConnectionStatusReason(ConnectionStatusReasonLocal) dc 2
void CTelegramConnection::startAuthTimer()
void CTelegramDispatcher::onConnectionAuthChanged(int, quint32) CTelegramConnection(0xb2602b68) auth CTelegramConnection::AuthState(AuthStateSignedIn) dc 2
void CTelegramDispatcher::onConnectionAuthChanged(int, quint32) Delayed packages: () 0
CTelegramDispatcher::continueInitialization( CTelegramDispatcher::InitializationStep(StepSignIn) ) on top of QFlags<CTelegramDispatcher::InitializationStep>(StepFirst)
отправка m_authId= 5415603553999387343
void CTelegramConnection::stopAuthTimer()
void CTelegramDispatcher::onConnectionStatusChanged(int, int, quint32) status CTelegramConnection::ConnectionStatus(ConnectionStatusConnected) reason CTelegramConnection::ConnectionStatusReason(ConnectionStatusReasonRemote) dc 2
void CTelegramConnection::onTransportReadyRead() Received different server salt: 8062699163366606297 (remote) vs 4406907682947276709 (local)
"Bad message 6476463135250790104/1: Code 48 (Incorrect server salt)."
отправка m_authId= 5415603553999387343
Local serverSalt fixed to 8062699163366606297
void CTelegramConnection::processMessageAck(CTelegramStream&) Package 6476463135753301244 acked
Core: Got DC Configuration.
1 "149.154.175.50" 443
1 "2001:0b28:f23d:f001:0000:0000:0000:000a" 443
2 "149.154.167.51" 443
2 "2001:067c:04e8:f002:0000:0000:0000:000a" 443
3 "149.154.175.100" 443
3 "2001:0b28:f23d:f003:0000:0000:0000:000a" 443
4 "149.154.167.92" 443
4 "2001:067c:04e8:f004:0000:0000:0000:000a" 443
4 "149.154.165.120" 443
5 "91.108.56.180" 443
5 "2001:0b28:f23f:f005:0000:0000:0000:000a" 443
CTelegramDispatcher::continueInitialization( CTelegramDispatcher::InitializationStep(StepDcConfiguration) ) on top of QFlags<CTelegramDispatcher::InitializationStep>(StepSignIn)
void CTelegramDispatcher::setConnectionState(TelegramNamespace::ConnectionState) TelegramNamespace::ConnectionState(ConnectionStateAuthenticated)
отправка m_authId= 5415603553999387343
отправка m_authId= 5415603553999387343
void CTelegramDispatcher::ensureMainConnectToWantedDc() Nothing to do. Wanted DC is already connected.
bool CTelegramConnection::processRpcError(CTelegramStream&, quint64, TLValue) "RPC Error 401: AUTH_KEY_UNREGISTERED for message 6476463136461970800 UsersGetUsers (dc 2|149.154.167.50:443)"
void CTelegramConnection::processMessageAck(CTelegramStream&) Package 6476463136461970804 acked
bool CTelegramConnection::processRpcError(CTelegramStream&, quint64, TLValue) "RPC Error 401: AUTH_KEY_UNREGISTERED for message 6476463136461970804 UsersGetUsers (dc 2|149.154.167.50:443)"
QThread: Destroyed while thread is still running
Отладка завершена
BaseRpcLayer::processPackage() should match received messageKey against the one calculate from decrypted message.
Note: server should send 0x6cfe
(qint32 = -404
) in case of key mismatch.
Building master, I see the following warning:
CMake Warning (dev) at /nix/store/n74jhpy1p48knf8gxiha95hisi47h9lj-qtbase-5.9.1-dev/lib/cmake/Qt5/Qt5ModuleLocation.cmake:4 (set):
Policy CMP0053 is not set: Simplify variable reference and escape sequence
evaluation. Run "cmake --help-policy CMP0053" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
For input:
'${_qt5_install_prefix}/Qt5@module@/Qt5@[email protected]'
the old evaluation rules produce:
'/nix/store/n74jhpy1p48knf8gxiha95hisi47h9lj-qtbase-5.9.1-dev/lib/cmake/Qt5/Qt5Config.cmake'
but the new evaluation rules produce:
'/nix/store/n74jhpy1p48knf8gxiha95hisi47h9lj-qtbase-5.9.1-dev/lib/cmake/Qt5@module@/Qt5@[email protected]'
Using the old result for compatibility since the policy is not set.
Call Stack (most recent call first):
/nix/store/n74jhpy1p48knf8gxiha95hisi47h9lj-qtbase-5.9.1-dev/lib/cmake/Qt5/Qt5Config.cmake:25 (include)
imports/TelegramQtQml/CMakeLists.txt:3 (find_package)
CTelegramDispatcher::restoreConnection() and CTelegramDispatcher::connectionSecretInfo() should work via CRawStream instead of CTelegramStream.
Currently secret data format depends on scheme, so update to a new scheme changes format without a real reason.
Maybe fix problem
CMake Error: TARGETS given no DESTINATION
install(
TARGETS TelegramQt${QT_VERSION_MAJOR}Qml DESTINATION ${INSTALL_QML_IMPORT_DIR}/TelegramQt
LIBRARY DESTINATION ${INSTALL_QML_IMPORT_DIR}/TelegramQt
COMPONENT Library
)
**#**install(TARGETS TelegramQt${QT_VERSION_MAJOR}Qml DESTINATION ${INSTALL_QML_IMPORT_DIR}/TelegramQt)
install(FILES qmldir plugins.qmltypes DESTINATION ${INSTALL_QML_IMPORT_DIR}/TelegramQt)
Captions for photos are empty in all the debug prints.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.