var windowActive = true;
var client = new NChat.Client();
var settings = new Settings(true, false, false);
var chatWin = document.getElementById("chatBox");
var usersB = document.getElementById("serverResB");
var usersT = document.getElementById("serverResT");
var noStorage;
var oldUsers;
var myID;
var TRUE = "1";
var FALSE = "0";
client.WebSocket = window.ReconnectingWebSocket || window.WebSocket;
if (!Date.now) {
Date.now = function() { return new Date().getTime(); }
}
//Process message
client.on("message", function(message) {
var tmpMessage;
switch(message.Header){
case "users":
tmpMessage = message.Body;
// Tällä kikalla tehdään viesti turvalliseksi. Ilman tätä mahdollinen JavaScript-koodi viestissä suorittuisi kaikkien vastaanottajien selaimissa.
tmpMessage = document.createTextNode(tmpMessage).textContent;
usersB.innerHTML = tmpMessage;
usersT.innerHTML = tmpMessage;
if(settings.notifyLeave === true){
if(oldUsers > message.Body){
client.fire("message", {Header: "info", Body: "Joku poistui paikalta"});
} else {
client.fire("message", {Header: "info", Body: "Joku saapui paikalle"});
}
}
oldUsers = message.Body;
break;
case "info":
tmpMessage = "[" + toTime(Date.now()/1000) +"] " + message.Body;
tmpMessage = document.createTextNode(tmpMessage).textContent;
//Add created tmpMessage to window
chatWin.innerHTML += "" + tmpMessage + "
";
chatWin.scrollTop = chatWin.scrollHeight;
notify();
break;
case "whoami":
myID = message.Body;
console.log(myID);
break;
case "fatalError":
client.socket.close();
client.socket = null();
case "error":
tmpMessage = "[" + toTime(message.Timestamp) +"] " + linkify(makeSafe(message.Body));
tmpMessage = document.createTextNode(tmpMessage).textContent;
chatWin.innerHTML += "" + tmpMessage + "
";
chatWin.scrollTop = chatWin.scrollHeight;
notify();
break;
case "userMessage":
tmpMessage = "[" + toTime(message.Timestamp) +"] " + linkify(makeSafe(message.Body));
tmpMessage = document.createTextNode(tmpMessage).textContent;
if(message.Source === myID && settings.ownName === true){
chatWin.innerHTML += "" + tmpMessage + "
";
} else {
chatWin.innerHTML += tmpMessage + "
";
}
chatWin.scrollTop = chatWin.scrollHeight;
notify();
break;
}
});
//Fire this function when connection to server has been made
client.on("open", function() {
//"Send" message directly to chatWin
var newMessage = NChat.Message("command", "whoami");
client.send(newMessage);
client.fire("message", {Header: "info", Body: "Yhteys muodostettu"});
client.fire("message", {Header: "info", Body: "Apua ja asetukset saa näkyviin kirjoittamalla /help"});
});
//Fire this function when connectio to server is lost
client.on("close", function() {
client.fire("message", {Header: "info", Body: "Yhteys katkaistu!"});
});
//Error handling
client.on("error", function(error) {
console.error(error);
});
//Sending messages to server
var messageBox = document.getElementById("message");
//Listen keystrokes in message box
messageBox.addEventListener("keyup", function(getKey) {
//If Enter has been hit
if (getKey.keyCode == 13) {
sendMessage();
}
});
var sendButton = document.getElementById("send");
sendButton.addEventListener("click", sendMessage, false);
//Send message
function sendMessage(){
//Check if messagebox is empty
if (messageBox.value.length == 0) {
return;
}
var message = messageBox.value;
if(message[0] === "/") {
command = message.slice(1, message.length);
messageBox.value = "";
if(!parseCommand(command)) {
var newMessage = NChat.Message("command", command);
client.send(newMessage);
}
} else {
//Create new NChat message
var newMessage = NChat.Message("userMessage", message);
//Clear message box
messageBox.value = "";
//Send message
client.send(newMessage);
}
messageBox.focus();
}
//Convert to time
function toTime(s) {
var d = new Date(s*1000),
h = d.getHours(),
m = d.getMinutes();
h = h < 10 ? "0"+h : h;
m = m < 10 ? "0"+m : m;
return h+":"+m;
}
//Parse commands
function parseCommand(command) {
var parts = command.split(" ");
switch(parts[0]){
case "lolapua":
case "help":
var msgs = [
"/help - Lol apua?",
"/yt on/off - Hae Youtube videon otsikko",
"/name on/off - Näytä omat viestit",
"/notify on/off - Näytä ilmoitukset",
"/settings - Näytä asetukset",
"/clear - Tyhjennä tallennetut asetukset",
];
msgs.forEach(function (msg) {client.fire("message", {Header: "info", Body: msg})});
return true;
case "yt":
return setSetting(parts[1], "getTitle");
case "notify":
return setSetting(parts[1], "notifyLeave");
case "name":
return setSetting(parts[1], "ownName");
case "settings":
Object.keys(settings).forEach(function (setting) { client.fire("message", {Header: "info", Body: settingInfo(setting) + (settings[setting] ? "päällä" : "pois")})});
return true;
case "clear":
localStorage.clear();
return true;
default:
return false;
}
}
//Return setting info
function settingInfo(setting){
switch(setting){
case "getTitle":
return "Hae Youtube videoiden otsikot: ";
case "notifyLeave":
return "Näytä ilmoitukset: ";
case "ownName":
return "Näytä omat viestit: ";
}
}
//Set value to setting
function setSetting(value, setting){
var result = false;
switch(value){
case "on":
settings[setting] = true;
if(!noStorage) localStorage[setting] = TRUE;
result = true;
break;
case "off":
settings[setting] = false;
if(!noStorage) localStorage[setting] = FALSE;
result = true;
break;
default:
result = false;
break;
}
client.fire("message", {Header: "info", Body: settingInfo(setting) + (settings[setting] ? "päällä" : "pois")});
return result;
}
function linkify(str) {
if(setApi == true && settings.getTitle == true){
var IDs = [];
var indx = 2;
url = str.replace(/(>|<)/gi,'').split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/);
if(url[indx] !== undefined) {
for(i = 0; i <= url.length; i+=3){
if(indx < url.length){
IDs.push(url[indx].split(/[^0-9a-z_-]/i)[0]);
indx+=2;
}
}
IDs.forEach(function(id){
if(id.length == 11){
makeRequest(id);
}
});
}
}
var e = /\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gi,
t = /(^|[^\/])(www\.[\S]+(\b|$))/gi,
n = /\w+@[a-zA-Z_]+?(?:\.[a-zA-Z]{2,6})+/gi;
return str.replace(e, '$&').replace(t, '$1$2').replace(n, '$&');
}
function makeSafe(unsafe) {
return unsafe.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'");
}
function notify() {
if (!windowActive)
document.title = "[!] NChat98";
}
//Settings Object constructor
function Settings(getTitle, notifyLeave, ownName) {
this.getTitle = getTitle;
this.notifyLeave = notifyLeave;
this.ownName = ownName;
}
//Parse localStorage data
function parseKey(key){
if(key === TRUE){
return true;
} else{
return false;
}
}
//Read values from localStorage
function readLocalStorage() {
if(typeof(Storage) !== "undefined") {
for (key in localStorage){
if(settings.hasOwnProperty(key)){
settings[key] = parseKey(localStorage[key]);
}
}
noStorage = false;
} else {
noStorage = true;
}
}
window.onbeforeunload = function() {
client.socket.close();
};
window.addEventListener('blur', function(e) {
windowActive = false;
});
window.addEventListener('focus', function(e) {
windowActive = true;
document.title = "NChat98";
});
window.addEventListener("load", readLocalStorage());
client.connect();