// ==UserScript==
// @name IdleScape - Chat.0
// @namespace D4IS
// @version 1.2.1
// @description Better chat for IdleScape
// @author D4M4G3X
// @match *://*.idlescape.com/*
// @grant none
// @require https://code.jquery.com/jquery-3.4.1.min.js
// @run-at document-start
// ==/UserScript==
(function() {
/* INITIATE APPLICATION */
let lib = {};
let app = {};
let initInterval = setInterval(()=> {
if (window.D4IS) {
clearInterval(initInterval);
lib = window.D4IS.init('chat.0', '1.2.1');
app = lib["chat.0"];
lib.app.setUpdateLocation($('.chat-tab-private'));
main();
}
}, 100);
function main() {
/* SET DEFAULT VALUES */
app.chatHeight = 250;
/* RUN MAIN INTERVAL */
let mainInterval = setInterval(()=> {
if (app.ready && $('.status-bar').length) {
if(!app.setup) {
app.setup = true;
if (lib.general.getStorage('ChatHeight')) {
app.chatHeight = parseInt(lib.general.getStorage('ChatHeight'));
}
$('.play-area-chat-container').css('flex', '0 0 '+app.chatHeight+'px');
}
setupChannels();
}
}, 1000);
/* QUICK INTERVAL */
let checkInterval = setInterval(()=> {
if (app.ready && $('.status-bar').length) {
checkUsernames();
checkPrivates();
checkCommands();
checkMessageCount();
whoisPopup();
}
}, 100);
/* UPDATE INTERVAL */
let updateInterval = setInterval(()=> {
if (app.ready && $('.status-bar').length) {
lib.app.updateUser(app.name);
}
}, 5 * 60 * 1000);
function checkCommands() {
$('.chat-message-system:not(.chat0-done)').each(function() {
let $that = $(this);
if (~$that.text().indexOf('Unknown command:')) {
$that.addClass('chat0-done');
let cmd = $that.text().split('Unknown command: ')[1];
if (lib.app.commands) {
if (lib.app.commands[cmd]) {
lib.app.commands[cmd]();
$that.css({
'height': '0',
'display': 'block',
'overflow': 'hidden'
}).text('');
}
}
}
});
}
function checkUsernames() {
$('.message-username:not(.user-cloned)').each(function() {
$(this).addClass('user-cloned');
let $user = $('<div>', {
'class': $(this).attr('class') + ' user-menu'
}).html($(this).html());
$user.insertAfter($(this));
$user.click(function(e) {
openPopup($(this), e.pageX);
});
$(this).addClass('user-original');
$(this).hide();
});
}
function gotoTab(tab, first = false) {
$('.chat-tab').removeClass('selected-tab');
$('.chat-tab-'+tab.toLowerCase()).addClass('selected-tab');
$('.chat-interface-container').hide();
$('.chat-interface-container.'+tab.toLowerCase()).show();
if(first) {
$('.chat-interface-container.'+tab.toLowerCase()).find('.chat-tabs > div:first-child').click();
}
}
function whoisPopup() {
$('.chat-message-system:not(.chat0-done').each(function() {
let $that = $(this);
if (~$that.text().indexOf('total level')) {
$that.addClass('chat0-done');
let skills = ['mining', 'foraging', 'fishing', 'farming', 'smithing', 'crafting', 'cooking', 'constitution', 'attack', 'strength', 'defense', 'runecrafting', 'enchanting'];
let user = $that.text().split('[SYSTEM]: ')[1].split(' ')[0];
let league = $that.text().split('playing in ')[1].split('.')[0];
let level = {};
let $html = $('<div>');
let $wrap = $('<div>', {
'class': 'chat0-whois-level-wrap'
}).appendTo($html);
$.each(skills, function(k, skill) {
if (~$that.text().indexOf(lib.general.ucfirst(skill)+' Level: ')) {
level[skill] = $that.html().split(lib.general.ucfirst(skill)+' Level: ')[1].split('<br>')[0];
if(~level[skill].indexOf('+')) {
level[skill] = level[skill].replace('(', '<span style="color: #7cd6ff">(');
level[skill] = level[skill].replace(')', ')</span>');
}
let $level = $('<div>', {
'class': 'chat0-whois-level'
}).appendTo($wrap);
let $icon = $('<img>', {
'class': 'dialog-icon chat0-whois-level-icon'
}).attr({
'src': lib.game.getSkillIcon(skill)
}).appendTo($level);
let $text = $('<span>', {
'class': 'dialog-text-big chat0-whois-level-text'
}).html(lib.general.ucfirst(skill)+': '+level[skill]).appendTo($level);
}
});
let $titlewrap = $('<div>');
let $title = $('<div>', {
'class': 'chat0-whois-title'
}).appendTo($titlewrap);
let $text = $('<span>', {
'class': 'dialog-text-big chat0-whois-title-text'
}).text(user).appendTo($title);
let $icon = $('<img>', {
'class': 'dialog-icon chat0-whois-title-icon'
}).attr({
'src': lib.game.getLeagueIcon(league.split(' ')[0].toLowerCase())
}).appendTo($title);
lib.game.dialog({
'title': $titlewrap.html(),
'text': $html.html(),
'class': 'chat0-whois',
'type': 'close',
});
$that.css({
'height': '0',
'display': 'block',
'overflow': 'hidden'
}).text('');
}
});
}
function openPopup($obj, posX) {
if (lib.user.getName() == $obj.text()) { return false; }
$('.chat-user-options').remove();
let pos = $obj.offset();
let $popup = $('<div>', {
'class': 'chat-user-options'
}).appendTo($('body'));
popupButton('Whisper', function() {
$obj.parent().find('.user-original').click();
gotoTab('private');
}).appendTo($popup);
popupButton('Whois', function() {
$obj.parents('.chat-message-container').find('input').val('/whois ' + $obj.text());
$obj.parents('.chat-message-container').find('input').focus();
}).appendTo($popup);
popupButton('Block', function() {
$obj.parents('.chat-message-container').find('input').val('/block ' + $obj.text());
$obj.parents('.chat-message-container').find('input').focus();
}).appendTo($popup);
popupButton('Close').appendTo($popup);
$popup.css({
'left': posX - 45,
'top': pos.top - ($popup.height() + 10)
});
}
function popupButton(text, cb = function(){}) {
let $btn = $('<div>', {
'class': 'nav-tab no-select chat-user-option-' + text.toLowerCase()
}).text(text);
$btn.hover(function() {
$(this).addClass('selected-tab');
}, function() {
$(this).removeClass('selected-tab');
});
$btn.click(function() {
$(this).parent().remove();
cb();
});
return $btn;
}
function setupChannels() {
if(!$('.chat-tab-wrap').length) {
let $tabWrap = $('<ul>', {
'class': 'chat-tab-wrap'
}).insertAfter($('.chat-buttons'));
$tabWrap.css({
'display': 'flex',
'margin': '0',
'background':'#2a343e',
'border': '1px solid #222'
});
addChatTab('Public').appendTo($tabWrap);
addChatTab('Private').appendTo($tabWrap);
$('.chat-buttons').remove();
let $options = $('<div>', {
'class': 'chat-option-wrap'
}).appendTo($tabWrap);
let $option = [];
$option[0] = $('<div>', {
'class': 'chat-button chat-option noselect'
}).text('▲');
$option[0].click(function() {
if (app.chatHeight < 550) {
app.chatHeight += 100;
lib.general.setStorage('ChatHeight', app.chatHeight);
$('.play-area-chat-container').css('flex', '0 0 '+app.chatHeight+'px');
}
});
$option[1] = $('<div>', {
'class': 'chat-button chat-option noselect'
}).text('▼');
$option[1].click(function() {
if (app.chatHeight > 150) {
app.chatHeight -= 100;
lib.general.setStorage('ChatHeight', app.chatHeight);
$('.play-area-chat-container').css('flex', '0 0 '+app.chatHeight+'px');
}
});
$option[2] = $('<div>', {
'class': 'chat-button chat-option noselect'
}).text('-');
$option[2].click(function() {
$.each($option, function() {
$(this).hide();
});
$option[3].show();
$('.play-area-chat-container').css('flex', '0 0 31px');
});
$option[3] = $('<div>', {
'class': 'chat-button chat-option noselect'
}).text('+').hide();
$option[3].click(function() {
$.each($option, function() {
$(this).show();
});
$(this).hide();
$('.play-area-chat-container').css('flex', '0 0 '+app.chatHeight+'px');
});
$.each($option, function() {
$(this).appendTo($options);
});
}
if(!$('.chat-interface-container.private').length) {
$('.chat-message-container-box').css({
'background': '#222323',
});
let $publicChat = $('.chat-interface-container');
let $privateChat = $publicChat.clone();
$publicChat.addClass('public');
$privateChat.addClass('private').insertAfter($publicChat);
$privateChat.find('.chat-tab-channel').remove();
$privateChat.find('.chat-message-container').remove();
$privateChat.find('.chat-functions-item').remove();
$privateChat.hide();
}
}
function checkPrivates() {
$('.chat-interface-container.public').find('.chat-tabs > div:not(.closed)').each(function() {
if ($(this).hasClass('chat-tab-whisper')) {
let $publicChat = $('.chat-interface-container.public');
let $privateChat = $('.chat-interface-container.private');
let $whisperTab = $(this);
let $chatBox = $publicChat.find('.chat-message-container-box > .chat-message-container:last-child');
$whisperTab.addClass('whisper-'+$(this).text().split(' ')[1]);
$whisperTab.appendTo($privateChat.find('.chat-tabs'));
$whisperTab.find('a').hide();
$chatBox.addClass('chatBox-'+$(this).text().split(' ')[1]);
$chatBox.appendTo($privateChat.find('.chat-message-container-box'));
}
});
}
function checkMessageCount() {
let tabs = ['public', 'private']
$.each(tabs, function(k, tab) {
let count = 0;
$('.chat-interface-container.' + tab).find('.chat-tabs > div').each(function() {
if (~$(this).text().indexOf('(') && ~$(this).text().indexOf(')')) {
count += parseInt($(this).text().split('(')[1].split(')')[0]);
}
});
$('.chat-tab-'+tab).find('span').text('('+count+')');
})
}
function addChatTab(label) {
let $chatTab = $('<li>', {
'class': 'nav-tab chat-tab chat-tab-' + label.toLowerCase()
}).html(label+' <span>(0)</span>');
if (label === 'Public') {
$chatTab.addClass('selected-tab');
}
$chatTab.click(function() {
gotoTab(label, true);
});
return $chatTab;
}
}
})();
if (!window.D4IS_Socket) {
window.D4IS_Socket = true;
const sockets = [];
const nativeWebSocket = window.WebSocket;
window.WebSocket = function(...args){
const socket = new nativeWebSocket(...args);
sockets.push(socket);
return socket;
};
let setupSocket = setInterval(()=> {
let lib = window.D4IS;
if(sockets.length != 0){
clearInterval(setupSocket);
sockets[0].addEventListener('message', (e) => socketMessageHandler(e));
}
}, 10);
}
function socketMessageHandler(e) {
let lib = window.D4IS;
let getHandler = setInterval(()=> {
if (lib) {
clearInterval(getHandler);
lib.app.messageHandler(e);
}
}, 10)
}
function includeJS(file) {
var script = document.createElement('script');
script.src = file;
script.type = 'text/javascript';
script.defer = false;
document.getElementsByTagName('head').item(0).appendChild(script);
}
function includeCSS(file) {
var style = document.createElement('link');
style.rel = 'stylesheet';
style.href = file;
style.type = 'text/css';
document.getElementsByTagName('head').item(0).appendChild(style);
}
if (typeof window.D4IS_JS == 'undefined') {
window.D4IS_JS = true;
includeJS('https://digimol.net/idlescape/assets/js/lib.js');
}
if (typeof window.D4IS_CSS == 'undefined') {
window.D4IS_CSS = true;
includeCSS('https://digimol.net/idlescape/assets/css/game.css');
}