Hide c.ai

Hide censorship warning, ads, call button from c.ai

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         Hide c.ai
// @version      2.5.2
// @match        *://character.ai/*
// @grant        none
// @license      WTFPL
// @description  Hide censorship warning, ads, call button from c.ai
// @namespace    hidecai
// ==/UserScript==

(function() {
  'use strict';

  const MULTI_SELECTORS = [
    // censorship warning
    '.border-error',
    // ads title
    '.mx-4.mb-1.justify-between.flex',
    // ads body
    '.text-\\[\\#F3F3F3\\].w-full.justify-center.flex',
    // ads body type 2
    '.rounded-\\[20px\\].duration-300',
    // Google ads
    '[data-google-query-id]'
  ];

  const SINGLE_SELECTORS = [
    // call
    '.bg-background.rounded-md.inline-flex:not(.ml-2)',
    // sidebar
    '.no-underline.tap-highlight-transparent:nth-of-type(2)',
    '.no-underline.tap-highlight-transparent:nth-of-type(3)',
    '.no-underline.tap-highlight-transparent:nth-of-type(4)',
    // bottom warning
    '.-mt-2.justify-center.items-center.flex.relative',
    // background warning
    '.bg-warning\\/20.max-w-\\[340px\\].flex',
    // ads banner
    '.bg-\\[var\\(--G50\\)\\].items-center.justify-center.flex.w-full',
    //'.justify-center .transition-opacity',
    '.h-svh > .w-full',
    // ads fullscreen banner
    '.fixed.z-50.grid.bg-\\[\\#131313\\]',
    // ads fullscreen banner layer
    '.inset-0.z-50',
    // search right side bar
    '.\\32 xl\\:w-\\[380px\\]',
  ];

  function clickCloseButton() {
    const closeBtn = document.querySelector(
        '[role="dialog"] button[aria-label="Close"].bg-\\[\\#333333\\]\\/75'
    );
    if (closeBtn) closeBtn.click();
  }

  function hideSearchAdsTitle() {
    document.querySelectorAll('p.text-xs.font-medium.leading-normal').forEach(p => {
      if (p.textContent.trim() === 'Advertisement') {
        const container = p.closest('.p-2');
        if (container) container.style.display = 'none';
      }
    });
  }

  function hideUpgradeTo() {
    document.querySelectorAll('button').forEach(btn => {
      if (btn.textContent.trim().startsWith('Upgrade to')) {
        const container = btn.closest('.flex.flex-col') || btn.parentElement;
        if (container) container.style.display = 'none';
      }
    });
  }

  function hideElements() {
    MULTI_SELECTORS.forEach(sel =>
      document.querySelectorAll(sel).forEach(el => el.style.display = 'none')
    );
    SINGLE_SELECTORS.forEach(sel => {
      const el = document.querySelector(sel);
      if (el) el.style.display = 'none';
    });
    hideSearchAdsTitle();
    hideUpgradeTo();
    clickCloseButton();
  }

  window.addEventListener('load', hideElements);
  new MutationObserver(hideElements).observe(document.body, {
    childList: true,
    subtree: true,
  });
})();