Kick.com Combined Chatter and Message Counter

Kick.com Combined Chatter and Message Counter - TRUTH EDITION

目前為 2024-01-09 提交的版本,檢視 最新版本

// ==UserScript==
// @name     Kick.com Combined Chatter and Message Counter
// @version  3.02
// @description Kick.com Combined Chatter and Message Counter - TRUTH EDITION
// @author   Graph1ks
// @match    https://kick.com/*
// @grant    none
// @namespace https://gf.qytechs.cn/users/1235079
// ==/UserScript==

(function () {
  'use strict';

  // Configurable options
  const config = {
    interval: 2000, // Set the interval for updating data in milliseconds
    topPosition: '0px', // Adjusted top position
    rightPosition: '80px', // 80 pixels away from the right border
    backgroundColor: '#24272C', // Adjusted background color
    textColor: '#fff' // White text color
  };

  let uniqueUserIds = {};
  let uniqueMessageIds = {};
  let totalMessages = 0;
  let messagesPerMinute = 0;
  let totalChatters = 0;
  let chattersPerMinute = 0;
  let last60SecondsMessages = 0;
  let last60SecondsChatters = 0;
  let scriptStartTime = Date.now();
  let currentStreamSrc = null;
  let pageURL = window.location.href; // Store the current page URL
  let streamerName = extractStreamerNameFromURL(); // Initialize streamerName

  // Create a fixed-position div for displaying the UI
  const uiContainer = document.createElement('div');
  uiContainer.style.position = 'fixed';
  uiContainer.style.top = config.topPosition;
  uiContainer.style.right = config.rightPosition;
  uiContainer.style.padding = '3px';
  uiContainer.style.background = config.backgroundColor;
  uiContainer.style.color = config.textColor;
  uiContainer.style.cursor = 'pointer'; // Add cursor style for clickability
  uiContainer.style.zIndex = '9999'; // Set a high z-index value
  document.body.appendChild(uiContainer);

  function countUniqueUserIdsAndMessages() {
    const userIdElements = document.querySelectorAll('[data-chat-entry-user-id]');
    const messageElements = document.querySelectorAll('[data-chat-entry]');

    const currentTime = Date.now();
    const elapsedMilliseconds = currentTime - scriptStartTime;

    userIdElements.forEach(element => {
      const userId = element.getAttribute('data-chat-entry-user-id');
      uniqueUserIds[userId] = true;
    });

    messageElements.forEach(element => {
      const messageId = element.getAttribute('data-chat-entry');
      uniqueMessageIds[messageId] = true;
    });

    totalMessages = Object.keys(uniqueMessageIds).length;
    totalChatters = Object.keys(uniqueUserIds).length;

    const elapsedSeconds = elapsedMilliseconds / 1000;

    // Calculate the messages and chatters per minute using the last 60 seconds
    if (elapsedSeconds >= 60) {
      messagesPerMinute = Math.round((totalMessages / elapsedSeconds) * 60);
      chattersPerMinute = Math.round((totalChatters / elapsedSeconds) * 60);

      last60SecondsMessages = totalMessages;
      last60SecondsChatters = totalChatters;
    }

    updateUI();
  }

  function checkStreamChange() {
    const videoElement = document.querySelector('video.vjs-tech');
    if (videoElement) {
      const newStreamSrc = videoElement.getAttribute('src');
      const newPageURL = window.location.href; // Get the current page URL

      if (newStreamSrc !== currentStreamSrc || newPageURL !== pageURL) {
        // Reset the script
        uniqueUserIds = {};
        uniqueMessageIds = {};
        totalMessages = 0;
        scriptStartTime = Date.now();

        // Update the streamer name
        streamerName = extractStreamerNameFromURL();

        currentStreamSrc = newStreamSrc;
        pageURL = newPageURL; // Update the stored page URL
      }
    }
  }

  function updateUI() {
    if (isChatAvailable()) {
      uiContainer.style.display = 'block'; // Display the container
      uiContainer.innerHTML = `
        <div style="font-size: 10px;">
          Unique Chatters: <span style="color: #FFA500;">${totalChatters}</span> | per min: ${chattersPerMinute !== 0 ? `<span style="color: #00FF00;">${chattersPerMinute}</span>` : '<span style="color: #00FF00;">Calculating...</span>'}<br>
          Messages: <span style="color: #FFA500;">${totalMessages}</span> | per min: ${messagesPerMinute !== 0 ? `<span style="color: #00FF00;">${messagesPerMinute}</span>` : '<span style="color: #00FF00;">Calculating...</span>'}<br>
          Watch Time: ${formatTimeElapsed(scriptStartTime)}
        </div>
      `;
    } else {
      uiContainer.style.display = 'none'; // Hide the container when there's no chat
    }
  }

  function isChatAvailable() {
    return document.querySelector('[data-chat-entry]') !== null;
  }

  function extractStreamerNameFromURL() {
    const urlParts = window.location.href.split('/');
    const streamerName = urlParts[urlParts.length - 1];
    // Capitalize the first letter
    return streamerName.charAt(0).toUpperCase() + streamerName.slice(1);
  }

  function capitalizeFirstLetter(string) {
    return string.charAt(0).toUpperCase() + string.slice(1);
  }

  function formatTimeElapsed(startTime) {
    const elapsedMilliseconds = Date.now() - startTime;
    const seconds = Math.floor(elapsedMilliseconds / 1000);
    const hours = Math.floor(seconds / 3600);
    const minutes = Math.floor((seconds % 3600) / 60);
    const remainingSeconds = seconds % 60;

    return `${hours}h ${minutes}m ${remainingSeconds}s`;
  }

  uiContainer.addEventListener('click', copyToClipboard);

  function copyToClipboard() {
    const textToCopy = `Streamer: ${streamerName}\nUnique Chatters: ${totalChatters} | per min: ${chattersPerMinute}\nMessages: ${totalMessages} | per min: ${messagesPerMinute}\nWatch Time: ${formatTimeElapsed(scriptStartTime)}`;
    navigator.clipboard.writeText(textToCopy).then(() => {
      uiContainer.innerHTML += '<div style="font-size: 12px; color: #0f0; margin-top: 5px;">Copied to clipboard!</div>';
      setTimeout(() => {
        uiContainer.innerHTML = uiContainer.innerHTML.replace(/<div style="font-size: 12px; color: #0f0; margin-top: 5px;">Copied to clipboard!<\/div>/, '');
      }, 1000);
    });
  }

  countUniqueUserIdsAndMessages();
  checkStreamChange();

  setInterval(() => {
    countUniqueUserIdsAndMessages();
    checkStreamChange();
  }, config.interval);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址