// This file is part of Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa // Copyright (C) 2017 Marco R. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // In addition, as a special exception, the copyright holders give // permission to link the code of portions of this program with the // OpenSSL library under certain conditions as described in each // individual source file, and distribute linked combinations including // the two. // // You must obey the GNU General Public License in all respects for all // of the code used other than OpenSSL. If you modify file(s) with this // exception, you may extend this exception to your version of the // file(s), but you are not obligated to do so. If you do not wish to do // so, delete this exception statement from your version. If you delete // this exception statement from all source files in the program, then // also delete it here. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "updatenews.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "xhr.h" UPDATENEWS *UPDATENEWS::instance() { static UPDATENEWS udn; return &udn; } UPDATENEWS::UPDATENEWS(QObject *parent) : QObject(parent) { } void UPDATENEWS::setUrl(QString url) { if (url!=m_url) { m_url = url; emit urlChanged(m_url); } } void UPDATENEWS::setDatabase() { static QQmlEngine qe; QString db_url=qe.offlineStorageDatabaseFilePath("Friendiqa"); m_db = QSqlDatabase::addDatabase("QSQLITE"); m_db.setDatabaseName(QUrl("file://"+db_url+".sqlite").toLocalFile()); qDebug() << db_url; if (!m_db.open()) { qDebug() << "Error: connection with database fail " << m_db.lastError(); } else { qDebug() << "Database: connection ok"; } } void UPDATENEWS::login() { qDebug() << "login"; QSqlQuery query("SELECT * FROM config WHERE isActive=0",m_db); qDebug() <<"size "<< query.size(); while (query.next()) { username = query.value(1).toString(); QByteArray bpassword=query.value(2).toByteArray(); QString password=QByteArray::fromBase64(bpassword); m_login=username+":"+password ; //emit this->loginChanged(m_login); m_url=query.value(0).toString(); QString isActive=query.value(7).toString(); qDebug() << " username " << username<< password << m_url << isActive; //UPDATENEWS::connect(&UPDATENEWS::getLogin,SIGNAL(loginChanged(QString)),this,SLOT(XHR::login(QString))); m_api="/api/statuses/friends_timeline"; } //return m_login; } void UPDATENEWS::timeline() { QSqlQuery query("SELECT status_id FROM news WHERE username='"+ username +"' ORDER BY status_id DESC LIMIT 1",m_db); if (query.isActive() && query.isSelect()){query.first();}; QString lastid=query.value(0).toString(); //query.finish(); qDebug() << lastid << query.at(); clearParams(); setParam("since_id",lastid); setParam("count","50"); get(); QObject::connect(this,&UPDATENEWS::success,this,&UPDATENEWS::store); } void UPDATENEWS::store(QByteArray serverreply,QString apiname) { //qDebug() << serverreply; QJsonDocument news; QJsonParseError jsonerror; news=QJsonDocument::fromJson(serverreply,&jsonerror); qDebug() << news.isArray()< newcontacts=findNewContacts(news); updateContacts(newcontacts); emit updatesuccess(); } QList UPDATENEWS::findNewContacts(QJsonDocument news){ QSqlQuery query("SELECT profile_image_url FROM contacts",m_db); QList imageurls; while (query.next()){ imageurls.append(query.value(0).toString()); } QList newcontacts; QList newcontactimagelinks; qDebug()< contacts){ qint64 currentTime =QDateTime::currentMSecsSinceEpoch(); for (int i=0; i < contacts.count();i++){ QJsonValue contact=contacts[i]; QSqlQuery query(m_db); query.prepare("INSERT INTO contacts username, id, name, screen_name, location,imageAge, " "profile_image_url, description, profile_image, url, protected, followers_count, " "friends_count, created_at, favourites_count, utc_offset, time_zone, statuses_count," " following, verified, statusnet_blocking, notifications, statusnet_profile_url," " cid, network, isFriend, timestamp" "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); query.bindValue(0,username); query.bindValue(1, contact["id"]); query.bindValue(2, contact["name"].toString().toUtf8().toBase64()); query.bindValue(3, contact["screen_name"]); query.bindValue(4, contact["location"]); query.bindValue(5, currentTime); query.bindValue(6, contact["profile_image_url"]); query.bindValue(7, contact["description"].toString().toUtf8().toBase64()); //query.bindValue(8,"") query.bindValue(9, contact["url"]); query.bindValue(10,contact["protected"]); query.bindValue(11,contact["followers_count"]); query.bindValue(12,contact["friends_count"]); query.bindValue(13,contact["created_at"]); query.bindValue(14,contact["favorites_count"]); query.bindValue(15,contact["utc_offset"]); query.bindValue(16,contact["time_zone"]); query.bindValue(17,contact["statuses_count"]); query.bindValue(18,contact["following"]); query.bindValue(19,contact["verfied"]); query.bindValue(20,contact["statusnet_blocking"]); query.bindValue(21,contact["notifications"]); query.bindValue(22,contact["statusnet_profile_url"]); query.bindValue(23,contact["cid"]); query.bindValue(24,contact["network"]); query.bindValue(25, 1); //query.bindValue(26,image_timestamp); } } QString UPDATENEWS::url() const { return m_url; } void UPDATENEWS::setParam(QString name, QString value) { params.insert(name, value); } void UPDATENEWS::clearParams() { files.clear(); params.clear(); } void UPDATENEWS::get() { QUrlQuery query; QHashIterator i(params); while(i.hasNext()) { i.next(); query.addQueryItem(i.key(), i.value()); } QUrl requrl(m_url+m_api); qDebug() << requrl; requrl.setQuery(query); QByteArray loginData = m_login.toLocal8Bit().toBase64(); QString headerData = "Basic " + loginData; request.setRawHeader("Authorization", headerData.toLocal8Bit()); request.setUrl(requrl); reply = manager.get(request); connect(reply, &QNetworkReply::finished, this, &UPDATENEWS::onReplySuccess); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError))); connect(reply, &QNetworkReply::readyRead, this, &UPDATENEWS::onReadyRead); connect(reply, &QNetworkReply::sslErrors, this, &UPDATENEWS::onSSLError); } void UPDATENEWS::onReplyError(QNetworkReply::NetworkError code) { qDebug() << code; emit this->error( bufferToString(), m_url,m_api, (int) code); buffer.clear(); reply->deleteLater(); } void UPDATENEWS::onReplySuccess() { qDebug() << "!"; emit this->success( buffer, m_api); buffer.clear(); // reply->deleteLater(); } void UPDATENEWS::onReadyRead() { qDebug() << "."; buffer += reply->readAll(); } void UPDATENEWS::onSSLError(const QList &errors) { qDebug() << "XHR::onSSLError :" ; QListIterator ierrs(errors); while(ierrs.hasNext()) { qDebug() << "\t" << ierrs.next().errorString(); } } QString UPDATENEWS::bufferToString() { return QTextCodec::codecForName("utf-8")->toUnicode(buffer); }