Skip to content
This repository has been archived by the owner on Sep 24, 2022. It is now read-only.

Kudos to skip virtual activities #24

Open
calcium opened this issue Mar 24, 2021 · 2 comments
Open

Kudos to skip virtual activities #24

calcium opened this issue Mar 24, 2021 · 2 comments

Comments

@calcium
Copy link

calcium commented Mar 24, 2021

Hello,
Is this feature possible? Was just wondering. :-)

@o2dazone
Copy link
Owner

the UI does expose a icon-virtualride class for virtual activities, so technically it would be possible to not include virtual activities in auto-kudos'ing. I think the more difficult part of implementing this would be offering the ability to choose, and store it in the extension itself. Perhaps a checkbox that saves your decision to Kudos virtual activities, this may require more browser permissions in the extension.

The reality is, I haven't used Strava in over a year, so my drive to implement it is pretty low 😬. I am happy to review and accept pull requests if you're willing to code it though :) Alternatively, if you use Violentmonkey or Tampermonkey , or any Chrome extension that allows dynamic injection of Javascript, I'm happy to whip up a modified version of this extension to only Kudos non virtual activities. This would prevent you from having to use my extension, and can just depend on the script instead.

@o2dazone
Copy link
Owner

o2dazone commented Jul 30, 2021

Hey @calcium,

Here is a modified version of the script taken directly from the repo This should filter out any virtual activities, although it's not thoroughly tested.

// ==UserScript==
// @name        StravaKudos modified
// @namespace   Violentmonkey Scripts
// @match       https://www.strava.com/*
// @grant       none
// @version     1.0
// @author      -
// @description 7/30/2021, 2:57:49 PM
// ==/UserScript==
(function() {
  let kudosBtns = []
    , KUDOS_INTERVAL = 1000 // in milliseconds
    , KUDOS_LOCKOUT = 100 // https://github.com/o2dazone/StravaKudos/issues/13#issuecomment-356319221
    , btn
    , viewingAthleteId
    , els = '[data-testid=\'unfilled_kudos\']';

  const init =() => {
    const styles = document.createElement('style');
    styles.innerHTML = `
      #stravaKudos {
        display: flex;
        flex-direction: column;
        left: 5px;
        font-size: 20px;
        box-shadow: 0 2px 1px rgba(0, 0, 0, 0.2);
        z-index: 49;
        position: fixed;
        top: 61px
      }

      #stravaKudos div {
        margin: 0 auto
      }

      #stravaKudos p {
        margin: 0;
        font-size: 14px
      }

      #stravaKudos.hidden,
      #stravaKudos.lockout p {
        display: none !important;
        visibility: hidden !important
      }

      #stravaKudosCount {
        margin: 0 3px;
        font-weight: bold
      }
    `;
    document.head.prepend(styles);

    btn = document.createElement('button');
    btn.id = 'stravaKudos';
    btn.innerHTML = `
      <div>Give <span id="skCount"></span> Kudos</div>
      <p>Strava may throttle too<br/>many Kudos in one session</p>
    `;
    btn.className = 'btn btn-sm btn-primary hidden';

    btn.addEventListener('click', giveKudos);
    document.body.prepend(btn);
    updateCountNum();
  };
  /* eslint-disable-next-line */
  const mockFillKudo = btn => {
    btn.setAttribute('fill','#FC5200');
    btn.dataset.testid = 'filled_kudos';
  };

  // give ALL the kudos
  const giveKudos = () => {
    setTimeout(() => {
      const kudoBtn = getEligibleKudoButtons()?.[0];
      if(kudoBtn) {
        // mockFillKudo(kudoBtn); /* for testing purposes only */
        kudoBtn.parentNode.click();
        giveKudos();
      }
    }, KUDOS_INTERVAL);
  };

  // toggle box styles
  const toggleKudosBox = () => {
    const num = kudosBtns.length;
    if (num) {
      btn.classList.remove('hidden');

      if (num < KUDOS_LOCKOUT) {
        btn.classList.add('lockout');
      } else {
        btn.classList.remove('lockout');
      }
    } else {
      btn.classList.add('hidden');
    }
  };

  const getEligibleKudoButtons = () => {
    const activityAvatars = document.querySelectorAll('[data-testid="owner-avatar"]');
    const buttons = [];

    activityAvatars.forEach(avatar => {
      // activity card is not your own
      if (!avatar.href.includes(viewingAthleteId)) {
        const activityCard = avatar.closest('[class*="--child-entry"]') /* group activity */ ||
                             avatar.closest('[data-testid="web-feed-entry"]') /* solo activity */;

        const cardProps = activityCard.parentNode.dataset.reactProps;

        let isVirtual = false;
        if (cardProps) {
          const parsedCardProps = JSON.parse(cardProps);
          isVirtual = parsedCardProps.activity.isVirtual;
        }

        !isVirtual && activityCard.querySelector(els) && buttons.push(activityCard.querySelector(els));
      }
    });

    return buttons;
  };

  // publish number of kudos
  const updateCountNum = () => {
    const count = document.getElementById('skCount');
    viewingAthleteId = document.querySelector('.user-menu > a')?.href?.match(/\d+/)?.[0]; // store viewing athlete id

    if (count) {
      setInterval(() => {
        kudosBtns = getEligibleKudoButtons();
        count.innerHTML = kudosBtns.length;
        toggleKudosBox();
      }, KUDOS_INTERVAL);
    }
  };

  init();
}());

Here is a diff of just the things I've changed

-        activityCard.querySelector(els) && buttons.push(activityCard.querySelector(els));
+        const cardProps = activityCard.parentNode.dataset.reactProps;
+
+        let isVirtual = false;
+        if (cardProps) {
+          const parsedCardProps = JSON.parse(cardProps);
+          isVirtual = parsedCardProps.activity.isVirtual;
+        }
+
+        !isVirtual && activityCard.querySelector(els) && buttons.push(activityCard.querySelector(els));

You can sideload this with the chrome extensions I mentioned above - this would replace the existing StravaKudos extension, so you can disable/remove that extension from your browser.

Let me know if this doesn't work.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants