Character Vault
Any Concept / Any System
Compendium
Your System Come To Life
Roll20 for Android
Streamlined for your Tablet
Roll20 for iPad
Streamlined for your Tablet

Personal tools

Difference between revisions of "Script:IsGM Auth Module"

From Roll20 Wiki

Jump to: navigation, search
m
m (Syntax)
Line 11: Line 11:
 
=== Syntax ===
 
=== Syntax ===
  
{{syntaxbox top|formal=true}}
+
{{syntaxbox top|formal=true|IsGM Auth Module}}
 
{{API command|reset-isgm}} {{API parameter|name=password|optional=true}}
 
{{API command|reset-isgm}} {{API parameter|name=password|optional=true}}
 
{{Formal API command|
 
{{Formal API command|

Revision as of 22:46, 8 January 2015

API ScriptAuthor: Aaron C. M.
Version: 1.1
Last Modified: 2014-06-14
Code: IsGM Auth Module
Dependencies: None
Conflicts: None

This script creates a function, isGM(id), which is accessible by other scripts to differentiate GM users from non-GM users. GM status is determined by comparing the msg.who from non-API messages to the player._displayname. Since non-API chat messages append " (GM)" to GMs in msg.who, comparing the two will only be equal if a player is NOT a gm. (This works regardless of if the player adds '(GM)' to their name.)

Additionally, the command !reset-isgm is provided, allowing the reset of the GM-status cache, for example if someone is promoted to GM status who had previously been identified as a player.

Contents

Syntax

!reset-isgm [password]
Formally:

S

→ !reset-isgm password


password

→ ε

password

string
Parameter Values
password Password to use when resetting the detected GM status of all players. This parameter is only necessary when calling !reset-isgm as a non-GM user.

Examples

If you have already been identified as a GM in the campaign, simply using !reset-isgm is enough to reset everyone's GM status. Anyone who knows the password may supply the password as an argument to force the reset regardless of their GM status. For example:

!reset-isgm swordfish

The main feature of the script, however, is the isGm function. This can be called from other scripts to validate users. For example:

if(isGM(msg.playerid))
{
    sendChat('','/w '+msg.who+' you are a GM!');
}
else
{
    sendChat('','/w '+msg.who+' you are NOT GM!');
}

Code

// GIST: https://gist.github.com/shdwjk/8d5bb062abab18463625

var IsGMModule = IsGMModule || {
    version: 0.6,
    active: true,
    reset_password: "swordfish",
    
    CheckInstall: function() {
        var players = findObjs({_type:"player"});

        if( ! _.has(state,'IsGM') || ! _.has(state.IsGM,'version') || state.IsGM.version != IsGMModule.version )
        {
            state.IsGM={
                version: IsGMModule.version,
                gms: [],
                players: [],
                unknown: []                
            };
        }
        state.IsGM.unknown=_.difference(
            _.pluck(players,'id'),
            state.IsGM.gms,
            state.IsGM.players
        );
        IsGMModule.active = (state.IsGM.unknown.length>0);
    },
    IsGM: function(id) {
        return _.contains(state.IsGM.gms,id);
    },
    HandleMessages: function(msg)
    {
        if(msg.type != "api")
        {
            if(IsGMModule.active && msg.playerid != 'API')
            {
                if(_.contains(state.IsGM.unknown, msg.playerid))
                {
                    var player=getObj('player',msg.playerid);
                    if("" == player.get('speakingas') || 'player|'+msg.playerid == player.get('speakingas'))
                    {
                        if(msg.who == player.get('_displayname'))
                        {
                            state.IsGM.players.push(msg.playerid);
                        }
                        else
                        {
                            state.IsGM.gms.push(msg.playerid);
                            sendChat('IsGM','/w gm '+player.get('_displayname')+' is now flagged as a GM.')
                        }
                        state.IsGM.unknown=_.without(state.IsGM.unknown,msg.playerid);
                        IsGMModule.active = (state.IsGM.unknown.length>0);
                    }
                }
            }
        }
        else
        {
            var tokenized = msg.content.split(" ");
            var command = tokenized[0];
            switch(command)
            {
                case '!reset-isgm':
                    if(isGM(msg.playerid) || (tokenized.length>1 && tokenized[1] == IsGMModule.reset_password))
                    {
                        delete state.IsGM;
                        IsGMModule.CheckInstall();
                        sendChat('IsGM','/w gm IsGM data reset.');
                    }
                    else
                    {
                        var who=getObj('player',msg.playerid).get('_displayname').split(' ')[0];
                        sendChat('IsGM','/w '+who+' ('+who+')Only GMs may reset the IsGM data.'
                        +'If you are a GM you can reset by specifying the reset password from'
                        +'the top of the IsGM script as an argument to !reset-isgm')
                    }
                    break;
            }
        }
    },
    RegisterEventHandlers: function(){
        on('chat:message',IsGMModule.HandleMessages);
    },
    
};

on('ready',function(){
    IsGMModule.CheckInstall();
    IsGMModule.RegisterEventHandlers();
});
      
var isGM = isGM || function(id) {
    return IsGMModule.IsGM(id);
};

Configuration

reset_password should be changed from the default. No further customization is required. Do note that the campaign's GM should remember to say something in the chat out of character after installing this script (or running the reset-isgm command) and before making use of any scripts which make use of isGM.

See Also