// 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 "AndroidNative/systemdispatcher.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; xhr.setUrl(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(); } } void UPDATENEWS::login() { QSqlQuery query("SELECT * FROM config WHERE isActive=0",m_db); while (query.next()) { username = query.value(1).toString(); QByteArray bpassword=query.value(2).toByteArray(); QString password=QByteArray::fromBase64(bpassword); m_login=username+":"+password ; xhr.setLogin(m_login); m_url=query.value(0).toString(); xhr.setUrl(m_url); m_imagedir=query.value(3).toString(); xhr.setImagedir(m_imagedir); QString isActive=query.value(7).toString(); m_updateInterval=query.value(5).toInt(); m_api="/api/statuses/friends_timeline"; xhr.setApi(m_api); } } void UPDATENEWS::timeline() { qDebug()<<"Friendiqa start 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(); xhr.clearParams(); xhr.setParam("since_id",lastid); xhr.setParam("count","50"); xhr.get(); QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString))); QObject::connect(&xhr,SIGNAL(error(QString,QString,QString,int)),this,SLOT(showError(QString,QString,QString,int))); } //void UPDATENEWS::startservice(QString type,QVariantMap map) //{ // qDebug ()<<"Friediqa start service "<error(m_api,QTextCodec::codecForName("utf-8")->toUnicode(serverreply)); if(m_updateInterval!=0){ m_db.close(); m_db.removeDatabase(m_db.connectionName()); emit quitapp(); alarm.setAlarm(m_updateInterval); }; } QList newcontacts=findNewContacts(news); updateContacts(newcontacts); startImagedownload(); connect(&xhr, SIGNAL(downloaded(QString, QString, QString, int)), this, SLOT(updateImageLocation(QString,QString, QString, int))); } void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index){ if (downloadtype=="contactlist"){ QSqlQuery testquery("SELECT profile_image FROM contacts WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db); testquery.exec(); //qDebug()<< "update imageurl for " < 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; qDebug()<<"updatenews findcontacts count "< contacts){ qint64 currentTime =QDateTime::currentMSecsSinceEpoch(); for (int i=0; i < contacts.count();i++){ QJsonValue contact=contacts[i]; QSqlQuery query(m_db); //qDebug() << "updatecontact " << contact["screen_name"]; QSqlQuery testquery("SELECT url FROM contacts WHERE username='"+ username +"' AND url='" + contact["url"].toString() +"'",m_db); if (testquery.first()){ query.prepare("UPDATE contacts SET id=?, name=?, screen_name=?, location=?,imageAge=?," "profile_image_url=?, description=?, 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=?, timestamp=? " " WHERE username='"+ username +"' AND url='" + contact["url"].toString() +"'"); query.bindValue(0, contact["id"].toInt()); query.bindValue(1, contact["name"].toString().toUtf8().toBase64()); query.bindValue(2, contact["screen_name"]); query.bindValue(3, contact["location"]); query.bindValue(4, currentTime); query.bindValue(5, contact["profile_image_url"]); if(contact["description"].isNull() ){query.bindValue(6,"");}else{query.bindValue(6, contact["description"].toString().toUtf8().toBase64());}; query.bindValue(7,contact["protected"].toBool()); query.bindValue(8,contact["followers_count"].toInt()); query.bindValue(9,contact["friends_count"].toInt()); QString sourcedate=contact["created_at"].toString(); QString formateddate=sourcedate.mid(0,3)+", "+sourcedate.mid(8,3)+sourcedate.mid(4,3)+sourcedate.mid(25,5)+sourcedate.mid(10,15); query.bindValue(10,QDateTime::fromString(formateddate,Qt::RFC2822Date).toMSecsSinceEpoch() ); query.bindValue(11,contact["favorites_count"].toInt()); query.bindValue(12,contact["utc_offset"].toInt()); query.bindValue(13,contact["time_zone"].toString()); query.bindValue(14,contact["statuses_count"].toInt()); query.bindValue(15,contact["following"].toBool()); query.bindValue(16,contact["verfied"].toBool()); query.bindValue(17,contact["statusnet_blocking"].toBool()); query.bindValue(18,contact["notifications"].toBool()); query.bindValue(19,contact["statusnet_profile_url"]); query.bindValue(20,contact["cid"].toInt()); query.bindValue(21,contact["network"]); qint64 timestamp=0; QString timestamphelper=contact["profile_image_url"].toString(); try {timestamp=timestamphelper.mid(timestamphelper.indexOf("?ts")+4,timestamphelper.length()).toUInt();} catch(...){}; query.bindValue(22,timestamp); } else{ 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"].toInt()); 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"]); if(contact["description"].isNull() ){query.bindValue(7,"");}else{query.bindValue(7, contact["description"].toString().toUtf8().toBase64());}; query.bindValue(8,"none"); query.bindValue(9, contact["url"].toString()); query.bindValue(10,contact["protected"].toBool()); query.bindValue(11,contact["followers_count"].toInt()); query.bindValue(12,contact["friends_count"].toInt()); QString sourcedate=contact["created_at"].toString(); QString formateddate=sourcedate.mid(0,3)+", "+sourcedate.mid(8,3)+sourcedate.mid(4,3)+sourcedate.mid(25,5)+sourcedate.mid(10,15); query.bindValue(13,QDateTime::fromString(formateddate,Qt::RFC2822Date).toMSecsSinceEpoch() ); query.bindValue(14,contact["favorites_count"].toInt()); query.bindValue(15,contact["utc_offset"].toInt()); query.bindValue(16,contact["time_zone"].toString()); query.bindValue(17,contact["statuses_count"].toInt()); query.bindValue(18,contact["following"].toBool()); query.bindValue(19,contact["verfied"].toBool()); query.bindValue(20,contact["statusnet_blocking"].toBool()); query.bindValue(21,contact["notifications"].toBool()); query.bindValue(22,contact["statusnet_profile_url"]); query.bindValue(23,contact["cid"].toInt()); query.bindValue(24,contact["network"]); query.bindValue(25, 0); qint64 timestamp=0; QString timestamphelper=contact["profile_image_url"].toString(); try {timestamp=timestamphelper.mid(timestamphelper.indexOf("?ts")+4,timestamphelper.length()).toUInt();} catch(...){}; query.bindValue(26,timestamp); } query.exec() ; } emit this->success(m_api); if ((contacts.count()==0) && (m_updateInterval!=0)){ m_db.close(); m_db.removeDatabase(m_db.connectionName()); emit quitapp(); alarm.setAlarm(m_updateInterval); }; } QString UPDATENEWS::url() const { return m_url; } void UPDATENEWS::startImagedownload() { xhr.setDownloadtype("contactlist"); xhr.setFilelist(newcontactimagelinks); xhr.setContactlist(newcontactnames); xhr.setImagedir(m_imagedir); xhr.getlist(); } void UPDATENEWS::showError(QString data, QString url,QString api, int code ) { emit this->error(api,data); if(m_updateInterval!=0){ m_db.close(); m_db.removeDatabase(m_db.connectionName()); emit quitapp(); alarm.setAlarm(m_updateInterval); }; }