🏠 Home 

Schwarze Liste

Blacklist for Stumblechat moderators


Install this script?
  1. // ==UserScript==
  2. // @name Schwarze Liste
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description Blacklist for Stumblechat moderators
  6. // @author MeKLiN
  7. // @match https://stumblechat.com/room/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=stumblechat.com
  9. // @grant none
  10. // @license MIT
  11. // ==/UserScript==
  12. (function() {
  13. 'use strict';
  14. // Store WebSocket globally
  15. let webSocket;
  16. // Store ban list in local storage
  17. let banList = [];
  18. // User map to keep track of users and their handles
  19. const userMap = new Map();
  20. // Override WebSocket constructor to intercept WebSocket creation
  21. const originalWebSocket = window.WebSocket;
  22. window.WebSocket = function(url, protocols) {
  23. // Create WebSocket connection
  24. webSocket = new originalWebSocket(url, protocols);
  25. // Event listener for receiving messages
  26. webSocket.addEventListener('message', event => {
  27. handleWebSocketMessage(event.data);
  28. });
  29. return webSocket;
  30. };
  31. // Function to handle WebSocket messages
  32. function handleWebSocketMessage(message) {
  33. const parsedMessage = JSON.parse(message);
  34. console.log('Received message:', parsedMessage);
  35. if (parsedMessage.stumble === "join") {
  36. const { handle, username } = parsedMessage;
  37. console.log('User joined:', username);
  38. // Add user to user map
  39. userMap.set(username, handle);
  40. // Check if the user is banned
  41. if (banList.includes(username)) {
  42. console.log('User is banned. Triggering ban...');
  43. // Trigger ban for the user
  44. triggerBan(handle);
  45. }
  46. }
  47. }
  48. // Function to trigger ban
  49. function triggerBan(handle) {
  50. console.log(`Banning user with handle: ${handle}`);
  51. // Send ban message
  52. const banRequest = JSON.stringify({ "stumble": "ban", "handle": handle });
  53. webSocket.send(banRequest);
  54. }
  55. // Function to send ban requests for banned users on join
  56. async function sendBanRequestsOnJoin() {
  57. console.log('Sending ban requests for banned users on join...');
  58. const userList = document.querySelectorAll('.bar .username');
  59. userList.forEach(user => {
  60. const username = user.textContent.trim();
  61. if (banList.includes(username)) {
  62. const handle = user.closest('.bar').getAttribute('user-id');
  63. if (handle) {
  64. console.log(`Banning user: ${username}`);
  65. // Trigger ban for the user
  66. triggerBan(handle);
  67. }
  68. }
  69. });
  70. }
  71. // Function to handle the file input and extract usernames
  72. function handleFileInput(event) {
  73. const file = event.target.files[0];
  74. if (file) {
  75. const reader = new FileReader();
  76. reader.onload = function(e) {
  77. const content = e.target.r###lt;
  78. banList = content.split('\n').map(username => username.trim());
  79. // Save updated ban list in local storage
  80. localStorage.setItem("banList", JSON.stringify(banList));
  81. console.log('Ban list loaded:', banList);
  82. };
  83. reader.readAsText(file);
  84. }
  85. }
  86. // Function to create load file button
  87. function createLoadFileButton() {
  88. const loadFileButton = document.createElement('input');
  89. loadFileButton.type = 'file';
  90. loadFileButton.accept = '.txt';
  91. loadFileButton.style.position = 'fixed';
  92. loadFileButton.style.top = '10px';
  93. loadFileButton.style.right = '150px';
  94. loadFileButton.style.zIndex = '1000';
  95. loadFileButton.addEventListener('change', handleFileInput);
  96. document.body.appendChild(loadFileButton);
  97. }
  98. // Function to create activate button
  99. function createActivateButton() {
  100. const activateButton = document.createElement('button');
  101. activateButton.textContent = 'Activate';
  102. activateButton.style.position = 'fixed';
  103. activateButton.style.top = '10px';
  104. activateButton.style.right = '10px';
  105. activateButton.style.zIndex = '1000';
  106. activateButton.addEventListener('click', () => {
  107. // Send ban requests for banned users on join
  108. sendBanRequestsOnJoin();
  109. // Hide the activate button after clicking
  110. activateButton.style.display = 'none';
  111. });
  112. document.body.appendChild(activateButton);
  113. }
  114. // Load ban list from local storage
  115. const storedBanList = localStorage.getItem("banList");
  116. if (storedBanList) {
  117. banList = JSON.parse(storedBanList);
  118. console.log('Ban list loaded from local storage:', banList);
  119. }
  120. // Create load file button and activate button
  121. createLoadFileButton();
  122. createActivateButton();
  123. })();