command.ps1

class Special {
    [Object]$remote

    Special ([Object]$remote) {
        AddActionMembers -PARAMS @('restart', 'shutdown', 'show')
    
        $this.remote = $remote
    }

    [string] identifier () {
        return "Command"
    }

    [string] ToString() {
        return $this.GetType().Name
    }

    [single] Getter ($param) {
        return $this.remote.Getter("$($this.identifier()).$param")
    }

    [void] Setter ($param, $val) {
        if ($val -is [Boolean]) {
            $this.remote.Setter("$($this.identifier()).$param", $(if ($val) { 1 } else { 0 }))
        }
        else {
            $this.remote.Setter("$($this.identifier()).$param", $val)
        }
    }

    [void] RunMacrobuttons() {
        "Launching the MacroButtons app" | Write-Verbose
        Start-Process -FilePath $(Join-Path -Path $this.remote.vmpath -ChildPath "VoicemeeterMacroButtons.exe")
    }

    [void] CloseMacrobuttons() {
        "Closing the MacroButtons app" | Write-Verbose
        Stop-Process -Name "VoicemeeterMacroButtons"
    }

    hidden $_hide = $($this | Add-Member ScriptProperty 'hide' `
        {
            $this._hide = $this.Setter('show', $false)
        } `
        {}
    )

    hidden $_showvbanchat = $($this | Add-Member ScriptProperty 'showvbanchat' `
        {
            $this.Getter('DialogShow.VBANCHAT')
        } `
        {
            param([bool]$arg)
            $this._showvbanchat = $this.Setter('DialogShow.VBANCHAT', $arg)
        }
    )

    hidden $_lock = $($this | Add-Member ScriptProperty 'lock' `
        {
            $this._lock = $this.Getter('lock')
        } `
        {
            param([bool]$arg)
            $this._lock = $this.Setter('lock', $arg)
        }
    )

    [void] Load ([string]$filename) {
        $this.Setter('load', $filename)
    }
}

function Make_Command([Object]$remote) {
    return [Special]::new($remote)
}