var profiles, following;
var selfWebsocket,followingWebSockets = [];
var privKey, modSuperNode, selfID;
function viewHome(){
if( sessionStorage.profiles === undefined || sessionStorage.privKey === undefined || sessionStorage.selfID === undefined || sessionStorage.serverPass === undefined || sessionStorage.superNodeList === undefined ){
alert("Login credentials failed! Returning to login page!");
window.location.href = "index.html";
return;
}
profiles = JSON.parse(sessionStorage.profiles);
console.log(profiles);
privKey = encrypt.retrieveShamirSecret(JSON.parse(sessionStorage.privKey));
selfID = sessionStorage.selfID;
superNodeList = new Set(JSON.parse(sessionStorage.superNodeList));
if(superNodeList.has(selfID)){
modSuperNode = true;
setInterval(reloadInitData, 3600000);
}
kBucketObj.launchKBucket().then(result => {
console.log(result);
initselfWebSocket();
listProfiles();
pingSuperNodeforNewMsgs();
getFollowinglistFromIDB().then(result => {
following = result;
if(!following.includes(selfID))
following.push(selfID);
console.log(following);
displayTweetsFromIDB().then(result => {
connectToAllFollowing();
}).catch(error => {
console.log(error);
})
}).catch(error => {
console.log(error);
})
}).catch(error => {
console.log(error);
});
}
function initselfWebSocket(){
selfWebsocket = new WebSocket("ws://"+location.host+"/ws");
selfWebsocket.onopen = (event) => {
console.log("Connecting");
var serverPass = encrypt.retrieveShamirSecret(JSON.parse(sessionStorage.serverPass));
selfWebsocket.send("$"+serverPass);
};
selfWebsocket.onclose = (event) => {
console.log("DISCONNECTED");
initselfWebSocket();
};
selfWebsocket.onmessage = (event) => {
console.log(event.data);
if(event.data[0] == '$')
return;
try{
data = JSON.parse(event.data);
if(data.follow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){
var idb = indexedDB.open("FLO_Tweet");
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("followers", "readwrite").objectStore("followers");
obs.add(data.sign,data.floID);
db.close();
};
selfWebsocket.send(`F${data.floID}`);
}else if(data.unfollow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){
var idb = indexedDB.open("FLO_Tweet");
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("followers", "readwrite").objectStore("followers");
obs.delete(data.floID);
db.close();
};
selfWebsocket.send(`U${data.floID}`);
}else if(data.message && data.to == selfID){
var msg = encrypt.decryptMessage(data.secret,data.pubVal)
if(encrypt.verify(msg,data.sign,profiles[data.from].pubKey))
storeMsg({time:data.time,floID:data.from,text:msg,type:'R'});
}else if(data.fromSuperNode && following.includes(data.floID)){
var tid = data.tid;
data = JSON.parse(data.data);
if(encrypt.verify(data.tweet,data.sign,profiles[data.floID].pubKey)){
storeTweet({floID:data.floID,time:data.time,data:data.tweet},tid);
createTweetElement(data.floID,data.time,data.tweet);
}
}else if(modSuperNode){
superNodeMode(data);
}
}catch(error){
console.log(error);
}
};
selfWebsocket.onerror = (event) => { console.log(event) };
}
function listProfiles(){
console.log("listProfiles");
document.getElementById("profileName").innerHTML=profiles[selfID].name;
document.getElementById("profileFloID").innerHTML='@'+selfID;
var profileList = document.getElementById("profileList");
profileList.innerHTML = "";
for (p in profiles){
var element = document.createElement("div");
element.setAttribute("class", "media");
element.innerHTML = `${profiles[p].name}
@${p}
${tweet.replace(/\n/g, "
")}