Isurandil said: Indeed, checking that on every sheet open would surely be overkill. But, that check does not require that frequency. For now, we have two game types and as far as I know you can only migrate from legacy to Jumpgate, so once the sheet passes as Jumpgate it is safe to assume that it stays that way. So, I imagine this to look like that: on:sheet-open Get game type. If game type is legacy, proceed. Get current time. Get time of last game type check. If last check was 24+ h ago, recheck. Check: Roll "/s {{msg=Automatic game type check roll. If this command produces an error, this game is a legacy game and, unfortunately, secret rolls are not available. This check will not be triggered for the next 24 hours. If you upgraded the game from legacy to Jumpgate and would like to force this recheck before the end of the cool down time, please use the 'Jumpgate Check' button on the info tab.}} {{jumpgate=[[1d1]]}}" CRP evaluate the roll results and if "jumpgate" is 1, this is a Jumpgate game, so set game type to Jumpgate. I posted a simple and hastily tested version (without the cool down stuff) on the Community Wiki . Turned out that using an unrecognized command will stop the script (hopefully not all of it forever, not yet tested!) so no need to look for a roll result. Just getting the execution past the await startRoll() is enough to proof that /s is recognized and the game is no legacy game. EDIT (we were probably posting more or less at the same time): Scott C. said: The
reason it will spam the chat isn't because of what one person opens.
It's because of what happens when the GM and the 6 players in the party
all log in to the game for the week. Each one of those will need to send
the check because they can't (easily) check the status of other sheets
and can't see the js variable state of those sheets. So, the gm then
gets blasted with a message for each player. I did not consider this such a big issue. The message it is currently displaying should/could explain to people what is happening, maybe even a bit better, but: Maybe someone else can find a better way/improve upon this solution. Or Roll20 adds a shiny new function getGameType() or getGameInfo().