ami/src/ami.js/ts_20_ui.js

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;
})();