ChatGPT Shortcut Anywhere

Toggle AiShort sidebar on the page

// ==UserScript==
// @name         ChatGPT Shortcut Anywhere
// @name:zh-CN   ChatGPT Shortcut Anywhere
// @name:ja      どこでもChatGPTショートカット
// @name:pt      Atalho ChatGPT Em Qualquer Lugar
// @namespace    https://www.aishort.top/
// @version      0.0.8
// @description  Toggle AiShort sidebar on the page
// @author       BensonLi
// @description:zh-CN ChatGPT Shortcut 扩展的增强版,任意网站都能打开 AiShort 侧边栏
// @description:ja ChatGPT Shortcut 拡張の強化版、任意のウェブサイトで AiShort サイドバーを開くことができます
// @description:pt Versão aprimorada da extensão ChatGPT Shortcut, abre a barra lateral AiShort em qualquer site
// @match        *://chatgpt.com/*
// @match        *://claude.ai/*
// @match        *://gemini.google.com/*
// @match        *://yiyan.baidu.com/*
// @match        *://chatglm.cn/*
// @match        *://*.siliconflow.cn/*
// @match        *://tongyi.aliyun.com/*
// @match        *://kimi.moonshot.cn/*
// @match        *://www.doubao.com/*
// @match        *://xinghuo.xfyun.cn/*
// @match        *://ying.baichuan-ai.com/*
// @match        *://yuanbao.tencent.com/*
// @match        *://groq.com/*
// @match        *://openrouter.ai/*
// @exclude      *://www.aishort.top/*
// @icon         https://www.aishort.top/img/logo.svg
// @grant        none
// @license      MIT
// ==/UserScript==

// You can directly set your preferred language by editing this variable.
// For example, replace 'null' with 'zh' for Chinese, 'en' for English, 'ja' for Japanese, etc.
// Supported language codes include: 'en', 'zh', 'ja', 'ko', 'es', 'fr', 'de', 'it', 'ru', 'pt', 'hi', 'ar', and 'bn'.
// If set to 'null', the script will automatically use the browser's default language.
const userSelectedLanguage = null; // Example: const userSelectedLanguage = 'zh';
// Array of available languages
const AVAILABLE_LANGUAGES = ['en', 'zh', 'ja', 'ko', 'es', 'fr', 'de', 'it', 'ru', 'pt', 'hi', 'ar', 'bn'];

const hostsRequiringPopup = ['chatgpt.com', 'gemini.google.com', 'groq.com', 'openrouter.ai','tongyi.aliyun.com'];
const hostname = window.location.hostname;
const delay = hostname === 'chatgpt.com' ? 5000 : 500;


// Function to get the user-selected language or the browser's default language
function getLanguage() {
    if (AVAILABLE_LANGUAGES.includes(userSelectedLanguage)) {
        return userSelectedLanguage;
    }
    const browserLanguage = navigator.language.split('-')[0];
    return AVAILABLE_LANGUAGES.includes(browserLanguage) ? browserLanguage : 'en';
}

// 获取iframe URL
function getIframeUrl() {
    const userLanguage = getLanguage();
    return userLanguage === 'zh' ? 'https://www.aishort.top/' : `https://www.aishort.top/${userLanguage}/`;
}

// 创建侧边栏按钮及逻辑
function createSidebar() {
    const iframeUrl = getIframeUrl();
    const toggleIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
    toggleIcon.setAttribute('viewBox', '0 0 1024 1024');
    toggleIcon.setAttribute('width', '35');
    toggleIcon.setAttribute('height', '35');
    toggleIcon.innerHTML = '<path d="M85.333333 490.666667A64 64 0 0 0 149.333333 554.666667h725.333334a64 64 0 0 0 0-128h-725.333334A64 64 0 0 0 85.333333 490.666667z" fill="#5cac7c"></path><path d="M405.333333 853.333333a64 64 0 0 1 0-128h469.333334a64 64 0 0 1 0 128h-469.333334z m256-597.333333a64 64 0 0 1 0-128h213.333334a64 64 0 0 1 0 128h-213.333334z" fill="#5cac7c" opacity=".5"></path>';
    toggleIcon.style.position = 'fixed';
    toggleIcon.style.bottom = '300px';
    toggleIcon.style.right = '15px';
    toggleIcon.style.zIndex = '1000';
    toggleIcon.style.cursor = 'pointer';
    document.body.appendChild(toggleIcon);

    if (hostsRequiringPopup.includes(hostname)) {
        let popupWindow = null;
        toggleIcon.addEventListener('click', function() {
            if (popupWindow && !popupWindow.closed) {
                popupWindow.close();
                popupWindow = null;
            } else {
                // 如果窗口未打开或已关闭,打开新窗口
                popupWindow = window.open(iframeUrl, '_blank', 'width=500,height=700');
            }
        });
    } else {
        const iframe = document.createElement('iframe');
        iframe.id = 'ai-shortcut-sidebar';
        iframe.style.cssText = 'width:400px;height:100%;position:fixed;right:-400px;top:0;z-index:999;border:none;transition:right 0.3s ease;';
        iframe.src = iframeUrl;
        document.body.appendChild(iframe);
        toggleIcon.addEventListener('click', function() {
            // 切换iframe显示
            iframe.style.right = (iframe.style.right === '0px') ? '-400px' : '0px';
        });
    }
}

// 检查是否已经存在相同的iframe(包括扩展的)
function checkForExistingIframe(delay) {
    setTimeout(function() {
        const iframes = Array.from(document.getElementsByTagName('iframe'));
        const iframeExistsWithSameHost = iframes.some(iframe => {
            try {
                const iframeSrc = new URL(iframe.src);
                return iframeSrc.hostname === 'www.aishort.top';
            } catch (e) {
                return false; // 无法解析的 iframe 忽略
            }
        });

        if (!iframeExistsWithSameHost) {
            createSidebar();
        }
    }, delay);
}

(function() {
    'use strict';
    window.onload = function() {
        checkForExistingIframe(delay);
    }
})();