跳转到内容

User:Kurgenera/pet.js

维基百科,自由的百科全书
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
// 【维基宠物/状态指示器脚本 V1.0】
$(function() {
    // ***************************************************************
    // 1. 配置
    // ***************************************************************
    // 状态持久化存储键名
    const PET_STORAGE_KEY = 'wiki-pet-state-hidden-v7';
    // 优先级 1.1:触发黑色警告的用户(最高优先级)
    const TARGET_USERS = [
        'Example', 'Jackyming', 
    ];
    // 优先级 1.2:触发红色警告的页面(第二优先级)
    const CRITICAL_PAGES = [
        'Wikipedia:Administrator_requests/Block', 
        'Wikipedia:管理員布告板/其他不当行为', 'WP:ANM' ,
        'WP:VP' ,
        'WP:VPH' , 'Wikipedia:互助客栈/求助',
        'WP:VPO' , 'Wikipedia:互助客栈/其他',
        'WP:VP' , 'Wikipedia:互助客栈/方针',
        'WP:WPA' , 'Wikipedia:互助客栈/条目探讨',
    ];
    // ***************************************************************

    const PET_ID = 'wiki-pet-status-emoji';
    const hour = new Date().getHours();
    // ... (页面和用户检测变量定义保持不变) ...

    // --- 页面和用户检测变量定义 (和 V6.0 相同) ---
    const currentPage = mw.config.get('wgPageName');
    const userName = mw.config.get('wgUserName');
    const relevantUser = mw.config.get('wgRelevantUserName');
    const isContribs = mw.config.get('wgCanonicalSpecialPageName') === 'Contributions';
    const namespaceNumber = mw.config.get('wgNamespaceNumber');

    // 优先级 1.1 检查:目标用户页面(最高)
    const isTargetUserContribs = isContribs && TARGET_USERS.includes(relevantUser);
    const isTargetUserPage = TARGET_USERS.some(target => {
        const userPrefix = 'User:' + target;
        const talkPrefix = 'User_talk:' + target;
        return currentPage.startsWith(userPrefix) || currentPage.startsWith(talkPrefix);
    });
    const isHighestPriority = isTargetUserContribs || isTargetUserPage;

    // 优先级 1.2 检查:关键页面(第二高)
    const isCriticalPage = CRITICAL_PAGES.some(page => currentPage.startsWith(page));
    
    // 优先级 2 检查:自己的页面
    const isOwnPage = currentPage.startsWith('User:' + userName) || currentPage.startsWith('User_talk:' + userName);
    // ---------------------------------------------------------------


    // 2. 注入基础 CSS (包含桌面、移动端及隐藏状态)
    var petBaseCSS = 
        // --- 桌面/平板通用样式 (80px) ---
        '#' + PET_ID + ' {' +
            'position: fixed !important; bottom: 20px; left: 20px; width: 128px; height: 128px; line-height: 12/px; text-align: center; font-size: 80px; border-radius: 50%; box-shadow: 0 4px 8px rgba(0,0,0,0.3); z-index: 99999; border: 3px solid white; cursor: help; transition: all 0.5s ease-in-out; }' +
        '#' + PET_ID + ':hover { transform: scale(1.1); }' + 
        
        // --- 隐藏状态 CSS:缩小到 15px 小点 ---
        '.pet-hidden {' +
            'width: 15px !important;' +
            'height: 15px !important;' +
            'line-height: 15px !important;' +
            'font-size: 0 !important;' + // 隐藏 Emoji
            'border-radius: 50% !important;' +
            'opacity: 0.8 !important;' +
            'box-shadow: none !important;' +
            'cursor: pointer !important;' +
            'transform: none !important;' +
        '}' +

        // --- 移动端优化样式 ---
        '@media screen and (max-width: 768px) {' +
            '#' + PET_ID + ' {' +
                'width: 50px !important; height: 50px !important; line-height: 50px !important; font-size: 30px !important; bottom: 10px !important; left: 10px !important; }' +
            '#' + PET_ID + ':hover { transform: none !important; }' +
            '.pet-hidden { width: 12px !important; height: 12px !important; bottom: 5px !important; left: 5px !important; }' + // 移动端隐藏时更小
        '}';
    
    mw.util.addCSS(petBaseCSS);

    // 3. 创建宠物 HTML 元素并添加到页面
    var $pet = $('<div>').attr('id', PET_ID);
    $('body').append($pet);
    
    // 4. 核心逻辑:按优先级执行状态更新
    function updatePetStatus() {
        var status = {};

        // === 优先级判断逻辑 (和 V6.0 相同) ===
        if (isHighestPriority) {
            status.text = '🔴 警告:正在查看目标用户页面!情绪保持稳定!';
            status.emoji = '🚫'; status.bg = '#111111'; status.borderColor = '#FF0000';
        } else if (isCriticalPage) {
            status.text = '🔔 注意:已进入关键讨论区,保持冷静和客观。';
            status.emoji = '🚨'; status.bg = '#FFC0CB'; status.borderColor = '#FF0000';
        } else if (isOwnPage) {
            status.text = '🏠 欢迎回家!这是您的私人空间。';
            status.emoji = '🏡'; status.bg = '#F0FFF0'; status.borderColor = '#006400';
        } else if (namespaceNumber === 3) {
            status.text = '💬 友好交流模式开启!保持微笑和理性。';
            status.emoji = '😊'; status.bg = '#E6E6FA'; status.borderColor = '#483D8B';
        } else if (namespaceNumber === 4) {
            status.text = '💼 站务模式:请参与讨论,保持方针和指引意识。';
            status.emoji = '🏛️'; status.bg = '#ADD8E6'; status.borderColor = '#4682B4';
        } else if (namespaceNumber === 0) {
            status.text = '📚 条目编辑模式:正在贡献知识!';
            status.emoji = '✨'; status.bg = '#FAFAD2'; status.borderColor = '#DAA520';
        } else if (hour >= 5 && hour < 12) {
            status.text = '早上好!宠物状态:活跃中。';
            status.emoji = '☕'; status.bg = '#E8F5E9'; status.borderColor = '#4CAF50'; 
        } else if (hour >= 12 && hour < 18) {
            status.text = '下午好!宠物状态:正在专注工作。';
            status.emoji = '📝'; status.bg = '#FFFDE7'; status.borderColor = '#FFC107'; 
        } else if (hour >= 18 && hour < 23) {
            status.text = '晚上好!宠物状态:正在放松休息。';
            status.emoji = '📚'; status.bg = '#E3F2FD'; status.borderColor = '#2196F3'; 
        } else {
            status.text = '深夜了,宠物状态:已进入休息模式。';
            status.emoji = '💤'; status.bg = '#263238'; status.borderColor = '#3F51B5'; 
        }
        
        // 应用样式和更新提示文本
        $pet.html(status.emoji).css({
            'background-color': status.bg,
            'border-color': status.borderColor
        });
        
        // 如果宠物处于隐藏状态,我们不更新其 title,避免覆盖恢复提示
        if (!$pet.hasClass('pet-hidden')) {
            $pet.attr('title', status.text);
        }
    }


    // 5. 初始状态检查和点击事件逻辑 (核心改动)
    
    // 5.1 注册点击事件
    $pet.on('click', function() {
        const isCurrentlyHidden = $pet.hasClass('pet-hidden');
        
        if (isCurrentlyHidden) {
            // 从隐藏状态恢复显示
            $pet.removeClass('pet-hidden');
            localStorage.removeItem(PET_STORAGE_KEY);
            updatePetStatus(); // 恢复后重新运行状态判断,更新 title
        } else {
            // 隐藏宠物
            $pet.addClass('pet-hidden');
            localStorage.setItem(PET_STORAGE_KEY, 'true');
            $pet.attr('title', '维基宠物:点击恢复显示'); // 设置新的悬停提示
            // 隐藏时保留颜色,以便用户知道它是什么状态的小点
        }
    });
    
    // 5.2 检查初始状态(优先于 updatePetStatus 运行,以防止闪烁)
    if (localStorage.getItem(PET_STORAGE_KEY) === 'true') {
        $pet.addClass('pet-hidden');
        $pet.attr('title', '维基宠物:点击恢复显示');
    }
    
    // 5.3 运行初始状态判断(填充颜色和 Emoji)
    updatePetStatus();
});