Files
minisrv/zefie_wtvp_minisrv/includes/WTVFavorites.js
zefie c2a3081afd v0.9.36
- 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
2022-11-29 08:29:31 -05:00

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;