Midjourney Click All

Click all the buttons in a row at once when you're in Discord with Midjourney bot open! 😊

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @name         Midjourney Click All
// @description  Click all the buttons in a row at once when you're in Discord with Midjourney bot open! 😊
// @author       mefengl
// @version      0.3.3
// @namespace    https://github.com/mefengl
// @icon         https://www.google.com/s2/favicons?sz=64&domain=midjourney.com
// @license      MIT
// @match        https://discord.com/channels/*
// @grant        none

// @name:en      Midjourney Click All
// @description:en Click all the buttons in a row at once when you're in Discord with Midjourney bot open! 😊
// @name:zh-CN   Midjourney一键点击
// @description:zh-CN 当你在Discord中打开Midjourney机器人时,一次点击一排的所有按钮!😊
// @name:es      Midjourney Click Todo
// @description:es ¡Haz clic en todos los botones en una fila a la vez cuando estés en Discord con el bot de Midjourney abierto! 😊
// @name:hi      Midjourney सभी पर क्लिक करें
// @description:hi जब आप Discord में Midjourney बॉट के साथ हों, तो एक बार में सभी बटनों पर क्लिक करें! 😊
// @name:ar      Midjourney انقر على الكل
// @description:ar انقر على جميع الأزرار في صف واحد في وقت واحد عندما تكون في Discord مع بوت Midjourney مفتوح! 😊
// @name:pt      Midjourney Clique Tudo
// @description:pt Clique em todos os botões em uma linha de uma vez quando estiver no Discord com o bot Midjourney aberto! 😊
// @name:ru      Midjourney Нажмите на все
// @description:ru Нажмите все кнопки в ряду сразу, когда вы находитесь в Discord с открытым ботом Midjourney! 😊
// @name:ja      Midjourney すべてをクリック
// @description:ja DiscordでMidjourneyボットを開いているときに、一度にすべてのボタンをクリックします!😊
// @name:de      Midjourney Klick Alles
// @description:de Klicken Sie auf alle Tasten in einer Reihe auf einmal, wenn Sie in Discord mit dem geöffneten Midjourney-Bot sind! 😊
// @name:fr      Midjourney Cliquez sur Tout
// @description:fr Cliquez sur tous les boutons d'une rangée à la fois lorsque vous êtes sur Discord avec le bot Midjourney ouvert! 😊
// ==/UserScript==
"use strict";
(() => {
  var __async = (__this, __arguments, generator) => {
    return new Promise((resolve, reject) => {
      var fulfilled = (value) => {
        try {
          step(generator.next(value));
        } catch (e) {
          reject(e);
        }
      };
      var rejected = (value) => {
        try {
          step(generator.throw(value));
        } catch (e) {
          reject(e);
        }
      };
      var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
      step((generator = generator.apply(__this, __arguments)).next());
    });
  };

  // ../../packages/monkit/dist/index.mjs
  function onUrlChange(callback) {
    let oldHref = document.location.href;
    return window.setInterval(() => {
      const newHref = document.location.href;
      if (oldHref !== newHref)
        callback(oldHref = newHref);
    }, 1e3);
  }

  // ../../packages/midkit/dist/index.mjs
  function sleep(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }
  function getButtonContainers(container = document.body) {
    return Array.from(container.querySelectorAll("[id^='message-accessorie'] [class^='children']"));
  }
  var CLONE_BUTTON_CLASS = "cloned-button";
  function getButtons(temp) {
    const buttons = temp.querySelectorAll("button");
    const originalButtons = Array.from(buttons).filter((button) => !button.classList.contains(CLONE_BUTTON_CLASS));
    return originalButtons;
  }
  function oneMoreButton(temp) {
    const buttons = getButtons(temp);
    const lastButton = buttons[buttons.length - 1];
    const cloneButton = lastButton.cloneNode();
    cloneButton.classList.add(CLONE_BUTTON_CLASS);
    lastButton.parentNode.insertBefore(cloneButton, lastButton.nextSibling);
    return cloneButton;
  }
  function getSubmitButton() {
    return document.querySelector('button[type="submit"]');
  }
  function submitForm() {
    return __async(this, null, function* () {
      const submitButton = getSubmitButton();
      if (!submitButton) {
        console.log("No submit button found");
        return;
      }
      submitButton.click();
    });
  }
  function getFormNumber() {
    const forms = document.querySelectorAll("form");
    return forms.length;
  }
  function clickAllButtonsWithConfirm(temp) {
    return __async(this, null, function* () {
      const buttons = getButtons(temp);
      for (const button of buttons) {
        button.click();
        while (getFormNumber() === 1) {
          yield sleep(500);
          console.log("Opening...");
        }
        submitForm();
        while (getFormNumber() === 2) {
          yield sleep(500);
          console.log("Submitting...");
        }
      }
    });
  }
  function isClicking(button) {
    return button.querySelector("div > div").getAttribute("aria-hidden") === "true";
  }
  function clickAllButtons(temp) {
    return __async(this, null, function* () {
      const buttons = getButtons(temp);
      buttons.pop();
      for (const button of buttons) {
        button.click();
        while (!isClicking(button)) {
          yield sleep(10);
          console.log("Waiting for clicking...");
        }
        while (isClicking(button)) {
          yield sleep(500);
          console.log("Clicking...");
        }
      }
    });
  }
  function smartClickAllButtons(temp) {
    return __async(this, null, function* () {
      const buttons = getButtons(temp);
      const testText = buttons[0].textContent;
      if (testText == null ? void 0 : testText.startsWith("U")) {
        yield clickAllButtons(temp);
      } else {
        yield clickAllButtonsWithConfirm(temp);
      }
    });
  }
  function getScrollerInner() {
    return document.querySelector("[data-list-id='chat-messages']");
  }
  function onScrollerInnerChange(callback) {
    let observer = new MutationObserver((mutations) => {
      for (let mutation of mutations) {
        for (let node of Array.from(mutation.addedNodes)) {
          if (node.nodeName.toLowerCase() === "li" && node instanceof Element)
            callback(node);
        }
      }
    });
    const scrollerInner = getScrollerInner();
    if (!scrollerInner)
      return null;
    observer.observe(scrollerInner, { childList: true });
    return observer;
  }

  // src/index.ts
  function initialize() {
    return __async(this, null, function* () {
      yield new Promise((resolve) => window.addEventListener("load", resolve));
      yield new Promise((resolve) => setTimeout(resolve, 6e3));
    });
  }
  function addClickAllButton(root) {
    const buttonContainers = getButtonContainers(root);
    for (const buttonContainer of buttonContainers) {
      if (getButtons(buttonContainer).length < 4)
        continue;
      const clickAllButton = oneMoreButton(buttonContainer);
      clickAllButton.textContent = "ALL";
      clickAllButton.addEventListener("click", () => {
        smartClickAllButtons(buttonContainer);
      });
    }
  }
  function addClickAllButtonWithCheck(root) {
    if (!(root == null ? void 0 : root.querySelector(".cloned-button")))
      addClickAllButton(root);
  }
  function checkClickAllButtonFiveTimes(root) {
    return __async(this, null, function* () {
      for (let i = 0; i < 5; i++) {
        yield new Promise((resolve) => setTimeout(resolve, 3e3));
        addClickAllButtonWithCheck(root);
      }
    });
  }
  function addClickAllButtonWithCheckFiveTimes(root) {
    return __async(this, null, function* () {
      addClickAllButton(root);
      yield checkClickAllButtonFiveTimes(root);
    });
  }
  function main() {
    return __async(this, null, function* () {
      yield initialize();
      addClickAllButton(void 0);
      onScrollerInnerChange(addClickAllButtonWithCheckFiveTimes);
      onUrlChange(() => {
        addClickAllButton(void 0);
        onScrollerInnerChange(addClickAllButtonWithCheckFiveTimes);
      });
    });
  }
  (function() {
    main();
  })();
})();