- BREAKING CHANGE from v0.9.35 and eariler: Move accounts into subfolder of SessionStore - viewergen and viewer updates from @GraspYonOx - new homepage theme inspired by @GraspYonOx - connect setup also mostly by @GraspYonOx - numerous bug fixes - nntp-server-zefie is now on npmjs - implement proper nodejs debugging - will start to phase out using console.log for actual debugging - existing "debug" (verbose) messages will stay as is - future code debugging will use debug() to debug WIP, therefore not showing to most users if it is accidently left in
404 lines
11 KiB
JavaScript
404 lines
11 KiB
JavaScript
class WTVFavorites {
|
|
|
|
fs = require('fs');
|
|
path = require('path');
|
|
uuid = require('uuid');
|
|
|
|
ssid = null;
|
|
minisrv_config = [];
|
|
wtvshared = null;
|
|
wtvmime = null;
|
|
wtvclient = null;
|
|
WTVClientSessionData = null;
|
|
favFileExt = ".zfav";
|
|
favstore_dir = null;
|
|
folderArr = [];
|
|
messageArr = [];
|
|
|
|
constructor(minisrv_config, wtvclient) {
|
|
if (!minisrv_config) throw ("minisrv_config required");
|
|
if (!wtvclient) throw ("WTVClientSessionData required");
|
|
var WTVShared = require("./WTVShared.js")['WTVShared'];
|
|
var WTVMime = require("./WTVMime.js");
|
|
this.WTVClientSessionData = require("./WTVClientSessionData.js");
|
|
this.minisrv_config = minisrv_config;
|
|
this.wtvshared = new WTVShared(minisrv_config);
|
|
this.wtvmime = new WTVMime(minisrv_config);
|
|
this.wtvclient = wtvclient;
|
|
this.ssid = wtvclient.ssid;
|
|
this.folderArr = this.folderArr;
|
|
this.messageArr = this.messageArr;
|
|
}
|
|
|
|
checkFavIntroSeen() {
|
|
return (this.wtvclient.getSessionData("subscriber_fav_intro_seen")) ? this.wtvclient.getSessionData("subscriber_fav_intro_seen") : false;
|
|
}
|
|
|
|
setFavIntroSeen(seen) {
|
|
this.wtvclient.setSessionData("subscriber_fav_intro_seen", (seen) ? true : false);
|
|
}
|
|
|
|
favstoreExists() {
|
|
if (!this.isguest) {
|
|
if (this.favstore_dir === null) {
|
|
// set favstore directory local var so we don't call the function every time
|
|
var userstore_dir = this.wtvclient.getUserStoreDirectory();
|
|
|
|
// FavStore
|
|
var store_dir = "FavStore" + this.path.sep;
|
|
this.favstore_dir = userstore_dir + store_dir;
|
|
}
|
|
return this.fs.existsSync(this.favstore_dir);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
folderExists(foldername) {
|
|
var folder_dir = null;
|
|
if (this.favstoreExists()) {
|
|
if (!foldername) return null;
|
|
|
|
var folder_dir = foldername + this.path.sep;
|
|
var store_dir = this.favstore_dir + folder_dir;
|
|
}
|
|
return (store_dir !== null) ? this.fs.existsSync(store_dir) : false;
|
|
}
|
|
|
|
getFolderDir(foldername) {
|
|
var folder_dir = null;
|
|
if (this.favstoreExists()) {
|
|
if (!foldername) return null;
|
|
|
|
var folder_dir = foldername + this.path.sep;
|
|
var store_dir = this.favstore_dir + folder_dir;
|
|
}
|
|
return store_dir;
|
|
}
|
|
|
|
|
|
checkFolderName(foldername) {
|
|
var regex_str = "^([A-Za-z0-9\-\_]{1,}$";
|
|
var regex = new RegExp(regex_str);
|
|
return regex.test(foldername);
|
|
}
|
|
|
|
|
|
createTemplateFolder(folder) {
|
|
// create emply folder
|
|
this.createFolder(folder)
|
|
var folder_templates = this.minisrv_config.favorites.folder_templates;
|
|
// populate it if a template exists
|
|
var self = this;
|
|
if (folder_templates[folder]) {
|
|
Object.keys(folder_templates[folder]).forEach(function (k) {
|
|
self.createFavorite(folder_templates[folder][k].title, folder_templates[folder][k].url, folder, (folder_templates[folder][k].image_type == "image/wtv-bitmap") ? atob(folder_templates[folder][k].image) : folder_templates[folder][k].image, folder_templates[folder][k].image_type);
|
|
})
|
|
}
|
|
}
|
|
|
|
createDefaultFolders() {
|
|
var brandId = this.ssid.charAt(8);
|
|
this.createTemplateFolder("Recommended");
|
|
if (brandId == 7)
|
|
this.createTemplateFolder("Personal (Samsung)");
|
|
else
|
|
this.createTemplateFolder("Personal");
|
|
|
|
if (brandId == 0)
|
|
this.createTemplateFolder("Sony");
|
|
}
|
|
|
|
createFavstore() {
|
|
if (this.favstoreExists() === false) {
|
|
if (!this.fs.existsSync(this.favstore_dir)) this.fs.mkdirSync(this.favstore_dir, { recursive: true });
|
|
this.createDefaultFolders();
|
|
this.wtvclient.setSessionData("subscriber_fav_images", true)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
createFolder(foldername) {
|
|
var folder_exists = this.folderExists(foldername);
|
|
if (folder_exists === false) {
|
|
var folderdir = foldername + this.path.sep;
|
|
var store_dir = this.favstore_dir + folderdir;
|
|
if (!this.fs.existsSync(store_dir)) this.fs.mkdirSync(store_dir, { recursive: true });
|
|
return true;
|
|
}
|
|
return folder_exists;
|
|
}
|
|
|
|
getFolders() {
|
|
var path = this.favstore_dir;
|
|
var self = this;
|
|
return this.fs.readdirSync(path).filter(function (file) {
|
|
self.folderArr.push(file);
|
|
return self.folderArr;
|
|
});
|
|
}
|
|
|
|
createFavoriteID() {
|
|
return this.uuid.v1();
|
|
}
|
|
|
|
createFavorite(title, url, folder, image, imagetype) {
|
|
var folderpath = this.getFolderDir(folder);
|
|
var favoriteid = this.createFavoriteID();
|
|
var favoritefile = favoriteid + this.favFileExt;
|
|
var favoritefileout = folderpath + favoritefile;
|
|
if (imagetype != "url")
|
|
image = btoa(image);
|
|
|
|
title = decodeURIComponent(title).replaceAll("+", " ");
|
|
url = decodeURIComponent(url)
|
|
var favoritedata = {
|
|
"title": title,
|
|
"url": url,
|
|
"folder": folder,
|
|
"image": image,
|
|
"imagetype": imagetype,
|
|
"id": favoriteid
|
|
}
|
|
try {
|
|
if (this.fs.existsSync(favoritefileout)) {
|
|
console.log(" * ERROR: Favorite with this UUID (" + favoriteid + ") already exists (should never happen). Favorite lost.");
|
|
return false;
|
|
}
|
|
|
|
// encode favorite into json
|
|
var result = this.fs.writeFileSync(favoritefileout, JSON.stringify(favoritedata));
|
|
if (!result) return false;
|
|
|
|
} catch (e) {
|
|
console.error(" # FavErr: Favorite Store failed\n", e, "\n", favoritefileout, "\n", favorite, "\n");
|
|
}
|
|
return false;
|
|
}
|
|
|
|
listFavorites(folder) {
|
|
var folderpath = this.getFolderDir(folder);
|
|
var self = this;
|
|
self.messageArr = [];
|
|
this.fs.readdirSync(folderpath)
|
|
.map(function (v) {
|
|
var favorite_data_raw = null;
|
|
var favoritepath = folderpath + self.path.sep + v;
|
|
if (self.fs.existsSync(favoritepath)) favorite_data_raw = self.fs.readFileSync(favoritepath);
|
|
if (favorite_data_raw) {
|
|
var favorite_data = JSON.parse(favorite_data_raw);
|
|
self.messageArr.push(favorite_data);
|
|
}
|
|
|
|
})
|
|
return self.messageArr;
|
|
}
|
|
|
|
getFavorite(folder, favoriteid) {
|
|
var folder_path = this.getFolderDir(folder);
|
|
var folder_file = favoriteid + this.favFileExt;
|
|
var folder_file_in = folder_path + this.path.sep + folder_file;
|
|
var folder_data_raw = null;
|
|
|
|
if (this.fs.existsSync(folder_file_in)) folder_data_raw = this.fs.readFileSync(folder_file_in);
|
|
else console.error(" # FavErr: could not find ", folder_file_in);
|
|
|
|
if (folder_data_raw) {
|
|
var folder_data = JSON.parse(folder_data_raw);
|
|
folder_data.folder_path = folder_path;
|
|
folder_data.folder_file = folder_file;
|
|
if (folder_data) {
|
|
folder_data.id = favoriteid;
|
|
|
|
return folder_data;
|
|
}
|
|
else console.error(" # FavErr: could not parse json in ", folder_file_in);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
deleteFolder(folder){
|
|
var dir = this.getFolderDir(folder);
|
|
if (dir) {
|
|
try {
|
|
this.fs.rmdirSync(dir, { recursive: true });
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
checkFolderName(folder) {
|
|
var check1 = /^([A-Za-z0-9\-\_])$/.test(folder);
|
|
var check2 = /^[A-Za-z]/.test(folder);
|
|
return (check1 && check2);
|
|
}
|
|
|
|
deleteFavorite(favoriteid, folder) {
|
|
var folderdir = this.getFolderDir(folder);
|
|
this.fs.unlinkSync(folderdir + favoriteid + ".zfav", { recursive: true });
|
|
}
|
|
|
|
clearFolder(folder) {
|
|
const { readdirSync, rmSync } = require('fs');
|
|
var dir = this.getFolderDir(folder);
|
|
readdirSync(dir).forEach(f => rmSync(`${dir}${f}`));
|
|
}
|
|
|
|
updateFavorite(favoritedata, folder) {
|
|
// encode message into json
|
|
var favoriteout = new Object();
|
|
var folderpath = this.getFolderDir(folder);
|
|
Object.assign(favoriteout, favoritedata);
|
|
delete favoriteout.folderpath;
|
|
delete favoriteout.favoritefile;
|
|
var result = this.fs.writeFileSync(folderpath + favoritedata.id + ".zfav", JSON.stringify(favoriteout));
|
|
if (!result) return false;
|
|
}
|
|
|
|
changeFavoriteName(favoriteid, folder, name) {
|
|
var favorite = this.getFavorite(folder, favoriteid);
|
|
if (!favorite) return false;
|
|
|
|
favorite.title = name;
|
|
this.updateFavorite(favorite, folder);
|
|
return true;
|
|
}
|
|
|
|
moveFavorite(oldfolder, newfolder, favoriteid) {
|
|
var favorite = this.getFavorite(oldfolder, favoriteid);
|
|
if (!favorite) return false;
|
|
|
|
var newfolderdata = this.listFavorites(newfolder);
|
|
var newfoldernum = newfolderdata.length
|
|
|
|
if (newfoldernum > 17)
|
|
return;
|
|
|
|
favorite.folder = newfolder;
|
|
this.updateFavorite(favorite, oldfolder);
|
|
var favoriteout = new Object();
|
|
var folderpath = this.getFolderDir(newfolder);
|
|
Object.assign(favoriteout, favorite);
|
|
delete favoriteout.folderpath;
|
|
delete favoriteout.favoritefile;
|
|
this.fs.writeFileSync(folderpath + favorite.id + ".zfav", JSON.stringify(favoriteout));
|
|
this.deleteFavorite(favoriteid, oldfolder)
|
|
return true;
|
|
}
|
|
|
|
createShortcutKey() {
|
|
var favoritefileout = this.favstore_dir + "KeyStore.zfav";
|
|
var keydata = {};
|
|
|
|
keydata.F1 = {
|
|
folder: "none",
|
|
id: "none"
|
|
}
|
|
keydata.F2 = {
|
|
folder: "none",
|
|
id: "none"
|
|
}
|
|
keydata.F3 = {
|
|
folder: "none",
|
|
id: "none"
|
|
}
|
|
keydata.F4 = {
|
|
folder: "none",
|
|
id: "none"
|
|
}
|
|
keydata.F5 = {
|
|
folder: "none",
|
|
id: "none"
|
|
}
|
|
keydata.F6 = {
|
|
folder: "none",
|
|
id: "none"
|
|
}
|
|
keydata.F7 = {
|
|
folder: "none",
|
|
id: "none"
|
|
}
|
|
|
|
try {
|
|
// encode favorite into json
|
|
var result = this.fs.writeFileSync(favoritefileout, keydata);
|
|
if (!result) return false;
|
|
|
|
} catch (e) {
|
|
console.error(" # FavErr: Key Store failed\n", e, "\n", favoritefileout);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
updateShortcutKey(oldkey, newkey, folder, id) {
|
|
var folderpath = this.getFolderDir(folder);
|
|
var favoritefileout = this.favstore_dir + "KeyStore.zfav";
|
|
var keydata = {};
|
|
|
|
keydata = this.fs.readFileSync(favoritefileout)
|
|
console.log(newkey)
|
|
switch(newkey) {
|
|
case "F1":
|
|
keydata.F1.folder = folder;
|
|
break
|
|
case "F2":
|
|
keydata.F2 = {
|
|
folder: folder,
|
|
id: id
|
|
}
|
|
break;
|
|
case "F3":
|
|
keydata.F3 = {
|
|
folder: folder,
|
|
id: id
|
|
}
|
|
break;
|
|
case "F4":
|
|
keydata.F4 = {
|
|
folder: folder,
|
|
id: id
|
|
}
|
|
break;
|
|
case "F5":
|
|
keydata.F5 = {
|
|
folder: folder,
|
|
id: id
|
|
}
|
|
break;
|
|
case "F6":
|
|
keydata.F6 = {
|
|
folder: folder,
|
|
id: id
|
|
}
|
|
break;
|
|
case "F7":
|
|
keydata.F7 = {
|
|
folder: folder,
|
|
id: id
|
|
}
|
|
break;
|
|
}
|
|
if (oldkey == "none")
|
|
{
|
|
//no
|
|
} else {
|
|
keydata[oldkey].folder = null;
|
|
keydata[oldkey].id = null;
|
|
}
|
|
|
|
try {
|
|
// encode favorite into json
|
|
var result = this.fs.writeFileSync(favoritefileout, keydata);
|
|
if (!result) return false;
|
|
|
|
} catch (e) {
|
|
console.error(" # FavErr: Key Store failed\n", e, "\n", favoritefileout);
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
module.exports = WTVFavorites;
|