362 lines
15 KiB
JavaScript
362 lines
15 KiB
JavaScript
#include ts_20_ui.js
|
|
#include ts_chat.js
|
|
#include cookies.js
|
|
#include ts_10_user.js
|
|
#include ts_utils.js
|
|
#include title.js
|
|
#include strings.js
|
|
#include utility.js
|
|
|
|
var UI = (function () {
|
|
function UI() {}
|
|
|
|
UI.RenderLanguage = function () {
|
|
document.getElementById("sendmsg").value = AmiStrings.getMenuString('send');
|
|
try {
|
|
document.getElementById("namelabel").innerHTML = AmiStrings.getMenuString('username');
|
|
} catch (e) {}
|
|
try {
|
|
document.getElementById("msglabel").innerHTML = AmiStrings.getMenuString('message');
|
|
} catch (e) {}
|
|
var rows = document.getElementById("settingsList").getElementsByTagName("table")[0].getElementsByTagName("tr");
|
|
for (var i = 0; i < rows.length; i++) {
|
|
if (rows[i].getAttribute("name").substr(0, 2) == ";;") {
|
|
var code = rows[i].getAttribute("name").substr(2);
|
|
rows[i].cells[0].innerHTML = AmiStrings.getMenuString('persist', [AmiStrings.getBBCodeString(code)]);
|
|
}
|
|
else if (rows[i].getAttribute("name").substr(0, 2) == "||") {
|
|
var code = rows[i].getAttribute("name").substr(2);
|
|
rows[i].cells[0].innerHTML = AmiStrings.getMenuString('enable', [AmiStrings.getBBCodeString(code)]);
|
|
}
|
|
else {
|
|
if(AmiStrings.hasSettingsString(rows[i].getAttribute('name')))
|
|
rows[i].cells[0].innerHTML = AmiStrings.getSettingsString(rows[i].getAttribute('name')) + ":";
|
|
}
|
|
}
|
|
var btns = document.getElementById("bbCodeContainer").getElementsByTagName("input");
|
|
for (var i = 0; i < btns.length; i++) {
|
|
if (btns[i].getAttribute("name") != ";;")
|
|
btns[i].value = AmiStrings.hasBBCodeString(btns[i].name) ? AmiStrings.getBBCodeString(btns[i].name) : btns[i].name;
|
|
}
|
|
if (UserContext.self != undefined)
|
|
UI.RedrawUserList();
|
|
};
|
|
|
|
UI.GenerateContextMenu = function (u) {
|
|
var ret = document.createElement("ul");
|
|
ret.id = "sock_menu_" + u.id;
|
|
ret.className = "userMenu";
|
|
if (UserContext.self.id !== u.id)
|
|
ret.classList.add('hidden');
|
|
UI.contextMenuFields.forEach(function (elt, i, arr) {
|
|
if ((UserContext.self.id === u.id && elt["self"]) || (elt["others"] && UserContext.self.id !== u.id)) {
|
|
if ((UserContext.self.canModerate() && elt["modonly"]) || !elt["modonly"]) {
|
|
if (AmiStrings.hasMenuString(elt.langid)) {
|
|
var li = document.createElement("li");
|
|
var link = document.createElement("a");
|
|
link.href = "javascript:void(0);";
|
|
link.innerHTML = AmiStrings.getMenuString(elt.langid);
|
|
switch (elt["action"]) {
|
|
default:
|
|
case 0:
|
|
var msg = Utils.replaceAll(Utils.replaceAll(elt["value"], "{0}", "{ {0} }"), "{1}", "{ {1} }");
|
|
link.onclick = function (e) {
|
|
ami.chat.inputBox.setValue(Utils.replaceAll(Utils.replaceAll(msg, "{ {0} }", UserContext.self.username), "{ {1} }", u.username) + " ");
|
|
ami.chat.inputBox.focus();
|
|
};
|
|
break;
|
|
case 1:
|
|
var msg = Utils.replaceAll(Utils.replaceAll(elt["value"], "{0}", "{ {0} }"), "{1}", "{ {1} }");
|
|
link.onclick = function (e) {
|
|
ami.sockChat.sendMessage(Utils.replaceAll(Utils.replaceAll(msg, "{ {0} }", UserContext.self.username), "{ {1} }", u.username));
|
|
};
|
|
break;
|
|
}
|
|
li.appendChild(link);
|
|
ret.appendChild(li);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
return ret;
|
|
};
|
|
|
|
UI.AddMessage = function (msgid, date, u, msg, strobe, playsound, flags) {
|
|
if(strobe === undefined) strobe = true;
|
|
if(playsound === undefined) playsound = true;
|
|
if(flags === undefined) flags = '10010';
|
|
|
|
if(date === null || date === undefined)
|
|
date = new Date;
|
|
else if(typeof date === 'number')
|
|
date = new Date(date * 1000);
|
|
|
|
var msgInfo = {
|
|
id: msgid,
|
|
sender: u,
|
|
created: date,
|
|
nameBold: flags[0] !== '0',
|
|
nameItalics: flags[1] !== '0',
|
|
nameUnderline: flags[2] !== '0',
|
|
showColon: flags[3] !== '0',
|
|
isPM: flags[4] !== '0',
|
|
canDelete: 'self' in UserContext
|
|
&& !isNaN(parseInt(msgid))
|
|
&& !u.isBot()
|
|
&& UserContext.self.canModerate()
|
|
&& (UserContext.self.id === u.id || UserContext.self.getRank() > u.getRank()),
|
|
};
|
|
|
|
var botInfo = null,
|
|
outmsg = msg;
|
|
|
|
if(u.isBot()) {
|
|
botInfo = AmiStrings.parseBotMessage(msg);
|
|
outmsg = botInfo.html;
|
|
}
|
|
|
|
if(playsound && ami.settings.get('runJokeTriggers'))
|
|
try {
|
|
var trigger = ami.textTriggers.getTrigger(msg);
|
|
if(trigger.isSoundType()) {
|
|
ami.sound.playLibrarySound(
|
|
trigger.getRandomSoundName(),
|
|
trigger.getVolume(),
|
|
trigger.getRate()
|
|
);
|
|
|
|
playsound = false;
|
|
}
|
|
} catch(ex) {}
|
|
|
|
if(playsound) {
|
|
if(botInfo)
|
|
ami.sound.playEventSound([botInfo.type, botInfo.isError ? 'error' : 'server']);
|
|
else if(UserContext.self.id === u.id)
|
|
ami.sound.playEventSound('outgoing');
|
|
else if(msgInfo.isPM)
|
|
ami.sound.playEventSound(['incoming-priv', 'incoming']);
|
|
else
|
|
ami.sound.playEventSound('incoming');
|
|
}
|
|
|
|
var mention = 'self' in UserContext && (outmsg.toLowerCase()).indexOf(UserContext.self.username.toLowerCase()) >= 0;
|
|
|
|
if(msgInfo.isPM && UserContext.self.id === u.id) {
|
|
var p = outmsg.split(' ');
|
|
msgInfo.pmTargetName = p[0];
|
|
outmsg = p.slice(1).join(' ');
|
|
}
|
|
|
|
if(strobe && ami.pageIsHidden() && (msgInfo.isPM || mention)) {
|
|
var strip = outmsg.replace(new RegExp("\\[.*?\\]", "g"), "").replace(new RegExp("\\<.*?\\>", "g"), "");
|
|
ami.notifications.display({
|
|
title: u.username + ' mentioned you!',
|
|
text: strip,
|
|
icon: u.getAvatarUrl(),
|
|
});
|
|
}
|
|
|
|
if(ami.settings.get('bbParse'))
|
|
for(var i = 0; i < UI.bbcode.length; i++) {
|
|
if(!UI.bbcode[i]["arg"]) {
|
|
var at = 0;
|
|
while((at = outmsg.indexOf("[" + UI.bbcode[i]['tag'] + "]", at)) != -1) {
|
|
var end;
|
|
if ((end = outmsg.indexOf("[/" + UI.bbcode[i]['tag'] + "]", at)) != -1) {
|
|
var inner = Utils.StripCharacters(outmsg.substring(at + ("[" + UI.bbcode[i]['tag'] + "]").length, end), UI.bbcode[i]["rmin"] == undefined ? "" : UI.bbcode[i]["rmin"]);
|
|
var replace = Utils.replaceAll(UI.bbcode[i]['swap'], "{0}", inner);
|
|
if (UI.bbcode[i].enableSetting && !ami.settings.get(UI.bbcode[i].enableSetting))
|
|
replace = inner;
|
|
outmsg = outmsg.substring(0, at) + replace + outmsg.substring(end + ("[/" + UI.bbcode[i]['tag'] + "]").length);
|
|
at += replace.length;
|
|
} else break;
|
|
}
|
|
} else {
|
|
var at = 0;
|
|
while((at = outmsg.indexOf("[" + UI.bbcode[i]['tag'] + "=", at)) != -1) {
|
|
var start, end;
|
|
if ((start = outmsg.indexOf("]", at)) != -1) {
|
|
if ((end = outmsg.indexOf("[/" + UI.bbcode[i]['tag'] + "]", start)) != -1) {
|
|
var arg = Utils.StripCharacters(outmsg.substring(at + ("[" + UI.bbcode[i]['tag'] + "=").length, start), "[]" + (UI.bbcode[i]["rmarg"] == undefined ? "" : UI.bbcode[i]["rmarg"]));
|
|
var inner = Utils.StripCharacters(outmsg.substring(start + 1, end), UI.bbcode[i]["rmin"] == undefined ? "" : UI.bbcode[i]["rmin"]);
|
|
var replace = Utils.replaceAll(Utils.replaceAll(UI.bbcode[i]['swap'], "{1}", inner), "{0}", arg);
|
|
if (UI.bbcode[i].enableSetting && !ami.settings.get(UI.bbcode[i].enableSetting))
|
|
replace = inner;
|
|
outmsg = outmsg.substring(0, at) + replace + outmsg.substring(end + ("[/" + UI.bbcode[i]['tag'] + "]").length);
|
|
at += replace.length;
|
|
} else break;
|
|
} else break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(ami.settings.get('parseLinks')) {
|
|
var tmp = outmsg.split(' ');
|
|
|
|
for(var i = 0; i < tmp.length; i++) {
|
|
if(tmp[i].indexOf("<") != -1 && tmp[i].indexOf(">") == -1) {
|
|
tmp[i + 1] = tmp[i] + " " + tmp[i + 1];
|
|
tmp[i] = "";
|
|
continue;
|
|
}
|
|
|
|
var text = tmp[i].replace(/(<([^>]+)>)/ig, "");
|
|
if(text.substr(0, 7) == "http://" || text.substr(0, 8) == "https://")
|
|
tmp[i] = "<a href='" + text + "' target='_blank'>" + text + "</a>";
|
|
}
|
|
|
|
outmsg = tmp.join(" ");
|
|
}
|
|
|
|
if(ami.settings.get('parseEmoticons'))
|
|
ami.emoticons.forEach(u.getRank(), function(emote) {
|
|
var args = [];
|
|
for(var i in emote.strings)
|
|
args.push(Utils.SanitizeRegex(Utils.Sanitize(':' + emote.strings[i] + ':')));
|
|
|
|
outmsg = outmsg.replace(new RegExp("(" + args.join("|") + ")(?![^\\<]*\\>)", "g"), '<img src="' + emote.url + '" class="chatEmote" />');
|
|
});
|
|
|
|
msgInfo.bodyRaw = outmsg;
|
|
|
|
var msgElem = ami.chat.messageList.add(msgInfo);
|
|
|
|
if(ami.settings.get('bbAutoEmbedV1')) {
|
|
var buttons = msgElem.getElementsByClassName('js-embed-btn');
|
|
while(buttons.length > 0)
|
|
buttons[0].click();
|
|
}
|
|
|
|
if(ami.settings.get('msgAutoScroll'))
|
|
ami.chat.messageList.scrollToBottom();
|
|
|
|
if(strobe && ami.pageIsHidden()) {
|
|
var title = ' ' + (botInfo ? botInfo.string : u.username);
|
|
ami.windowTitle.flashTitle(['[ @]' + title, '[@ ]' + title]);
|
|
}
|
|
};
|
|
|
|
UI.ToggleUserMenu = function (id) {
|
|
var menu = document.getElementById("sock_menu_" + id);
|
|
menu.classList[menu.classList.contains('hidden') ? 'remove' : 'add']('hidden');
|
|
};
|
|
|
|
UI.AddUser = function (u, addToContext) {
|
|
if (addToContext === void 0) { addToContext = true; }
|
|
if (u.visible) {
|
|
var msgDiv = document.createElement("div");
|
|
msgDiv.className = (this.rowEven[1]) ? "rowEven" : "rowOdd";
|
|
msgDiv.id = "sock_user_" + u.id;
|
|
msgDiv.innerHTML = "<a style='color:" + u.color + "; display: block;' href='javascript:UI.ToggleUserMenu(" + u.id + ");'>" + u.username + "</a>";
|
|
msgDiv.appendChild(UI.GenerateContextMenu(u));
|
|
$i('userList').getElementsByClassName('body')[0].appendChild(msgDiv);
|
|
this.rowEven[1] = !this.rowEven[1];
|
|
}
|
|
if (addToContext) {
|
|
UserContext.users[u.id] = u;
|
|
}
|
|
};
|
|
|
|
UI.ModifyUser = function (u) {
|
|
var tmp = document.getElementById("sock_user_" + u.id).getElementsByTagName("a")[0];
|
|
tmp.style.color = u.color;
|
|
tmp.innerHTML = u.username;
|
|
};
|
|
|
|
UI.MakeChannelDisplayName = function(name, ispwd, istemp) {
|
|
var displayName = '';
|
|
|
|
if(ispwd)
|
|
displayName += '*';
|
|
if(istemp)
|
|
displayName += '[';
|
|
displayName += name;
|
|
if(istemp)
|
|
displayName += ']';
|
|
|
|
return displayName;
|
|
};
|
|
|
|
UI.SwitchChannel = function(name) {
|
|
var channels = $c('js-sidebar-channel');
|
|
for(var i = 0; i < channels.length; ++i) {
|
|
var channel = channels[i];
|
|
if(channel.style.fontWeight === 'bold')
|
|
channel.style.fontWeight = null;
|
|
}
|
|
|
|
$i('sock_chan_' + name).style.fontWeight = 'bold';
|
|
};
|
|
|
|
UI.AddChannel = function (name, ispwd, istemp, iscurr) {
|
|
var displayName = UI.MakeChannelDisplayName(name, ispwd, istemp);
|
|
|
|
var html = $e({
|
|
attrs: {
|
|
classList: ['js-sidebar-channel', this.rowEven[2] ? "rowEven" : "rowOdd"],
|
|
id: 'sock_chan_' + name,
|
|
},
|
|
child: {
|
|
tag: 'a',
|
|
child: displayName,
|
|
attrs: {
|
|
style: { display: 'block' },
|
|
href: 'javascript:void(0);',
|
|
onclick: function() {
|
|
var cmd = '/join ' + name;
|
|
if(ispwd && !UserContext.self.canModerate())
|
|
cmd += ' ' + prompt(AmiStrings.getMenuString('chanpwd', [name]));
|
|
ami.sockChat.sendMessage(cmd);
|
|
},
|
|
},
|
|
}
|
|
});
|
|
|
|
if(iscurr)
|
|
html.style.fontWeight = 'bold';
|
|
|
|
$i('chanList').getElementsByClassName('body')[0].appendChild(html);
|
|
this.rowEven[2] = !this.rowEven[2];
|
|
};
|
|
|
|
UI.ModifyChannel = function (oldname, newname, ispwd, istemp) {
|
|
var displayName = UI.MakeChannelDisplayName(newname, ispwd, istemp);
|
|
$i('sock_chat_' + oldname).children[0].textContent = displayName;
|
|
};
|
|
|
|
UI.RemoveChannel = function (name) {
|
|
$ri('sock_chat_' + oldname);
|
|
};
|
|
|
|
UI.RemoveUser = function (id) {
|
|
delete UserContext.users[id];
|
|
this.RedrawUserList();
|
|
};
|
|
|
|
UI.RedrawChannelList = function() {
|
|
$i('chanList').getElementsByClassName('top')[0].innerHTML = AmiStrings.getMenuString('chans');
|
|
$i('chanList').getElementsByClassName('body')[0].innerHTML = '';
|
|
this.rowEven[2] = false;
|
|
};
|
|
|
|
UI.RedrawUserList = function () {
|
|
$i('userList').getElementsByClassName('top')[0].innerHTML = AmiStrings.getMenuString('online');
|
|
$i('userList').getElementsByClassName('body')[0].innerHTML = '';
|
|
this.rowEven[1] = false;
|
|
if(UserContext.self !== undefined)
|
|
this.AddUser(UserContext.self, false);
|
|
for (var key in UserContext.users) {
|
|
if (UserContext.users[key].visible)
|
|
this.AddUser(UserContext.users[key], false);
|
|
}
|
|
};
|
|
|
|
UI.rowEven = [true, false, false];
|
|
UI.ChatBot = new User('-1', 'Misaka-' + (Math.ceil(20000 * Math.random()) + 1).toString(), 'inherit', '');
|
|
UI.contextMenuFields = [];
|
|
UI.bbcode = [];
|
|
|
|
return UI;
|
|
})();
|