// 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; 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(); } else { qDebug() << "Database: connection ok"; } } 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(); updateInterval=query.value(5).toInt(); //UPDATENEWS::connect(&UPDATENEWS::getLogin,SIGNAL(loginChanged(QString)),this,SLOT(XHR::login(QString))); m_api="/api/statuses/friends_timeline"; xhr.setApi(m_api); if(updateInterval!=0){alarm.setAlarm(updateInterval);}; } } 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(); 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::store(QByteArray serverreply,QString apiname) { QJsonDocument news; QJsonParseError jsonerror; news=QJsonDocument::fromJson(serverreply,&jsonerror); if (news.isArray()){ for (int i=0; i < news.array().count();i++){ QJsonValue newsitem=news[i]; QSqlQuery query(m_db); query.prepare("INSERT INTO news (username,messagetype,text,created_at,in_reply_to_status_id,source,status_id,in_reply_to_user_id,geo,favorited,uid,statusnet_html,statusnet_conversation_id,friendica_activities,friendica_activities_self,attachments,friendica_owner) " "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); query.bindValue(0,username); query.bindValue(1,"0"); query.bindValue(2, newsitem["text"].toString().toUtf8().toBase64()); QString sourcedate=newsitem["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(3,QDateTime::fromString(formateddate,Qt::RFC2822Date).toMSecsSinceEpoch() ); if(newsitem["in_reply_to_status_id"]!=QJsonValue::Null){query.bindValue(4, newsitem["in_reply_to_status_id"].toInt());}; query.bindValue(5,newsitem["source"]); query.bindValue(6,newsitem["id"].toInt()); if(newsitem["in_reply_to_user_id"]!=QJsonValue::Null){ query.bindValue(7,newsitem["in_reply_to_user_id"].toInt());}; query.bindValue(8,newsitem["geo"]); query.bindValue( 9, newsitem["favorited"].toInt()); query.bindValue(10, newsitem["user"]["id"].toInt()); query.bindValue(11, newsitem["statusnet_html"].toString().toUtf8().toBase64()); query.bindValue(12, newsitem["statusnet_conversation_id"].toInt()); QJsonArray likeArray;QJsonArray dislikeArray;QJsonArray attendyesArray;QJsonArray attendnoArray;QJsonArray attendmaybeArray; if (newsitem.toObject().contains("friendica_activities")){ for (int a=0; a < newsitem["friendica_activities"]["like"].toArray().count();a++){ likeArray.append(newsitem["friendica_activities"]["like"][a]["url"].toString()); } for (int b=0; b < newsitem["friendica_activities"]["dislike"].toArray().count();b++){ dislikeArray.append(newsitem["friendica_activities"]["dislike"][b]["url"].toString()); } for (int c=0; c < newsitem["friendica_activities"]["attendyes"].toArray().count();c++){ attendyesArray.append(newsitem["friendica_activities"]["attendyes"][c]["url"].toString()); } for (int d=0; d < newsitem["friendica_activities"]["attendno"].toArray().count();d++){ attendnoArray.append(newsitem["friendica_activities"]["attendno"][d]["url"].toString()); } for (int e = 0; e < newsitem["friendica_activities"]["attendmaybe"].toArray().count();e++){ attendmaybeArray.append(newsitem["friendica_activities"]["attendmaybe"][e]["url"].toString()); } }; QJsonArray friendica_activities; friendica_activities={likeArray,dislikeArray,attendyesArray,attendnoArray,attendmaybeArray}; QJsonDocument activities; activities.setArray(friendica_activities); query.bindValue(13,activities.toJson(QJsonDocument::Compact).toBase64()); query.bindValue(14,"[]"); if (newsitem["attachments"]!=QJsonValue::Undefined){ query.bindValue(15, QJsonDocument(newsitem["attachments"].toArray()).toJson(QJsonDocument::Compact).toBase64()); }; query.bindValue(16, newsitem["friendica_owner"]["url"]); query.exec() ; } } else {emit this->error(m_api,QTextCodec::codecForName("utf-8")->toUnicode(serverreply));} 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 query("UPDATE contacts SET imageLocation='"+ filename +"' WHERE imageurl ='"+imageurl+ "' AND username = '" +username+"'",m_db); query.exec(); } } 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; //qDebug()< 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); } } emit this->success(m_api); } 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); }