User:Kurgenera/pet.js
外观
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ 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();
});