Drawaria Moderator Menu With Tools

Enhanced real-time moderator tool for Drawaria with additional features, custom chat messages, and improved visuals

  1. // ==UserScript==
  2. // @name Drawaria Moderator Menu With Tools
  3. // @namespace drawaria.moderator.tool
  4. // @version 3.0
  5. // @description Enhanced real-time moderator tool for Drawaria with additional features, custom chat messages, and improved visuals
  6. // @author YouTube And Minish
  7. // @match https://drawaria.online/*
  8. // @grant none
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. // Initialize data structures
  16. const bannedPlayers = new Set();
  17. const mutedPlayers = new Set();
  18. const reportedPlayers = [];
  19. const warnedPlayers = new Map();
  20. const suspiciousPlayers = new Set();
  21.  
  22. // Style definitions
  23. const styles = `
  24. #moderatorMenuContainer {
  25. position: fixed;
  26. bottom: 60px;
  27. right: 10px;
  28. z-index: 1000;
  29. background-color: #333;
  30. border-radius: 5px;
  31. padding: 0;
  32. color: white;
  33. width: 250px;
  34. box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
  35. cursor: move;
  36. font-family: Arial, sans-serif;
  37. }
  38. #moderatorMenuTitle {
  39. padding: 10px;
  40. background-color: #555;
  41. border-radius: 5px 5px 0 0;
  42. text-align: center;
  43. cursor: pointer;
  44. display: flex;
  45. justify-content: space-between;
  46. align-items: center;
  47. }
  48. #moderatorMenuContent {
  49. padding: 10px;
  50. display: none;
  51. }
  52. .menuButton {
  53. display: block;
  54. width: 100%;
  55. margin-bottom: 5px;
  56. padding: 10px;
  57. background-color: #444;
  58. color: white;
  59. border: none;
  60. border-radius: 5px;
  61. cursor: pointer;
  62. transition: background-color 0.3s;
  63. text-align: left;
  64. }
  65. .menuButton:hover {
  66. background-color: #666;
  67. }
  68. .menuButton i {
  69. margin-right: 10px;
  70. }
  71. .playerList {
  72. max-height: 200px;
  73. overflow-y: auto;
  74. border: 1px solid #555;
  75. border-radius: 5px;
  76. margin-top: 10px;
  77. }
  78. .playerListItem {
  79. padding: 5px;
  80. border-bottom: 1px solid #555;
  81. }
  82. .highlight {
  83. background-color: #ff9999;
  84. }
  85. `;
  86.  
  87. // Create the moderator menu
  88. function createModeratorMenu() {
  89. const menuContainer = document.createElement('div');
  90. menuContainer.id = 'moderatorMenuContainer';
  91. document.body.appendChild(menuContainer);
  92.  
  93. const styleElement = document.createElement('style');
  94. styleElement.textContent = styles;
  95. document.head.appendChild(styleElement);
  96.  
  97. const menuTitle = document.createElement('div');
  98. menuTitle.id = 'moderatorMenuTitle';
  99. menuTitle.innerHTML = '<span>Moderator Menu</span><span id="toggleArrow">▼</span>';
  100. menuContainer.appendChild(menuTitle);
  101.  
  102. const menuContent = document.createElement('div');
  103. menuContent.id = 'moderatorMenuContent';
  104. menuContainer.appendChild(menuContent);
  105.  
  106. menuTitle.addEventListener('click', () => {
  107. menuContent.style.display = menuContent.style.display === 'none' ? 'block' : 'none';
  108. const toggleArrow = document.getElementById('toggleArrow');
  109. toggleArrow.innerText = menuContent.style.display === 'none' ? '▼' : '▲';
  110. });
  111.  
  112. // Add buttons to the menu
  113. addMenuButton(menuContent, '<i class="fas fa-ban"></i> Ban Player', handleBanButtonClick);
  114. addMenuButton(menuContent, '<i class="fas fa-undo"></i> Unban Player', handleUnbanButtonClick);
  115. addMenuButton(menuContent, '<i class="fas fa-volume-mute"></i> Mute Player', handleMuteButtonClick);
  116. addMenuButton(menuContent, '<i class="fas fa-volume-up"></i> Unmute Player', handleUnmuteButtonClick);
  117. addMenuButton(menuContent, '<i class="fas fa-exclamation-triangle"></i> Warn Player', handleWarnButtonClick);
  118. addMenuButton(menuContent, '<i class="fas fa-flag"></i> Report Player', handleReportButtonClick);
  119. addMenuButton(menuContent, '<i class="fas fa-eye"></i> View Reports', handleViewReportsClick);
  120. addMenuButton(menuContent, '<i class="fas fa-users"></i> View Banned Players', handleViewBannedPlayersClick);
  121. addMenuButton(menuContent, '<i class="fas fa-microphone-alt-slash"></i> View Muted Players', handleViewMutedPlayersClick);
  122. addMenuButton(menuContent, '<i class="fas fa-user-times"></i> Kick Player', handleKickButtonClick);
  123. addMenuButton(menuContent, '<i class="fas fa-exclamation"></i> Highlight Suspicious', handleHighlightSuspiciousClick);
  124.  
  125. // Create player lists
  126. createPlayerList(menuContent, 'bannedPlayersList', 'Banned Players');
  127. createPlayerList(menuContent, 'mutedPlayersList', 'Muted Players');
  128. createPlayerList(menuContent, 'warnedPlayersList', 'Warned Players');
  129. createPlayerList(menuContent, 'reportedPlayersList', 'Reported Players');
  130. createPlayerList(menuContent, 'suspiciousPlayersList', 'Suspicious Players');
  131.  
  132. // Make the menu draggable
  133. makeDraggable(menuContainer);
  134. }
  135.  
  136. // Add a button to the menu
  137. function addMenuButton(menu, text, onClick) {
  138. const button = document.createElement('button');
  139. button.innerHTML = text;
  140. button.className = 'menuButton';
  141. button.addEventListener('click', onClick);
  142. menu.appendChild(button);
  143. }
  144.  
  145. // Create a player list
  146. function createPlayerList(menu, id, title) {
  147. const listTitle = document.createElement('h3');
  148. listTitle.textContent = title;
  149. menu.appendChild(listTitle);
  150.  
  151. const listContainer = document.createElement('div');
  152. listContainer.id = id;
  153. listContainer.className = 'playerList';
  154. menu.appendChild(listContainer);
  155. }
  156.  
  157. // Function to handle the "Ban" button click event
  158. function handleBanButtonClick() {
  159. const nickname = prompt("Enter the player's nickname to ban:");
  160.  
  161. if (nickname) {
  162. bannedPlayers.add(nickname);
  163. addModeratorMessages(nickname, 'Ban');
  164. removePlayer(nickname);
  165. updatePlayerList();
  166. disableChatWithUser(nickname);
  167. broadcastBanMessage(nickname);
  168. updateBannedPlayersList();
  169. }
  170. }
  171.  
  172. // Function to handle the "Unban" button click event
  173. function handleUnbanButtonClick() {
  174. const nickname = prompt("Enter the player's nickname to unban:");
  175.  
  176. if (nickname) {
  177. if (bannedPlayers.has(nickname)) {
  178. bannedPlayers.delete(nickname);
  179. addModeratorMessages(nickname, 'Unban');
  180. updatePlayerList();
  181. enableChatWithUser(nickname);
  182. broadcastUnbanMessage(nickname);
  183. updateBannedPlayersList();
  184. } else {
  185. alert('Player is not banned.');
  186. }
  187. }
  188. }
  189.  
  190. // Function to handle the "Mute" button click event
  191. function handleMuteButtonClick() {
  192. const nickname = prompt("Enter the player's nickname to mute:");
  193.  
  194. if (nickname) {
  195. mutedPlayers.add(nickname);
  196. addModeratorMessages(nickname, 'Mute');
  197. disableChatWithUser(nickname);
  198. updateMutedPlayersList();
  199. }
  200. }
  201.  
  202. // Function to handle the "Unmute" button click event
  203. function handleUnmuteButtonClick() {
  204. const nickname = prompt("Enter the player's nickname to unmute:");
  205.  
  206. if (nickname) {
  207. if (mutedPlayers.has(nickname)) {
  208. mutedPlayers.delete(nickname);
  209. addModeratorMessages(nickname, 'Unmute');
  210. enableChatWithUser(nickname);
  211. updateMutedPlayersList();
  212. } else {
  213. alert('Player is not muted.');
  214. }
  215. }
  216. }
  217.  
  218. // Function to handle the "Warn" button click event
  219. function handleWarnButtonClick() {
  220. const nickname = prompt("Enter the player's nickname to warn:");
  221. const reason = prompt("Enter the reason for the warning:");
  222.  
  223. if (nickname && reason) {
  224. if (warnedPlayers.has(nickname)) {
  225. warnedPlayers.set(nickname, warnedPlayers.get(nickname) + 1);
  226. } else {
  227. warnedPlayers.set(nickname, 1);
  228. }
  229. addModeratorMessages(nickname, 'Warn', reason);
  230. updateWarnedPlayersList();
  231. if (warnedPlayers.get(nickname) >= 3) {
  232. if (confirm(`Player ${nickname} has 3 warnings. Do you want to ban them?`)) {
  233. handleBanButtonClick(nickname);
  234. }
  235. }
  236. }
  237. }
  238.  
  239. // Function to handle the "Report" button click event
  240. function handleReportButtonClick() {
  241. const nickname = prompt("Enter the player's nickname to report:");
  242. const reason = prompt("Enter the reason for the report:");
  243.  
  244. if (nickname && reason) {
  245. reportedPlayers.push({ nickname, reason, timestamp: new Date() });
  246. addModeratorMessages(nickname, 'Report', reason);
  247. updateReportedPlayersList();
  248. }
  249. }
  250.  
  251. // Function to handle the "View Reports" button click event
  252. function handleViewReportsClick() {
  253. const sortedReports = reportedPlayers.sort((a, b) => b.timestamp - a.timestamp);
  254. const reports = sortedReports.map(player => `${player.nickname}: ${player.reason} (at ${player.timestamp.toLocaleString()})`).join('\n');
  255. alert(reports || 'No reports available.');
  256. }
  257.  
  258. // Function to handle the "View Banned Players" button click event
  259. function handleViewBannedPlayersClick() {
  260. const banned = Array.from(bannedPlayers).join('\n');
  261. alert(banned || 'No banned players.');
  262. }
  263.  
  264. // Function to handle the "View Muted Players" button click event
  265. function handleViewMutedPlayersClick() {
  266. const muted = Array.from(mutedPlayers).join('\n');
  267. alert(muted || 'No muted players.');
  268. }
  269.  
  270. // Function to handle the "Kick" button click event
  271. function handleKickButtonClick() {
  272. const nickname = prompt("Enter the player's nickname to kick:");
  273.  
  274. if (nickname) {
  275. addModeratorMessages(nickname, 'Kick');
  276. removePlayer(nickname);
  277. updatePlayerList();
  278. broadcastKickMessage(nickname);
  279. }
  280. }
  281.  
  282. // Function to handle the "Highlight Suspicious" button click event
  283. function handleHighlightSuspiciousClick() {
  284. const nickname = prompt("Enter the player's nickname to highlight as suspicious:");
  285.  
  286. if (nickname) {
  287. suspiciousPlayers.add(nickname);
  288. highlightPlayer(nickname);
  289. updateSuspiciousPlayersList();
  290. }
  291. }
  292.  
  293. // Function to add moderator messages with custom formatting
  294. function addModeratorMessages(nickname, action, additionalInfo = '') {
  295. const chatBox = document.getElementById('chatbox_messages');
  296.  
  297. if (chatBox) {
  298. let messages = [];
  299.  
  300. if (action === 'Ban') {
  301. messages = [
  302. `<div class="chatmessage systemchatmessage5" data-ts="${Date.now()}">Moderator: Banned ${nickname}</div>`,
  303. `<div class="chatmessage systemchatmessage7" data-ts="${Date.now()}">Complain about the moderator on Discord, on this channel: <a href="https://discord.gg/XeVKWWs" target="_blank">#report-a-moderator</a></div>`,
  304. `<div class="chatmessage systemchatmessage" data-ts="${Date.now()}">Someone voted to ban from the room: ${nickname}</div>`,
  305. `<div class="chatmessage systemchatmessage" data-ts="${Date.now()}">${nickname} has been banned from the room!</div>`,
  306. `<div class="chatmessage systemchatmessage7" data-ts="${Date.now()}">${nickname} - player has left the room</div>`
  307. ];
  308. } else if (action === 'Unban') {
  309. messages = [
  310. `<div class="chatmessage systemchatmessage5" data-ts="${Date.now()}">Moderator: Unbanned ${nickname}</div>`,
  311. `<div class="chatmessage systemchatmessage" data-ts="${Date.now()}">${nickname} has been unbanned from the room!</div>`
  312. ];
  313. } else if (action === 'Mute') {
  314. messages = [
  315. `<div class="chatmessage systemchatmessage5" data-ts="${Date.now()}">Moderator: Muted ${nickname}</div>`,
  316. `<div class="chatmessage systemchatmessage" data-ts="${Date.now()}">${nickname} has been muted in the room!</div>`
  317. ];
  318. } else if (action === 'Unmute') {
  319. messages = [
  320. `<div class="chatmessage systemchatmessage5" data-ts="${Date.now()}">Moderator: Unmuted ${nickname}</div>`,
  321. `<div class="chatmessage systemchatmessage" data-ts="${Date.now()}">${nickname} has been unmuted in the room!</div>`
  322. ];
  323. } else if (action === 'Warn') {
  324. messages = [
  325. `<div class="chatmessage systemchatmessage5" data-ts="${Date.now()}">Moderator: Warned ${nickname} for: ${additionalInfo}</div>`,
  326. `<div class="chatmessage systemchatmessage" data-ts="${Date.now()}">${nickname} has been warned! (${warnedPlayers.get(nickname)}/3)</div>`
  327. ];
  328. } else if (action === 'Report') {
  329. messages = [
  330. `<div class="chatmessage systemchatmessage5" data-ts="${Date.now()}">Moderator: Reported ${nickname}</div>`,
  331. `<div class="chatmessage systemchatmessage" data-ts="${Date.now()}">${nickname} has been reported for: ${additionalInfo}</div>`
  332. ];
  333. } else if (action === 'Kick') {
  334. messages = [
  335. `<div class="chatmessage systemchatmessage5" data-ts="${Date.now()}">Moderator: Kicked ${nickname}</div>`,
  336. `<div class="chatmessage systemchatmessage" data-ts="${Date.now()}">${nickname} has been kicked from the room!</div>`
  337. ];
  338. }
  339.  
  340. messages.forEach(message => {
  341. chatBox.innerHTML += message;
  342. });
  343. }
  344. }
  345.  
  346. // Function to remove a player from the list
  347. function removePlayer(nickname) {
  348. const playerList = document.getElementById('playerlist');
  349.  
  350. if (playerList) {
  351. const playerToRemove = Array.from(playerList.querySelectorAll('.playerlist-row')).find(player => {
  352. const nameElement = player.querySelector('.playerlist-name a');
  353. return nameElement && nameElement.textContent.trim() === nickname;
  354. });
  355.  
  356. if (playerToRemove) {
  357. playerToRemove.remove();
  358. }
  359. }
  360. }
  361.  
  362. // Function to update the player list
  363. function updatePlayerList() {
  364. const playerList = document.getElementById('playerlist');
  365.  
  366. if (playerList) {
  367. Array.from(playerList.querySelectorAll('.playerlist-row')).forEach(player => {
  368. const nameElement = player.querySelector('.playerlist-name a');
  369. if (nameElement) {
  370. const playerName = nameElement.textContent.trim();
  371. if (bannedPlayers.has(playerName)) {
  372. player.remove();
  373. }
  374. }
  375. });
  376. }
  377. }
  378.  
  379. // Function to sanitize nickname for use in CSS selectors
  380. function sanitizeNickname(nickname) {
  381. return nickname.replace(/[^a-zA-Z0-9]/g, '');
  382. }
  383.  
  384. // Function to disable chat with the banned player
  385. function disableChatWithUser(nickname) {
  386. const sanitizedNickname = sanitizeNickname(nickname);
  387. const chatWithUser = document.querySelector(`.chat-with-${sanitizedNickname}`);
  388.  
  389. if (chatWithUser) {
  390. chatWithUser.style.display = 'none';
  391. }
  392. }
  393.  
  394. // Function to enable chat with the unbanned player
  395. function enableChatWithUser(nickname) {
  396. const sanitizedNickname = sanitizeNickname(nickname);
  397. const chatWithUser = document.querySelector(`.chat-with-${sanitizedNickname}`);
  398.  
  399. if (chatWithUser) {
  400. chatWithUser.style.display = 'block';
  401. }
  402. }
  403.  
  404. // Function to broadcast the ban message to all players
  405. function broadcastBanMessage(nickname) {
  406. if (window.myRoom.players && Array.isArray(window.myRoom.players)) {
  407. const message = JSON.stringify([
  408. "bc_uc_freedrawsession_changedroom",
  409. null,
  410. null,
  411. window.myRoom.players.filter(player => player.nickname !== nickname)
  412. ]);
  413. sendMessageToAll(`42${message}`);
  414. }
  415. }
  416.  
  417. // Function to broadcast the unban message to all players
  418. function broadcastUnbanMessage(nickname) {
  419. if (window.myRoom.players && Array.isArray(window.myRoom.players)) {
  420. const message = JSON.stringify([
  421. "bc_uc_freedrawsession_changedroom",
  422. null,
  423. null,
  424. window.myRoom.players
  425. ]);
  426. sendMessageToAll(`42${message}`);
  427. }
  428. }
  429.  
  430. // Function to broadcast the kick message to all players
  431. function broadcastKickMessage(nickname) {
  432. if (window.myRoom.players && Array.isArray(window.myRoom.players)) {
  433. const message = JSON.stringify([
  434. "bc_uc_freedrawsession_changedroom",
  435. null,
  436. null,
  437. window.myRoom.players.filter(player => player.nickname !== nickname)
  438. ]);
  439. sendMessageToAll(`42${message}`);
  440. }
  441. }
  442.  
  443. // Function to update the banned players list
  444. function updateBannedPlayersList() {
  445. updatePlayerListContainer('bannedPlayersList', Array.from(bannedPlayers));
  446. }
  447.  
  448. // Function to update the muted players list
  449. function updateMutedPlayersList() {
  450. updatePlayerListContainer('mutedPlayersList', Array.from(mutedPlayers));
  451. }
  452.  
  453. // Function to update the warned players list
  454. function updateWarnedPlayersList() {
  455. const warnedList = Array.from(warnedPlayers).map(([name, count]) => `${name} (${count}/3)`);
  456. updatePlayerListContainer('warnedPlayersList', warnedList);
  457. }
  458.  
  459. // Function to update the reported players list
  460. function updateReportedPlayersList() {
  461. const reportedList = reportedPlayers.map(player => `${player.nickname}: ${player.reason}`);
  462. updatePlayerListContainer('reportedPlayersList', reportedList);
  463. }
  464.  
  465. // Function to update the suspicious players list
  466. function updateSuspiciousPlayersList() {
  467. updatePlayerListContainer('suspiciousPlayersList', Array.from(suspiciousPlayers));
  468. }
  469.  
  470. // Generic function to update player list containers
  471. function updatePlayerListContainer(containerId, playerList) {
  472. const listContainer = document.getElementById(containerId);
  473. if (listContainer) {
  474. listContainer.innerHTML = '';
  475. playerList.forEach(player => {
  476. const playerItem = document.createElement('div');
  477. playerItem.textContent = player;
  478. playerItem.className = 'playerListItem';
  479. listContainer.appendChild(playerItem);
  480. });
  481. }
  482. }
  483.  
  484. // Function to highlight a suspicious player
  485. function highlightPlayer(nickname) {
  486. const playerList = document.getElementById('playerlist');
  487. if (playerList) {
  488. const playerToHighlight = Array.from(playerList.querySelectorAll('.playerlist-row')).find(player => {
  489. const nameElement = player.querySelector('.playerlist-name a');
  490. return nameElement && nameElement.textContent.trim() === nickname;
  491. });
  492.  
  493. if (playerToHighlight) {
  494. playerToHighlight.classList.add('highlight');
  495. }
  496. }
  497. }
  498.  
  499. // WebSocket handling
  500. const originalSend = WebSocket.prototype.send;
  501. WebSocket.prototype.send = function (...args) {
  502. if (window.sockets.indexOf(this) === -1) {
  503. window.sockets.push(this);
  504.  
  505. if (window.sockets.indexOf(this) === 0) {
  506. this.addEventListener('message', handleIncomingMessage);
  507. }
  508. }
  509.  
  510. return originalSend.call(this, ...args);
  511. };
  512.  
  513. // Initialize
  514. createModeratorMenu();
  515.  
  516. // Room & Socket Control
  517. window.myRoom = {
  518. players: []
  519. };
  520. window.sockets = [];
  521.  
  522. // Ensure the WebSocket messages are correctly formatted and sent to all players
  523. function sendMessageToAll(message) {
  524. window.sockets.forEach(socket => {
  525. if (socket.readyState === WebSocket.OPEN) {
  526. socket.send(message);
  527. }
  528. });
  529. }
  530.  
  531. // Function to handle incoming WebSocket messages
  532. function handleIncomingMessage(event) {
  533. let message = String(event.data);
  534.  
  535. if (message.startsWith('42')) {
  536. let payload = JSON.parse(message.slice(2));
  537.  
  538. if (payload[0] == 'bc_uc_freedrawsession_changedroom' || payload[0] == 'mc_roomplayerschange') {
  539. window.myRoom.players = payload[3];
  540. updatePlayerList();
  541. updateBannedPlayersList();
  542. updateMutedPlayersList();
  543. updateWarnedPlayersList();
  544. updateReportedPlayersList();
  545. updateSuspiciousPlayersList();
  546. }
  547. } else if (message.startsWith('430')) {
  548. let configs = JSON.parse(message.slice(3))[0];
  549. window.myRoom.players = configs.players;
  550. window.myRoom.id = configs.roomid;
  551. updatePlayerList();
  552. updateBannedPlayersList();
  553. updateMutedPlayersList();
  554. updateWarnedPlayersList();
  555. updateReportedPlayersList();
  556. updateSuspiciousPlayersList();
  557. }
  558. }
  559.  
  560. // Connect to the WebSocket server
  561. function connectToWebSocketServer() {
  562. const socket = new WebSocket('wss://sv3.drawaria.online/socket.io/?sid1=s%3A11JLEUID6B8TEN3-RCEDSV1h8ZzvoF3a.99s79DOPC%2Fb2ajOJBEBNkhMT0Z1FSm8jzcCGzohk%2FeI&hostname=drawaria.online&EIO=3&transport=websocket');
  563.  
  564. socket.onopen = () => {
  565. console.log('WebSocket connection opened');
  566. window.sockets.push(socket);
  567. socket.addEventListener('message', handleIncomingMessage);
  568. };
  569.  
  570. socket.onclose = () => {
  571. console.log('WebSocket connection closed');
  572. window.sockets = window.sockets.filter(s => s !== socket);
  573. };
  574.  
  575. socket.onerror = (error) => {
  576. console.error('WebSocket error:', error);
  577. };
  578. }
  579.  
  580. // Connect to the WebSocket server
  581. connectToWebSocketServer();
  582.  
  583. // Make an element draggable
  584. function makeDraggable(element) {
  585. let isDragging = false;
  586. let offsetX, offsetY;
  587.  
  588. element.addEventListener('mousedown', (e) => {
  589. isDragging = true;
  590. offsetX = e.clientX - element.getBoundingClientRect().left;
  591. offsetY = e.clientY - element.getBoundingClientRect().top;
  592. element.style.cursor = 'grabbing';
  593. });
  594.  
  595. document.addEventListener('mousemove', (e) => {
  596. if (isDragging) {
  597. element.style.left = `${e.clientX - offsetX}px`;
  598. element.style.top = `${e.clientY - offsetY}px`;
  599. element.style.bottom = 'auto';
  600. element.style.right = 'auto';
  601. }
  602. });
  603.  
  604. document.addEventListener('mouseup', () => {
  605. isDragging = false;
  606. element.style.cursor = 'move';
  607. });
  608. }
  609.  
  610. // Add custom chat commands for moderators
  611. function addCustomChatCommands() {
  612. const originalSendChat = window.sendChat;
  613. window.sendChat = function(message) {
  614. if (message.startsWith('/')) {
  615. const [command, ...args] = message.slice(1).split(' ');
  616. handleChatCommand(command, args);
  617. } else {
  618. originalSendChat.call(this, message);
  619. }
  620. };
  621. }
  622.  
  623. // Handle custom chat commands
  624. function handleChatCommand(command, args) {
  625. switch(command.toLowerCase()) {
  626. case 'ban':
  627. if (args.length > 0) {
  628. handleBanButtonClick(args.join(' '));
  629. }
  630. break;
  631. case 'unban':
  632. if (args.length > 0) {
  633. handleUnbanButtonClick(args.join(' '));
  634. }
  635. break;
  636. case 'mute':
  637. if (args.length > 0) {
  638. handleMuteButtonClick(args.join(' '));
  639. }
  640. break;
  641. case 'unmute':
  642. if (args.length > 0) {
  643. handleUnmuteButtonClick(args.join(' '));
  644. }
  645. break;
  646. case 'kick':
  647. if (args.length > 0) {
  648. handleKickButtonClick(args.join(' '));
  649. }
  650. break;
  651. case 'warn':
  652. if (args.length > 1) {
  653. handleWarnButtonClick(args[0], args.slice(1).join(' '));
  654. }
  655. break;
  656. case 'report':
  657. if (args.length > 1) {
  658. handleReportButtonClick(args[0], args.slice(1).join(' '));
  659. }
  660. break;
  661. case 'highlight':
  662. if (args.length > 0) {
  663. handleHighlightSuspiciousClick(args.join(' '));
  664. }
  665. break;
  666. default:
  667. addModeratorMessages('System', 'Unknown command', `Unknown command: /${command}`);
  668. }
  669. }
  670.  
  671. // Initialize custom chat commands
  672. addCustomChatCommands();
  673.  
  674. })();