Userscript, который требует JavaScript страницы, работает в консоли JS, но не в Tampermonkey

1

У меня есть этот usercript (см. Ниже), для http://multiplayerpiano.com.
В консоли сценарий работает как ожидалось, но при использовании в качестве скрипта для Tampermonkey он просто не делает этого.

Я не знаю почему. Команды работают нормально, но функция запрета между строками 21 и 30 ничего не делает. Ошибок не выдают, даже в подробном режиме. Помощь будет высоко оценена.

Имеет ли это отношение к window.pass1 в инструкции if, которая может быть просто pass1 без window?

// ==UserScript==
// @name Josh 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
// @author Josh (SYZYGY-DEV333)
// @match http://www.multiplayerpiano.com/*
// @match https://www.multiplayerpiano.com/*
// @match http://ourworldofpixels.com/piano/*
// @grant none
// ==/UserScript==

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 == "true") {
        if (MPP.client.channel.crown.userId == MPP.client.getOwnParticipant()._id) {
            if (pp.name == window.pass) {
            } else {
                kickban(pp._id, 10000);
            }
        }
    }
});

MPP.client.on('a', function(m) {
    if (m.a == '-lock') {
        if (m.p._id == MPP.client.getOwnParticipant()._id) {
            window.locked = "true";
            MPP.chat.send("Room Locked.");
        }
    } else if (m.a == '-unlock') {
        if (m.p._id == MPP.client.getOwnParticipant()._id) {
            window.locked = "false";
            MPP.chat.send("Room Unlocked.");
        }
    } else if (m.a.startsWith('-setpass')) {
        if (m.p._id == MPP.client.getOwnParticipant()._id) {
            window.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 MPP Room Locker v0.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.");
        }
    }
});
  • 1
    Вы имеете в виду pass not pass1 - и если pass ссылается на var pass в начале скрипта, то, возможно, вы пробовали? Ваш другой usercript работает нормально?
  • 0
    Я также изменил бы window.locked на только что locked ... и (не важно, но лучше код) использовать true / false вместо "true" / "false"
Показать ещё 1 комментарий
Теги:
userscripts
tampermonkey
greasemonkey

1 ответ

1
Лучший ответ

Три вещи:

  1. Да, window.pass и window.locked (всего 4 места) ошибочны. Вы устанавливаете их как vars в скрипте, а скрипт работает в другой области.
  2. Я удивлен, что скрипт работал вообще, поскольку скрипт мог работать до того, как MPP.client определен/инициализирован.
  3. Как указал Jaromanda X, используйте booleans, а не строки, для булевых.

Таким образом, надежная задача - подождать, пока функции целевой страницы будут существовать до того, как будет запущен код, который зависит от них.

Вот ваш рефакторинг с вашими учетными записями, чтобы сделать все это:

// ==UserScript==
// @name Josh 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.5
// @author Josh (SYZYGY-DEV333)
// @match http://www.multiplayerpiano.com/*
// @match https://www.multiplayerpiano.com/*
// @match http://ourworldofpixels.com/piano/*
// @grant none
// ==/UserScript==

var pass = "passphrase";
var locked = false;

var initTmr = setInterval ( () => {
    if (typeof MPP === "object"  &&  typeof MPP.client === "object") {
        clearInterval (initTmr);
        startMyCode ();
    }
}, 200); 

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

function startMyCode () {
    MPP.client.on("participant added", function(pp) {
        if (locked === true) {
            if (MPP.client.channel.crown.userId == MPP.client.getOwnParticipant()._id) {
                if (pp.name == pass) {
                } else {
                    kickban(pp._id, 10000);
                }
            }
        }
    });
    MPP.client.on('a', function(m) {
        if (m.a == '-lock') {
            if (m.p._id == MPP.client.getOwnParticipant()._id) {
                locked = true;
                MPP.chat.send("Room Locked.");
            }
        } else if (m.a == '-unlock') {
            if (m.p._id == MPP.client.getOwnParticipant()._id) {
                locked = false;
                MPP.chat.send("Room Unlocked.");
            }
        } else if (m.a.startsWith('-setpass')) {
            if (m.p._id == MPP.client.getOwnParticipant()._id) {
                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 MPP Room Locker v0.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.");
            }
        }
    });
}
  • 0
    Большое спасибо! Я полагаю, я не думал прямо. Это работает.
  • 0
    Пожалуйста; рад помочь.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню