Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name SE
- // @namespace
- // @version SE 2.0
- // @description Productivity fixes for chattcentralen
- // @author
- // @match https://chattcentralen.se/*
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- loadConfig();
- console.log(config);
- document.title = "✉ Chattcentralen - " + window.location.pathname.substr(1);
- switch(window.location.pathname) {
- case '/':
- console.log("Main page: inserting username and password");
- if(config.username)
- document.getElementsByClassName('username')[0].value = config.username;
- if(config.password)
- document.getElementsByClassName('password')[0].value = config.password;
- document.getElementsByClassName('ui-button')[1].focus();
- if(config.autoLogin && document.getElementsByClassName("messages")[0].textContent.indexOf("Please enter") > -1) {
- console.log("Autologin");
- document.getElementsByClassName('ui-button')[1].click();
- }
- break;
- case '/messages':
- shimFunctions();
- case '/announcements':
- case '/statistics':
- if(config.showCounters) {
- createCounters();
- getStats();
- }
- registerHotkeys();
- createSettingsButton();
- if(config.goToMessagesFirst && document.referrer == window.location.origin+'/')
- window.location = window.location.origin+'/messages';
- break;
- }
- })();
- function loadConfig() {
- console.log("Loading config");
- var defaults = {
- hotkeys: ['KeyQ', 'KeyW', 'KeyA', 'KeyS', 'KeyZ', 'KeyX', 'Digit1', 'Digit2', 'Digit3', 'Digit4', 'Digit5'],
- username: '',
- password: '',
- autoLogin: false,
- showCounters: true,
- goToMessagesFirst: false,
- highlightMessagesNotes: true,
- focusTargetNotes: false,
- notificationSound: true
- };
- var local = JSON.parse(localStorage.getItem('config'));
- if(local === null)
- local = defaults;
- for (let i in defaults)
- if (!local.hasOwnProperty(i))
- local[i] = defaults[i];
- for (let i in local)
- if (!defaults.hasOwnProperty(i))
- delete local[i];
- console.log("\tConfig loaded");
- Notification.requestPermission().then(function(result) {
- local.showNotifications = result === "granted";
- });
- config = local;
- }
- (function(){
- let allowCopyAndPaste = function(e){
- e.stopImmediatePropagation();
- return true;
- };
- document.addEventListener('copy', allowCopyAndPaste, true);
- document.addEventListener('paste', allowCopyAndPaste, true);
- document.addEventListener('onpaste', allowCopyAndPaste, true);
- document.addEventListener('oncontextmenu', allowCopyAndPaste, true);
- document.addEventListener('contextmenu', allowCopyAndPaste, true);
- })();
- function focusMessageBox() {
- window.scroll(0, 0);
- document.getElementsByClassName('conversation-message-text')[0].focus();
- }
- function getTargetName() {
- return document.getElementsByClassName('target-name')[0].textContent.slice(1);
- }
- function getUsername() {
- return document.getElementsByClassName("user")[0].textContent.match(/\w+/)[0];
- }
- function notifyOperator() {
- if(document.hidden) {
- if(notifyOperator.notificationSound === undefined) {
- notifyOperator.notificationSound = new Audio("https://youtu.be/llcQu-XB6oE?t=10");
- }
- console.log("Sending notification");
- let oldTitle = document.title;
- let newTitle = "✉ New message!";
- let notification = new Notification("Chattcentralen", {body: "New message received!"});
- if(config.notificationSound) {
- notifyOperator.notificationSound.play();
- }
- setTimeout(() => {
- notification.close.bind(notification);
- }, 5000);
- var n = 0;
- function blinkTitle() {
- document.title = n%2 ? newTitle : oldTitle;
- n++;
- if(document.hidden)
- window.setTimeout(blinkTitle, 500);
- else
- document.title = oldTitle;
- }
- blinkTitle();
- window.focus();
- }
- }
- function highlightMessagesNotes(element) {
- console.log("Highlighting messages and notes");
- let username = document.getElementsByClassName('target-name')[0].textContent.match(/\w+/)[0];
- for (let e of document.getElementsByClassName("from-to")) {
- if(e.textContent.indexOf(username) > -1) {
- e.parentElement.parentElement.style.background = highlightColor;
- }
- }
- let target = getTargetName();
- }
- window.afterConversationLoaded = function() {
- console.log("Loaded conversation");
- getStats();
- notifyOperator();
- console.log("Registering emoji click refocusing");
- for(let e of document.getElementsByClassName('emoji-insert')) {
- e.addEventListener('click', focusMessageBox);
- }
- console.log("Registering automatic photo adding");
- for(let e of document.getElementById('AddMediaDialog').getElementsByClassName("mediaAddContainer")) {
- e.addEventListener('click', () => {
- e.getElementsByTagName("img")[0].click();
- e.getElementsByTagName("input")[0].click();
- $('#btnAddMedia').button('enable')[0].click();
- focusMessageBox();
- });
- }
- let highlightColor = "rgb(255, 211, 20)";
- var target = document.getElementById('conversation-content');
- if(config.highlightMessagesNotes) {
- console.log("Highlighting own messages");
- for(let e of document.getElementById("conversation-messages").getElementsByClassName('message-text')) {
- let parentParent = e.parentElement.parentElement;
- if(parentParent.textContent.slice(1).indexOf(getTargetName()) > -1)
- parentParent.style.background = "rgb(188, 188, 188)";
- else
- parentParent.style.background = "rgb(255, 255, 255)";
- }
- console.log("Highlighting target notes");
- let ending = getTargetName().toUpperCase();
- for(let e of document.getElementsByClassName('player-last-notes')[0].children) {
- if(e.children[2].textContent.toUpperCase().replace(/[\ \)]*$/,"").indexOf(ending) > -1) {
- e.style.background = highlightColor;
- }
- }
- }
- let targetNotesContent = document.getElementsByClassName('target-note-content')[0];
- document.addEventListener('selectionchange', (e) => {
- let anchor = document.getSelection().anchorNode;
- if(anchor && anchor.nodeType === Node.TEXT_NODE) {
- anchor = anchor.parentElement;
- }
- if(anchor.classList.contains('message-text')) {
- targetNotesContent.value = window.getSelection().toString();
- }
- });
- }
- function shimFunctions() {
- /*
- if(config.showCounters) {
- console.log("Adding statistics counters");
- loadConversation = (function() {
- var cached_loadConversation = loadConversation;
- return function() {
- var result = cached_loadConversation.apply(this, arguments);
- afterConversationLoaded();
- return result;
- };
- })();
- }
- /*/
- console.log("Adding statistics counters????");
- if(config.showCounters) {
- console.log("Adding statistics counters");
- loadConversation = new Function(
- "id",
- "doPreload",
- "review",
- "fromClaimNext",
- "claimNextType",
- loadConversation.toString()
- .replace("userIdleTime = 0;", "userIdleTime = 0;\n\t\tafterConversationLoaded();")
- .replace(/^function[^{]+{/i,"")
- .replace(/}[^}]*$/i, "")
- );
- }
- //*/
- console.log("Shimming playerNotes");
- playerNotes = (function() {
- var cached_playerNotes = playerNotes;
- return function() { // Swaps category dropdown and log button for player
- var result = cached_playerNotes.apply(this, arguments);
- let e = document.getElementsByClassName('player-note-categories')[0];
- let f = document.getElementsByClassName('player-save-note')[0];
- if(e !== undefined && f !== undefined) {
- f.insertAdjacentElement('beforebegin', e);
- f.addEventListener('click', focusMessageBox);
- }
- return result;
- };
- })();
- console.log("Shimming targetNotes");
- targetNotes = (function() { // Swaps category dropdown and log button for player
- var cached_targetNotes = targetNotes;
- return function() {
- var result = cached_targetNotes.apply(this, arguments);
- let e = document.getElementsByClassName('target-note-categories')[0];
- let f = document.getElementsByClassName('target-save-note')[0];
- if(e !== undefined && f !== undefined) {
- f.insertAdjacentElement('beforebegin', e);
- if(config.focusTargetNotes) {
- f.addEventListener('click', (() => $('.target-note-content')[0].focus()));
- } else {
- f.addEventListener('click', focusMessageBox);
- }
- }
- return result;
- };
- })();
- }
- function registerHotkeys() {
- console.log("Registering hotkeys");
- var helperFunctions = new Map();
- helperFunctions.set(config.hotkeys[0], // Go to player note
- () => {
- let e = document.getElementsByClassName('player-note-content')[0];
- if(e !== undefined) {
- var targetNameNote = " (" + getTargetName() + ")";
- if(!e.value.endsWith(targetNameNote))
- e.value += targetNameNote;
- $.fancybox.close();
- e.focus();
- let pos = e.value.length - targetNameNote.length;
- e.setSelectionRange(pos, pos);
- }
- });
- helperFunctions.set(config.hotkeys[1], // Go to target note
- () => {
- let e = document.getElementsByClassName('target-note-content')[0];
- if(e !== undefined) {
- $.fancybox.close();
- e.focus();
- }
- });
- helperFunctions.set(config.hotkeys[2], focusMessageBox); // Go to message box
- helperFunctions.set(config.hotkeys[3], // Open latest attachment
- () => {
- let e = document.getElementsByClassName('conversation-attachment')[0];
- if(e !== undefined) {
- e.click();
- }
- });
- helperFunctions.set(config.hotkeys[4], // Add image
- () => {
- let e = document.getElementsByClassName('message-addmedia-button')[0];
- if(e !== undefined) {
- e.click();
- }
- });
- helperFunctions.set(config.hotkeys[5], // Remove image
- () => {
- let e = document.getElementsByClassName('message-delmedia-button')[0];
- if(e !== undefined) {
- e.click();
- }
- });
- helperFunctions.set(config.hotkeys[6], // Go to Messages
- () => {
- $('button[rel="messages"]').click();
- });
- helperFunctions.set(config.hotkeys[7], // Go to Statistics
- () => {
- $('button[rel="statistics"]').click();
- /*console.log("Sending notification");
- window.setTimeout(() => {
- notifyOperator();
- }, 2000);*/
- });
- helperFunctions.set(config.hotkeys[8], // Go to Announcements
- () => {
- $('button[rel="announcements"]').click();
- });
- helperFunctions.set(config.hotkeys[9], // Go to Manual
- () => {
- $('button[rel="documents/manual.pdf"]').click();
- });
- helperFunctions.set(config.hotkeys[10], // Go to Settings
- () => {
- $('button[rel="settings"]').click();
- });
- document.addEventListener('keyup', (e) =>{ // Send Mssg and Lap Time on hit Enter
- if (e.which == 13) {
- var isFocused = $(".conversation-message-text").is(":focus")
- var len = $('.conversation-message-text').val().length;
- if (len >= 75 && isFocused) {
- $('#counters-column5').trigger("click");
- $('.message-submit-button').trigger("click");
- }}
- });
- document.addEventListener('keydown', (e) => { // Adds event listeners for the hotkeys
- if(e.altKey && isOkHotkey(e.code)) {
- e.preventDefault();
- e.stopPropagation();
- let f = helperFunctions.get(e.code);
- if(f !== undefined) f();
- }
- });
- console.log("\tHotkeys registered");
- }
- function isOkHotkey(code) {
- return code.startsWith("Key") || code.startsWith("Digit") || code.startsWith("Numpad") || code.startsWith("F");
- }
- function createSettingsButton() {
- function addSetting(value, name) {
- var id_name = (name + 'Setting').replace(/[^A-Za-z_]/g,'');
- var label = document.createElement('label');
- label.innerHTML = name + ": ";
- label.setAttribute('for', id_name);
- label.style.gridColumn = '1';
- var element = document.createElement('input');
- if(typeof value == 'boolean') {
- element.type = 'checkbox';
- element.checked = value;
- } else {
- element.type = 'text';
- element.value = value !== undefined ? value : "";
- }
- element.id = id_name;
- element.name = id_name;
- element.style.gridColumn = '2';
- settingsDialog.appendChild(label);
- settingsDialog.appendChild(element);
- return element;
- }
- function setHotkey(n, e) {
- if(isOkHotkey(e.code) || ['Backspace', 'Delete'].includes(e.code)) {
- e.preventDefault();
- e.stopPropagation();
- var code = (['Backspace', 'Delete'].includes(e.code)) ? "" : e.code;
- e.target.value = code;
- config.hotkeys[n] = code;
- }
- }
- console.log("Creating settings button");
- var menu = $('#topmenu1')[0];
- var settingsDialog = document.createElement('div');
- settingsDialog.id = 'SettingsDialog';
- settingsDialog.style.display = 'none';
- settingsDialog.style.alignItems = 'center';
- addSetting(config.username, 'Username') .addEventListener('change', (e) => {config.username = e.target.value;});
- addSetting(config.password, 'Password') .addEventListener('change', (e) => {config.password = e.target.value;});
- addSetting(config.autoLogin, 'Autologin') .addEventListener('change', (e) => {config.autoLogin = e.target.checked;});
- addSetting(config.showCounters, 'Show counters') .addEventListener('change', (e) => {config.showCounters = e.target.checked;});
- addSetting(config.goToMessagesFirst, 'Go to Messages after login')
- .addEventListener('change', (e) => {config.goToMessagesFirst = e.target.checked;});
- addSetting(config.highlightMessagesNotes, 'Highlights messages and notes')
- .addEventListener('change', (e) => {config.highlightMessagesNotes = e.target.checked;});
- addSetting(config.focusTargetNotes, 'Focus target notes after logging')
- .addEventListener('change', (e) => {config.focusTargetNotes = e.target.checked;});
- addSetting(config.notificationSound, 'Play sound on new message')
- .addEventListener('change', (e) => {config.notificationSound = e.target.checked;});
- addSetting(config.hotkeys[ 0], 'Go to player logging') .addEventListener('keydown', (e) => {setHotkey( 0, e);});
- addSetting(config.hotkeys[ 1], 'Go to target logging') .addEventListener('keydown', (e) => {setHotkey( 1, e);});
- addSetting(config.hotkeys[ 2], 'Go to message box') .addEventListener('keydown', (e) => {setHotkey( 2, e);});
- addSetting(config.hotkeys[ 3], 'Open latest attachment').addEventListener('keydown', (e) => {setHotkey( 3, e);});
- addSetting(config.hotkeys[ 4], 'Add photo dialog') .addEventListener('keydown', (e) => {setHotkey( 4, e);});
- addSetting(config.hotkeys[ 5], 'Remove selected photo') .addEventListener('keydown', (e) => {setHotkey( 5, e);});
- addSetting(config.hotkeys[ 6], 'Go to Messages') .addEventListener('keydown', (e) => {setHotkey( 6, e);});
- addSetting(config.hotkeys[ 7], 'Go to Statistics') .addEventListener('keydown', (e) => {setHotkey( 7, e);});
- addSetting(config.hotkeys[ 8], 'Go to Announcements') .addEventListener('keydown', (e) => {setHotkey( 8, e);});
- addSetting(config.hotkeys[ 9], 'Go to Manual') .addEventListener('keydown', (e) => {setHotkey( 9, e);});
- addSetting(config.hotkeys[10], 'Open these settings') .addEventListener('keydown', (e) => {setHotkey(10, e);});
- var settingsButton = menu.children[5].cloneNode();
- settingsButton.id = 'SettingsButton';
- settingsButton.setAttribute('rel', 'settings');
- settingsButton.addEventListener('click', () => {
- $('#SettingsDialog').dialog({
- title: "Settings",
- resizable: false,
- modal: true,
- position: 'top',
- width: '400',
- open: () => {
- $('#SettingsDialog')[0].style.display = 'grid';
- },
- buttons: [
- {
- text: "Save",
- click: () => {
- console.log("Storing config");
- localStorage.setItem('config', JSON.stringify(config));
- console.log("\tConfig stored:");
- console.log(localStorage.getItem('config'));
- loadConfig();
- //window.location.reload();
- }
- }
- ]
- });
- });
- $('button[rel="documents/manual.pdf"]')[0].insertAdjacentElement('afterend', settingsButton);
- $('button[rel="documents/manual.pdf"]')[0].insertAdjacentText('afterend', '\n');
- $('#SettingsButton').button();
- settingsButton.children[0].innerHTML = 'Settings';
- document.getElementById('informDialog').insertAdjacentElement('afterend', settingsDialog);
- console.log("\tSettings button created");
- }
- function createCounters() {
- console.log("Creating counter elements");
- var menu = document.getElementById('topmenu1');
- menu.style.position = 'relative';
- var counters = document.createElement('div');
- counters.id = 'counters-container';
- counters.style.display = 'inline-block';
- counters.style.position = 'absolute';
- counters.style.top = '50%';
- counters.style.transform = 'translateY(-50%)';
- counters.style.fontSize = '1.1em';
- var column1 = document.createElement('div');
- column1.id = 'counters-column1';
- column1.style.display = 'inline-block';
- column1.style.marginLeft = '15em';
- column1.style.marginTop = '1em';
- column1.style.verticalAlign = 'top';
- column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Sent: ';
- column1.appendChild(document.createElement('span'));
- column1.appendChild(document.createElement('br'));
- column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Earned: €';
- column1.appendChild(document.createElement('span'));
- column1.appendChild(document.createElement('br'));
- var column2 = document.createElement('div');
- column2.id = 'counters-column2';
- column2.style.display = 'inline-block';
- column2.style.marginLeft = '2em';
- column2.style.marginTop = '1em';
- column2.style.verticalAlign = 'top';
- column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'This week: ';
- column2.appendChild(document.createElement('span'));
- column2.appendChild(document.createElement('br'));
- column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Earned: €';
- column2.appendChild(document.createElement('span'));
- column2.appendChild(document.createElement('br'));
- column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Rate: €';
- column2.appendChild(document.createElement('span'));
- column2.appendChild(document.createElement('br'));
- var column4 = document.createElement('div');
- column4.id = 'counters-column4';
- column4.style.display = 'inline-block';
- column4.style.marginLeft = '3em';
- column4.style.marginTop = '1em';
- column4.style.verticalAlign = 'top';
- column4.appendChild(document.createElement('span')); column4.lastChild.innerHTML = 'Time: ';
- column4.appendChild(document.createElement('span'));
- column4.appendChild(document.createElement('br'));
- column4.appendChild(document.createElement('span')); column4.lastChild.innerHTML = 'Last Msg: ';
- column4.appendChild(document.createElement('span'));
- var column5 = document.createElement('div');
- column5.id = 'counters-column5';
- column5.style.display = 'inline-block';
- column5.style.marginLeft = '3em';
- column5.style.marginTop = '1em';
- column5.style.verticalAlign = 'top';
- column5.appendChild(document.createElement('button')); column5.lastChild.innerHTML = 'Clear';
- counters.appendChild(column1);
- counters.appendChild(column2);
- counters.appendChild(column4);
- counters.appendChild(column5);
- menu.insertBefore(counters, menu.lastElementChild);
- console.log("\tCounter elements created");
- }
- function calcRate(messages) {
- if(messages >= 1976)
- return 0.19;
- if(messages >= 1576)
- return 0.16;
- if(messages >= 776)
- return 0.14;
- return 0.12;
- }
- function calcEarned(rate, normal, bonus, other) {
- return rate * (normal + bonus) +
- 0.02 * bonus +
- 0.12 * other;
- }
- function getStats() {
- function updateCounters(stats) {
- function statsForDate(date) {
- var normal = parseInt(date.replied_messages_normal) | 0;
- var peakHour = parseInt(date.replied_messages_peakhour) | 0;
- var weekend = parseInt(date.replied_messages_saturday) +
- parseInt(date.replied_messages_sunday) +
- parseInt(date.replied_messages_specialtrigger) | 0;
- var other = parseInt(date.replied_favorites) +
- parseInt(date.replied_flirts) +
- parseInt(date.replied_matches) +
- parseInt(date.replied_proposals)| 0;
- return [normal, peakHour + weekend, other];
- }
- console.log("Updating counters");
- var date = new Date().toLocaleString('sv-SE', {
- year: 'numeric',
- month: '2-digit',
- day: '2-digit'
- });
- var sentNormal, sentBonus, other, normalWeek=0, bonusWeek=0, otherWeek=0, rate,
- column1 = document.getElementById('counters-column1'),
- column2 = document.getElementById('counters-column2'),
- column4 = document.getElementById('counters-column4'),
- column5 = document.getElementById('counters-column5');
- column1.children[1].innerHTML = 'No statistics for today (yet?)!';
- column1.children[4].innerHTML = '';
- for(const s of stats) {
- [sentNormal, sentBonus, other] = statsForDate(s);
- normalWeek += sentNormal;
- bonusWeek += sentBonus;
- otherWeek += other;
- if(s.date == date) {
- rate = calcRate(normalWeek + bonusWeek);
- column1.children[1].innerHTML = sentNormal + sentBonus;
- column1.children[4].innerHTML = (rate * (sentNormal + sentBonus)).toFixed(2);
- console.log("\tCounters for today updated");
- break;
- }
- }
- column2.children[1].innerHTML = normalWeek + bonusWeek;
- column2.children[4].innerHTML = calcEarned(rate, normalWeek, bonusWeek, otherWeek).toFixed(2);
- column2.children[7].innerHTML = rate;
- console.log("\tCounters updated");
- }
- console.log("Getting statistics");
- $.ajax({
- url: '/ajax/stats/action/getStats',
- dataType: 'json',
- type: 'POST',
- data: {
- year: new Date().getFullYear(),
- weekno: $.datepicker.iso8601Week(new Date()),
- pagination: {
- current: 1,
- drawPagination: false,
- perPage: 20,
- total: 1
- },
- type: 'mine'
- },
- success: function (response) {
- console.log("getStats AJAX call success");
- updateCounters(response.data.result);
- },
- complete: function () {}
- });
- console.log("\tStatistics gotten");
- }
- var h1 = document.getElementById('counters-column4'),
- start = document.getElementById('counters-column5'),
- h2 = document.getElementById('counters-column4'),
- seconds = 0, minutes = 0, hours = 0,
- t;
- function add() {
- seconds++;
- if (seconds >= 60) {
- seconds = 0;
- minutes++;
- if (minutes >= 60) {
- minutes = 0;
- hours++;
- }
- }
- h1.children[1].textContent = (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") + ":" + (seconds > 9 ? seconds : "0" + seconds);
- timer();
- }
- function timer() {
- t = setTimeout(add, 1000);
- }
- timer();
- /* Start button */
- start.onclick = function() {
- h2.children[4].textContent = leftPad(minutes) + ":" + leftPad(seconds);
- h1.children[1].innerHTML = "00:00";
- seconds = 0; minutes = 0; hours = 0;
- return false;
- }
- return true;
- function leftPad(value) {
- return value < 10 ? ('0' + value) : value;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement