Tampermonkey下MPP房间锁定脚本封禁功能失效求助
问题修复:Tampermonkey下MPP Room Locker封禁功能失效
我来帮你搞定这个问题,你的怀疑完全正确——核心问题出在变量作用域和布尔值的不规范使用上,下面一步步拆解修复方案:
问题根源分析
Tampermonkey沙箱隔离导致变量访问失败
Tampermonkey默认会给每个用户脚本创建独立的沙箱环境,你在脚本顶部声明的var pass和var locked属于脚本私有作用域,但你在事件监听里却用window.pass、window.locked去访问——这相当于去浏览器全局window对象找这些变量,自然找不到,导致封禁逻辑根本没触发。字符串布尔值的逻辑隐患
你把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
相关产品推荐
相关产品推荐

