forked from lubuwest/Friendiqa
280 lines
18 KiB
JavaScript
280 lines
18 KiB
JavaScript
//.pragma library
|
|
.import QtQuick.LocalStorage 2.0 as Sql
|
|
.import "qrc:/js/helper.js" as Helperjs
|
|
.import "qrc:/js/news.js" as Newsjs
|
|
|
|
// IMAGE FUNCTIONS
|
|
|
|
function requestList(login,database,rootwindow,callback) {
|
|
//get list of own images and call download function
|
|
Helperjs.friendicaRequest(login,"/api/friendica/photos/list", rootwindow,function (helperobject){
|
|
//print("return"+helperobject);
|
|
var obj=JSON.parse(helperobject);
|
|
Helperjs.readField("id",database,"imageData",login.username,function(AllStoredImages){
|
|
if (AllStoredImages.length>0){
|
|
for(var i=0;i< AllStoredImages.length;i++){
|
|
var position=Helperjs.inArray(obj,"resourceID",AllStoredImages[i]);
|
|
if (position>-1){obj.splice(position,1)}
|
|
//obj.splice(obj.indexOf(AllStoredImages[i]),1);// list of objects instead of list!!!
|
|
}}
|
|
callback(obj)
|
|
})
|
|
})}
|
|
|
|
function dataRequest(login,photoID,database,rootwindow) {
|
|
// check if image exist and call download function
|
|
Helperjs.friendicaRequest(login,"/api/friendica/photo?photo_id="+photoID, rootwindow, function (image){
|
|
try{ if(image==""){currentimageno=currentimageno+1}else{
|
|
var obj = JSON.parse(image);
|
|
var helpfilename=obj.filename.substring(0,obj.filename.lastIndexOf("."));
|
|
var filesuffix="";
|
|
if (obj.type=="image/jpeg"){filesuffix=".jpg"}
|
|
else if (obj.type=="image/png"){filesuffix=".png"}
|
|
else {filesuffix=""}
|
|
|
|
if (helpfilename==""){// check if file has any filename
|
|
obj.filename=obj["id"]+filesuffix;
|
|
}
|
|
else{obj.filename=helpfilename+filesuffix}
|
|
|
|
var link="";
|
|
if(obj["link"][0]){link=obj["link"][0]} else{link=obj["link"]["4"]}
|
|
xhr.setUrl(Qt.resolvedUrl(link));
|
|
xhr.setFilename(login.imagestore+'albums/'+obj.album+"/"+obj["filename"]);
|
|
xhr.setDownloadtype("picture");
|
|
xhr.download();
|
|
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
db.transaction( function(tx) {
|
|
var result = tx.executeSql('SELECT * from imageData where id = "'+obj["id"]+'"');
|
|
if(result.rows.length === 1) {// use update
|
|
result = tx.executeSql('UPDATE imageData SET username ="' +login.username+ '",id="'+obj.id+'", created="'+obj.created+'", edited="'+obj.edited+'", profile="'+obj.profile+'", link="'+obj["link"]["4"]+'", filename="'+obj.filename+'",title="'+obj.title+'", desc="'+obj.desc+'", type="'+obj.type+'", width="'+obj.width+'", height="'+obj.height+'", album="'+obj.album+'", location="file://'+login.imagestore+'albums/'+obj.album+'/" where id="'+obj["id"]+'"');
|
|
} else {// use insert print('... does not exists, create it')
|
|
result = tx.executeSql('INSERT INTO imageData VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [login.username,obj.id,obj.created,obj.edited, obj.title, obj.desc, obj.album, obj.filename, obj.type, obj.height, obj.width,obj. profile,obj["link"]["4"],'file://'+login.imagestore+'albums/'+obj.album+"/"]);
|
|
}
|
|
})}}
|
|
catch (e){print("Data retrieval failure! "+ e+obj);}
|
|
})}
|
|
|
|
|
|
function deleteImageData(database,user,field,selection,callback) { // does nothing useful at the moment
|
|
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
//print(' delete Image Data() for ' + field +"="+selection)
|
|
db.transaction( function(tx) {
|
|
result = tx.executeSql('UPDATE imageData SET data="" where '+ field +'="'+selection+'"');
|
|
callback(result)})
|
|
}
|
|
|
|
function requestFriendsAlbumPictures(login,friend,rootwindow,callback){
|
|
// screenscraping of albums page of contact without user and password
|
|
Helperjs.friendicaWebRequest(friend.url.replace("profile","photos"),rootwindow,function(photohtml){
|
|
//print(photohtml);
|
|
var photoarray=[];
|
|
var arr = photohtml.split("sidebar-photos-albums-li");
|
|
for (var i=2;i<arr.length;i++){
|
|
var albumlink = arr[i].substring(arr[i].indexOf('http'),arr[i].indexOf('class')-2);
|
|
var albumname=arr[i].substring(arr[i].indexOf('/span')+6,arr[i].indexOf('</a>')-1);
|
|
var album={'link':albumlink,'name':albumname}
|
|
photoarray.push(album);
|
|
}
|
|
callback(photoarray)
|
|
})
|
|
}
|
|
|
|
function requestFriendsPictures(link,rootwindow,callback){
|
|
// screenscraping of pictures page for given album
|
|
Helperjs.friendicaWebRequest(link,rootwindow,function(photohtml){
|
|
var photoarray=[];
|
|
var basehtml=photohtml.substring(photohtml.indexOf('<base')+12,photohtml.indexOf('/>',photohtml.indexOf('<base'))-2);
|
|
|
|
// old theme
|
|
if (photohtml.indexOf("photo-album-image-wrapper-end")>-1){ //theme 1
|
|
var arr = photohtml.split("photo-album-image-wrapper-end");}
|
|
|
|
// other themes
|
|
if (photohtml.indexOf("photo-album-wrapper")>-1){ //theme 2
|
|
var photoarea=photohtml.substring(photohtml.indexOf("photo-album-wrapper"),photohtml.indexOf("photo-album-end"))
|
|
var arr = photoarea.split("</a>");}
|
|
|
|
for (var i=0;i<arr.length-1;i++){
|
|
var photoname=arr[i].substring(arr[i].lastIndexOf('alt')+5,arr[i].lastIndexOf('title')-2);
|
|
var thumblink=arr[i].substring(arr[i].lastIndexOf('<img')+10,arr[i].lastIndexOf('alt')-2);
|
|
|
|
var imagetype=thumblink.substring(thumblink.lastIndexOf("."));
|
|
var photolink=thumblink.substring(0,thumblink.length-imagetype.length-2)+"-0"+imagetype
|
|
if(thumblink.substring(0,4)!=="http"){thumblink=basehtml+thumblink}
|
|
if(photolink.substring(0,4)!=="http"){photolink=basehtml+photolink}
|
|
var photo={'link':photolink,'name':photoname,'thumb':thumblink}
|
|
photoarray.push(photo);
|
|
}
|
|
callback(photoarray)
|
|
})
|
|
}
|
|
|
|
// CONFIG FUNCTIONS
|
|
|
|
function initDatabase(database) { // initialize the database object
|
|
var db =Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
print('initDatabase()'+database[0]+database[1]+database[2]+database[3])
|
|
db.transaction( function(tx) {
|
|
tx.executeSql('CREATE TABLE IF NOT EXISTS imageData(username TEXT,id INT, created TEXT,edited TEXT, title TEXT, desc TEXT, album TEXT,filename TEXT, type TEXT, height INT, width INT, profile INT, link TEXT,location TEXT)');
|
|
tx.executeSql('CREATE TABLE IF NOT EXISTS config(server TEXT, username TEXT, password TEXT, imagestore TEXT, maxnews INT, timerInterval INT, newsViewType TEXT,isActive INT, permissions TEXT,maxContactAge INT,APIVersion TEXT,layout TEXT, addons TEXT)');
|
|
tx.executeSql('CREATE TABLE IF NOT EXISTS news(username TEXT, messagetype INT, text TEXT, created_at INT, in_reply_to_status_id INT, source TEXT, status_id INT, in_reply_to_user_id INT, geo TEXT,favorited TEXT, uid INT, statusnet_html TEXT, statusnet_conversation_id TEXT,friendica_activities TEXT, friendica_activities_self TEXT, attachments TEXT, friendica_owner INT)');
|
|
tx.executeSql('CREATE TABLE IF NOT EXISTS contacts(username TEXT, id INT, name TEXT, screen_name TEXT, location TEXT,imageAge INT, profile_image_url TEXT, description TEXT, profile_image BLOB, url TEXT, protected TEXT, followers_count INT, friends_count INT, created_at INT, favourites_count TEXT, utc_offset TEXT, time_zone TEXT, statuses_count INT, following TEXT, verified TEXT, statusnet_blocking TEXT, notifications TEXT, statusnet_profile_url TEXT, cid INT, network TEXT, isFriend INT)');
|
|
tx.executeSql('CREATE TABLE IF NOT EXISTS groups(username TEXT, groupname TEXT, gid INT, members TEXT)');
|
|
})}
|
|
|
|
function savePermissions(database,obj) { // stores config to DB
|
|
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
var permissions=JSON.stringify(obj)
|
|
db.transaction( function(tx) {
|
|
var result = tx.executeSql( 'UPDATE config SET permissions="'+permissions+'" WHERE username="'+obj.username +'"');
|
|
})
|
|
}
|
|
|
|
function storeConfig(database,obj) { // stores config to DB
|
|
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
db.transaction( function(tx) {
|
|
//print(JSON.stringify(obj));
|
|
var result = tx.executeSql('SELECT * from config WHERE username="'+obj.username+'"');
|
|
if(result.rows.length === 1) {// use update
|
|
var result2 = tx.executeSql('UPDATE config SET server="'+obj.server+'",password="'+obj.password+'", imagestore="'+obj.imagestore+'", maxnews='+obj.maxnews+', timerInterval='+obj.interval+', newsViewType="'+obj.newsViewType+'", isActive=0 WHERE username="'+obj.username +'"');
|
|
var result3 = tx.executeSql('UPDATE config SET isActive=1 WHERE username !="'+obj.username +'"');
|
|
var result4 = tx.executeSql('UPDATE config SET maxnews='+obj.maxnews);
|
|
} else {// use insert print('... does not exists, create it')
|
|
var result2 = tx.executeSql('INSERT INTO config VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)', [obj.server, obj.username, obj.password, obj.imagestore, obj.maxnews, obj.interval,obj.newsViewType,0,"[[],[],[],[]]",0,"","",""]);
|
|
var result3 = tx.executeSql('UPDATE config SET isActive=1 WHERE username !="'+obj.username +'"');
|
|
var result4 = tx.executeSql('UPDATE config SET maxnews='+obj.maxnews);
|
|
}
|
|
})}
|
|
|
|
function getServerConfig(database,login,rootwindow,callback){
|
|
// check server with given credentials
|
|
try {Helperjs.friendicaRequest(login,"/api/statusnet/config",rootwindow, function (obj){
|
|
var serverconfig = JSON.parse(obj);
|
|
var serverconfigString="import QtQuick 2.0; import QtQuick.Dialogs 1.2; MessageDialog{ visible: true; title:'Server';standardButtons: StandardButton.Ok;text: 'SUCCESS! \nName: "+serverconfig.site.name+"\nLanguage: "+serverconfig.site.language+
|
|
"\nEmail: "+serverconfig.site.email+"\nTimezone: "+serverconfig.site.timezone+"\nClosed: "+serverconfig.site.closed+
|
|
"\nText limit: "+serverconfig.site.textlimit+"\nShort Url length: "+serverconfig.site.shorturllength+
|
|
"\nFriendica version: "+serverconfig.site.friendica.FRIENDICA_VERSION+"\nDFRN version: "+serverconfig.site.friendica.DFRN_PROTOCOL_VERSION +
|
|
"\nDB Update version: "+serverconfig.site.friendica.DB_UPDATE_VERSION+"'}";
|
|
|
|
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
db.transaction( function(tx) {
|
|
var result = tx.executeSql('UPDATE config SET APIVersion="'+ serverconfig.site.friendica.FRIENDICA_VERSION+'" WHERE username="'+login.username +'"')})
|
|
|
|
Helperjs.friendicaRequest(login,"/friendica/json",rootwindow, function (obj){
|
|
var serverData = JSON.parse(obj);var serverAddons=JSON.stringify(serverData.plugins).replace(/"/g,"");
|
|
db.transaction( function(tx) {
|
|
var result = tx.executeSql('UPDATE config SET addons="'+ serverAddons+'" WHERE username="'+login.username +'"')})
|
|
|
|
callback(serverconfigString);
|
|
})})}
|
|
catch (e){callback (e);
|
|
}}
|
|
|
|
function readConfig(database,callback,filter,filtervalue) { // reads config
|
|
if (filter){var where = " WHERE "+ filter +" = '" + filtervalue+"'"} else { var where=""}
|
|
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3],initDatabase(database));
|
|
db.transaction( function(tx) {
|
|
var tables = tx.executeSql("SELECT * FROM sqlite_master WHERE type='table'");
|
|
if (tables.rows.length==0){print("no database");callback("")} else {
|
|
var rs = tx.executeSql('select * from config'+where);
|
|
var rsArray=[];
|
|
if (rs.rows.length>0){
|
|
for(var i = 0; i < rs.rows.length; i++) {
|
|
rsArray.push(rs.rows.item(i))
|
|
}
|
|
var rsObject={server:rsArray[0].server,username:rsArray[0].username, password:rsArray[0].password,imagestore:rsArray[0].imagestore,maxnews:rsArray[0].maxnews,isActive:rsArray[0].isActive,timerInterval:rsArray[0].timerInterval, newsViewType:rsArray[0].newsViewType,permissions:JSON.parse(rsArray[0].permissions),maxContactAge:rsArray[0].maxContactAge,APIVersion:rsArray[0].APIVersion,addons:rsArray[0].addons};
|
|
} else {var rsObject=""}
|
|
callback(rsObject)}}
|
|
)
|
|
}
|
|
|
|
function readActiveConfig(database){
|
|
var obj;
|
|
readConfig(database,function(config){obj=config},"isActive", 0);
|
|
return obj;
|
|
}
|
|
|
|
function deleteConfig(database,userobj,callback) { // delete user data from DB
|
|
if (userobj){var where = " WHERE username='"+ userobj.username+"' and server='"+userobj.server+"'";} else { return "no user selected!";}
|
|
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
if(!db) { return; }
|
|
db.transaction( function(tx) {
|
|
var rs = tx.executeSql('delete from config'+where);
|
|
callback(rs);
|
|
})
|
|
}
|
|
|
|
function cleanNews(database,callback){
|
|
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
db.transaction( function(tx) {
|
|
var maxnewsrs = tx.executeSql("SELECT DISTINCT maxnews FROM config");
|
|
var maxnews=maxnewsrs.rows.item(0).maxnews;
|
|
var newscountrs = tx.executeSql('SELECT COUNT(*) from news');
|
|
var newscount = newscountrs.rows.item(0)["COUNT(*)"];
|
|
if (newscount>maxnews){var lastvalidtimers= tx.executeSql('select created_at from news ORDER BY created_at DESC LIMIT ' +(newscount-maxnews));
|
|
var lastvalidtime=lastvalidtimers.rows.item(maxnews).created_at;
|
|
var deleters = tx.executeSql('DELETE from news WHERE created_at<='+lastvalidtime)}
|
|
callback()
|
|
})
|
|
}
|
|
|
|
function processNews(callback){
|
|
// Newsjs.getCurrentContacts(login,db,function(contacts){
|
|
// contactlist=contacts});
|
|
|
|
if (contactLoadType=="news"){
|
|
if(root.news.length==0){}
|
|
else{// show news
|
|
Newsjs.storeNews(login,db,news,root,function(dbnews){
|
|
root.newsSignal(dbnews);
|
|
newstab.newstabstatus=login.newsViewType
|
|
})}
|
|
}
|
|
else if (contactLoadType=="friends"){// show friends
|
|
root.friendsSignal(login.username);
|
|
Newsjs.getCurrentContacts(login,db,function(contacts){
|
|
contactlist=contacts;
|
|
})}
|
|
|
|
else if (contactLoadType=="conversation"){
|
|
var conversationid=news[0].statusnet_conversation_id
|
|
if (!isNaN(parseInt(conversationid))){//no directmessage conversation
|
|
Newsjs.storeNews(root.login,root.db,news,root,function(){
|
|
Newsjs.conversationfromdb(db,root.login.username,conversationid, function(newsarray){
|
|
newstab.conversation=newsarray;
|
|
})
|
|
})}
|
|
else {newstab.conversation=news}//only DM conversations from database
|
|
}
|
|
else if (contactLoadType=="favorites"){//show favorited news
|
|
Newsjs.storeNews(root.login,root.db,news,root,function(){
|
|
Newsjs.favoritesfromdb(db,login.username,function(newsarray){
|
|
root.newsSignal(newsarray);
|
|
newstab.newstabstatus="Favorites";
|
|
})
|
|
})}
|
|
callback()
|
|
}
|
|
|
|
function updateContactInDB(login,database,isFriend,contact){// for newstab and friendstab
|
|
// var suffix=contact.profile_image_url.substring(contact.profile_image_url.lastIndexOf("."), contact.profile_image_url.length);
|
|
// var imagename=login.imagestore+"contacts/"+contact.screen_name.trim()+suffix;
|
|
var imagename=login.imagestore+"contacts/"+contact.screen_name+"-"+contact.profile_image_url.substring(contact.profile_image_url.lastIndexOf("/")+1, contact.profile_image_url.length);
|
|
contacttimer.restart();
|
|
var currentTime=Date.now();
|
|
xhr.setUrl(Qt.resolvedUrl(contact.profile_image_url));
|
|
xhr.setFilename(imagename);
|
|
xhr.setDownloadtype("contact");
|
|
xhr.download();
|
|
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
var result;
|
|
db.transaction( function(tx) {
|
|
result = tx.executeSql('SELECT * from contacts where username="'+login.username+'" AND url = "'+contact.url+'"'); // check for news url
|
|
if(result.rows.length === 1) {// use update
|
|
result = tx.executeSql('UPDATE contacts SET id='+contact.id+', name="'+Qt.btoa(contact.name)+'", screen_name="'+contact.screen_name+'", location="'+contact.location+'",imageAge='+currentTime+', profile_image_url="'+contact.profile_image_url+'", description="'+Qt.btoa(contact.description)+'", profile_image="'+imagename+'", protected="'+contact.protected+'", followers_count='+contact.followers_count+', friends_count='+contact.friends_count+', created_at="'+ Date.parse(Newsjs.cleanDate(contact.created_at))+'", favourites_count="'+contact.favorites_count+'", utc_offset="'+contact.utc_offset+'", time_zone="'+contact.time_zone+'", statuses_count='+contact.statuses_count+', following="'+contact.following+'", verified ="'+contact.verified+'", statusnet_blocking="'+contact.statusnet_blocking+'", notifications="'+contact.notifictions+'", statusnet_profile_url="'+contact.statusnet_profile_url+'", cid='+contact.cid+', network="'+contact.network+'", isFriend='+isFriend+' where username="'+login.username+'" AND url="'+contact.url+'"');
|
|
} else {// use insert
|
|
result = tx.executeSql('INSERT INTO contacts VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [login.username,contact.id,Qt.btoa(contact.name),contact.screen_name,contact.location,currentTime,contact.profile_image_url, Qt.btoa(contact.description),imagename,contact.url,contact.protected,contact.followers_count, contact.friends_count,Date.parse(Newsjs.cleanDate(contact.created_at)),contact.favorites_count,contact.utc_offset,contact.time_zone,contact.statuses_count,contact.following,contact.verfied,contact.statusnet_blocking,contact.notifications,contact.statusnet_profile_url,contact.cid,contact.network,isFriend]);}
|
|
});
|
|
}
|