Greasy Fork

Greasy Fork is available in English.

CAI Swipe Navigator

Stolen and broken code that hyperlinks to swipes.

当前为 2023-03-15 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         CAI Swipe Navigator
// @namespace    Massgen swipenav
// @version      0.1
// @description  Stolen and broken code that hyperlinks to swipes.
// @author       n/a
// @match        https://beta.character.ai/chat*
// @grant        none
// @license MIT
// ==/UserScript==

// Create display box for showing the message text
var displayBox = document.createElement('div');
displayBox.setAttribute('id', 'message-display-mass-');
displayBox.setAttribute('class', 'messages-list-mass-');
displayBox.setAttribute('style', 'display: none;');
document.body.appendChild(displayBox);

var count = 0;
var prevClass = '';

function clearDisplayAndCount() {
  count = 0;
  document.getElementById('message-display-mass-').innerHTML = '';
}

// Function to retrieve and display the associated message
function getMessage(event) {
  var number = parseInt(event.target.getAttribute('data-slide-number'));
  var messageDiv = document.querySelectorAll('div[class="msg char-msg"]')[number - 1].cloneNode(true); // clone the message element
  var annotationContainer = messageDiv.querySelector('.annotation-buttons-container'); // find the annotation buttons container
  if(annotationContainer !== null) {
    annotationContainer.remove(); // remove the annotation buttons container
  }
  var message = messageDiv.innerHTML;

  // Check if message is already in the message display box before adding it
  var messageExists = false;
  var messageDivs = document.querySelectorAll('.hywmsg.non-deleted');
  for (var i = 0; i < messageDivs.length; i++) {
    if (messageDivs[i].innerHTML.includes(message)) {
      messageExists = true;
      break;
    }
  }

  if (!messageExists) {
    var newMessage = document.createElement('div');
    newMessage.innerHTML = '<div class="slide-number-msg">Swipe ' + (number) + ': </div>' + message;
    newMessage.setAttribute('class', 'hywmsg non-deleted');
    document.getElementById('message-display').appendChild(newMessage);
  }
}
function checkNewMessages() {
  var messages = document.querySelectorAll('.swiper-slide div[class="msg char-msg"]');
  for (var i = 0; i < messages.length; i++) {
    if (!messages[i].hasAttribute('data-isnew')) {
      var messageContent = messages[i].innerHTML;
      if (!messageContent.includes("typing-dot typing-dot-light-bg")) {
        messages[i].setAttribute('data-isnew', 'true');
        var message = messageContent.trim();
        var messageNumber = i + 1;
        var currentClass = messages[i].parentNode.parentNode.parentNode.parentNode.getAttribute('class');
        if (prevClass !== '' && prevClass !== currentClass) {
          count = 0;
          document.getElementById('message-display-mass-').innerHTML = '';
        }
        prevClass = currentClass;
        count++;
        var existingMessage = document.querySelector('.hywmsg.non-deleted-mass-[data-slide-number="' + messageNumber + '"]');
        if (existingMessage) {
          existingMessage.remove();
        }
        var newMessage = document.createElement('div');
        newMessage.setAttribute('data-slide-number', messageNumber);
        newMessage.innerHTML = '<div class="slide-number-msg-mass-">Swipe ' + count + ': </div>' + message;
        newMessage.setAttribute('class', 'hywmsg non-deleted-mass-');
        document.getElementById('message-display-mass-').appendChild(newMessage);
        newMessage.addEventListener('click', getMessage);
      }
    }
  }

  var newMessages = document.querySelectorAll('.hywmsg.non-deleted-mass-');
  for (var i = 0; i < newMessages.length; i++) {
    var annotationButtons = newMessages[i].querySelectorAll('.annotation-buttons-container.col.mb-3');
    for (var j = 0; j < annotationButtons.length; j++) {
      annotationButtons[j].remove();
    }
  }
}


// Function to check for new messages and add them to the display box
function checkNewMessages() {
  var messages = document.querySelectorAll('.swiper-slide div[class="msg char-msg"]');
  for (var i = 0; i < messages.length; i++) {
    if (!messages[i].hasAttribute('data-isnew')) {
      var messageContent = messages[i].innerHTML;
      // Exclude messages with typing-dot typing-dot-light-bg class
      if (!messageContent.includes("typing-dot typing-dot-light-bg")) {
        messages[i].setAttribute('data-isnew', 'true');
        var message = messageContent.trim();
        var messageNumber = i + 1;
        var existingMessage = document.querySelector('.hywmsg.non-deleted-mass-[data-slide-number="' + messageNumber + '"]');
        if (existingMessage) {
          existingMessage.remove();
        }
        var newMessage = document.createElement('div');
        newMessage.setAttribute('data-slide-number', messageNumber);
        newMessage.innerHTML = '<div class="slide-number-msg-mass-">Swipe ' + messageNumber + ': </div>' + message;
        newMessage.setAttribute('class', 'hywmsg non-deleted-mass-');
        document.getElementById('message-display-mass-').appendChild(newMessage);
        newMessage.addEventListener('click', getMessage);
      }
    }
  }

  // Remove the annotation buttons from newly added messages
  var newMessages = document.querySelectorAll('.hywmsg.non-deleted-mass-');
  for (var i = 0; i < newMessages.length; i++) {
    var annotationButtons = newMessages[i].querySelectorAll('.annotation-buttons-container.col.mb-3');
    for (var j = 0; j < annotationButtons.length; j++) {
      annotationButtons[j].remove();
    }
  }


        // Function to navigate to the corresponding slide when slide-number-msg element is clicked
function navigateToSlide(event) {
  var slideNumber = parseInt(event.target.getAttribute('data-slide-number'));
  var activeSlideNumber = parseInt(document.querySelector('.swiper-slide.swiper-slide-active').getAttribute('data-slide-number'));
  var slideDifference = slideNumber - activeSlideNumber;
  if (slideDifference < 0) {
    for (var i = 0; i < Math.abs(slideDifference); i++) {
      document.querySelector('.swiper-button-prev').click();
    }
  } else if (slideDifference > 0) {
    for (var i = 0; i < slideDifference; i++) {
      document.querySelector('.swiper-button-next').click();
    }
  }
}

// Add slide navigation function to slide-number-msg elements
var slideNumberMsgs = document.querySelectorAll('.slide-number-msg-mass-');
for (var i = 0; i < slideNumberMsgs.length; i++) {
  slideNumberMsgs[i].setAttribute('data-slide-number', i + 1);
  slideNumberMsgs[i].addEventListener('click', navigateToSlide);
}

// Add numbered navigation to swiper-slide elements
var swiperSlides = document.getElementsByClassName('swiper-slide');
for (var i = 0; i < swiperSlides.length; i++) {
  swiperSlides[i].setAttribute('data-slide-number', i + 1);

  // Check if slide already has a slide-number element before adding one
  if (!swiperSlides[i].querySelector('.slide-number-mass-')) {
    var messageNumber = document.createElement('div');
    messageNumber.innerHTML = i + 1;
    messageNumber.setAttribute('class', 'slide-number-mass-');
    messageNumber.setAttribute('data-slide-number', i + 1);
    messageNumber.onclick = function() {
      var slideNumber = this.getAttribute('data-slide-number');
      var activeSlideNumber = document.querySelector('.swiper-slide.swiper-slide-active').getAttribute('data-slide-number');
      var slideDifference = slideNumber - activeSlideNumber;
      if (slideDifference < 0) {
        for (var i = 0; i < Math.abs(slideDifference); i++) {
          document.querySelector('.swiper-button-prev').click();
        }
      } else if (slideDifference > 0) {
        for (var i = 0; i < slideDifference; i++) {
          document.querySelector('.swiper-button-next').click();
        }
      }
    };
    swiperSlides[i].appendChild(messageNumber);
  }
}

  // Add class to currently active swiper-slide element
  var activeSlide = document.querySelector('.swiper-slide.swiper-slide-active');
  activeSlide.classList.add('active-slide-mass-');
}

// Create a MutationObserver to detect changes in the DOM
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
      if (mutation.target.classList.contains('infinite-scroll-component')) {
        clearDisplayAndCount();
      }
    }
  });
});

// Observe changes in the body element and its child nodes
observer.observe(document.body, {
  childList: true,
  subtree: true
});

// Call the checkNewMessages function every second
setInterval(checkNewMessages, 1000);



// Style HTML
let styleHTML = document.createElement('style');
styleHTML.innerHTML = `
html {
    height: 100%;
    overflow: hidden;
    width: 100%;
}
body {
    height: 100%;
    overflow-x: hidden;
    overflow-y: auto;
    width: 100%;
}
.messages-list-mass- {
   padding: 4px 4px 3px 4px;
   margin: 40px 4px 0 0;
   border: 3px solid gray;
   position: absolute;
   top: 0;
   right: 0;
   width: 20%;
   height: 80%;
   overflow-y: scroll;
   border-radius: 0 0 8px 8px;
   z-index: 100;
   resize: both;
   direction: rtl;
   min-width: 100px;
   min-height: 100px;
}
.display-btn-mass- {
   cursor: pointer;
   user-select: none;
   border: 3px solid gray;
   padding: 4px;
   margin: 4px;
   width: 20%;
   position: absolute;
   top: 0;
   right: 0;
   background-color: lightsteelblue;
   color: black;
   font-weight: bold;
   text-align: center;
   z-index: 100;
}
.messages-list-mass- div {
   margin-top: 5px;
   padding: 8px;
   background-color: lightpink;
   direction: ltr;
}
.hywmsg-mass- {
   border-radius: 8px;
}
.hywmsg.non-deleted-mass- {
   background-color: aquamarine;
}
.hywmsg.hidden-mass- {
   display: none;
}
.screen-btn-mass- {
   cursor: pointer;
   user-select: none;
   border: 3px solid gray;
   padding: 4px;
   margin: 4px;
   width: 20%;
   position: absolute;
   top: 0;
   right: 0;
   background-color: lightsteelblue;
   color: black;
   font-weight: bold;
   text-align: center;
   z-index: 100;
}
.swiper-slide {
  position: relative;
}
.slide-number-mass- {
  position: absolute;
  top: 0;
  right: 0;
  background-color: white;
  border-radius: 50%;
  height: 20px;
  width: 20px;
  text-align: center;
  line-height: 20px;
  font-weight: bold;
}
.active-slide-mass- .slide-number-mass- {
  background-color: lightsteelblue;
  color: black;
}
.slide-number-msg-mass- {
  display: inline-block;
  margin-right: 5px;
  font-weight: bold;
  cursor: pointer;
}
`
document.body.appendChild(styleHTML);

// Button HTML
let buttonHTML = document.createElement('div');
buttonHTML.innerHTML = "Massgen Navigation";
buttonHTML.onclick = function () {
    let msgList = document.getElementsByClassName('messages-list-mass-')[0]
    if (msgList.style.display === "none") {
        msgList.style.display = "block";
    } else {
        msgList.style.display = "none";
    }
};
buttonHTML.classList.add("display-btn-mass-");
document.body.appendChild(buttonHTML);


window.addEventListener('load', function() {
    const displayBtn = {
        default: document.querySelector('.display-btn'),
        massgen: document.querySelector('.display-btn-mass-'),
    };
    const messagesList = {
        default: document.querySelector('.messages-list'),
        massgen: document.querySelector('.messages-list-mass-'),
    };
    const hideBtn = document.createElement('div');
    let isHidden = false;
    let currentMode = 'default';

    function setMode(mode) {
        if (mode === currentMode) {
            return;
        }
        if (mode === 'default') {
            displayBtn.default.style.display = 'block';
            messagesList.default.style.display = 'block';
            displayBtn.massgen.style.display = 'none';
            messagesList.massgen.style.display = 'none';
            hideBtn.innerHTML = 'HYW';
        } else if (mode === 'massgen') {
            displayBtn.default.style.display = 'none';
            messagesList.default.style.display = 'none';
            displayBtn.massgen.style.display = 'block';
            messagesList.massgen.style.display = 'block';
            hideBtn.innerHTML = 'Massgen';
        }
        currentMode = mode;
    }

    hideBtn.innerHTML = 'HYW';
    hideBtn.style.position = 'absolute';
    hideBtn.style.top = '50px';
    hideBtn.style.right = '400px';
    hideBtn.style.cursor = 'pointer';
    hideBtn.style.userSelect = 'none';
    hideBtn.style.border = '3px solid grey';
    hideBtn.style.padding = '8px';
    hideBtn.style.margin = '4px';
    hideBtn.style.backgroundColor = 'lightsteelblue';
    hideBtn.style.color = 'white';
    hideBtn.style.fontWeight = 'bold';
    hideBtn.style.textAlign = 'center';
    hideBtn.style.zIndex = '100';

    hideBtn.onclick = function () {
        if (isHidden) {
            setMode('default');
            hideBtn.style.backgroundColor = 'lightsteelblue';
            isHidden = false;
        } else {
            setMode('massgen');
            hideBtn.style.backgroundColor = 'lightsteelblue';
            isHidden = true;
        }
    };
            displayBtn.massgen.style.display = 'none';
            messagesList.massgen.style.display = 'none';
    document.body.appendChild(hideBtn);
});