text: // 1. Go to https://www.linkedin.com/company/{COMPANY_NAME}/people/
  // 2. Make sure your LinkedIn is in English
  // 3. Modify the constants to your liking
  // 4. Open chrome dev tools and paste this script or add it as a snippet
  
  (async () => {
    // maximum amount of connection requests
    const MAX_CONNECTIONS = 10;
    // time in ms to wait before requesting to connect
    const WAIT_TO_CONNECT = 2000;
    // time in ms to wait before new employees load after scroll
    const WAIT_AFTER_SCROLL = 3000;
    // message to connect (%EMPLOYEE% and %COMPANY% will be replaced with real values)
    const MESSAGE = `Hi %EMPLOYEE%, I'm a Software Engineer with 4 yrs of experience in full-stack web development. 
  	I see you're currently working at %COMPANY% where I saw a Full Stack job post and was interested to hear more about it. 
  	Would you (or a colleague) have time to chat about the position?
  	Thanks! Mario`;
    // keywords to filter employees in specific positions
    const POSITION_KEYWORDS = [
      "software",
      "developer",
      "full stack",
      "back end",
      "front end",
      "r&d",
    ];
  
    // <--> //
  
    const MESSAGE_CHAR_LIMIT = 300;
  
    function buildMessage(employee) {
      const company = document.getElementsByClassName(
        "org-top-card-summary__title"
      )[0].title;
  
      const replacements = { "%COMPANY%": company, "%EMPLOYEE%": employee };
      const message = MESSAGE.replace(/%\w+%/g, (i) => {
        return replacements[i];
      });
  
      return message.length <= MESSAGE_CHAR_LIMIT ? message : "";
    }
  
    function getButtonElements() {
      return [
        ...document.querySelectorAll(
          'button[data-control-name="people_profile_card_connect_button"]'
        ),
      ].filter((button) => {
        const cardInnerText = button.offsetParent.innerText.split("\n");
        const positionIndex = cardInnerText.length > 3 ? 3 : 1;
        const position = cardInnerText[positionIndex];
        return POSITION_KEYWORDS.some((p) => position.match(new RegExp(p, "gi")));
      });
    }
  
    function fillMessageAndConnect() {
      const employee = document
        .getElementById("send-invite-modal")
        .innerText.split(" ")[1];
      document.getElementById("custom-message").value = buildMessage(employee);
      document
        .getElementById("artdeco-modal-outlet")
        .getElementsByTagName("button")[2]
        .click();
      console.log(`🤝 Requested connection to ${employee}`);
    }
  
    async function connect(button) {
      return new Promise((resolve) => {
        setTimeout(() => {
          button.click();
          fillMessageAndConnect();
          resolve();
        }, WAIT_TO_CONNECT);
      });
    }
  
    async function* getConnectButtons() {
      while ((buttons = getButtonElements()).length > 0) {
        yield* buttons;
        await loadMoreButtons();
      }
    }
  
    async function loadMoreButtons() {
      console.log("⏬ Scrolling..");
      await Promise.resolve(window.scrollTo(0, document.body.scrollHeight));
      return new Promise((resolve) => setTimeout(resolve, WAIT_AFTER_SCROLL));
    }
  
    // <--> //
  
    console.log("⏳ Started connecting, please wait.");
    try {
      var connections = 0;
      const buttonsGenerator = getConnectButtons();
      while (
        connections < MAX_CONNECTIONS &&
        !(next = await buttonsGenerator.next()).done
      ) {
        const button = next.value;
        await connect(button);
        connections++;
      }
      console.log(
        `✅ Done! Successfully requested connection to ${connections} people.`
      );
    } catch {
      console.log(
        `⛔ Whoops, looks like something went wrong. 
  		Please go to https://github.com/mariiio/linkedin_connect and follow the instructions.`
      );
    }
  })();
  