3cx auto-join

3cx auto-join.

// ==UserScript==
// @name         3cx auto-join
// @namespace    cwrau.info
// @license      unlicense
// @version      1.0.3
// @description  3cx auto-join.
// @author       https://github.com/cwrau
// @match        https://3cx.*.*/meet/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=teuto.net
// ==/UserScript==
'use strict';

const observers = [];

function waitForElement(selector, element = document.body) {
    return new Promise(resolve => {
        const found = element.querySelector(selector);
        if (found) {
            return resolve(found);
        }

        const observer = new MutationObserver(mutations => {
            const found = element.querySelector(selector);
            if (found) {
                observers.forEach(o => o.disconnect());
                resolve(found);
            }
            mutations.forEach(mutation => {
                mutation.addedNodes.forEach(node => {
                    if (node.shadowRoot) {
                        waitForElement(selector, node.shadowRoot).then(e => {
                            observers.forEach(o => o.disconnect());
                            resolve(e);
                        });
                    }
                });
            });
        });
        observer.observe(element, {childList: true, subtree: true});
        observers.push(observer);

        element.querySelectorAll('*').forEach(e => {
            if (e.shadowRoot) {
                waitForElement(selector, e.shadowRoot).then(e => {
                    observers.forEach(o => o.disconnect());
                    resolve(e);
                });
            }
        });
    });
}

waitForElement('.join-button').then((elm) => {
    setTimeout(() => {
        elm.click();
    }, 1000);
});