Init()
{
    // this gives the game interface time to setup
    waittillframeend;
    thread ModuleSetup();
}

ModuleSetup()
{
    // waiting until the game specific functions are ready
    level waittill( level.notifyTypes.gameFunctionsInitialized );

    RegisterCustomCommands();
}

RegisterCustomCommands()
{
    command = SpawnStruct();
    
    // unique key for each command (how iw4madmin identifies the command)
    command.eventKey = "PrintLineCommand";

    // name of the command (cannot conflict with existing command names)
    command.name = "println";
    
    // short version of the command (cannot conflcit with existing command aliases)
    command.alias = "pl";

    // description of what the command does
    command.description = "prints line to game";
    
    // minimum permision required to execute
    // valid values: User, Trusted, Moderator, Administrator, SeniorAdmin, Owner
    command.minPermission = "Trusted";

    // games the command is supported on
    // separate with comma or don't define for all
    // valid values: IW3, IW4, IW5, IW6, T4, T5, T6, T7, SHG1, CSGO, H1
    command.supportedGames = "IW4,IW5,T5,T6";

    // indicates if a target player must be provided to execvute on
    command.requiresTarget = false;

    // code to run when the command is executed
    command.handler = ::PrintLnCommandCallback;
    
    // register the command with integration to be send to iw4madmin
    scripts\_integration_shared::RegisterScriptCommandObject( command );

    // you can also register via parameters
    scripts\_integration_shared::RegisterScriptCommand( "AffirmationCommand", "affirm", "af", "provide affirmations", "User", undefined, false, ::AffirmationCommandCallback );
}

PrintLnCommandCallback( event )
{
    if ( IsDefined( event.data["args"] ) )
    {
        IPrintLnBold( event.data["args"] );
        return;
    }

    scripts\_integration_base::LogDebug( "No data was provided for PrintLnCallback" );
}

AffirmationCommandCallback( event, _ )
{
    level endon( level.eventTypes.gameEnd );

    request         = SpawnStruct();
    request.url     = "https://www.affirmations.dev";
    request.method  = "GET";

    // If making a post request you can also provide more data
    // request.body = "Body of the post message";
    // request.headers = [];
    // request.headers["Authorization"] = "api-key";

    scripts\_integration_shared::RequestUrlObject( request );
    request waittill( level.eventTypes.urlRequestCompleted, response );

    // horrible json parsing.. but it's just an example
    parsedResponse = strtok( response, "\"" );

    if ( IsPlayer( self ) )
    {
        self IPrintLnBold ( "^5" + parsedResponse[parsedResponse.size - 2] );
    }
}