You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tampermonkey下MPP房间锁定脚本封禁功能失效求助

问题修复:Tampermonkey下MPP Room Locker封禁功能失效

我来帮你搞定这个问题,你的怀疑完全正确——核心问题出在变量作用域和布尔值的不规范使用上,下面一步步拆解修复方案:

问题根源分析

  1. Tampermonkey沙箱隔离导致变量访问失败
    Tampermonkey默认会给每个用户脚本创建独立的沙箱环境,你在脚本顶部声明的var pass和var locked属于脚本私有作用域,但你在事件监听里却用window.pass、window.locked去访问——这相当于去浏览器全局window对象找这些变量,自然找不到,导致封禁逻辑根本没触发。

  2. 字符串布尔值的逻辑隐患
    你把locked存成字符串"true"/"false",虽然在简单判断里能勉强生效,但这是不规范的写法,容易在复杂逻辑里出问题,应该直接使用原生布尔值true/false。

修复后的完整代码

// ==UserScript==
// @name Josh's MPP Room Locker
// @description Lock an MPP room and only allow entrance if the name is set to the passphrase
// @namespace Copyright 2018 SYZYGY-DEV333; licensed under Apache v2
// @version 0.1.1
// @author Josh (SYZYGY-DEV333)
// @match http://www.multiplayerpiano.com/*
// @match https://www.multiplayerpiano.com/*
// @match http://ourworldofpixels.com/piano/*
// @grant none
// ==/UserScript==

// 修复:直接使用脚本作用域变量,去掉window前缀,locked改用布尔值
var pass = "passphrase";
var locked = false;

function kickban(id, ms) {
 MPP.client.sendArray([{m: "kickban", _id: id, ms: ms}]);
}

MPP.client.on("participant added", function(pp) {
 // 修复:简化嵌套逻辑,先判断是否锁定+是否是房主
 if (locked && MPP.client.channel.crown.userId === MPP.client.getOwnParticipant()._id) {
   // 修复:直接使用脚本内的pass变量
   if (pp.name !== pass) {
     kickban(pp._id, 10000);
   }
 }
});

MPP.client.on('a', function(m) {
 if (m.a === '-lock') {
   if (m.p._id === MPP.client.getOwnParticipant()._id) {
     // 修复:赋值布尔值true
     locked = true;
     MPP.chat.send("Room Locked.");
   }
 } else if (m.a === '-unlock') {
   if (m.p._id === MPP.client.getOwnParticipant()._id) {
     // 修复:赋值布尔值false
     locked = false;
     MPP.chat.send("Room Unlocked.");
   }
 } else if (m.a.startsWith('-setpass')) {
   if (m.p._id === MPP.client.getOwnParticipant()._id) {
     // 修复:直接赋值给脚本内的pass变量
     pass = m.a.slice(9);
     MPP.chat.send("Passphrase set to: "+m.a.slice(9));
   }
 } else if (m.a === '-help') {
   if (m.p._id === MPP.client.getOwnParticipant()._id) {
     MPP.chat.send("[[ Josh's MPP Room Locker v0.1.1 ]]");
     MPP.chat.send("-lock -- Locks room.");
     MPP.chat.send("-unlock -- Unlocks room.");
     MPP.chat.send("-setpass [pass] -- sets a passphrase for entry.");
     MPP.chat.send("All users must have this as their name when entering the room.");
     MPP.chat.send("-help -- displays this help message.");
   }
 }
});

关键修复点说明

  • 移除了所有window.前缀,直接使用脚本私有作用域内的pass和locked变量,确保变量访问一致
  • 将locked的初始值和所有赋值改为原生布尔值true/false,避免字符串判断的潜在问题
  • 优化了participant added事件中的嵌套逻辑,让代码更易读且逻辑更清晰
  • 顺便把版本号更新到了0.1.1,方便区分修复后的版本

内容的提问来源于stack exchange,提问作者SYZYGY-DEV 333

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:10:39