Discord New Message Alert

Alerts when new messages arrive in Discord chat

  1. // ==UserScript==
  2. // @name Discord New Message Alert
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description Alerts when new messages arrive in Discord chat
  6. // @author r!PsAw
  7. // @match https://discord.com/channels/*
  8. // @match https://diep.io/*
  9. // @grant GM_setValue
  10. // @grant GM_getValue
  11. // @grant unsafeWindow
  12. // @run-at document-start
  13. // @license balls
  14. // ==/UserScript==
  15.  
  16. const win = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window;
  17.  
  18. //detect if we're on discord or diep.io
  19. function where_are_we_rn(){
  20. switch(win.location.origin){
  21. case "https://discord.com":
  22. return "discord";
  23. case "https://diep.io":
  24. return "diepio";
  25. default:
  26. return "unknown";
  27. }
  28. }
  29.  
  30. const origin = where_are_we_rn();
  31.  
  32. //logic for discord
  33. let scrollerInner;
  34. let old = new Set();
  35. function find_scrollerInner(){
  36. if(document.querySelector('[class^="scrollerInner__"]')){
  37. scrollerInner = document.querySelector('[class^="scrollerInner__"]')
  38. return;
  39. }
  40. setTimeout(find_scrollerInner, 200);
  41. }
  42. find_scrollerInner();
  43.  
  44. function check_classes(element, goal){
  45. for(let _class of element.classList){
  46. if(_class.includes(goal)) return true;
  47. }
  48. return false;
  49. }
  50.  
  51. function check_id(element, goal) {
  52. return element.id && element.id.includes(goal);
  53. }
  54.  
  55. function is_message(element){
  56. return (element.innerText.length > 0 && element.nodeName === 'SPAN');
  57. }
  58.  
  59. function read_messages(){
  60. if(!scrollerInner || origin != 'discord') return;
  61. for(let msg of scrollerInner.children){
  62. if(check_id(msg, 'chat-messages-')){
  63. let children = msg.children;
  64. for(let child of children){
  65. if(check_classes(child, 'message__')){
  66. let children1 = child.children;
  67. for(let child1 of children1){
  68. if(check_classes(child1, 'contents_')){
  69. let children2 = child1.children;
  70. for(let child2 of children2){
  71. if(check_id(child2, 'message-content-')){
  72. let children3 = child2.children;
  73. for(let child3 of children3){
  74. if(is_message(child3)){
  75. //console.log(child3.innerText);
  76. if(!old.has(child3.innerText)){
  77. old.add(child3.innerText);
  78. GM_setValue("Last Message", child3.innerText);
  79. }
  80. }
  81. }
  82. }
  83. }
  84. }
  85. }
  86. }
  87. }
  88. }
  89. }
  90. }
  91. setInterval(read_messages, 1000);
  92.  
  93. //logic for diep.io
  94.  
  95. let last_message = '';
  96. function display_new_message(){
  97. if(!GM_getValue("Last Message") || origin != 'diepio') return;
  98.  
  99. const stored_message = GM_getValue("Last Message");
  100. if(win.input && win.input.doesHaveTank() && stored_message !== last_message){
  101. console.log(stored_message, last_message, stored_message !== last_message);
  102. last_message = stored_message;
  103. win.input.inGameNotification(`[Discord -> Diep.io] ${stored_message}`);
  104. }
  105. }
  106.  
  107. setInterval(display_new_message, 1000);