2019-01-09 22:03:16 +01:00
// This file is part of Friendiqa
2018-11-09 22:06:13 +01:00
// https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
//
// 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 <http://www.gnu.org/licenses/>.
# include "updatenews.h"
# include <QHttpPart>
# include <QTextCodec>
# include <QUrlQuery>
# include <QList>
# include <QDataStream>
# include <QJsonDocument>
# include <QJsonObject>
# include <QJsonArray>
# include <QQmlEngine>
# include <QSqlQuery>
# include <QSqlRecord>
# include <QSqlDatabase>
# include <QSqlError>
# include <QDateTime>
2019-06-25 20:59:10 +02:00
//#include "AndroidNative/systemdispatcher.h"
2018-11-09 22:06:13 +01:00
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 ;
2019-01-09 22:03:16 +01:00
xhr . setUrl ( url ) ;
2018-11-09 22:06:13 +01:00
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 ( ) ) ;
2019-06-25 20:59:10 +02:00
//qDebug() << db_url;
2018-11-09 22:06:13 +01:00
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 ;
2019-01-09 22:03:16 +01:00
xhr . setLogin ( m_login ) ;
2018-11-09 22:06:13 +01:00
m_url = query . value ( 0 ) . toString ( ) ;
2019-01-09 22:03:16 +01:00
xhr . setUrl ( m_url ) ;
m_imagedir = query . value ( 3 ) . toString ( ) ;
xhr . setImagedir ( m_imagedir ) ;
2018-11-09 22:06:13 +01:00
QString isActive = query . value ( 7 ) . toString ( ) ;
2019-06-25 20:59:10 +02:00
}
//m_updateInterval=query.value(5).toInt();
QSqlQuery syncquery ( " SELECT * FROM globaloptions " , m_db ) ;
// QSqlQuery delquery("DELETE FROM globaloptions WHERE k='sync_interval'",m_db);
// delquery.exec();
m_updateInterval = 0 ;
syncindex = 0 ;
synclist . clear ( ) ;
//QSqlQuery syncquery("SELECT * FROM globaloptions WHERE k like 'sync_%' AND v=1",m_db);
while ( syncquery . next ( ) ) {
if ( syncquery . value ( 0 ) . toString ( ) = = " syncinterval " ) {
m_updateInterval = syncquery . value ( 1 ) . toInt ( ) ;
}
if ( syncquery . value ( 0 ) . toString ( ) . left ( 5 ) = = " sync_ " & & syncquery . value ( 1 ) . toInt ( ) = = 1 ) {
synclist . append ( syncquery . value ( 0 ) . toString ( ) ) ;
//qDebug() << " sync " << syncquery.value(0).toString() << " " <<syncquery.value(1).toString();
}
if ( syncquery . value ( 0 ) . toString ( ) . left ( 7 ) = = " notify_ " & & syncquery . value ( 1 ) . toInt ( ) = = 1 ) {
notifylist . append ( syncquery . value ( 0 ) . toString ( ) ) ;
//qDebug() << " notify " << syncquery.value(0).toString() << " " <<syncquery.value(1).toString();
}
}
// QSqlQuery notifyquery("SELECT * FROM globaloptions WHERE k like 'notify_%' AND v=1",m_db);
//qDebug() << "size " << notifyquery.size();
// while (notifyquery.next()){
// notifylist.append(syncquery.value(0).toString());
// qDebug() << " notify " << syncquery.value(0).toString();
//}
}
void UPDATENEWS : : startsync ( )
{ //qDebug()<<"Friendiqa start syncing " <<synclist.length()<<" index "<<syncindex;
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 ) ) ) ;
if ( syncindex < synclist . length ( ) ) {
if ( synclist [ syncindex ] = = " sync_Timeline " ) {
timeline ( ) ;
} else if ( synclist [ syncindex ] = = " sync_Replies " ) {
replies ( ) ;
} else if ( synclist [ syncindex ] = = " sync_DirectMessages " ) {
directmessages ( ) ;
} else if ( synclist [ syncindex ] = = " sync_Notifications " ) {
notifications ( ) ;
}
} else if ( syncindex = = synclist . length ( ) ) {
m_api = " " ;
if ( m_updateInterval ! = 0 ) {
syncindex = 0 ;
synclist . clear ( ) ;
m_db . close ( ) ;
m_db . removeDatabase ( m_db . connectionName ( ) ) ;
emit quitapp ( ) ;
alarm . setAlarm ( m_updateInterval ) ;
m_updateInterval = 0 ;
}
2018-11-09 22:06:13 +01:00
}
}
void UPDATENEWS : : timeline ( )
{
2019-06-25 20:59:10 +02:00
m_api = " /api/statuses/friends_timeline " ;
2019-01-09 22:03:16 +01:00
xhr . clearParams ( ) ;
2019-06-25 20:59:10 +02:00
xhr . setUrl ( m_url ) ;
xhr . setApi ( m_api ) ;
QSqlQuery query ( " SELECT status_id FROM news WHERE messagetype=0 AND username=' " + username + " ' ORDER BY status_id DESC LIMIT 1 " , m_db ) ;
if ( query . isActive ( ) & & query . isSelect ( ) ) {
if ( query . first ( ) ) {
QString lastid = query . value ( 0 ) . toString ( ) ;
xhr . setParam ( " since_id " , lastid ) ;
}
}
2019-01-09 22:03:16 +01:00
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 ) ) ) ;
2019-06-25 20:59:10 +02:00
QObject : : connect ( & xhr , SIGNAL ( downloaded ( QString , QString , QString , int ) ) , this , SLOT ( updateImageLocation ( QString , QString , QString , int ) ) ) ;
2018-11-09 22:06:13 +01:00
}
2019-06-25 20:59:10 +02:00
void UPDATENEWS : : replies ( )
2018-11-09 22:06:13 +01:00
{
2019-06-25 20:59:10 +02:00
m_api = " /api/statuses/replies " ;
xhr . clearParams ( ) ;
xhr . setUrl ( m_url ) ;
xhr . setApi ( m_api ) ;
QSqlQuery query ( " SELECT status_id FROM news WHERE messagetype=3 AND username=' " + username + " ' ORDER BY status_id DESC LIMIT 1 " , m_db ) ;
if ( query . isActive ( ) & & query . isSelect ( ) ) {
if ( query . first ( ) ) {
QString lastid = query . value ( 0 ) . toString ( ) ;
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 ) ) ) ;
QObject : : connect ( & xhr , SIGNAL ( downloaded ( QString , QString , QString , int ) ) , this , SLOT ( updateImageLocation ( QString , QString , QString , int ) ) ) ;
}
void UPDATENEWS : : directmessages ( )
{
m_api = " /api/direct_messages/all " ;
xhr . clearParams ( ) ;
xhr . setUrl ( m_url ) ;
xhr . setApi ( m_api ) ;
QSqlQuery query ( " SELECT status_id FROM news WHERE messagetype=1 AND username=' " + username + " ' ORDER BY status_id DESC LIMIT 1 " , m_db ) ;
if ( query . isActive ( ) & & query . isSelect ( ) ) {
if ( query . first ( ) ) {
QString lastid = query . value ( 0 ) . toString ( ) ;
xhr . setParam ( " since_id " , lastid ) ;
}
}
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 ) ) ) ;
QObject : : connect ( & xhr , SIGNAL ( downloaded ( QString , QString , QString , int ) ) , this , SLOT ( updateImageLocation ( QString , QString , QString , int ) ) ) ;
}
void UPDATENEWS : : notifications ( )
{
m_api = " /api/friendica/notifications " ;
xhr . clearParams ( ) ;
xhr . setUrl ( m_url ) ;
xhr . setApi ( m_api ) ;
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 ) ) ) ;
QObject : : connect ( & xhr , SIGNAL ( downloaded ( QString , QString , QString , int ) ) , this , SLOT ( updateImageLocation ( QString , QString , QString , int ) ) ) ;
}
void UPDATENEWS : : store ( QByteArray serverreply , QString apiname )
{ if ( apiname ! = m_api | | xhr . downloadtype ( ) ! = " " ) { } else {
QJsonDocument news ;
//qDebug()<<apiname << serverreply;
QJsonParseError jsonerror ;
news = QJsonDocument : : fromJson ( serverreply , & jsonerror ) ;
if ( news . isArray ( ) ) {
for ( int i = 0 ; i < news . array ( ) . count ( ) ; i + + ) {
QJsonValue newsitem = news [ i ] ;
if ( apiname = = " /api/friendica/notifications " ) {
QSqlQuery testquery ( " SELECT status_id FROM news WHERE status_id= " + QString : : number ( newsitem [ " id " ] . toInt ( ) ) + " AND messagetype=2 AND username=' " + username + " ' " , m_db ) ;
if ( testquery . first ( ) ) { continue ; }
}
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 ( ) ) ;
} else {
query . bindValue ( 15 , " " ) ;
2019-01-09 22:03:16 +01:00
}
2019-06-25 20:59:10 +02:00
if ( newsitem [ " friendica_author " ] ! = QJsonValue : : Undefined ) {
query . bindValue ( 16 , newsitem [ " friendica_author " ] [ " url " ] ) ;
} else {
query . bindValue ( 16 , newsitem [ " user " ] [ " url " ] ) ;
}
if ( apiname = = " /api/statuses/replies " ) {
query . bindValue ( 1 , " 3 " ) ;
2019-01-09 22:03:16 +01:00
}
2019-06-25 20:59:10 +02:00
if ( apiname = = " /api/direct_messages/all " ) {
query . bindValue ( 1 , " 1 " ) ;
query . bindValue ( 5 , " Friendica " ) ;
if ( newsitem [ " recipient " ] [ " id " ] ! = QJsonValue : : Null ) { query . bindValue ( 7 , newsitem [ " recipient " ] [ " id " ] . toInt ( ) ) ; }
query . bindValue ( 10 , newsitem [ " sender_id " ] . toInt ( ) ) ;
query . bindValue ( 11 , newsitem [ " text " ] . toString ( ) . toUtf8 ( ) . toBase64 ( ) ) ;
if ( newsitem [ " friendica_parent_uri " ] ! = QJsonValue : : Null ) { query . bindValue ( 12 , newsitem [ " friendica_parent_uri " ] ) ; }
query . bindValue ( 16 , newsitem [ " sender " ] [ " url " ] ) ;
2019-01-09 22:03:16 +01:00
}
2019-06-25 20:59:10 +02:00
if ( apiname = = " /api/friendica/notifications " ) {
query . bindValue ( 1 , " 2 " ) ;
query . bindValue ( 3 , QDateTime : : fromString ( newsitem [ " date " ] . toString ( ) , " yyyy-MM-dd hh:mm:ss " ) . toMSecsSinceEpoch ( ) ) ;
query . bindValue ( 5 , " Friendica " ) ;
QJsonObject cleancontact = findNotificationContact ( newsitem [ " url " ] . toString ( ) ) ;
query . bindValue ( 10 , cleancontact [ " id " ] . toInt ( ) ) ;
query . bindValue ( 11 , newsitem [ " msg_html " ] . toString ( ) . toUtf8 ( ) . toBase64 ( ) ) ;
if ( newsitem [ " parent " ] ! = QJsonValue : : Null ) { query . bindValue ( 12 , newsitem [ " parent " ] ) ; }
query . bindValue ( 16 , newsitem [ " url " ] ) ;
2019-01-09 22:03:16 +01:00
}
2019-06-25 20:59:10 +02:00
if ( ! ( query . exec ( ) ) ) { qDebug ( ) < < query . lastError ( ) ; }
// notifications
if ( apiname = = " /api/statuses/friends_timeline " ) {
if ( notifylist . contains ( " notify_Timeline " ) ) {
alarm . notify ( " Home: " + newsitem [ " user " ] [ " name " ] . toString ( ) , newsitem [ " text " ] . toString ( ) , 0 ) ;
}
2019-01-09 22:03:16 +01:00
}
2019-06-25 20:59:10 +02:00
if ( apiname = = " /api/statuses/replies " ) {
if ( notifylist . contains ( " notify_Replies " ) ) {
alarm . notify ( " Replies: " + newsitem [ " user " ] [ " name " ] . toString ( ) , newsitem [ " text " ] . toString ( ) , 1 ) ;
}
}
if ( apiname = = " /api/direct_messages/all " ) {
if ( notifylist . contains ( " notify_DirectMessages " ) ) {
alarm . notify ( " DirectMessage: " + newsitem [ " sender " ] [ " name " ] . toString ( ) , newsitem [ " text " ] . toString ( ) , 2 ) ;
}
}
if ( apiname = = " /api/friendica/notifications " ) {
if ( notifylist . contains ( " notify_Notifications " ) ) {
alarm . notify ( " Notification: " + newsitem [ " name " ] . toString ( ) , newsitem [ " text " ] . toString ( ) , 3 ) ;
}
}
}
QList < QJsonValue > newcontacts = findNewContacts ( news ) ;
//qDebug()<< "new contacts count " << newcontacts.size();
if ( newcontacts . size ( ) > 0 ) {
updateContacts ( newcontacts ) ;
startImagedownload ( ) ;
} else {
if ( m_updateInterval ! = 0 ) {
syncindex + = 1 ;
startsync ( ) ;
}
}
}
else {
qDebug ( ) < < " Friendiqa updatenews error " < < serverreply ;
emit this - > error ( m_api , QTextCodec : : codecForName ( " utf-8 " ) - > toUnicode ( serverreply ) ) ;
syncindex + = 1 ;
startsync ( ) ;
2019-01-09 22:03:16 +01:00
}
2018-11-09 22:06:13 +01:00
}
}
2019-06-25 20:59:10 +02:00
2019-01-09 22:03:16 +01:00
void UPDATENEWS : : updateImageLocation ( QString downloadtype , QString imageurl , QString filename , int index ) {
if ( downloadtype = = " contactlist " ) {
2019-06-25 20:59:10 +02:00
QSqlQuery testquery ( " SELECT profile_image FROM contacts WHERE profile_image_url =' " + imageurl + " ' AND username = ' " + username + " ' " , m_db ) ;
testquery . first ( ) ;
//qDebug()<< "update imageurl for " <<imageurl << " from " <<testquery.value(0).toString() <<" to "<< filename <<" index " << index << " newcontactnames.length " <<newcontactnames.length();
QSqlQuery query ( " UPDATE contacts SET profile_image=' " + filename + " ' WHERE profile_image_url =' " + imageurl + " ' AND username = ' " + username + " ' " , m_db ) ;
2019-01-09 22:03:16 +01:00
query . exec ( ) ;
2019-06-25 20:59:10 +02:00
if ( index = = ( newcontactnames . length ( ) - 1 ) ) {
newcontactnames . clear ( ) ;
newcontactimagelinks . clear ( ) ;
if ( m_updateInterval ! = 0 ) {
syncindex + = 1 ;
startsync ( ) ;
}
}
2019-01-09 22:03:16 +01:00
}
}
2018-11-09 22:06:13 +01:00
2019-06-25 20:59:10 +02:00
QJsonObject UPDATENEWS : : findNotificationContact ( QString contacturl ) {
QSqlQuery query ( " SELECT id,url FROM contacts WHERE url=' " + contacturl + " ' AND username=' " + username + " ' " , m_db ) ;
query . first ( ) ;
QJsonObject contact {
{ " id " , query . value ( 0 ) . toInt ( ) } ,
{ " url " , query . value ( 1 ) . toString ( ) }
} ;
return contact ;
}
2018-11-09 22:06:13 +01:00
QList < QJsonValue > UPDATENEWS : : findNewContacts ( QJsonDocument news ) {
QSqlQuery query ( " SELECT profile_image_url FROM contacts " , m_db ) ;
QList < QString > imageurls ;
while ( query . next ( ) ) {
imageurls . append ( query . value ( 0 ) . toString ( ) ) ;
}
QList < QJsonValue > newcontacts ;
2019-06-25 20:59:10 +02:00
//qDebug()<<"updatenews findcontacts news count "<<news.array().count();
2019-01-09 22:03:16 +01:00
2018-11-09 22:06:13 +01:00
for ( int i = 0 ; i < news . array ( ) . count ( ) ; i + + ) {
2019-01-09 22:03:16 +01:00
//main contacts
2019-06-25 20:59:10 +02:00
if ( imageurls . contains ( news [ i ] [ " user " ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) | | newcontactimagelinks . contains ( news [ i ] [ " user " ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) ) {
2018-11-09 22:06:13 +01:00
}
2019-01-09 22:03:16 +01:00
else {
2018-11-09 22:06:13 +01:00
newcontacts . append ( news [ i ] [ " user " ] ) ;
2019-06-25 20:59:10 +02:00
newcontactimagelinks . append ( news [ i ] [ " user " ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) ;
2019-01-09 22:03:16 +01:00
newcontactnames . append ( news [ i ] [ " user " ] [ " screen_name " ] . toString ( ) ) ;
}
//like/dislike contacts
if ( news [ i ] . toObject ( ) . contains ( " friendica_activities " ) ) {
for ( int a = 0 ; a < news [ i ] [ " friendica_activities " ] [ " like " ] . toArray ( ) . count ( ) ; a + + ) {
2019-06-25 20:59:10 +02:00
if ( imageurls . contains ( news [ i ] [ " friendica_activities " ] [ " like " ] [ a ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) | | newcontactimagelinks . contains ( news [ i ] [ " friendica_activities " ] [ " like " ] [ a ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) ) {
2019-01-09 22:03:16 +01:00
}
else {
newcontacts . append ( news [ i ] [ " friendica_activities " ] [ " like " ] [ a ] ) ;
2019-06-25 20:59:10 +02:00
newcontactimagelinks . append ( news [ i ] [ " friendica_activities " ] [ " like " ] [ a ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) ;
2019-01-09 22:03:16 +01:00
newcontactnames . append ( news [ i ] [ " friendica_activities " ] [ a ] [ " screen_name " ] . toString ( ) ) ;
}
}
for ( int b = 0 ; b < news [ i ] [ " friendica_activities " ] [ " dislike " ] . toArray ( ) . count ( ) ; b + + ) {
2019-06-25 20:59:10 +02:00
if ( imageurls . contains ( news [ i ] [ " friendica_activities " ] [ " dislike " ] [ b ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) | | newcontactimagelinks . contains ( news [ i ] [ " friendica_activities " ] [ " dislike " ] [ b ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) ) {
2019-01-09 22:03:16 +01:00
}
else {
newcontacts . append ( news [ i ] [ " friendica_activities " ] [ " dislike " ] [ b ] ) ;
2019-06-25 20:59:10 +02:00
newcontactimagelinks . append ( news [ i ] [ " friendica_activities " ] [ " dislike " ] [ b ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) ;
2019-01-09 22:03:16 +01:00
newcontactnames . append ( news [ i ] [ " friendica_activities " ] [ b ] [ " screen_name " ] . toString ( ) ) ;
}
}
2018-11-09 22:06:13 +01:00
}
2019-01-09 22:03:16 +01:00
//owner contacts
2019-06-25 20:59:10 +02:00
if ( news [ i ] . toObject ( ) . contains ( " friendica_author " ) ) {
if ( imageurls . contains ( news [ i ] [ " friendica_author " ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) | | newcontactimagelinks . contains ( news [ i ] [ " friendica_owner " ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) ) {
2019-01-09 22:03:16 +01:00
}
else {
2019-06-25 20:59:10 +02:00
newcontacts . append ( news [ i ] [ " friendica_author " ] ) ;
newcontactimagelinks . append ( news [ i ] [ " friendica_author " ] [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) ;
newcontactnames . append ( news [ i ] [ " friendica_author " ] [ " screen_name " ] . toString ( ) ) ;
2019-01-09 22:03:16 +01:00
}
}
2018-11-09 22:06:13 +01:00
}
return newcontacts ;
}
void UPDATENEWS : : updateContacts ( QList < QJsonValue > contacts ) {
qint64 currentTime = QDateTime : : currentMSecsSinceEpoch ( ) ;
for ( int i = 0 ; i < contacts . count ( ) ; i + + ) {
QJsonValue contact = contacts [ i ] ;
QSqlQuery query ( m_db ) ;
2019-06-25 20:59:10 +02:00
//qDebug() << "updatecontact " << contact["screen_name"];
2019-01-09 22:03:16 +01:00
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 ) ;
2019-06-25 20:59:10 +02:00
query . bindValue ( 5 , contact [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) ;
if ( contact [ " description " ] . isNull ( ) ) { query . bindValue ( 6 , " " ) ; } else { query . bindValue ( 6 , contact [ " description " ] . toString ( ) . toUtf8 ( ) . toBase64 ( ) ) ; }
2019-01-09 22:03:16 +01:00
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 ( ) ;
2019-06-25 20:59:10 +02:00
try { timestamp = timestamphelper . mid ( timestamphelper . indexOf ( " ?ts " ) + 4 , timestamphelper . length ( ) ) . toUInt ( ) ; } catch ( . . . ) { }
2019-01-09 22:03:16 +01:00
query . bindValue ( 22 , timestamp ) ;
}
2018-11-09 22:06:13 +01:00
2019-01-09 22:03:16 +01:00
else {
query . prepare ( " INSERT INTO contacts (username, id, name, screen_name, location,imageAge, "
" profile_image_url, description, profile_image, url, protected, followers_count, "
2018-11-09 22:06:13 +01:00
" friends_count, created_at, favourites_count, utc_offset, time_zone, statuses_count, "
2019-01-09 22:03:16 +01:00
" following, verified, statusnet_blocking, notifications, statusnet_profile_url, cid, network, isFriend, timestamp) "
2018-11-09 22:06:13 +01:00
" VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) " ) ;
2019-01-09 22:03:16 +01:00
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 ) ;
2019-06-25 20:59:10 +02:00
query . bindValue ( 6 , contact [ " profile_image_url " ] . toString ( ) . section ( ' ? ' , 0 , 0 ) ) ;
if ( contact [ " description " ] . isNull ( ) ) { query . bindValue ( 7 , " " ) ; } else { query . bindValue ( 7 , contact [ " description " ] . toString ( ) . toUtf8 ( ) . toBase64 ( ) ) ; }
2019-01-09 22:03:16 +01:00
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 ( ) ;
2019-06-25 20:59:10 +02:00
try { timestamp = timestamphelper . mid ( timestamphelper . indexOf ( " ?ts " ) + 4 , timestamphelper . length ( ) ) . toUInt ( ) ; } catch ( . . . ) { }
2019-01-09 22:03:16 +01:00
query . bindValue ( 26 , timestamp ) ;
}
2019-06-25 20:59:10 +02:00
query . exec ( ) ;
2018-11-09 22:06:13 +01:00
}
}
QString UPDATENEWS : : url ( ) const
{
return m_url ;
}
2019-01-09 22:03:16 +01:00
void UPDATENEWS : : startImagedownload ( )
2018-11-09 22:06:13 +01:00
{
2019-06-25 20:59:10 +02:00
//qDebug() << "start image download";
2019-01-09 22:03:16 +01:00
xhr . setDownloadtype ( " contactlist " ) ;
xhr . setFilelist ( newcontactimagelinks ) ;
xhr . setContactlist ( newcontactnames ) ;
xhr . setImagedir ( m_imagedir ) ;
xhr . getlist ( ) ;
2018-11-09 22:06:13 +01:00
}
2019-01-09 22:03:16 +01:00
void UPDATENEWS : : showError ( QString data , QString url , QString api , int code )
2018-11-09 22:06:13 +01:00
{
2019-06-25 20:59:10 +02:00
qDebug ( ) < < " showerror " < < api < < " data " < < data ;
2019-01-09 22:03:16 +01:00
emit this - > error ( api , data ) ;
2019-06-25 20:59:10 +02:00
if ( api ! = m_api | | xhr . downloadtype ( ) ! = " " ) { } else {
if ( m_updateInterval ! = 0 ) {
syncindex + = 1 ;
startsync ( ) ;
}
}
2018-11-09 22:06:13 +01:00
}