Difference between revisions of "Standards:GMCP Client Variables"

From Mudlet
Jump to navigation Jump to search
m (Initial Draft)
(Retired)
Tag: Blanking
 
(67 intermediate revisions by the same user not shown)
Line 1: Line 1:
== GMCP Client Variables Sharing Standard ==
 
  
=== Overview and Rationale ===
 
The GMCP Client Variables Sharing extension provides a standardized way to exchange client-specific variables between MUD clients and game servers using GMCP messages. This facilitates enhanced user experiences by allowing servers to adjust gameplay and UI elements based on client-provided data.
 
 
=== Specification for Client.Variables ===
 
 
==== Commands - Server ====
 
 
===== Client.Variables.Default =====
 
'''Purpose''': Sent by the server to acknowledge support for the Client.Variables namespace.
 
<syntaxhighlight lang="json">
 
Client.Variables.Default {}
 
</syntaxhighlight>
 
===== Client.Variables.List =====
 
'''Purpose''': The client sends a list of available client variables and their attributes.
 
<syntaxhighlight lang="json">
 
Client.Variables.List {
 
    “256_COLORS”: {“available”: true, “updatable”: false},
 
    “ANSI”: {“available”: true, “updatable”: false},
 
    “BOLD_IS_BRIGHT”: {“available”: true, “updatable”: true},
 
    “CHARSET”: {“available”: true, “updatable”: true},
 
    “CLIENT_NAME”: {“available”: true, “updatable”: false},
 
    “CLIENT_VERSION”: {“available”: true, “updatable”: false},
 
    “FONT”: {“available”: false, “updatable”: false},
 
    “FONT_SIZE”: {“available”: false, “updatable”: false},
 
    “LANGUAGE”: {“available”: false, “updatable”: false},
 
    “MTTS”: {“available”: true, “updatable”: false},
 
    “OSC_COLOR_PALETTE”: {“available”: true, “updatable”: false},
 
    “SCREEN_READER”: {“available”: false, “updatable”: false},
 
    “SYSTEMTYPE”: {“available”: false, “updatable”: false},
 
    “TERMINAL_TYPE”: {“available”: true, “updatable”: false},
 
    “TLS”: {“available”: true, “updatable”: false},
 
    “TRUECOLOR”: {“available”: true, “updatable”: false},
 
    “USER”: {“available”: false, “updatable”: false},
 
    “UTF-8”: {“available”: true, “updatable”: false},
 
    “VT100”: {“available”: true, “updatable”: false},
 
    “WORD_WRAP”: {“available”: true, “updatable”: false}
 
}
 
</syntaxhighlight>
 
====== Attribute Details ======
 
{| class="“wikitable”"
 
|-
 
! Attribute
 
!Description
 
|-
 
|available
 
|Indicates if the variable is available for use.
 
|-
 
|updatable
 
| Indicates if the variable can be updated by the server.
 
|}
 
 
=====Client.Variables.Request=====
 
'''Purpose''': The server requests specific client variables.
 
<syntaxhighlight lang="json">
 
Client.Variables.Request [“BOLD_IS_BRIGHT”, “CHARSET”, “FONT”, “FONT_SIZE”, “LANGUAGE”, “SCREEN_READER”, “SYSTEMTYPE”, “USER”]
 
</syntaxhighlight>
 
=====Client.Variables.Update=====
 
'''Purpose''': The client sends updates for requested variables.
 
<syntaxhighlight lang="json">
 
Client.Variables.Update {
 
    “BOLD_IS_BRIGHT”: {
 
        “available”: true,
 
        “updatable”: true,
 
        “requested”: false,
 
        “source”: “request”,
 
        “timestamp”: 1721495879,
 
        “value”: 2
 
    },
 
    “CHARSET”: {
 
        “available”: true,
 
        “updatable”: true,
 
        “requested”: false,
 
        “source”: “request”,
 
        “timestamp”: 1721495879,
 
        “value”: “UTF-8”
 
    },
 
    “FONT”: {
 
        “available”: false,
 
        “updatable”: false,
 
        “requested”: true,
 
        “source”: “request”,
 
        “timestamp”: 1721495879
 
    },
 
    “FONT_SIZE”: {
 
        “available”: false,
 
        “updatable”: false,
 
        “requested”: true,
 
        “source”: “request”,
 
        “timestamp”: 1721495879
 
    },
 
    “LANGUAGE”: {
 
        “available”: false,
 
        “updatable”: false,
 
        “requested”: true,
 
        “source”: “request”,
 
        “timestamp”: 1721495879
 
    },
 
    “SCREEN_READER”: {
 
        “available”: false,
 
        “updatable”: false,
 
        “requested”: true,
 
        “source”: “request”,
 
        “timestamp”: 1721495879
 
    },
 
    “SYSTEMTYPE”: {
 
        “available”: false,
 
        “updatable”: false,
 
        “requested”: true,
 
        “source”: “request”,
 
        “timestamp”: 1721495879
 
    },
 
    “USER”: {
 
        “available”: false,
 
        “updatable”: false,
 
        “requested”: true,
 
        “source”: “request”,
 
        “timestamp”: 1721495879
 
    }
 
}
 
</syntaxhighlight>
 
=====Attribute Details=====
 
{| class="“wikitable”"
 
|-
 
!Attribute!!Description
 
|-
 
|available||Indicates if the variable is available for use.
 
|-
 
|updatable||Indicates if the variable can be updated by the server.
 
|-
 
|requested||Indicates if the variable was requested by the server.
 
|-
 
|source||Indicates the source of the update (request, server, client).
 
|-
 
|timestamp||Unix timestamp indicating when the update was made.
 
|-
 
|value||The value of the variable.
 
|}
 
=====Client.Variables.Set=====
 
'''Purpose''': The server sets specific client variables.
 
<syntaxhighlight lang="json">
 
Client.Variables.Set {
 
    “BOLD_IS_BRIGHT” : “1”
 
}
 
</syntaxhighlight>
 
===Implementation Considerations===
 
 
*'''Client Support Advertisement''': Clients should advertise their support for the Client.Variables namespace using Core.Supports.Set.
 
*'''Server Acknowledgement''': Servers acknowledge support with Client.Variables.Default.
 
*'''Consent Management''': Clients must handle user consent for sharing sensitive variables. Prompts should inform users of requested data and allow them to opt-in or block requests.
 
*'''Variable Updates''': Clients should manage variable updates efficiently, ensuring data integrity and user consent.
 
 
===Example Flow===
 
 
1. '''Client''': Advertises support.
 
<syntaxhighlight lang="json">
 
Core.Supports.Set ["Client.Variables 1", ...]
 
</syntaxhighlight>
 
2. '''Server''': Acknowledges support.
 
<syntaxhighlight lang="json">
 
Client.Variables.Default {}
 
</syntaxhighlight>
 
3. '''Client''': Sends available variables list.
 
<syntaxhighlight lang="json">
 
Client.Variables.List {
 
    "256_COLORS": {"available": true, "updatable": false},
 
    "ANSI": {"available": true, "updatable": false},
 
    "BOLD_IS_BRIGHT": {"available": true, "updatable": true},
 
    "CHARSET": {"available": true, "updatable": true},
 
    "CLIENT_NAME": {"available": true, "updatable": false},
 
    "CLIENT_VERSION": {"available": true, "updatable": false},
 
    "FONT": {"available": false, "updatable": false},
 
    "FONT_SIZE": {"available": false, "updatable": false},
 
    "LANGUAGE": {"available": false, "updatable": false},
 
    "MTTS": {"available": true, "updatable": false},
 
    "OSC_COLOR_PALETTE": {"available": true, "updatable": false},
 
    "SCREEN_READER": {"available": false, "updatable": false},
 
    "SYSTEMTYPE": {"available": false, "updatable": false},
 
    "TERMINAL_TYPE": {"available": true, "updatable": false},
 
    "TLS": {"available": true, "updatable": false},
 
    "TRUECOLOR": {"available": true, "updatable": false},
 
    "USER": {"available": false, "updatable": false},
 
    "UTF-8": {"available": true, "updatable": false},
 
    "VT100": {"available": true, "updatable": false},
 
    "WORD_WRAP": {"available": true, "updatable": false}
 
}
 
</syntaxhighlight>
 
4. '''Server''': Requests specific variables.
 
<syntaxhighlight lang="json">
 
Client.Variables.Request ["BOLD_IS_BRIGHT", "CHARSET", "FONT", "FONT_SIZE", "LANGUAGE", "SCREEN_READER", "SYSTEMTYPE", "USER"]
 
</syntaxhighlight>
 
5. '''Client''': Updates requested variables.
 
<syntaxhighlight lang="json">
 
Client.Variables.Update {
 
    "BOLD_IS_BRIGHT": {
 
        "available": true,
 
        "updatable": true,
 
        "requested": false,
 
        "source": "request",
 
        "timestamp": 1721495879,
 
        "value": 2
 
    },
 
    "CHARSET": {
 
        "available": true,
 
        "updatable": true,
 
        "requested": false,
 
        "source": "request",
 
        "timestamp": 1721495879,
 
        "value": "UTF-8"
 
    },
 
    "FONT": {
 
        "available": false,
 
        "updatable": false,
 
        "requested": true,
 
        "source": "request",
 
        "timestamp": 1721495879
 
    },
 
    "FONT_SIZE": {
 
        "available": false,
 
        "updatable": false,
 
        "requested": true,
 
        "source": "request",
 
        "timestamp": 1721495879
 
    },
 
    "LANGUAGE": {
 
        "available": false,
 
        "updatable": false,
 
        "requested": true,
 
        "source": "request",
 
        "timestamp": 1721495879
 
    },
 
    "SCREEN_READER": {
 
        "available": false,
 
        "updatable": false,
 
        "requested": true,
 
        "source": "request",
 
        "timestamp": 1721495879
 
    },
 
    "SYSTEMTYPE": {
 
        "available": false,
 
        "updatable": false,
 
        "requested": true,
 
        "source": "request",
 
        "timestamp": 1721495879
 
    },
 
    "USER": {
 
        "available": false,
 
        "updatable": false,
 
        "requested": true,
 
        "source": "request",
 
        "timestamp": 1721495879
 
    }
 
}
 
</syntaxhighlight>
 
===Conclusion===
 
The GMCP Variables Sharing extension standardizes the exchange of client-specific variables, ensuring seamless integration and enhanced user experiences. By adopting this standard, MUD developers can streamline variable management, improve client-server communication, and provide more personalized gaming experiences.
 
 
==Versions==
 
*Version 1.0: Initial specification.
 
 
==Authors==
 
*Mike Conley (Tamarindo, Administrator at StickMUD and Mudlet contributor) mike.conley[at]stickmud.com
 
 
===Notes===
 
*This specification is subject to updates and community input. Contributions and feedback are welcome to ensure it meets the needs of the MUD community.
 
*Implementation should follow GMCP protocol specifications, and all messages must be well-formatted JSON objects.
 

Latest revision as of 19:30, 7 September 2024