alchzh / Zoom Buzzer

// ==UserScript==
// @name         Zoom Buzzer
// @namespace    http://tampermonkey.net/
// @version      0.3.2
// @description  Zoom buzz highlighting
// @author       Albert Zhang
// @match        https://*.zoom.us/wc/*/join*
// @grant        none
// @copyright 2020, Albert Zhang (https://openuserjs.org/users/alchzh)
// @license MIT
// ==/UserScript==

function throttle(delay, noTrailing, callback, debounceMode, {
  clearCallback = undefined
} = {}) {
  /*
   * After wrapper has stopped being called, this timeout ensures that
   * `callback` is executed at the proper times in `throttle` and `end`
   * debounce modes.
   */
  let timeoutID;
  let cancelled = false;

  // Keep track of the last time `callback` was executed.
  let lastExec = 0;

  // Function to clear existing timeout
  function clearExistingTimeout() {
    if (timeoutID) {
      clearTimeout(timeoutID);
    }
  }

  // Function to cancel next exec
  function cancel() {
    clearExistingTimeout();
    cancelled = true;
  }

  // `noTrailing` defaults to falsy.
  if (typeof noTrailing !== "boolean") {
    debounceMode = callback;
    callback = noTrailing;
    noTrailing = undefined;
  }

  function clear(cause) {
    clearExistingTimeout();

    if (clearCallback) {
      clearCallback();
    }

    timeoutID = undefined;
  }

  /*
   * The `wrapper` function encapsulates all of the throttling / debouncing
   * functionality and when executed will limit the rate at which `callback`
   * is executed.
   */
  function wrapper(...arguments_) {
    let self = this;
    let elapsed = Date.now() - lastExec;

    if (cancelled) {
      return;
    }

    // Execute `callback` and update the `lastExec` timestamp.
    function exec() {
      lastExec = Date.now();
      callback.apply(self, arguments_);
    }

    if (debounceMode && !timeoutID) {
      /*
       * Since `wrapper` is being called for the first time and
       * `debounceMode` is true (at begin), execute `callback`.
       */
      exec();
    }

    clearExistingTimeout();

    if (debounceMode === undefined && elapsed > delay) {
      /*
       * In throttle mode, if `delay` time has been exceeded, execute
       * `callback`.
       */
      exec();
    }
    else if (noTrailing !== true) {
      /*
       * In trailing throttle mode, since `delay` time has not been
       * exceeded, schedule `callback` to execute `delay` ms after most
       * recent execution.
       *
       * If `debounceMode` is true (at begin), schedule `clear` to execute
       * after `delay` ms.
       *
       * If `debounceMode` is false (at end), schedule `callback` to
       * execute after `delay` ms.
       */
      timeoutID = setTimeout(
        debounceMode ? clear : exec,
        debounceMode === undefined ? delay - elapsed : delay
      );
    }
  }

  wrapper.getTimeoutID = function getTimeoutID() {
    return timeoutID;
  };
  wrapper.cancel = cancel;
  wrapper.clear = clear;

  // Return the wrapper function.
  return wrapper;
}

function debounce(delay, atBegin, callback, options) {
  const wrapper = throttle(delay, false, callback, atBegin !== false, options);
  return wrapper;
}

(function () {
  "use strict";

const STYLES = `
.listClone {
position: absolute !important;
color: transparent;
overflow: visible !important;
z-index: 10;
top: 2px;
left: 4px;
}

.listClone, .listClone * {
pointer-events: none;
color: transparent !important;
}

.listClone * {
background: none;
}

.chat-virtualized-list div[role="presentation"] {
border-color: transparent !important;
}

.chat-virtualized-list.cleared {
background-color: #e2fee2;
}

.chat-virtualized-list.cleared .listClone mark {
background-color: #fecbc8;
box-shadow: 2px 0 0 #fecbc8, -2px 0 0 #fecbc8;
color: #fff !important;
}

.chat-virtualized-list.buzzed {
background-color: #fecbc8;
}

.chat-virtualized-list.buzzed .listClone mark {
color: #000 !important;
}

.chat-virtualized-list.buzzed .listClone mark.new {
background-color: tomato;
box-shadow: 2px 0 0 tomato, -2px 0 0 tomato;
color: #fff !important;
}

.chat-virtualized-list.buzzed .listClone mark.first {
background-color: red;
box-shadow: 2px 0 0 red, -2px 0 0 red;
color: #fff !important;
}


.listClone mark {
border-radius: 2px;
}

.chat-item__chat-info-msg {
background: none !important;
overflow: visible;
}

.clear-button.cleared {
visibility: hidden;
}

.clear-button.buzzed {
visibility: visible;
background: red !important;
color: #fff!important;
padding: 2px 15px;
border-radius: 10.5px;
font-size: 12px;
cursor: pointer;
border: none;
max-width: 181px;
overflow: hidden;
-o-text-overflow: ellipsis;
text-overflow: ellipsis;}
`;

  
    var scriptStyles = document.createElement('style');
    scriptStyles.type = 'text/css';
    scriptStyles.innerHTML = STYLES;
    document.body.appendChild(scriptStyles);


  let beep = new Audio(
    "data:audio/mpeg;base64,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"
  );
  let toWatch = null;
  let chatList = null;
  let clearButton = null;
  const options = {
    subtree: true,
    childList: true,
    characterData: true,
  };
  const observer = new MutationObserver(throttle(100, clone));
  let markPos = Infinity;

  const buzz = debounce(
    30000,
    true,
    (_markPos) => {
      toWatch.classList.add("buzzed");
      toWatch.classList.remove("cleared");
      clearButton.classList.add("buzzed");
      clearButton.classList.remove("cleared");
      markPos = _markPos;
      beep.play();
    }, {
      clearCallback() {
        markPos = Infinity;
        toWatch.classList.add("cleared");
        toWatch.classList.remove("buzzed");
        clearButton.classList.add("cleared");
        clearButton.classList.remove("buzzed");
      }
    }
  );

  let lastBuzzCount = 0;
  let listClone;

  function _clone(mutations, firstRun) {
    if (!(listClone = document.getElementById("listClone"))) {
      listClone = document.createElement("div");
      listClone.classList.add("listClone");
      listClone.id = "listClone";
      listClone.style.cssText = chatList.style.cssText;
    }

    listClone.style.cssText = chatList.style.cssText;
    listClone.innerHTML = chatList.innerHTML;

    let buzzCount = 0;
    Array.from(listClone.getElementsByTagName("pre")).forEach((pre) => {
      pre.innerHTML = pre.innerHTML
        .split("\n")
        .map((s) => {
          if (/^\S*[Bb]\S*[Zz]\S*$/.test(s)) {
            buzzCount += 1;
            if (firstRun !== true && buzzCount === lastBuzzCount + 1) {
              buzz(buzzCount);
            }
            return buzzCount >= markPos ? `<mark class="new">${s.trim()}</mark>` : `<mark>${s.trim()}</mark>`;
          }
          return s.trim();
        })
        .join("\n");
    });

    if (markPos < Infinity) {
      console.log(markPos);
      listClone.getElementsByTagName("mark")[markPos - 1].classList.add("first");
    }

    lastBuzzCount = buzzCount;

    chatList.parentElement.appendChild(listClone);
  }

  function clone() {
    observer.disconnect();

    try {
      _clone.apply(null, arguments);
    }
    finally {
      observer.observe(toWatch, options);
    }
  }

  setInterval(function () {
    const _toWatch = toWatch;
    const _chatList = chatList;
    toWatch = document.querySelector(".chat-virtualized-list");
    chatList = document.querySelector(".chat-virtualized-list .ReactVirtualized__Grid__innerScrollContainer")

    if (!toWatch) {
      observer.disconnect();
      return
    }

    if (toWatch && chatList) {
      if (toWatch !== _toWatch || chatList !== _chatList || !listClone) {
        clearButton = document.createElement("button");
        clearButton.className = "btn btn-default clear-button";
        clearButton.addEventListener("click", () => buzz.clear("button"));
        clearButton.innerHTML = "Clear";
        document.querySelector(".chat-container__chat-control").appendChild(clearButton);

        observer.disconnect();
        clone(null, true);
        buzz.clear("initialization");
      }
      observer.observe(toWatch, options);
    }
  }, 2000);
})();