TW Chat Alert

Notification with sound and highlighted background when a keyword appears in the chat (with GUI for management)

  1. // ==UserScript==
  2. // @name TW Chat Alert
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.25.3.20.2338
  5. // @description Notification with sound and highlighted background when a keyword appears in the chat (with GUI for management)
  6. // @author qtMety (in game Annienta Montagne)
  7. // @include https://*.the-west.*/game.php*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. 'use strict';
  13.  
  14. let settings = JSON.parse(localStorage.getItem("TWCAchatKeywordAlertSettings")) || {
  15. keywords: [
  16. "word", "two words", "three words?", "another keyword", "ward",
  17. "wod", "wor",
  18. ],
  19. checkInterval: 15000,
  20. enableSound: true,
  21. highlightBgColor: "#000000", // Default: sfondo nero
  22. highlightTextColor: "#FFFFFF" // Default: testo bianco
  23. };
  24.  
  25. let languageStorage = localStorage.getItem("TWCALanguage") || "en";
  26.  
  27. let chatCheckInterval;
  28.  
  29. let seenMessages = new Set();
  30. const alertSound = new Audio("https://www.myinstants.com/media/sounds/tindeck_1.mp3");
  31.  
  32. const translations = {
  33. br: {
  34. saveSettings: "Salvar Configurações",
  35. resetDefaults: "Restaurar Padrões",
  36. keywordsTitle: "Palavras-chave ativas:",
  37. enableSound: "Ativar Som",
  38. checkInterval: "Intervalo de Verificação",
  39. volume: "Volume",
  40. highlightBgColor: "Cor de Fundo Destacada:",
  41. highlightTextColor: "Cor do Texto Destacado:",
  42. selectLanguage: "Selecionar Idioma",
  43. settingsSavedSuccess: "Configurações salvas com sucesso!",
  44. settingsDefaultSuccess: "Configurações restauradas",
  45. language: "Português (Brasil)",
  46. informationText: "Informações",
  47. informationsContentText: "Este script tem como objetivo destacar palavras-chave no chat do jogo e receber um som de alerta! <br> Você pode usá-lo, por exemplo, para seu apelido no jogo ou para compra e venda de itens!",
  48. languageText: "Idioma",
  49. contactText: "Contato",
  50. contactInfosText: "Você pode me enviar uma mensagem privada (escrevendo para Annienta Montagne) no mundo 1 do the-west: it1.the-west.it",
  51. donationText: "Ajude-me a continuar o desenvolvimento com uma pequena doação!",
  52. versionText: "Versão"
  53. },
  54. cs: {
  55. saveSettings: "Uložit nastavení",
  56. resetDefaults: "Obnovit výchozí",
  57. keywordsTitle: "Aktivní klíčová slova:",
  58. enableSound: "Povolit zvuk",
  59. checkInterval: "Interval kontroly",
  60. volume: "Hlasitost",
  61. highlightBgColor: "Zvýrazněná barva pozadí:",
  62. highlightTextColor: "Zvýrazněná barva textu:",
  63. selectLanguage: "Vybrat jazyk",
  64. settingsSavedSuccess: "Nastavení bylo úspěšně uloženo!",
  65. settingsDefaultSuccess: "Nastavení bylo obnoveno",
  66. language:"Čeština",
  67. informationText: "Informace",
  68. informationsContentText: "Tento skript má za cíl zvýraznit klíčová slova v herním chatu a upozornit vás zvukem! <br> Můžete jej využít například pro svou herní přezdívku nebo pro obchodování s předměty!",
  69. languageText: "Jazyk",
  70. contactText: "Kontakt",
  71. contactInfosText: "Můžete mi poslat soukromou zprávu (napsat Annienta Montagne) na světě 1 v the-west: it1.the-west.it",
  72. donationText: "Podpořte další vývoj malým příspěvkem!",
  73. versionText: "Verze"
  74. },
  75. de: {
  76. saveSettings: "Einstellungen speichern",
  77. resetDefaults: "Auf Standard zurücksetzen",
  78. keywordsTitle: "Aktive Schlüsselwörter:",
  79. enableSound: "Ton aktivieren",
  80. checkInterval: "Prüfintervall",
  81. volume: "Lautstärke",
  82. highlightBgColor: "Hervorgehobene Hintergrundfarbe:",
  83. highlightTextColor: "Hervorgehobene Textfarbe:",
  84. selectLanguage: "Sprache auswählen",
  85. settingsSavedSuccess: "Einstellungen erfolgreich gespeichert!",
  86. settingsDefaultSuccess: "Einstellungen zurückgesetzt",
  87. language:"Deutsch",
  88. informationText: "Informationen",
  89. informationsContentText: "Dieses Skript hebt Schlüsselwörter im Spielchat hervor und benachrichtigt dich per Ton! <br> Nutze es beispielsweise für deinen Spielnamen oder für den Kauf und Verkauf von Gegenständen!",
  90. languageText: "Sprache",
  91. contactText: "Kontakt",
  92. contactInfosText: "Du kannst mir eine private Nachricht senden (schreibe an Annienta Montagne) auf Welt 1 von the-west: it1.the-west.it",
  93. donationText: "Hilf mir, die Entwicklung mit einer kleinen Spende fortzusetzen!",
  94. versionText: "Version"
  95. },
  96. el: {
  97. saveSettings: "Αποθήκευση ρυθμίσεων",
  98. resetDefaults: "Επαναφορά προεπιλογών",
  99. keywordsTitle: "Ενεργές λέξεις-κλειδιά:",
  100. enableSound: "Ενεργοποίηση ήχου",
  101. checkInterval: "Διάστημα ελέγχου",
  102. volume: "Ένταση",
  103. highlightBgColor: "Χρώμα επισημασμένου φόντου:",
  104. highlightTextColor: "Χρώμα επισημασμένου κειμένου:",
  105. selectLanguage: "Επιλογή γλώσσας",
  106. settingsSavedSuccess: "Οι ρυθμίσεις αποθηκεύτηκαν με επιτυχία!",
  107. settingsDefaultSuccess: "Οι ρυθμίσεις επαναφέρθηκαν",
  108. language:"Ελληνικά",
  109. informationText: "Πληροφορίες",
  110. informationsContentText: "Αυτό το σενάριο έχει σκοπό να επισημάνει λέξεις-κλειδιά στη συνομιλία του παιχνιδιού και να σε ειδοποιήσει με ήχο! <br> Μπορείς να το χρησιμοποιήσεις, π.χ. για το όνομα του χαρακτήρα σου ή για αγορές και πωλήσεις αντικειμένων!",
  111. languageText: "Γλώσσα",
  112. contactText: "Επικοινωνία",
  113. contactInfosText: "Μπορείς να μου στείλεις προσωπικό μήνυμα (γράψε στον Annienta Montagne) στον κόσμο 1 του the-west: it1.the-west.it",
  114. donationText: "Βοήθησέ με να συνεχίσω την ανάπτυξη με μια μικρή δωρεά!",
  115. versionText: "Έκδοση"
  116. },
  117. en: {
  118. saveSettings: "Save Settings",
  119. resetDefaults: "Reset Defaults",
  120. keywordsTitle: "Active Keywords:",
  121. enableSound: "Enable Sound",
  122. checkInterval: "Check Interval",
  123. volume: "Volume",
  124. highlightBgColor: "Highlighted Background Color:",
  125. highlightTextColor: "Highlighted Text Color:",
  126. selectLanguage: "Select Language",
  127. settingsSavedSuccess: "Settings saved successfully!",
  128. settingsDefaultSuccess: "Settings restored",
  129. language:"English",
  130. informationText: "Information",
  131. informationsContentText: "This script aims to highlight keywords in the game chat and notify you with a sound! <br> You can use it, for example, for your in-game nickname or for buying and selling items!",
  132. languageText: "Language",
  133. contactText: "Contact",
  134. contactInfosText: "You can send me a private message (write to Annienta Montagne) on world 1 of the-west: it1.the-west.it",
  135. donationText: "Help me continue development with a small donation!",
  136. versionText: "Version"
  137. },
  138. es: {
  139. saveSettings: "Guardar Configuración",
  140. resetDefaults: "Restablecer Predeterminados",
  141. keywordsTitle: "Palabras clave activas:",
  142. enableSound: "Habilitar Sonido",
  143. checkInterval: "Intervalo de Comprobación",
  144. volume: "Volumen",
  145. highlightBgColor: "Color de fondo resaltado:",
  146. highlightTextColor: "Color del texto resaltado:",
  147. selectLanguage: "Seleccionar Idioma",
  148. settingsSavedSuccess: "¡Configuración guardada con éxito!",
  149. settingsDefaultSuccess: "Configuración restablecida",
  150. language:"Español",
  151. informationText: "Información",
  152. informationsContentText: "Este script destaca palabras clave en el chat del juego y te avisa con un sonido! <br> Puedes usarlo, por ejemplo, para tu apodo en el juego o para comprar y vender objetos!",
  153. languageText: "Idioma",
  154. contactText: "Contacto",
  155. contactInfosText: "Puedes enviarme un mensaje privado (escribe a Annienta Montagne) en el mundo 1 de the-west: it1.the-west.it",
  156. donationText: "¡Ayúdame a seguir desarrollando con una pequeña donación!",
  157. versionText: "Versión"
  158. },
  159. fr: {
  160. saveSettings: "Enregistrer les paramètres",
  161. resetDefaults: "Réinitialiser les paramètres",
  162. keywordsTitle: "Mots-clés actifs :",
  163. enableSound: "Activer le son",
  164. checkInterval: "Intervalle de vérification",
  165. volume: "Volume",
  166. highlightBgColor: "Couleur de fond mise en évidence :",
  167. highlightTextColor: "Couleur du texte mise en évidence :",
  168. selectLanguage: "Sélectionner la langue",
  169. settingsSavedSuccess: "Paramètres enregistrés avec succès!",
  170. settingsDefaultSuccess: "Paramètres réinitialisés",
  171. language:"Français",
  172. informationText: "Informations",
  173. informationsContentText: "Ce script met en évidence des mots-clés dans le chat du jeu et t'avertit par un son ! <br> Tu peux l'utiliser, par exemple, pour ton pseudo en jeu ou pour l'achat et la vente d'objets !",
  174. languageText: "Langue",
  175. contactText: "Contact",
  176. contactInfosText: "Tu peux m'envoyer un message privé (écrire à Annienta Montagne) sur le monde 1 de the-west : it1.the-west.it",
  177. donationText: "Aide-moi à poursuivre le développement avec une petite donation !",
  178. versionText: "Version"
  179. },
  180. hu: {
  181. saveSettings: "Beállítások mentése",
  182. resetDefaults: "Alapértelmezés visszaállítása",
  183. keywordsTitle: "Aktív kulcsszavak:",
  184. enableSound: "Hang bekapcsolása",
  185. checkInterval: "Ellenőrzési időköz",
  186. volume: "Hangerő",
  187. highlightBgColor: "Kiemelt háttérszín:",
  188. highlightTextColor: "Kiemelt szövegszín:",
  189. selectLanguage: "Nyelv kiválasztása",
  190. settingsSavedSuccess: "Beállítások sikeresen mentve!",
  191. settingsDefaultSuccess: "Beállítások visszaállítva",
  192. language:"Magyar",
  193. informationText: "Információk",
  194. informationsContentText: "Ez a szkript kulcsszavakat emel ki a játék chatjében, és hanggal értesít téged! <br> Használhatod például a játékbeli nevedhez vagy tárgyak adás-vételéhez!",
  195. languageText: "Nyelv",
  196. contactText: "Kapcsolat",
  197. contactInfosText: "Küldhetsz nekem privát üzenetet (írj Annienta Montagne-nek) a the-west 1-es világán: it1.the-west.it",
  198. donationText: "Támogass egy kis adománnyal a további fejlesztésekhez!",
  199. versionText: "Verzió"
  200. },
  201. it: {
  202. saveSettings: "Salva Impostazioni",
  203. resetDefaults: "Ripristina Predefiniti",
  204. keywordsTitle: "Parole chiave attive:",
  205. enableSound: "Abilita Suono",
  206. checkInterval: "Intervallo di Controllo",
  207. volume: "Volume",
  208. highlightBgColor: "Colore sfondo evidenziato:",
  209. highlightTextColor: "Colore testo evidenziato:",
  210. selectLanguage: "Seleziona Lingua",
  211. settingsSavedSuccess: "Impostazioni salvate con successo!",
  212. settingsDefaultSuccess: "Impostazioni ripristinate",
  213. language:"Italiano",
  214. informationText: "Informazioni",
  215. informationsContentText: "Questo script ha lo scopo di evidenziare delle parole chiave all'interno della chat di gioco e ricevere un suono per essere avvisato! <br> Puoi usarlo, ad esempio, per il tuo nickname in gioco, oppure per la compravendita di oggetti!",
  216. languageText: "Linguaggio",
  217. contactText: "Contatti",
  218. contactInfosText: "Puoi mandarmi un messaggio privato (scrivendo ad Annienta Montagne) su world 1 di the-west: it1.the-west.it",
  219. donationText: "Aiutami a continuare con lo sviluppo con una piccola donazione!",
  220. versionText: "Versione"
  221. },
  222. nl: {
  223. saveSettings: "Instellingen opslaan",
  224. resetDefaults: "Standaardwaarden herstellen",
  225. keywordsTitle: "Actieve zoekwoorden:",
  226. enableSound: "Geluid inschakelen",
  227. checkInterval: "Controle-interval",
  228. volume: "Volume",
  229. highlightBgColor: "Gemarkeerde achtergrondkleur:",
  230. highlightTextColor: "Gemarkeerde tekstkleur:",
  231. selectLanguage: "Selecteer Taal",
  232. settingsSavedSuccess: "Instellingen succesvol opgeslagen!",
  233. settingsDefaultSuccess: "Instellingen hersteld",
  234. language:"Dutch",
  235. informationText: "Informatie",
  236. informationsContentText: "Dit script markeert trefwoorden in de gamechat en waarschuwt je met een geluid! <br> Je kunt het bijvoorbeeld gebruiken voor je in-game bijnaam of voor de handel in items!",
  237. languageText: "Taal",
  238. contactText: "Contact",
  239. contactInfosText: "Je kunt me een privébericht sturen (schrijf naar Annienta Montagne) op wereld 1 van the-west: it1.the-west.it",
  240. donationText: "Help me de ontwikkeling voort te zetten met een kleine donatie!",
  241. versionText: "Versie"
  242. },
  243. pl: {
  244. saveSettings: "Zapisz ustawienia",
  245. resetDefaults: "Przywróć domyślne",
  246. keywordsTitle: "Aktywne słowa kluczowe:",
  247. enableSound: "Włącz dźwięk",
  248. checkInterval: "Interwał sprawdzania",
  249. volume: "Głośność",
  250. highlightBgColor: "Podświetlony kolor tła:",
  251. highlightTextColor: "Podświetlony kolor tekstu:",
  252. selectLanguage: "Wybierz język",
  253. settingsSavedSuccess: "Ustawienia zapisane pomyślnie!",
  254. settingsDefaultSuccess: "Ustawienia przywrócone",
  255. language:"Polski",
  256. informationText: "Informacje",
  257. informationsContentText: "Ten skrypt podkreśla słowa kluczowe na czacie gry i powiadamia cię dźwiękiem! <br> Możesz go użyć np. dla swojego pseudonimu w grze lub do handlu przedmiotami!",
  258. languageText: "Język",
  259. contactText: "Kontakt",
  260. contactInfosText: "Możesz wysłać mi prywatną wiadomość (napisz do Annienta Montagne) na świecie 1 the-west: it1.the-west.it",
  261. donationText: "Pomóż mi kontynuować rozwój dzięki drobnej darowiźnie!",
  262. versionText: "Wersja"
  263. },
  264. pt: {
  265. saveSettings: "Salvar Configurações",
  266. resetDefaults: "Restaurar Padrões",
  267. keywordsTitle: "Palavras-chave ativas:",
  268. enableSound: "Ativar Som",
  269. checkInterval: "Intervalo de Verificação",
  270. volume: "Volume",
  271. highlightBgColor: "Cor de Fundo Destacada:",
  272. highlightTextColor: "Cor do Texto Destacado:",
  273. selectLanguage: "Selecionar Idioma",
  274. settingsSavedSuccess: "Configurações salvas com sucesso!",
  275. settingsDefaultSuccess: "Configurações restauradas",
  276. language:"Português",
  277. informationText: "Informações",
  278. informationsContentText: "Este script tem como objetivo destacar palavras-chave no chat do jogo e alertá-lo com um som! <br> Você pode usá-lo, por exemplo, para o seu apelido no jogo ou para compra e venda de itens!",
  279. languageText: "Idioma",
  280. contactText: "Contato",
  281. contactInfosText: "Você pode me enviar uma mensagem privada (escrevendo para Annienta Montagne) no mundo 1 do the-west: it1.the-west.it",
  282. donationText: "Ajude-me a continuar o desenvolvimento com uma pequena doação!",
  283. versionText: "Versão"
  284. },
  285. ro: {
  286. saveSettings: "Salvare setări",
  287. resetDefaults: "Resetare implicită",
  288. keywordsTitle: "Cuvinte cheie active:",
  289. enableSound: "Activare sunet",
  290. checkInterval: "Interval de verificare",
  291. volume: "Volum",
  292. highlightBgColor: "Culoare de fundal evidențiată:",
  293. highlightTextColor: "Culoare text evidențiat:",
  294. selectLanguage: "Selectare limbă",
  295. settingsSavedSuccess: "Setări salvate cu succes!",
  296. settingsDefaultSuccess: "Setările au fost restaurate",
  297. language:"Română",
  298. informationText: "Informații",
  299. informationsContentText: "Acest script evidențiază cuvintele cheie din chatul jocului și te notifică printr-un sunet! <br> Îl poți folosi, de exemplu, pentru porecla ta din joc sau pentru cumpărarea și vânzarea de obiecte!",
  300. languageText: "Limbă",
  301. contactText: "Contact",
  302. contactInfosText: "Îmi poți trimite un mesaj privat (scrie la Annienta Montagne) pe world 1 din the-west: it1.the-west.it",
  303. donationText: "Ajută-mă să continui dezvoltarea cu o mică donație!",
  304. versionText: "Versiune"
  305. },
  306. sk: {
  307. saveSettings: "Uložiť nastavenia",
  308. resetDefaults: "Obnoviť predvolené",
  309. keywordsTitle: "Aktívne kľúčové slová:",
  310. enableSound: "Povoliť zvuk",
  311. checkInterval: "Interval kontroly",
  312. volume: "Hlasitosť",
  313. highlightBgColor: "Zvýraznená farba pozadia:",
  314. highlightTextColor: "Zvýraznená farba textu:",
  315. selectLanguage: "Vybrať jazyk",
  316. settingsSavedSuccess: "Nastavenia boli úspešne uložené!",
  317. settingsDefaultSuccess: "Nastavenia boli obnovené",
  318. language:"Slovenčina",
  319. informationText: "Informácie",
  320. informationsContentText: "Tento skript zvýrazňuje kľúčové slová v hernom chate a upozorňuje ťa zvukom! <br> Môžeš ho použiť napríklad pre svoju prezývku v hre alebo na nákup a predaj predmetov!",
  321. languageText: "Jazyk",
  322. contactText: "Kontakt",
  323. contactInfosText: "Môžeš mi poslať súkromnú správu (napíš Annienta Montagne) na svete 1 v the-west: it1.the-west.it",
  324. donationText: "Pomôž mi pokračovať vo vývoji malým príspevkom!",
  325. versionText: "Verzia"
  326. },
  327. tr: {
  328. saveSettings: "Ayarları Kaydet",
  329. resetDefaults: "Varsayılanları Sıfırla",
  330. keywordsTitle: "Aktif Anahtar Kelimeler:",
  331. enableSound: "Sesi Etkinleştir",
  332. checkInterval: "Kontrol Aralığı",
  333. volume: "Ses",
  334. highlightBgColor: "Vurgulanan Arka Plan Rengi:",
  335. highlightTextColor: "Vurgulanan Metin Rengi:",
  336. selectLanguage: "Dil Seçin",
  337. settingsSavedSuccess: "Ayarlar başarıyla kaydedildi!",
  338. settingsDefaultSuccess: "Ayarlar geri yüklendi",
  339. language:"Türkçe",
  340. informationText: "Bilgi",
  341. informationsContentText: "Bu komut dosyası, oyun sohbetinde anahtar kelimeleri vurgular ve sizi bir ses ile uyarır! <br> Örneğin, oyun içi takma adınız veya eşya alım satımı için kullanabilirsiniz!",
  342. languageText: "Dil",
  343. contactText: "İletişim",
  344. contactInfosText: "Bana özel mesaj gönderebilirsiniz (Annienta Montagne yazın) world 1 of the-west: it1.the-west.it",
  345. donationText: "Geliştirmeye devam etmem için küçük bir bağış yap!",
  346. versionText: "Sürüm"
  347. }
  348. };
  349.  
  350.  
  351.  
  352. const TWCA = {
  353. name: "The-West Chat Alert",
  354. versionShort: "2.0",
  355. versionLong: "1.25.3.20.2338",
  356. author: "qtMety (aka Annienta Montagne, the-west.it w1)",
  357. website: "",
  358. language: languageStorage
  359. }
  360.  
  361. var TWCA_api = TheWestApi.register('TWCA', TWCA.name, TWCA.versionShort, Game.version.toString(), TWCA.author);
  362. var TWCAT = translations[TWCA.language]
  363. var TWCA_versionInfo = '<b>'+TWCAT.versionText+': </b><i>'+TWCA.name+' '+TWCA.versionLong+'</i><br>'
  364. var TWCA_registerTitle = '<b><h1>'+TWCAT.informationText+'</h1></b>'+TWCA_versionInfo+'<b>'+TWCAT.languageText+': </b><i>'+TWCAT.language+'</i><br>';
  365. var TWCA_registerInformation = TWCAT.informationsContentText+'<br>'
  366. var TWCA_registerContact = '<br><h1><b>'+TWCAT.contactText+'</b></h1>'+TWCAT.contactInfosText+'<br>'
  367. var TWCA_donationText = '<b>'+TWCAT.donationText+'</b>'
  368. var TWCA_donationImg = '<h3>'+TWCA_donationText+'</h3><div style="text-align: left;"><a href="https://ko-fi.com/qtmety" target="_blank"><img src="http://inurse.app/imgs/buyMeACoffee.webp" alt="Kofi Donation" width="100"></a><a href="https://ko-fi.com/qtmety" target="_blank"><img src="http://inurse.app/imgs/paypalDonations.webp" alt="Kofi Donations" width="100"></a></div>'
  369. var TWCA_registerContent = '<br>';
  370. TWCA_api.setGui(TWCA_registerTitle+''+TWCA_registerInformation+''+TWCA_registerContact+''+TWCA_donationImg+''+TWCA_registerContent);
  371.  
  372.  
  373. var B = 0;
  374.  
  375. alertSound.volume = 0.8;
  376.  
  377. function checkChat() {
  378. let messages = document.querySelectorAll(".chat_text");
  379. messages.forEach((td, index) => {
  380. let text = td.innerText.trim().toLowerCase();
  381. let messageId = `${index}_${text}`;
  382.  
  383. let foundKeyword = settings.keywords.find(keyword => {
  384. let regex = new RegExp(`\\b${keyword}\\b`, "gi");
  385. return regex.test(text);
  386. });
  387.  
  388. if (foundKeyword && !seenMessages.has(messageId)) {
  389. seenMessages.add(messageId);
  390.  
  391. if (settings.enableSound && alertSound.paused) {
  392. alertSound.volume = settings.volume; // Assicura che il volume sia aggiornato prima di riprodurre
  393. alertSound.play().catch(() => {});
  394. }
  395.  
  396. td.style.backgroundColor = settings.highlightBgColor;
  397. td.style.color = settings.highlightTextColor;
  398. td.style.fontWeight = "bold";
  399. td.style.padding = "5px";
  400. td.style.borderRadius = "5px";
  401. }
  402. });
  403. }
  404.  
  405. setTimeout(() => {
  406. chatCheckInterval = setInterval(checkChat, settings.checkInterval);
  407. }, 3000);
  408.  
  409. function saveSettings() {
  410. localStorage.setItem("TWCAchatKeywordAlertSettings", JSON.stringify(settings));
  411. }
  412.  
  413. function openSettingsWindow() {
  414. let win = wman.open("chatAlertWindow", "TW Chat Alert", "noreload");
  415. if (!win) return;
  416.  
  417. win.setSize(700, 450).setMiniTitle("Chat Alert");
  418. // Aggiunge dinamicamente lo stile per lo slider
  419. let style = document.createElement('style');
  420. style.innerHTML = `
  421. .slidecontainer {
  422. width: 100%;
  423. }
  424.  
  425. .slider {
  426. -webkit-appearance: none;
  427. width: 100%;
  428. height: 10px;
  429. border-radius: 5px;
  430. background: url('https://westit.innogamescdn.com/images/interface/dock.png') repeat-x;
  431. background-size: 100% 100%;
  432. outline: none;
  433. opacity: 0.7;
  434. -webkit-transition: .2s;
  435. transition: opacity .2s;
  436. }
  437.  
  438. .slider:hover {
  439. opacity: 1;
  440. }
  441.  
  442. .slider::-webkit-slider-thumb {
  443. -webkit-appearance: none;
  444. appearance: none;
  445. width: 35px;
  446. height: 28px;
  447. border: 0;
  448. background: url('https://www.inurse.app/imgs/twoGuns.gif');
  449. cursor: pointer;
  450. }
  451.  
  452. .slider::-moz-range-thumb {
  453. width: 23px;
  454. height: 24px;
  455. border: 0;
  456. background: url('https://www.inurse.app/imgs/twoGuns.gif');
  457. cursor: pointer;
  458. }
  459.  
  460.  
  461. /* Stile generale del menu a tendina */
  462. .dropdown {
  463. position: relative;
  464. display: inline-block;
  465. }
  466.  
  467. .dropdown-btn {
  468. background-color: #e4c8a2;
  469. color: black;
  470. padding: 5px 10px;
  471. border: none;
  472. cursor: pointer;
  473. font-size: 14px;
  474. display: flex;
  475. align-items: center;
  476. justify-content: space-between;
  477. width: 125px;
  478. }
  479.  
  480. .dropdown-btn:hover {
  481. background-color: #e4c59b;
  482. }
  483.  
  484. .dropdown-content {
  485. display: none;
  486. position: absolute;
  487. background-color: white;
  488. min-width: 220px;
  489. box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2);
  490. z-index: 1000;
  491. max-height: 250px;
  492. overflow-y: auto;
  493. border: 1px solid #ccc;
  494. padding: 5px;
  495. }
  496.  
  497. .show {
  498. display: block;
  499. }
  500.  
  501. #flagDropdown {
  502. display: flex;
  503. align-items: center; /* Allinea verticalmente */
  504. justify-content: space-between; /* Spazia gli elementi */
  505. width: auto; /* Adatta la larghezza */
  506. }
  507.  
  508. `;
  509. document.head.appendChild(style);
  510.  
  511.  
  512. let content = $(`
  513. <div class="tw2gui_groupframe_content_pane">
  514. <p><b id="keywordTitle">${TWCAT.keywordsTitle}</b></p>
  515. <textarea id="keywordList" style="width: 95%; height: 100px;"></textarea>
  516. <ul style="list-style-type: none;">
  517. <li style="margin: 5px 0;">
  518. <div id="enableSoundDiv" class="tw2gui_checkbox undefined tw2gui_checkbox_labeled hasMousePopup">
  519. ${TWCAT.enableSound}
  520. </div>
  521. </li>
  522. <li style="margin: 5px 0;">
  523. <span class="tw2gui_textfield_wrapper">
  524. <span id="checkIntervalLabel" class="tw2gui_textfield_label">${TWCAT.checkInterval}</span>
  525. <span class="tw2gui_textfield">
  526. <span><input type="number" id="checkInterval" min="5" max="60" step="1" style="width: 80px;"></span>
  527. </span>
  528. </span>
  529. </li>
  530. </ul>
  531. <p>
  532. <label id="highlightBgColorLabel" for="highlightBgColor">${TWCAT.highlightBgColor}:</label>
  533. <input class="tw2gui_textfield" type="color" id="highlightBgColor" value="${settings.highlightBgColor || '#000000'}">
  534. </p>
  535. <p>
  536. <label id="highlightTextColorLabel" for="highlightTextColor">${TWCAT.highlightTextColor}:</label>
  537. <input class="tw2gui_textfield" type="color" id="highlightTextColor" value="${settings.highlightTextColor || '#FFFFFF'}">
  538. </p>
  539. <p>
  540. <label id="volumeLabel" for="volumeControl">${TWCAT.volume}:</label>
  541. <input type="range" id="volumeControl" min="0" max="1" step="0.1" class="slider" style="width: 80%;">
  542. <span id="volumeValue"></span>
  543. </p>
  544. </div>
  545.  
  546.  
  547. <div class="tw2gui_groupframe ">
  548.  
  549. <div class="tw2gui_groupframe_background bg0"></div>
  550. <div class="tw2gui_groupframe_background bg1"></div>
  551. <div class="tw2gui_groupframe_background bg2"></div>
  552. <div class="tw2gui_groupframe_background bg3"></div>
  553. <div class="tw2gui_groupframe_background bg4"></div>
  554. <div class="tw2gui_groupframe_frame tw2gui_bg_tl"></div>
  555. <div class="tw2gui_groupframe_frame tw2gui_bg_tr"></div>
  556. <div class="tw2gui_groupframe_frame tw2gui_bg_bl"></div>
  557. <div class="tw2gui_groupframe_frame tw2gui_bg_br"></div>
  558.  
  559. <div class="tw2gui_groupframe_content_pane" style="display: flex; justify-content: space-between; align-items: center;">
  560.  
  561. <div class="tw2gui_button">
  562. <div class="tw2gui_button_right_cap"></div>
  563. <div class="tw2gui_button_left_cap"></div>
  564. <div class="tw2gui_button_middle_bg"></div>
  565. <div id="cancelSettings" class="textart_title">${TWCAT.resetDefaults}</div>
  566. </div>
  567.  
  568. <div id="flagDropdown"></div>
  569.  
  570.  
  571. <div class="tw2gui_button">
  572. <div class="tw2gui_button_right_cap"></div>
  573. <div class="tw2gui_button_left_cap"></div>
  574. <div class="tw2gui_button_middle_bg"></div>
  575. <div id="saveSettings" class="textart_title">${TWCAT.saveSettings}</div>
  576. </div>
  577.  
  578. </div>
  579.  
  580.  
  581. </div>
  582. </div>
  583.  
  584.  
  585.  
  586. </div>
  587. `);
  588.  
  589. win.appendToContentPane(content);
  590. setTimeout(initDropdown, 10);
  591.  
  592.  
  593. // Imposta lo stato iniziale del checkbox div
  594. if (settings.enableSound) {
  595. $("#enableSoundDiv").addClass("tw2gui_checkbox_checked");
  596. } else {
  597. $("#enableSoundDiv").removeClass("tw2gui_checkbox_checked");
  598. }
  599.  
  600. // Carica le impostazioni salvate
  601. $("#keywordList").val(settings.keywords.join("\n"));
  602. //$("#enableSound").prop("checked", settings.enableSound);
  603. $("#volumeControl").val(settings.volume || 0.8);
  604. $("#volumeValue").text((settings.volume || 0.8) * 100 + "%");
  605. alertSound.volume = settings.volume || 0.8; // Imposta il volume quando la finestra si apre
  606. $("#checkInterval").val((settings.checkInterval || 15000) / 1000);
  607.  
  608. // Aggiornamento visualizzazione volume
  609. $("#volumeControl").on("input", function() {
  610. $("#volumeValue").text($(this).val() * 100 + "%");
  611. });
  612.  
  613. // Gestisce il click sul checkbox div
  614. $("#enableSoundDiv").on("click", function() {
  615. $(this).toggleClass("tw2gui_checkbox_checked");
  616. settings.enableSound = $(this).hasClass("tw2gui_checkbox_checked");
  617. });
  618.  
  619. $("#cancelSettings").on("click", function() {
  620. settings = {
  621. keywords: [
  622. "word", "two words", "three words boh", "another keyword", "ward",
  623. "wod", "wor",
  624. ],
  625. checkInterval: 15000,
  626. enableSound: true,
  627. volume: 0.8,
  628. highlightBgColor: "#000000", //Reset sfondo nero
  629. highlightTextColor: "#FFFFFF" // Reset testo bianco
  630. };
  631.  
  632. $("#keywordList").val(settings.keywords.join("\n"));
  633. $("#enableSoundDiv").addClass("tw2gui_checkbox_checked");
  634. $("#volumeControl").val(settings.volume);
  635. $("#volumeValue").text(settings.volume * 100 + "%");
  636. $("#checkInterval").val(settings.checkInterval / 1000);
  637. $("#highlightBgColor").val(settings.highlightBgColor);
  638. $("#highlightTextColor").val(settings.highlightTextColor);
  639.  
  640. alertSound.volume = settings.volume; //Aggiorna il volume immediatamente
  641. saveSettings();
  642. //Annulla il vecchio setInterval e avvia il nuovo con il nuovo valore
  643. clearInterval(chatCheckInterval);
  644. chatCheckInterval = setInterval(checkChat, settings.checkInterval);
  645. new UserMessage(''+TWCAT.settingsDefaultSuccess+'', 'success').show();
  646. });
  647.  
  648. // Salvataggio delle impostazioni
  649. $("#saveSettings").on("click", function() {
  650. settings.keywords = $("#keywordList").val().split("\n").map(k => k.trim()).filter(k => k);
  651. settings.enableSound = $("#enableSoundDiv").hasClass("tw2gui_checkbox_checked");
  652. settings.volume = parseFloat($("#volumeControl").val());
  653. settings.checkInterval = parseInt($("#checkInterval").val()) * 1000;
  654. settings.highlightBgColor = $("#highlightBgColor").val();
  655. settings.highlightTextColor = $("#highlightTextColor").val();
  656.  
  657. alertSound.volume = settings.volume; // Aggiorna il volume immediatamente
  658. saveSettings();
  659. //Annulla il vecchio setInterval e avvia il nuovo con il nuovo valore
  660. clearInterval(chatCheckInterval);
  661. chatCheckInterval = setInterval(checkChat, settings.checkInterval);
  662. new UserMessage(''+TWCAT.settingsSavedSuccess+'', 'success').show();
  663. });
  664. }
  665.  
  666. function applyTranslations(language) {
  667. if (!translations[language]) language = "en"; // Se manca, usa l'italiano di default
  668.  
  669. document.getElementById("saveSettings").textContent = translations[language].saveSettings;
  670. document.getElementById("cancelSettings").textContent = translations[language].resetDefaults;
  671. document.getElementById("keywordTitle").textContent = translations[language].keywordsTitle;
  672. document.getElementById("enableSoundDiv").textContent = translations[language].enableSound;
  673. document.getElementById("checkIntervalLabel").textContent = translations[language].checkInterval;
  674. document.getElementById("volumeLabel").textContent = translations[language].volume;
  675. document.getElementById("highlightBgColorLabel").textContent = translations[language].highlightBgColor;
  676. document.getElementById("highlightTextColorLabel").textContent = translations[language].highlightTextColor;
  677. document.getElementById("dropdown-btn").textContent = translations[language].selectLanguage;
  678. }
  679.  
  680.  
  681.  
  682. function initDropdown() {
  683.  
  684. // Aspettiamo che il sistema west.gui sia disponibile
  685. if (typeof west === "undefined" || typeof west.gui === "undefined") {
  686. console.error("west.gui non è definito. Riprovo...");
  687. setTimeout(initDropdown, 500);
  688. return;
  689. }
  690.  
  691. //Definizione delle lingue e posizione delle bandiere
  692. var languages = {
  693. br: { lang: "Português (pt-br)", bg_pos: "0px -1008px", locale: "pt_BR" },
  694. cs: { lang: "Čeština (cs)", bg_pos: "0px -784px", locale: "cs_CZ" },
  695. de: { lang: "Deutsch (de)", bg_pos: "0px -1103px", locale: "de_DE" },
  696. el: { lang: "Ελληνικά (el)", bg_pos: "0px -752px", locale: "el_GR" },
  697. en: { lang: "English (en)", bg_pos: "0px -1488px", locale: "en_EN" },
  698. es: { lang: "Español (es)", bg_pos: "0px -1392px", locale: "es_ES" },
  699. fr: { lang: "Français (fr)", bg_pos: "0px -1360px", locale: "fr_FR" },
  700. hu: { lang: "Magyar (hu)", bg_pos: "0px -1136px", locale: "hu_HU" },
  701. it: { lang: "Italiano (it)", bg_pos: "0px -1296px", locale: "it_IT" },
  702. nl: { lang: "Dutch (nl)", bg_pos: "0px -687px", locale: "nl_NL" },
  703. pl: { lang: "Polski (pl)", bg_pos: "0px -1616px", locale: "pl_PL" },
  704. pt: { lang: "Português (pt)", bg_pos: "0px -848px", locale: "pt_PT" },
  705. ro: { lang: "Română (ro)", bg_pos: "0px -976px", locale: "ro_RO" },
  706. sk: { lang: "Slovenčina (sk)", bg_pos: "0px -815px", locale: "sk_SK" },
  707. tr: { lang: "Türkçe (tr)", bg_pos: "0px -1328px", locale: "tr_TR" }
  708. };
  709.  
  710. const flagDropdown = document.getElementById("flagDropdown");
  711.  
  712. if (!flagDropdown) {
  713. console.error(" Elemento flagDropdown non trovato!");
  714. return;
  715. }
  716.  
  717. var langCombo = new west.gui.Combobox();
  718. langCombo.setWidth(180);
  719.  
  720. Object.entries(languages)
  721. .sort((a, b) => a[1].lang.localeCompare(b[1].lang))
  722. .forEach(([key, value]) => {
  723. langCombo.addItem(
  724. key,
  725. `<span style="background: url(//portal-bar.innogamescdn.com/images/west-sprite_01.newRuFlag.1661155041.png) no-repeat left center; background-position: ${value.bg_pos}; padding-left: 30px;">${value.lang}</span>`
  726. );
  727. });
  728.  
  729. // Seleziona la lingua attuale
  730. const savedLanguage = localStorage.getItem("TWCALanguage") || "en";
  731. langCombo.select(savedLanguage);
  732.  
  733. // Listener per il cambio lingua
  734. langCombo.addListener(function(selectedKey) {
  735. localStorage.setItem("TWCALanguage", selectedKey);
  736. applyTranslations(selectedKey); // Applica la traduzione immediatamente
  737. });
  738.  
  739. // Inserisce il combobox direttamente nel flagDropdown
  740. $(flagDropdown).empty().append(langCombo.getMainDiv());
  741. }
  742.  
  743.  
  744. function addSettingsButton() {
  745. let menuContainer = document.querySelector("#ui_menubar");
  746. if (!menuContainer) return;
  747.  
  748. // Crea il contenitore per il pulsante
  749. let menuDiv = document.createElement("div");
  750. menuDiv.className = "ui_menucontainer";
  751. menuDiv.style.marginBottom = "7px";
  752.  
  753. let settingsButton = document.createElement("div");
  754. settingsButton.id = "chatAlertMenuButton";
  755. settingsButton.className = "menulink hasMousePopup";
  756. settingsButton.style.backgroundImage = "url(http://inurse.app/imgs/voiceMessageIcon.webp)";
  757. settingsButton.style.backgroundSize = "contain"; // Adatta l'immagine alla dimensione del pulsante
  758. settingsButton.style.backgroundRepeat = "no-repeat";
  759. settingsButton.style.backgroundPosition = "0px 0px";
  760. settingsButton.style.width = "26px";
  761. settingsButton.style.height = "26px";
  762. settingsButton.style.cursor = "pointer";
  763.  
  764. settingsButton.title = "Impostazioni Chat Alert";
  765. settingsButton.addEventListener("click", openSettingsWindow);
  766.  
  767. // Effetto hover
  768. settingsButton.addEventListener("mouseenter", () => {
  769. settingsButton.style.backgroundPosition = "0px 0px";
  770. });
  771. settingsButton.addEventListener("mouseleave", () => {
  772. settingsButton.style.backgroundPosition = "0px 0px";
  773. });
  774.  
  775. let bottomDiv = document.createElement("div");
  776. bottomDiv.className = "menucontainer_bottom";
  777.  
  778. menuDiv.appendChild(settingsButton);
  779. menuDiv.appendChild(bottomDiv);
  780.  
  781. menuContainer.appendChild(menuDiv);
  782. }
  783.  
  784. setTimeout(addSettingsButton, 1000);
  785.  
  786. })();