256 lines
15 KiB
JavaScript
256 lines
15 KiB
JavaScript
function friendicaRequest(url,user,password,api,callback) {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.onreadystatechange = function() {
|
|
if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
|
|
} else if(xhr.readyState === XMLHttpRequest.DONE) {
|
|
try{ callback(xhr.responseText);
|
|
}
|
|
catch (e){
|
|
print("friendicaRequest: Data retrieval failure! "+ e);
|
|
}
|
|
}
|
|
}
|
|
xhr.open("GET", url+api,false,user,password);
|
|
xhr.send();
|
|
}
|
|
|
|
function requestFriends(url,user,password,database,callback){
|
|
friendicaRequest(url,user,password,"/api/statuses/friends", function (obj){
|
|
var friends=JSON.parse(obj);
|
|
for (var i=0;i<friends.length;i++){
|
|
var db=LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
print('store friends data for ' + friends[i].name);
|
|
db.transaction( function(tx) {
|
|
var result = tx.executeSql('SELECT * from contacts where id = "'+obj[i].id+'"'); // check for user id
|
|
if(result.rows.length === 1) {// use update
|
|
print(list[i].id +' exists, update it')
|
|
result = tx.executeSql('UPDATE contacts SET id="'+friends[i].id+'", name="'+friends[i].name+'", screen_name="'+friends[i].screen_name+'", location="'+friends[i].location+'", description="'+friends[i].description+'", profile_image="'+getBase64Image(friends[i].profile_image_url)+'", url="'+friends[i].url+'", protected="'+friends[i].protected+'", followers_count="'+friends[i].followers_count+'", friends_count="'+friends[i].friends_count+'", created_at="'+friends[i].created_at+'", favourites_count="'+friends[i].favourites_count+'", utc_offset="'+ friends[i].utc_offset+'", time_zone="'+friends[i].time_zone+'",statuses_count="' +friends[i].statuses_count+'", following="'+friends[i].following+'", verified="'+friends[i].verified+'", statusnet_blocking="'+friends[i].statusnet_blocking+'", notifications="'+friends[i].notifications+'", statusnet_profile_url="'+friends[i].statusnet_profile_url+'", cid="'+friends[i].cid+'", network="'+friends[i].network+'" WHERE cid="'+friends[i].cid+'"');
|
|
} else {// use insert
|
|
result = tx.executeSql('INSERT INTO contacts VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [friends[i].id,friends[i].name,friends[i].screen_name,friends[i].location,friends[i].description,getBase64Image(friends[i].profile_image_url),friends[i].url,friends[i].protected,friends[i].followers_count,friends[i].friends_count,friends[i].created_at,friends[i].favourites_count,friends[i].utc_offset,friends[i].time_zone,friends[i].statuses_count,friends[i].following,friends[i].verified,friends[i].statusnet_blocking,friends[i].notifications,friends[i].statusnet_profile_url,friends[i].cid,friends[i].network]);}
|
|
print("Result: " + result)
|
|
});
|
|
}
|
|
callback();});}
|
|
|
|
function requestNews(url,user,password,database,callback){
|
|
friendicaRequest(url,user,password,"/api/statuses/friends_timeline", function (obj){
|
|
var news=JSON.parse(obj);
|
|
for (var i=0;i<news.length;i++){
|
|
var db=LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
print('store news data for ' + news[i].status_id);
|
|
db.transaction( function(tx) {
|
|
var result = tx.executeSql('SELECT * from news where id = "'+news[i].status_id+'"'); // check for news id
|
|
if(result.rows.length === 1) {// use update
|
|
print(news[i].id +' exists, update it')
|
|
result = tx.executeSql('UPDATE news SET text="'+news[i].text+'", truncated="'+news[i].truncated+'", created_at="'+news[i].created_at+'", in_reply_to_status_id="'+news[i].in_reply_to_status_id+'", source="'+news[i].source+'", status_id="'+news[i].status_id+'", in_reply_to_user_id="'+news[i].in_reply_to_user_id+'", geo="'+news[i].geo+'", favorited="'+news[i].favorited+'", uid="'+news[i].uid+'", status_html="'+news[i].status_html+'", statusnet_conversation_id="'+news[i].statusnet_conversation_id+'", attachments="'+news[i].attachments+'" where status_id="'+news[i].status_id+'"');
|
|
} else {// use insert
|
|
result = tx.executeSql('INSERT INTO news VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [news[i].text,news[i].truncated,news[i].created_at, news[i].in_reply_to_status_id, news[i].source, news[i].status_id,news[i].in_reply_to_user_id,news[i].geo,news[i].favorited, news[i].uid,news[i].status_html,news[i].statusnet_conversation_id, news[i].attachments]);
|
|
print("Inserted");}
|
|
});}
|
|
callback();}
|
|
);}
|
|
|
|
function requestFriendsAlbumPictures(url,user,password,db){
|
|
readField("screen_name",db,"contacts",function(obj){
|
|
for (i=0; i<obj.length;i++){
|
|
friendicaRequest(url,user,password,"/photos/"+screen_name,function(photohtml){
|
|
print(photohtml);
|
|
var photoarray=[];
|
|
var arr = photohtml.split("photo-top-image-wrapper lframe");
|
|
for (j=1;j<arr.length;i++){
|
|
var photo = arr[i].substring(arr[i].indexOf('<img src=')+11,arr[i].indexOf('alt=')-3);
|
|
photoarray.push(photo);
|
|
}})}},"network","FRIENDICA")
|
|
}
|
|
|
|
|
|
function newsfromdb(database,user,callback,stop_id){
|
|
var db=LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
db.transaction( function(tx) {
|
|
if (!stop_id){var rs = tx.executeSql('select status_id from news ORDER BY status_id DESC LIMIT 1');
|
|
var stop_id=rs.rows.item;}
|
|
var newsrs=tx.executeSql('select * from news WHERE (status_id<'+stop_id+') DESC LIMIT 20');
|
|
var newsArray;
|
|
for(var i = 0; i < newsrs.rows.length; i++) {
|
|
newsArray.push(newsrs.rows.item(i))
|
|
}
|
|
callback(newsArray);
|
|
});}
|
|
|
|
function requestList(url,user,password,database,callback) {
|
|
friendicaRequest(url,user,password,"/api/friendica/photos/list", function (obj){
|
|
var obj=JSON.parse(obj);
|
|
readField("resourceID",database,"imageData",function(AllStoredImages){
|
|
for(var i=0;i< AllStoredImages.length;i++){
|
|
obj.splice(obj.indexOf(AllStoredImages[i]),1);
|
|
}
|
|
});
|
|
callback(obj);
|
|
})}
|
|
|
|
function uploadData(url,user,password,api,data,callback) {
|
|
var xhr = new XMLHttpRequest();
|
|
print(url+api+data);
|
|
xhr.onreadystatechange = function() {
|
|
if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
|
|
print('HEADERS_RECEIVED')
|
|
} else if(xhr.readyState === XMLHttpRequest.DONE) {
|
|
print('DONE');
|
|
var obj=xhr.responseText.toString();
|
|
print("Upload message: "+obj);
|
|
callback(obj);
|
|
}
|
|
}
|
|
xhr.open("POST", url+api+data,false,user,password);
|
|
xhr.send();
|
|
}
|
|
|
|
function uploadMedia(url,user,password,picture,callback) {
|
|
uploadData(url,user,password,"/api/media/upload?media=", getBase64Image(picture),callback)
|
|
}
|
|
|
|
function statusUpdate(url,user,password,title,status,in_reply_to_status_id,media,group_allow,contact_allow,group_deny,contact_deny,callback) {
|
|
if(title){titleString="&title="+title}
|
|
if(status){statusString="&status="+status}
|
|
if(in_reply_to_status_id){replyString="&in_reply_to_status_id="+in_reply_to_status_id}
|
|
if(media){mediaString="&media="+base64Image(media)}
|
|
if(group_allow){groupallowString="&group_allow="+group_allow}
|
|
if(group_deny){groupdenyString="&group_deny="+group_deny}
|
|
if(contact_allow){contactallowString="&contact_allow="+contact_allow}
|
|
if(contact_deny){contactdenyString="&contact_deny="+contact_deny}
|
|
if(in_reply_to_status_id){replyString="&in_reply_to_status_id="+in_reply_to_status_id}
|
|
upload_data(url,user,password,"statuses/update?"+titleString+statusString+replyString+mediaString+groupallowString+groupdenyString+contactallowString+contactdenyString, function (obj){
|
|
var obj=JSON.parse(obj);
|
|
})}
|
|
|
|
|
|
function getBase64Image(img) {
|
|
var ctx = getContext("2d");
|
|
ctx.width = img.width;
|
|
ctx.height = img.height;
|
|
ctx.drawImage(img, 0, 0);
|
|
var dataURL = canvas.toDataURL("image/png");
|
|
// escape data:image prefix
|
|
return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
|
|
// or just return dataURL
|
|
// return dataURL
|
|
}
|
|
|
|
|
|
function dataRequest(url,user,password,photoID,database) {
|
|
friendicaRequest(url,user,password,"/api/friendica/photo?photo_id="+photoID, function (obj){
|
|
try{ var image = JSON.parse(obj);
|
|
print(" Data retrieval success!");
|
|
storeData(image,database)
|
|
}
|
|
catch (e){
|
|
infobox.text="Data retrieval failure! "+ e;
|
|
}
|
|
});
|
|
}
|
|
|
|
function initDatabase(database) { // initialize the database object
|
|
var db =LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
print('initDatabase()'+database[0]+database[1]+database[2]+database[3])
|
|
db.transaction( function(tx) {
|
|
print('... create table')
|
|
tx.executeSql('CREATE TABLE IF NOT EXISTS imageData(id INT, uid INT, contact_id INT, guid TEXT, resourceID TEXT, created TEXT,edited TEXT, title TEXT, desc TEXT, album TEXT,filename TEXT, type TEXT, height INT, width INT, datasize INT, data BLOB, scale INT, profile INT, allow_cid TEXT, allow_gid TEXT, deny_cid TEXT, deny_gid TEXT)');
|
|
tx.executeSql('CREATE TABLE IF NOT EXISTS config(server TEXT, username TEXT, password TEXT,isActive BOOL)');
|
|
tx.executeSql('CREATE TABLE IF NOT EXISTS news(text TEXT, truncated BOOL, created_at TEXT, in_reply_to_status_id INT, source TEXT, status_id INT, in_reply_to_user_id INT, geo TEXT,favorited BOOL, uid INT, statusnet_html TEXT, statusnet_conversation_id TEXT,attachments TEXT)');
|
|
tx.executeSql('CREATE TABLE IF NOT EXISTS contacts(id INT, name TEXT, screen_name TEXT, location TEXT,description TEXT, profile_image BLOB, url TEXT, protected BOOL, followers_count INT, friends_count INT, created_at TEXT, favourites_count INT, utc_offset TEXT, time_zone TEXT, statuses_count INT, following BOOL, verified BOOL, statusnet_blocking BOOL, notifications BOOL, statusnet_profile_url TEXT, cid INT, network TEXT)');
|
|
})}
|
|
|
|
function storeConfig(database,obj) { // stores config to DB
|
|
var db=LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
print('storeConfig() for ' + obj.username)
|
|
print('database: ' + database[0]);
|
|
db.transaction( function(tx) {
|
|
print('... check if a object exists: '+obj.username)
|
|
var result = tx.executeSql('SELECT * from config WHERE username="'+obj.username+'"');
|
|
if(result.rows.length === 1) {// use update
|
|
print(obj.username +' exists, update it');
|
|
var result2 = tx.executeSql('UPDATE config SET server="'+obj.server+'",password="'+obj.password+'", isActive="TRUE" WHERE username="'+obj.username +'"');
|
|
var result3 = tx.executeSql('UPDATE config SET isActive="FALSE" WHERE username !="'+obj.username +'"');
|
|
} else {// use insert print('... does not exists, create it')
|
|
var result2 = tx.executeSql('INSERT INTO config VALUES (?,?,?,?)', [obj.server, obj.username, obj.password, "TRUE"]);
|
|
var result3 = tx.executeSql('UPDATE config SET isActive="FALSE" WHERE username !="'+obj.username +'"');
|
|
print("Inserted");}
|
|
});}
|
|
|
|
function getServerConfig(url,user,password,callback){
|
|
try {friendicaRequest(url,user,password,"/api/statusnet/config", function (obj){
|
|
var serverconfig = JSON.parse(obj);
|
|
var serverconfigString="import QtQuick 2.0; Text{x: 20; y: 150; color:'white'; text: 'Name: "+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+"'}";
|
|
callback(serverconfigString);
|
|
})}
|
|
catch (e){callback (e);
|
|
}}
|
|
|
|
|
|
function readConfig(database,callback,filter,filtervalue) { // reads and applies data from DB
|
|
print('readConfig()')
|
|
if (filter){var where = " WHERE "+ filter +" = '" + filtervalue+"'";} else { var where="";}
|
|
var db=LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
if(!db) { return; }
|
|
db.transaction( function(tx) {
|
|
print('... read from database '+where)
|
|
var rs = tx.executeSql('select * from config'+where);
|
|
var rsArray=[];
|
|
for(var i = 0; i < rs.rows.length; i++) {
|
|
rsArray.push(rs.rows.item(i))
|
|
}
|
|
print(rs.toString);
|
|
var rsObject={server:rsArray[0].server,username:rsArray[0].username, password:rsArray[0].password};
|
|
callback(rsObject);
|
|
});
|
|
}
|
|
|
|
|
|
function storeData(obj,database) { // stores data to DB
|
|
var db=LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
print('storeData() for ' + obj["resource-id"])
|
|
print('database: ' + database[0]);
|
|
db.transaction( function(tx) {
|
|
print('... check if a object exists: '+obj["resource-id"])
|
|
var result = tx.executeSql('SELECT * from imageData where resourceID = "'+obj["resource-id"]+'"'); // prepare object to be stored as JSON
|
|
if(result.rows.length === 1) {// use update
|
|
print(obj["resource-id"] +' exists, update it')
|
|
result = tx.executeSql('UPDATE imageData SET id="'+obj.id+'", uid="'+obj.uid+'", contact_id="'+obj.contact_id+'", guid="'+obj.guid+'", created="'+obj.created+'", edited="'+obj.edited+'", datasize="'+obj.datasize+'", scale="'+obj.scale+'", profile="'+obj.profile+'", allow_cid="'+obj.allow_cid+'", allow_gid="'+obj.allow_gid+'", deny_cid="'+obj.deny_cid+'", deny_gid="'+obj.deny_gid+'", filename="'+obj.filename+'",title="'+obj.title+'", desc="'+obj.desc+'", type="'+obj.type+'", width="'+obj.width+'", height="'+obj.height+'", album="'+obj.album+'", data="'+obj.data+'", where resourceID="'+obj["resource-id"]+'"');
|
|
} else {// use insert print('... does not exists, create it')
|
|
result = tx.executeSql('INSERT INTO imageData VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [obj.id,obj.uid,obj.contact_id,obj.guid, obj["resource-id"], obj.created,obj.edited, obj.title, obj.desc, obj.album, obj.filename, obj.type, obj.height, obj.width, obj.datasize, obj.data,obj.scale, obj.profile,obj.allow_cid,obj.allow_gid,obj.deny_cid,obj.deny_gid]);
|
|
print("Inserted");}
|
|
});}
|
|
|
|
|
|
function readData(resourceID) { // reads and applies data from DB
|
|
print('readData()')
|
|
if(!db) { return; }
|
|
db.transaction( function(tx) {
|
|
print('... read object')
|
|
var result = tx.executeSql('select * from imageData where resourceID="'+resourceID+'"');
|
|
return result;
|
|
});
|
|
}
|
|
|
|
function readField(field,database,table, callback,filter,filtervalue) { // reads and applies data from DB
|
|
print('readData()')
|
|
if (filter){
|
|
var where = " WHERE "+ filter +" = '" + filtervalue+"'";
|
|
} else { var where="";}
|
|
var db=LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
|
|
if(!db) { return; }
|
|
db.transaction( function(tx) {
|
|
print('... read from database ' + field)
|
|
var rsArray=[];
|
|
print('select DISTINCT '+field+' from '+table+where);
|
|
var rs = tx.executeSql('select DISTINCT '+field+' from '+table+where);
|
|
for(var i = 0; i < rs.rows.length; i++) {
|
|
rsArray.push(rs.rows.item(i)[field])
|
|
}
|
|
callback(rsArray);
|
|
});
|
|
}
|