// ==UserScript==
// @name TheWest-Notifier
// @namespace TWNotifier_M77
// @author Meuchelfix77 (updated by Tom Robert)
// @description Plays a notification sound, when specified events are triggered in the browser game The West!
// @include https://*.the-west.*/game.php*
// @exclude https://classic.the-west.net*
// @version 1.023
// @icon http://twm.pf-control.de/TWNotifier/favicon.ico
// @grant none
// ==/UserScript==
(function (fn) {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.textContent = '(' + fn.toString() + ')();';
(document.head || document.body || document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
})(function () {
TWN = {
version: '1.023',
name: 'TheWest-Notifier',
author: 'Meuchelfix77 (updated by Tom Robert)',
website: 'https://greasyfork.org/scripts/16917',
LANGUAGE: (localStorage.getItem('scriptsLang') || Game.locale.substr(0, 2)),
init: function () {
switch (TWN.LANGUAGE) {
default:
TWN.lang = {
translator: 'Meuchelfix77',
notifications: 'Notifications',
confirmationTitle: 'Confirmation',
confirmation: 'Are you sure to remove this notification?',
types: {
messages: 'Messages',
reports: 'Reports',
townforum: 'Townforum',
friends: 'Friends',
wayFinished: 'Way finished',
noQueue: 'Empty job queue',
newItem: 'New item',
nickInChat: 'Nickname in chat',
},
sounds: {
bum: 'Bum',
chime: 'Chime',
coin: 'Coin',
coin2: 'Coin 2',
icq: 'ICQ',
qip: 'QIP',
tinkle: 'Tinkle',
trumpet: 'Trumpet',
vk: 'VK',
custom: 'Custom',
},
event: 'Event',
info: 'Information',
remove: 'Remove this notification',
listen: 'Listen to this sound',
sound: 'Sound',
soundFile: 'Sound file',
soundInfo: 'Warning! Not all files can be played in your browser.',
desc: {
messages: 'Telegram received:',
reports: 'Report received of type:',
townforum: 'New forum post in:',
friends: 'Friend(s) online:',
wayFinished: 'Way finished:',
noQueue: 'Empty job queue:',
newItem: 'New item in inventory:',
nickInChat: 'Nickname typed in chat:',
},
reportTypes: {
all: 'All',
work: 'Work',
duels: 'Duels',
achvmnt: 'Achievements',
fort: 'Fort battles',
other: 'Other',
},
add: 'Add notification',
wayFinishedInfo: 'Triggers when you have finished your way and reached your destination.',
reportInfo: '<b>Warning!</b> This will cause problems with the blinking messages button on the bottom screen.<br>Selecting <i>All</i> will solve these problems.',
noQueueInfo: 'Triggers when there are no more job assignments in you job queue.',
messagesInfo: 'Triggers when you receive a telegram.',
friendListInfo: 'Seperate multiple friends with a semicolon (;)',
townforumInfo: 'Triggers when somebody writes a post in the forum<span id="selectedForum"></span>.',
newItemInfo: 'Triggers when you find, buy or get a new item.',
nickInChatInfo: 'Triggers when your name was typed in the chat. Seperate more nicks with a semicolon (;)',
install: 'Install',
cancel: 'Cancel',
update: 'Update',
updateAvailable: 'A new version of the script is available',
};
break;
case ('de'):
TWN.lang = {
translator: 'Meuchelfix77',
notifications: 'Benachrichtigungen',
confirmationTitle: 'Bestätigung',
confirmation: 'Willst du diese Benachrichtigung wirklich löschen?',
types: {
messages: 'Telegramme',
reports: 'Berichte',
townforum: 'Stadtforum',
friends: 'Freunde',
wayFinished: 'Weg beendet',
noQueue: 'Keine Arbeitsaufträge',
newItem: 'Neues Item',
nickInChat: 'Spielername im Chat',
},
sounds: {
bum: 'Bum',
chime: 'Glockenspiel',
coin: 'Münze',
coin2: 'Münze 2',
icq: 'ICQ',
qip: 'QIP',
tinkle: 'Glitzer',
trumpet: 'Trompete',
vk: 'VK',
custom: 'Eigene',
},
event: 'Ereignis',
remove: 'Diese Benachrichtigung löschen',
listen: 'Anhören',
sound: 'Ton',
soundFile: 'Audio-Datei',
soundInfo: 'Achtung! Nicht alle Dateien werden von deinem Browser unterstützt.',
desc: {
messages: 'Telegramm erhalten:',
reports: 'Bericht erhalten vom Typ:',
townforum: 'Neuer Foren-Beitrag in:',
friends: 'Freund(e) online:',
wayFinished: 'Weg beendet:',
noQueue: 'Keine weiteren Aufträge:',
newItem: 'Neues Item im Inventar:',
nickInChat: 'Name im Chat erwähnt:',
},
reportTypes: {
all: 'Alle',
work: 'Arbeiten',
duels: 'Duelle',
achvmnt: 'Erfolge',
fort: 'Fortkämpfe',
other: 'Sonstige',
},
add: 'Benachrichtigung hinzufügen',
wayFinishedInfo: 'Wird ausgelöst, wenn du dein Ziel erreicht hast.',
reportInfo: '<b>Achtung!</b> Diese Einstellung verursacht ein Problem mit der blinkenden Nachrichten-Schaltfläche am unteren Bildrand.<br>Die Option <i>Alle</i> behebt dieses Problem.',
noQueueInfo: 'Wird ausgelöst, wenn du keine Arbeiten mehr in der Warteschlange hast.',
messagesInfo: 'Wird ausgelöst, wenn du ein Telegramm erhälst.',
friendListInfo: 'Trenne mehrere Freunde mit einem Semikolon (;)',
townforumInfo: 'Wird ausgelöst, wenn jemand einen Beitrag im Stadtforum<span id="selectedForum"></span> verfasst.',
newItemInfo: 'Wird ausgelöst wenn du ein neues Item findest oder kaufst.',
nickInChatInfo: 'Wird ausgelöst wenn dein Name im Chat steht. Trenne weitere Nicks mit einem Semikolon (;)',
install: 'Installieren',
cancel: 'Abbrechen',
};
break;
case ('pl'):
TWN.lang = {
translator: 'Darius II',
notifications: 'Powiadomienia',
confirmationTitle: 'Potwierdzenie',
confirmation: 'Chcesz usunąć to powiadomienie?',
types: {
messages: 'Wiadomości',
reports: 'Raporty',
townforum: 'Forum',
friends: 'Znajomi',
wayFinished: 'Dotarcie do celu',
noQueue: 'Brak zadań',
newItem: 'New item',
nickInChat: 'Nickname in chat',
},
sounds: {
bum: 'Bum',
chime: 'Kurant',
coin: 'Kucie',
coin2: 'Kucie 2',
icq: 'ICQ',
qip: 'QIP',
tinkle: 'Dzwonek',
trumpet: 'Trąbka',
vk: 'VK',
custom: 'Własny',
},
event: 'Zdarzenie',
remove: 'Usuń zdarzenie',
listen: 'Odsłuchaj',
sound: 'Dźwięk',
soundFile: 'Plik dźwięku',
soundInfo: 'Uwaga! Nie wszystkie typy plików dźwiękowych mogą być odtwarzane w przeglądarce.',
desc: {
messages: 'Otrzymano wiadomość:',
reports: 'Typ raportu:',
townforum: 'Nowy wpis w:',
friends: 'Pojawił się znajomy/a :',
wayFinished: 'Ośiągnięto cel:',
noQueue: 'Brak zadań:',
newItem: 'New item in inventory:',
nickInChat: 'Nickname typed in chat:',
},
reportTypes: {
all: 'Wszystkie',
work: 'Praca',
duels: 'Pojedynki',
achvmnt: 'Osiągnięcia',
fort: 'Fortowe',
other: 'Pozostałe',
},
add: 'Dodaj powiadomienie',
wayFinishedInfo: 'Odtworzy dźwięk kiedy dotrzesz na wyznaczoną pozycję.',
reportInfo: '<b>Uwaga!</b> Ten wybór powoduje problemy z migotaniem przycisku "wiadomości/raporty", wybrór <i>Wszystkie</i> rozwiąże ten problem.',
noQueueInfo: 'Odtworzy dźwięk, kiedy zostaną wykonane wszystkie zadania.',
messagesInfo: 'Odtworzy dźwięk, kiedy otrzymasz telegram.',
friendListInfo: 'Oddziel znajomych średnikiem (;)',
townforumInfo: 'Odtworzy dźwięk, kiedy ktoś napisze wiadomośc na forum w zakładce: <span id="selectedForum"></span>.',
newItemInfo: 'Triggers when you find, buy or get a new item.',
nickInChatInfo: 'Triggers when your name was typed in the chat. Seperate more nicks with a semicolon (;)',
install: 'Zainstaluj',
cancel: 'Anuluj',
};
break;
case ('pt'):
TWN.lang = {
translator: 'jccwest',
notifications: 'Notificações',
confirmationTitle: 'confirmação',
confirmation: 'Tem certeza que deseja remover esta notificação?',
types: {
messages: 'Mensagens',
reports: 'Relatórios',
townforum: 'Fórum da cidade',
friends: 'Amigos',
wayFinished: 'Chegou ao destino',
noQueue: 'Sem trabalhos',
newItem: 'Novo item no inventário',
nickInChat: 'Nickname in chat',
},
sounds: {
bum: 'Bum',
chime: 'Chime',
coin: 'Coin',
coin2: 'Coin 2',
icq: 'ICQ',
qip: 'QIP',
tinkle: 'Tinkle',
trumpet: 'Trompete',
vk: 'VK',
custom: 'Custom',
},
event: 'Evento',
info: 'Informação',
remove: 'Remover esta notificação',
listen: 'reproduzir o som',
sound: 'Som',
soundFile: 'arquivo de som',
soundInfo: 'Aviso! Nem todos os arquivos podem ser reproduzidos no seu navegador.',
desc: {
messages: 'Telegrama recebido:',
reports: 'Relatório recebeu do tipo:',
townforum: 'Novo post no fórum:',
friends: 'Amigo(s) on-line:',
wayFinished: 'Chegou ao destino:',
noQueue: 'Sem trabalhos:',
newItem: 'Novo item no inventário:',
nickInChat: 'Nickname typed in chat:',
},
reportTypes: {
all: 'Todos',
work: 'Trabalho',
duels: 'Duelos',
achvmnt: 'Conquistas',
fort: 'Batalhas no forte',
other: 'Outro',
},
add: 'Adicionar notificação',
wayFinishedInfo: 'Avisa quando tiver terminado o meu caminho e a chegada ao destino.',
reportInfo: '<b>Aviso!</b> Isto irá causar problemas com o botão piscando mensagens na tela inferior seleção <i>Todos</i> vai resolver estes problemas.',
noQueueInfo: 'Avisa quando não há mais trabalhos atribuídos.',
messagesInfo: 'Avisa quando recebe um telegrama.',
friendListInfo: 'Separe vários amigos com um ponto e vírgula (;)',
townforumInfo: 'Avisa quando alguém escreve um post no fórum <span id="selectedForum"></span>.',
newItemInfo: 'Avisa quando encontra,ou compra um novo item.',
nickInChatInfo: 'Triggers when your name was typed in the chat. Seperate more nicks with a semicolon (;)',
install: 'Instalar',
cancel: 'Cancelar',
};
break;
case ('el'):
TWN.lang = {
translator: 'Timemod Herkumo',
notifications: 'Ειδοποιήσεις',
confirmationTitle: 'Επιβεβαίωση',
confirmation: 'Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτήν την ειδοποίηση;',
types: {
messages: 'Μυνήματα',
reports: 'Αναφορές',
townforum: 'Φόρουμ πόλης',
friends: 'Φιλοι',
wayFinished: 'Τέλος προορισμού',
noQueue: 'Κενή ουρά εργασίας',
newItem: 'Νέο αντικείμενο',
nickInChat: 'Ψευδώνυμο στην συνομιλία',
},
sounds: {
bum: 'Bum',
chime: 'Κουδούνι',
coin: 'Νόμισμα',
coin2: 'Νόμισμα 2',
icq: 'ICQ',
qip: 'QIP',
tinkle: 'Λάμψη',
trumpet: 'Τρομπέτα',
vk: 'VK',
custom: 'Προσαρμοσμένο',
},
event: 'Εκδήλωση',
info: 'Πληροφορίες',
remove: 'Κατάργηση αυτής της ειδοποίησης',
listen: 'Ακούστε αυτόν τον ήχο',
sound: 'Ήχοι',
soundFile: 'Αρχείο ήχου',
soundInfo: '<b>Προειδοποίηση!</b><br>Δεν είναι δυνατή η αναπαραγωγή όλων των αρχείων στο πρόγραμμα περιήγησής σας.',
desc: {
messages: 'Λάβατε νέο τηλεγάφημα:',
reports: 'Λάβατε νέα αναφορά:',
townforum: 'Νέο θέμα στο Φόρουμ:',
friends: 'Συνδεδεμένος φίλος:',
wayFinished: 'Προορισμός:',
noQueue: 'Κενή ουρά εργασίας:',
newItem: 'Νέο αντικείμενο:',
nickInChat: 'Ψευδόνυμο στο τσατ:',
},
reportTypes: {
all: 'Όλα',
work: 'Εργασίες',
duels: 'Μονομαχίες',
achvmnt: 'Επιτεύγματα',
fort: 'Μάχες Οχυρού',
other: 'Άλλο',
},
add: 'Προσθήκη ειδοποίησης',
wayFinishedInfo: 'Ενεργοποιείται όταν φτάσετε στον προορισμό σας.',
reportInfo: '<b>Προειδοποίηση!</b><br>Αυτό θα προκαλέσει προβλήματα με την αναλαμπή του κουμπιού μηνυμάτων στην κάτω μπάρα μενού.<br>Η επιλογή <i>"Όλα"</i> θα λύσει αυτά τα προβλήματα.',
noQueueInfo: 'Ενεργοποιείται όταν δεν υπάρχουν εργασίες στην ουρά εργασίας.',
messagesInfo: 'Ενεργοποιείται όταν λαμβάνετε ένα τηλεγράφημα.',
friendListInfo: 'Ξεχωρίστε πολλούς φίλους με ένα ερωτηματικό (;)',
townforumInfo: 'Ενεργοποιείται όταν κάποιος γράφει μια ανάρτηση στο φόρουμ .',
newItemInfo: 'Ενεργοποιείται όταν βρίσκετε, αγοράζετε ή λαμβάνετε ένα νέο αντικείμενο.',
nickInChatInfo: 'Ενεργοποιείται όταν αναφέρεται το όνομά σας στη συζήτηση. Seperate more nicks with a semicolon (;)',
install: 'Εγκατάσταση',
cancel: 'Ματαίωση',
};
break;
} // Init all modules of TWNotifier
TWN.initStyleSheet();
TWN.settings.init();
TWN.notifications.init();
},
roomsListening: [
],
// init the global stylesheet
initStyleSheet: function () {
var css = $('<style id="TWNotifierStyles"></style>');
$(document.head || document.body || document.documentElement).append(css);
},
// add global CSS information
addStyle: function (css) {
var styles = $('#TWNotifierStyles');
styles.html(styles.html() + '\n' + css);
},
// returns a value from our storage
get: function (key, val) {
return (localStorage.getItem('TWNotifier_' + key) || val);
},
// sets a value pair in our storage
set: function (key, val) {
localStorage.setItem('TWNotifier_' + key, val);
},
// removes a key-value pair from our storage
remove: function (key) {
localStorage.removeItem('TWNotifier_' + key);
},
showMessage: function (text, icon) {
new UserMessage(text, icon).show();
},
// append the specified function
appendFunction: function (oldFn, newFn, _thisOld, _thisNew) {
var fn = parent,
i = 1; // start for finding the function to replace
// every loop we get one step deeper/closer to our function to replace/append to
while (fn[oldFn[i - 1]][oldFn[i]]) {
fn = fn[oldFn[i - 1]];
i++;
}
var tmpFn = fn[oldFn[i - 1]]; // avoid recursion
fn[oldFn[i - 1]] = function () {
newFn.apply(_thisNew, arguments); // and afterwards our new
return tmpFn.apply(this, arguments); // call the old function;
};
}
};
TWN.images = {
right_menu: 'data:image/png;base64,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',
right_menu_hover: 'data:image/png;base64,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',
sound: 'data:image/png;base64,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',
remove: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAcCAYAAAB75n/uAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMPSURBVHja7FVNaFxVFP7uzJ15781rMy6CUkNJ0ygi1W40i4BCgmKF0k1FxEXFpeDCZUEFKZKCLnSZlRuz8GfhQgISxa1SkbQF0xICFYUSDZ1kOjPv595z7j0uJplMJplxmupKP3jv3Xu/8853zjvn3qfeeu2ZK7Ozs7i+fMViF6rnec/YupuVZ2ZmRDvna8WihveSHWCn7nHeATsfFbUWbclt6FIAdr51CEd9BSy5uKgDaENuU5dDMLsGAOk1lPaa7E4HovNpjaWRUhAqneW0EYSx5Ja3dq3UwTVQf1MT2Q0kM2yDMBbdSkwtqowgy6nWE4zavisAqjJ57stuNru1+Mo+/yKdDNPMqiCMoY3lrFQOYcil3ZYA4LcjGj11fum9dy6CmAEAJa1xaQ5f3Fn56ky/ZFqpLUVxVXSjZZpRXFXNxDS6Izgx9eoP3S9cmvtgn5PRU+eXdsa//vTZdDfXaOVBFFehk9zmYTyCRivvZPDkzOtXP5p7e+iev7ayhk+BH5e/++T0zlozNUeiI1XoZsvklfgBbNbTPfugnjBq9TqMIVhrkVuD3BCsJWRZjjTLkKQp0iQFMQEANjaTjo+7zTyvxFWlDbHT5QCZYdct8P6HH+ONCy9h+edrIC9g50CWYcjCWIYlhvcekxMTWF1b2969KXWaICcuB7HS7UFlD7kwf3n8wpvv/vboIydRa1mcfvwkmhlj8Zvv8fz00/j9j02srt7E8bExhFGEX26sYGH+8nh3gN6LFHVJtLHsykGEZmL2ZEC2refYgYnA7OC9h3MM53bGDiICsoQ7Wwn3nhZh5Si0Jed1KUCSWd/NOubhKqzUQNtCP4LYDucfAA+w7SvAw2YAgOgQGTDRkO4VmOlfzEDhcDXwvl1zL+0DSUTgvUf7MBGI+E4NdmwPgu5HFAtt7WennoDxgC8QXnzhOdQbTURRhInJx+AdIwgCKKUGNsFTIgKl1HovOXv25du31/9EoaCgtv8SSqnOJSJ4+KEH8e3Xn48d4PuYiAwWuE8cE5H+Nfin8L/Af0DgrwEAWMmrNSQDjVcAAAAASUVORK5CYII=',
listen: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAATLSURBVHjabNTbb1MFAAbw75ye09Nz2q5dt17W7tbuonNuMBzb2Mhgg8GEcQk6zEIwBo2LBucLWaIhM2AkmvhiYiJoNAIPE0RRUCAaQHCwQdmVrcuQrbtQ1nbrveecrrfjAwmJke8P+D18+fIRhw/3wOl0guM4WK2FoGkasZgAgITX6yH6+vq6Ozo6vrdYzB6fz4f1ja3Q6TIQE/zs0VO+a6KsgP2iK2u1UkHBH0mBwjMilyuwvLyEeCI14PP5a7q7u38F4Cl/oRJvHXgXl/+4ApohxKWoqS7E5uOrC/6z77SRe8UVGcj/Y3J4PB46EAz1t7Zuq6mtrYNGo+HVKiWOn/gaNJVG7/VIZ/6LjYqe1/jn6PB93J3Xtf8+EGnjFNITUJKkp9ji4qI6EAzd6+jYV9e2/WVwnAICH5FtbG7BmtVFOPZt36E7gc3HT15V/11XXfZgY8FIj285gJH5jG+cjwSQgiDA51tGMBjE9PSMJZFIDnV2dlY2NzWCokgkk0kY9Nnxli1bMexwoWVt1qWKHJ9o/wfVJ2/q2zet4T5W8zfgiipMjvlUK5mbm3d+1+49A+vqG/qtVpujq+tgcW1NNQDA7fZi1jkdb25aHxF1Oz797GKWo6S4wNFWNr4rEVnEDQdOxekiFKrnTnu9IgIC207t3fvqbovFDEkCvF4vGEaOyckpLPv8CIcjCIWCKU1GqeSPKWseBjVl311PflhvUx7T2e3BgLBT65eKzAWGv0475pz7l4WyanJmxhmcevAQExMOjI6Ooe/WABYWXKAoCrkWMzgugx0cHIo+zw68kq92YWiWOvI4ooNe4b0YiaTgiXL16XRyisUSxCSRR+Xl50kmkwnxlRWwrAIGgwFKJQeSfDIAiyUHt2/3KxemRwMaIguhiJ4SUypwTHp6RQyDj2mzpDQhyLCCNMBR7sXHRDqVhCAIEEUBRqPhKQYAIAhUlBfx2ZbSDK+dgM7Ap7RsDHwsbY2nJSiZRCBGSlxCokASEKne3jNavcGIWCyGJa8XllwzamtqYLNZoVar4Vtyi+XlpaqpcMXPc34SLQ3po2ZNGI+DzE5ltgzZXPjWEmRl4YQKNJGcp0w55ps0Lc9RKBSSXC4vCYXCRG/vDygtLUVJSQn8gZAs4A8SL2VKIzZ9IP/t7dlHf/xpsXkhasusKk7EjfJHrsvuxCcpWTa0dGCQioZDG2acM2AYBiZTTvmqVZVXQ+GIcWR4ELNzc0hJhPy3S3+q69ZdPvTRvqZD4+NTpWf7dRdYrRUbKuVvMCkXHrjVr5uKNNAro+dIgiRB03IwjALJZHJi0jFepVJyszt27IZOlwU+GkWUF5kz585iXVUhrt1x7RqZVysbKhQjb26Rei/emPvAR6whCrMEb1UJc4l80jsBAKAoGViWWxwbHa5yuRYcTU2bUFBohUqlTA0P2XHn3gQOH9z2+XrL8HsHNjMNd+1DtivjpmNGcz6qbGJnnon77zlIkgSCIJCpzQy6Hs1Xj40NT8bjcUSjPBuLxfF+VxdSybS0f6vpS7fzltB9Ymk6pVqL+uLQ+Z2Nhl/4mPTs+0pLEjQajSgKfLWMJI709PREDAY9eF7A5NRD1NQ3gI8GOaP2vl1Hu9iu9rI9apZFPL6CfwcAFv8pW2JrAdUAAAAASUVORK5CYII=',
add: 'data:image/png;base64,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',
info: 'data:image/png;base64,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',
};
TWN.sounds = [
'bum', 'chime', 'coin', 'coin2', 'icq', 'qip', 'tinkle', 'trumpet', 'vk',
];
TWN.notifications = {
list: {
length: 0
},
init: function () {
// Load notifications
this.list.length = TWN.get('notificationCount', 0);
for (var i = 0; i < this.list.length; i++) {
var data = TWN.get('notification_' + i, '');
if (data == '') {
this.remove(i);
i = 0;
continue;
}
data = JSON.parse(data);
this.list[i] = data;
}
// append TW-functions with TWNotifier-functionality
// friend online
TWN.appendFunction([
'west', 'notification', 'ToastOnlineNotification', 'prototype', 'init'
], function (name) {
var sound = '';
for (var i = 0; i < this.list.length; i++) {
if (this.list[i].event == 'friends') {
if (this.list[i].info == '*')
sound = this.list[i].sound;
else if (this.list[i].info.split(';').includes(name)) {
sound = this.list[i].sound;
break;
}
}
}
TWN.notifications.playSound(sound);
}, west.notification.ToastOnlineNotification.prototype._super.prototype, this);
// new report
TWN.appendFunction(['Character', 'setToRead'], function (type, status) {
if (status == false)
return;
// TOWNFORUM
if (type == 'townforum') {
var notifications = {
length: 0
};
var custom = 0; // 0 = no notification, 1 = only all; 2 = custom notification
for (var notification in TWN.notifications.list) {
if (TWN.notifications.list[notification].event == 'townforum') {
notifications[notifications.length] = TWN.notifications.list[notification].info;
notifications.length++;
if (TWN.notifications.list[notification].info == '*' && custom == 0)
custom = 1;
else
custom = 2;
}
} // No notifications for forum
if (custom == 0 || notifications.length == 0)
return;
// no custom notifications
if (custom == 1) {
TWN.notifications.playSound(TWN.notifications.list[TWN.notifications.getIndex('townforum', '*')].sound);
return;
} // custom notifications
$.ajax('forum.php', {
complete: function (data) {
var DOM = $.parseHTML(data.responseText);
var forumList = $('#forum_list', DOM);
forumList.children().each(function (i, el) {
if ($(el).hasClass('background')) {
var index = TWN.notifications.getIndex('townforum', $(el).find('span').text());
if (index != -1) {
TWN.notifications.playSound(TWN.notifications.list[index].sound);
return false;
}
}
});
}
});
return;
}
// MESSAGES
if (type == 'messages') {
var index = TWN.notifications.getIndex('messages');
if (index != -1)
TWN.notifications.playSound(TWN.notifications.list[index].sound);
return;
}
// REPORTS
if (type == 'reports') {
// If no report types are specified, just play the sound for 'all reports', if specified (no requests)
var allSound = 'data:audio/ogg;base64,;';
for (var noti in TWN.notifications.list) {
if (TWN.notifications.list[noti].event == 'reports') {
if (TWN.notifications.list[noti].info != 'all') {
allSound = '';
break;
} else
allSound = TWN.notifications.list[noti].sound;
}
}
if (allSound != '') {
TWN.notifications.playSound(allSound);
return;
}
// Send requests to check if there are new reports for the specified report types
Ajax.remoteCall('reports', 'get_reports', {
page: 0,
folder: 'all'
}, function (json) {
if (json.error != false || !json.reports[0])
return;
var report_id = json.reports[0].report_id; // latest report
// create counter
var sounds = {},
counter = (TWN.notifications.getIndex('reports', 'all') == -1 ? -6 : 0);
for (type in TWN.lang.reportTypes) {
var index = TWN.notifications.getIndex('reports', type);
if (index != -1) {
sounds[type] = TWN.notifications.list[index].sound;
counter++;
} else
sounds[type] = '';
}
var gen = function (type, report) {
return function (json) {
if (json.error != false || !json.reports[0] || sounds[type] == '')
return;
if (json.reports[0].report_id == report) {
counter = 0;
TWN.notifications.playSound(sounds[type]);
} else {
counter--;
if (counter == 0)
TWN.notifications.playSound(sounds.all);
}
};
};
for (type in sounds)
Ajax.remoteCall('reports', 'get_reports', {
page: 0,
folder: type
}, gen(type, report_id));
});
return;
}
}, Character, this);
// way finished
TWN.appendFunction(['OnGoingWayFinishedEntry'], function () {
for (var i = 0; i < this.list.length; i++) {
if (this.list[i].event == 'wayFinished') {
this.playSound(this.list[i].sound);
break;
}
}
}, OnGoingEntry, TWN.notifications);
OnGoingWayFinishedEntry.prototype = new OnGoingEntry;
// empty job queue
EventHandler.listen('taskqueue-updated', function () {
if (TaskQueueUi.isEmpty) {
var index = TWN.notifications.getIndex('noQueue');
if (index != -1)
TWN.notifications.playSound(TWN.notifications.list[index].sound);
}
});
// new item in inventory
TWN.appendFunction(['WestUi',
'showInventoryChanged'], function (type, item_id, count) {
if (type == 'add') {
var index = TWN.notifications.getIndex('newItem');
if (index != -1)
TWN.notifications.playSound(TWN.notifications.list[index].sound);
}
}, WestUi);
// nickname in chat
TWN.addListeners = function () {
var roomChanged = function (room, type, data) {
var index = TWN.notifications.getIndex('nickInChat');
if (index != -1 && type == 'NewMessage') {
var div = $(data[0]);
var cText = div.find('.chat_text').html().toLowerCase();
var nli = TWN.notifications.list[index];
var nList = [Character.name];
if (nli.info != '*')
nList.push(...nli.info.split(';'));
for (var n of nList)
if (cText.includes(n.toLowerCase())) {
TWN.notifications.playSound(nli.sound);
break;
}
}
};
var rooms = Chat.Resource.Manager.getRooms();
for (var r in rooms) {
var room = Chat.Resource.Manager.getRoom(r);
if (TWN.roomsListening.indexOf(room.id) == -1) {
TWN.roomsListening.push(room.id);
room.addListener(roomChanged);
}
}
};
if (EventHandler.hasOwnProperty('add')) {
EventHandler.add('chat_room_added', function (room) {
TWN.addListeners();
});
} else {
EventHandler.listen('chat_room_added', function (room) {
TWN.addListeners();
});
}
},
// Add notification
add: function (event, info, sound) {
TWN.set('notification_' + this.list.length, JSON.stringify({
event: event,
info: info,
sound: sound
}));
this.list[this.list.length++] = {
event: event,
info: info,
sound: sound
};
TWN.set('notificationCount', this.list.length);
},
// Remove specified notification
remove: function (id) {
for (var i = id; i < this.list.length; i++) {
TWN.set('notification_' + i, TWN.get('notification_' + (i + 1), ''));
this.list[i] = this.list[i + 1];
}
TWN.remove('notification_' + (--this.list.length));
this.list[this.list.length] = {};
TWN.set('notificationCount', this.list.length);
},
getIndex: function (event, info) {
for (var i = 0; i < this.list.length; i++)
if (this.list[i].event == event && (this.list[i].info == info || info == undefined))
return i;
return -1;
},
// Play the specified sound
playSound: function (src) {
if (src && $('#ui-loader').css('display') == 'none') {
var audio = TWN.sounds.includes(src) ? 'https://tomrobert.safe-ws.de/' + src + '.mp3' : src;
new Audio(audio).play();
}
}
};
TWN.settings = {
gui: {
window: {},
comboboxes: {}
},
table: null,
townforumTopics: {
length: 0
},
init: function () {
var rightBar = $('.ui_menucontainer');
var optionEl = $('<div id="TWNotifierSettingsBtn" onclick="TWN.settings.open ();" title="' + TWN.name + '"></div>');
if (rightBar && rightBar[1]) {
rightBar = $(rightBar[1]);
rightBar.css('max-height', (rightBar.children('div').length * 30 - 2) + 'px');
rightBar.append(optionEl);
}
TWN.addStyle('#TWNotifierSettingsBtn { width:32px; height:41px; margin:-8px -16px 0 -7px; cursor:pointer; background:url(' + TWN.images.right_menu + '); }' +
'#TWNotifierSettingsBtn:hover { background:url(' + TWN.images.right_menu_hover + '); }' +
'.TWNotifier-event-col { min-width:175px; font-weight:bold; }' +
'.TWNotifier-sound-col, .TWNotifier-remove-col { float:right; }' +
'.TWNotifier-sound-col { margin-right:-2px; }' +
'.TWNotifier-sound-col img, .TWNotifier-remove-col img { margin-top:-3px; cursor:pointer; }' +
'.tbody .TWNotifier-event-col, .tbody .TWNotifier-info-col { margin-left:4px; }' +
'.TWNotifierButton { background:rgba(29,28,28,0.5); border:1px solid #646464; border-radius:2px; box-shadow:0 0 1px 1px #000; display:inline-block; margin-left:8px; padding:1px 2px; }' +
'.TWNotifierSettings #TWNotifierSettings { padding:4px 0 0 4px; border-top:1px solid rgba(0,0,0,0.77); margin:2px -2px; }' +
'.TWNotifierSettings #reportWarning { margin:5px 5px 0 0; padding:5px 5px; display:none; border:1px solid #C33; }' +
'.TWNotifierSettings .tfoot { padding:0 !important; height:6px; }' +
'.TWNotifierSettings #settingInfo { margin:5px 5px 0 0; padding:5px 5px; text-align:center; border:1px solid #000; background:rgba(0,0,0,0.32); }' +
'.TWNotifierSettings #settingInfo img { margin:0 16px; vertical-align:middle; }' +
'.TWNotifierSettings #selectedForum { font-style:italic; }');
},
open: function () {
this.gui.window = wman.open('TWNotifierSettings', TWN.name, 'noreload').setMiniTitle(TWN.name);
TWN.settings.gui.window.showLoader();
// Create table
this.table = new west.gui.Table(false);
this.table.addColumn('TWNotifier-event-col').addColumn('TWNotifier-info-col').addColumn('TWNotifier-remove-col').addColumn('TWNotifier-sound-col');
this.table.appendToCell('head', 'TWNotifier-event-col', TWN.lang.event).appendToCell('head', 'TWNotifier-info-col', TWN.lang.info).appendToCell('head', 'TWNotifier-remove-col', ' ').appendToCell('head', 'TWNotifier-sound-col', ' ');
this.table.setScrollbar();
// Fill table
TWN.settings.refreshTable();
TWN.settings.gui.window.appendToContentPane(this.table.getMainDiv());
// Create settings
var settings = $('<div id="TWNotifierSettings"></div>');
var dropdown = new west.gui.Combobox('TWNotifierNotificationType').setWidth(130).addListener(function () {
TWN.settings.changeSettings(dropdown.getValue());
});
for (var type in TWN.lang.types)
dropdown.addItem(type, TWN.lang.types[type]);
// TODO: Correct width (depending on other elements)
var soundName = new west.gui.Textfield('TWNotifierSoundName').setWidth(165).setPlaceholder('https:// .mp3');
var soundBox = new west.gui.Combobox('TWNotifierSoundBox').setWidth(130);
for (var sound of TWN.sounds)
soundBox.addItem(sound, TWN.lang.sounds[sound]);
soundBox.addItem('custom', TWN.lang.sounds.custom).addListener(function () {
if (soundBox.getValue() == 'custom')
soundName.getMainDiv().css('display', 'inline-block');
else
soundName.getMainDiv().css('display', 'none');
});
var testSound = $('<div class="TWNotifierButton" title="' + TWN.lang.listen + '"><img src="' + TWN.images.listen + '" style="cursor:pointer;"></div>').click(function () {
if (soundBox.getValue() != 'custom')
TWN.notifications.playSound(soundBox.getValue());
else
TWN.notifications.playSound(soundName.getValue());
});
var addButton = $('<div class="TWNotifierButton" title="' + TWN.lang.add + '"><img src="' + TWN.images.add + '" style="cursor:pointer;"></div>').click(function () {
var event = dropdown.getValue();
var info = TWN.settings.getInfo(event);
var sound = soundBox.getValue();
if (sound == 'custom')
sound = soundName.getValue();
TWN.notifications.add(event, info, sound);
TWN.settings.refreshTable();
});
TWN.settings.gui.window.appendToContentPane($('<span>' + TWN.lang.event + ': </span>')).appendToContentPane(dropdown.getMainDiv()).appendToContentPane($('<span style="margin-left:8px;">' + TWN.lang.sound + ': </span>'));
TWN.settings.gui.window.appendToContentPane(soundBox.getMainDiv()).appendToContentPane(soundName.getMainDiv().css({
'display': 'none',
'margin-top': '1px'
})).appendToContentPane(testSound).appendToContentPane(addButton).appendToContentPane(settings);
TWN.settings.changeSettings();
TWN.settings.gui.window.hideLoader();
},
removeConfirmation: function (id) {
var dialog = new west.gui.Dialog(TWN.lang.confirmationTitle, TWN.lang.confirmation);
dialog.addButton('yes', function () {
TWN.notifications.remove(id);
$('.TWNotifierSettings .row_' + id).remove();
TWN.settings.refreshTable();
}).addButton('no', function () {
dialog.hide();
}).show();
},
refreshTable: function () {
this.table.clearBody();
for (var i = 0; i < TWN.notifications.list.length; i++) {
var inl = TWN.notifications.list[i];
var sound = inl.sound;
this.table.appendRow(null, '');
this.table.appendToCell(-1, 'TWNotifier-event-col', TWN.lang.desc[inl.event] || inl.event);
this.table.appendToCell(-1, 'TWNotifier-info-col', TWN.settings.getDescription(inl));
this.table.appendToCell(-1, 'TWNotifier-remove-col', $('<img src="' + TWN.images.remove + '" onclick="TWN.settings.removeConfirmation (' + i + ');" title="' + TWN.lang.remove + '">'));
this.table.appendToCell(-1, 'TWNotifier-sound-col', $('<img src="' + TWN.images.sound + '" onclick="TWN.notifications.playSound(\'' + sound + '\');" title="' + TWN.lang.listen + '">'));
}
},
changeSettings: function (val) {
var settings = $('#TWNotifierSettings').html('');
switch (val) {
case ('friends'):
settings.append($('<label for="friendsName" style="cursor:pointer;">' + TWN.lang.types.friends + ':</label>'), new west.gui.Textfield('friendsName').getMainDiv(), this.infoBox(val));
break;
case ('wayFinished'):
settings.append(this.infoBox(val));
break;
case ('noQueue'):
settings.append(this.infoBox(val));
break;
case ('townforum'):
var dropdown = new west.gui.Combobox('TWNotifierTownforumTopic');
$.ajax('forum.php', {
complete: function (data) {
var DOM = $.parseHTML(data.responseText);
$('#forum_list', DOM).children('div').each(function (i, el) {
if ($(el).find('span').text() == '')
return;
TWN.settings.townforumTopics[TWN.settings.townforumTopics.length] = $(el).find('span').text();
TWN.settings.townforumTopics.length++;
});
dropdown.addListener(function () {
$('#selectedForum').html((dropdown.getValue() != '*' ? ' ' + dropdown.getValue() : ''));
});
dropdown.addItem('*', TWN.lang.reportTypes.all);
for (var i = 0; i < TWN.settings.townforumTopics.length; i++)
dropdown.addItem(TWN.settings.townforumTopics[i], TWN.settings.townforumTopics[i]);
TWN.settings.gui.comboboxes.townforumTopics = dropdown;
settings.append($('<span>' + TWN.lang.types.townforum + ': </span>'), dropdown.getMainDiv(), TWN.settings.infoBox(val));
}
});
break;
case ('reports'):
var dropdown = new west.gui.Combobox('TWNotifierReportType');
var types = [
'all',
'work',
'duels',
'achvmnt',
'fort',
'other'
];
for (var i = 0; i < types.length; i++)
dropdown.addItem(types[i], TWN.lang.reportTypes[types[i]]);
dropdown.addListener(function (selected) {
if (selected != 'all')
$('#reportWarning').css('display', 'block');
else
$('#reportWarning').css('display', 'none');
});
settings.append($('<span>' + TWN.lang.types.reports + ': </span>'), dropdown.getMainDiv(), $('<div id="reportWarning">' + TWN.lang.reportInfo + '</div>'));
TWN.settings.gui.comboboxes.reportTypes = dropdown;
break;
case ('newItem'):
settings.append(this.infoBox(val));
break;
case ('nickInChat'):
settings.append($('<label for="TWNnicks" style="cursor:pointer;">' + TWN.lang.types.nickInChat + ':</label>'), new west.gui.Textfield('TWNnicks').getMainDiv(), this.infoBox(val));
break;
//case ('messages'):
default:
settings.append(this.infoBox('messages'));
break;
}
},
infoBox: function (text) {
return $('<div id="settingInfo"><img src="' + TWN.images.info + '"> ' + TWN.lang[text + 'Info'] + ' <img src="' + TWN.images.info + '"></div>');
},
getInfo: function (i) {
switch (i) {
case ('reports'):
return TWN.settings.gui.comboboxes.reportTypes.getValue() || 'all';
case ('townforum'):
return TWN.settings.gui.comboboxes.townforumTopics.getValue() || '*';
case ('friends'):
var fTF = $('#friendsName').val();
return fTF ? fTF.replace(/;\s+/g, ';').replace(/;$/g, '') : '*';
case ('nickInChat'):
var nTF = $('#TWNnicks').val();
return nTF ? nTF.replace(/;\s+/g, ';').replace(/;$/g, '') : '*';
default:
return '';
}
},
getDescription: function (e) {
var info = e.info;
switch (e.event) {
case ('reports'):
return TWN.lang.reportTypes[info] || info;
case ('townforum'):
if (info == '*')
return TWN.lang.reportTypes.all;
return info;
case ('friends'):
if (info == '*')
return TWN.lang.reportTypes.all;
var res = '';
info = info.split(';');
for (var i = 0; i < info.length; i++) {
if (i != 0 && info[i] != '')
res += ', ';
res += '<a href="javascript:PlayerProfileWindow.open (encodeURIComponent (\'' + info[i].replace(/'/g, '\\\'') + '\') );">' + info[i] + '</a>';
}
return res;
case ('nickInChat'):
var res = Character.name;
if (info == '*')
return res;
info = info.split(';');
for (var nick of info)
res += ', ' + nick;
return res;
default:
return TWN.lang[e.event + 'Info'];
}
},
};
TWN.init();
});