Difference between revisions of "Standards:GMCP Client Variables"

From Mudlet
Jump to navigation Jump to search
Line 12: Line 12:
  
 
===== Client.Variables.Default =====
 
===== Client.Variables.Default =====
'''Purpose''': Sent by the server to confirm support for the <code>Client.Variables</code> namespace. The client responds synchronously with a <code>Client.Variables.List</code> message.
+
'''Purpose''': Sent by the server to confirm support for the <code>Client.Variables</code> namespace. The client responds with a <code>Client.Variables.List</code> message. The client's response is synchronous.
 
<syntaxhighlight lang="json">
 
<syntaxhighlight lang="json">
 
Client.Variables.Default {}
 
Client.Variables.Default {}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
===== Client.Variables.List =====
 
===== Client.Variables.List =====
'''Purpose''': The client sends an array of available client variables and their attributes with <code>Client.Variables.List</code>. The server may asynchronously respond with a <code>Client.Variables.Request</code> message.
+
'''Purpose''': The client lists available variables and their attributes using <code>Client.Variables.List</code>. The server may request specific variables with <code>Client.Variables.Request</code>. The server's response is asynchronous.
 
======Attribute Details======
 
======Attribute Details======
 
{| class="wikitable “wikitable”"
 
{| class="wikitable “wikitable”"
Line 66: Line 66:
 
'''Purpose''': The server requests specific client variables with <code>Client.Variables.Request</code>. The client will synchronously respond with a <code>Client.Variables.Update</code> message.  
 
'''Purpose''': The server requests specific client variables with <code>Client.Variables.Request</code>. The client will synchronously respond with a <code>Client.Variables.Update</code> message.  
  
To encourage consent to collect personal information, custom messages to describe the reason for collecting the information may be included for the client to display with the <code>purpose</code> attribute.
+
Encourage user consent by including a custom message in the <code>purpose</code> attribute, explaining why the information is collected. Limit the length of the value for the <code>purpose</code> attribute to 250 characters or less.
 
 
Limit the length of the value for the <code>purpose</code> attribute to 250 characters or less.
 
 
======Attribute Details======
 
======Attribute Details======
 
{| class="wikitable “wikitable”"
 
{| class="wikitable “wikitable”"
Line 273: Line 271:
  
 
===Conclusion===
 
===Conclusion===
The GMCP Client 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.
+
The GMCP Client Variables Sharing extension standardizes the exchange of client-specific variables, ensuring seamless integration and enhanced user experiences. Adopting this standard streamlines variable management, enhances client-server communication, and enables more personalized gaming experiences.
  
 
==Versions==
 
==Versions==

Revision as of 14:09, 25 August 2024

GMCP Client Variables Sharing Standard

Overview and Rationale

The GMCP Client Variables Sharing extension standardizes how client-specific variables are exchanged between MUD clients and servers. This enables servers to dynamically adjust gameplay and UI elements based on client data, enhancing the user experience.

Rationale

As MUDs become more complex, the need for customizable and dynamic interactions between clients and servers has grown. Sharing client-specific variables allows for personalized gameplay experiences, seamless UI adjustments, and improved accessibility features. By standardizing this exchange, the GMCP Client Variables Sharing extension ensures that all participants in the MUD ecosystem can benefit from enhanced communication and data sharing.

Consent Management Process

User consent is essential for sharing client-specific variables. Ensure users are informed about the data being shared and retain control over their personal information. This exchange of information is geared towards finding out what data is available in the client, receiving only what is needed from the server or script, and prompting the user for fields where consent is necessary and the fields are desired.

Specification for Client.Variables

Commands

Client.Variables.Default

Purpose: Sent by the server to confirm support for the Client.Variables namespace. The client responds with a Client.Variables.List message. The client's response is synchronous.

Client.Variables.Default {}
Client.Variables.List

Purpose: The client lists available variables and their attributes using Client.Variables.List. The server may request specific variables with Client.Variables.Request. The server's response is asynchronous.

Attribute Details
Attribute Description Value Required
name Client variable identifier. (text) Yes
available Indicates if the variable is available for use. Values that require consent default to false. true or false Yes
updatable Indicates if the variable can be updated by the server. true or false Yes
Client.Variables.List [
    {"name": "256_COLORS", "available": true, "updatable": false},
    {"name": "ANSI", "available": true, "updatable": false},
    {"name": "BOLD_IS_BRIGHT", "available": true, "updatable": true},
    {"name": "CHARSET", "available": true, "updatable": true},
    {"name": "CLIENT_NAME", "available": true, "updatable": false},
    {"name": "CLIENT_VERSION", "available": true, "updatable": false},
    {"name": "LANGUAGE", "available": false, "updatable": false},
    {"name": "MTTS", "available": true, "updatable": false},
    {"name": "OSC_COLOR_PALETTE", "available": true, "updatable": false},
    {"name": "SCREEN_READER", "available": false, "updatable": false},
    {"name": "SYSTEMTYPE", "available": false, "updatable": false},
    {"name": "TERMINAL_TYPE", "available": true, "updatable": false},
    {"name": "TLS", "available": true, "updatable": false},
    {"name": "TRUECOLOR", "available": true, "updatable": false},
    {"name": "USER", "available": false, "updatable": false},
    {"name": "UTF-8", "available": true, "updatable": false},
    {"name": "VT100", "available": true, "updatable": false},
    {"name": "WORD_WRAP", "available": true, "updatable": false}
]
Client.Variables.Request

Purpose: The server requests specific client variables with Client.Variables.Request. The client will synchronously respond with a Client.Variables.Update message.

Encourage user consent by including a custom message in the purpose attribute, explaining why the information is collected. Limit the length of the value for the purpose attribute to 250 characters or less.

Attribute Details
Attribute Description Value Required
name Client variable identifier. (text) Yes
purpose Reason for collecting the information. (text) No
Client.Variables.Request [
    {"name": "BOLD_IS_BRIGHT"},
    {"name": "CHARSET"},
    {"name": "LANGUAGE", "purpose": "Match client language to adjust game and user interface content"},
    {"name": "SCREEN_READER", "purpose": "Enable accessible features to adjust game and user interface content"},
    {"name": "SYSTEMTYPE", "purpose": "Consider client operating system to adjust game and user interface elements"},
    {"name": "USER", "purpose": "Indicate client account:character name to the game server"}
]
Client.Variables.Update

Purpose: The client sends updates for requested variables with Client.Variables.Update. This message is sent with a source attribute of request in response to Client.Variables.Request. A source of client will be sent when updates occur in the client, such as changing a requested variable in the client's menu. A source of server will be sent in response to the Client.Variables.Set message, which is initiated by the server.

The requested attribute should only be sent in response to Client.Variables.Request.

Attribute Details
Attribute Description Value Required
name Client variable identifier. (text) Yes
available Indicates if the variable is available for use. true or false Yes
updatable Indicates if the variable can be updated by the server. true or false Yes
requested Indicates if the variable was requested by the server. true or false Yes
source Indicates the source of the update. request or client or server Yes
timestamp Unix timestamp indicating when the update was made. 10-digit (or less) number Yes
success Indicates if an updatable variable changed. true or false Only sent in response to Client.Variables.Set messages.
value The value of the variable. When available is trueand a value exists.
Client.Variables.Update [
    {"name": "BOLD_IS_BRIGHT", "available": true, "updatable": true, "requested": false, "source": "request", "timestamp": 1721495879, "value": 2},
    {"name": "CHARSET", "available": true, "updatable": true, "requested": false, "source": "request", "timestamp": 1721495879, "value": "UTF-8"},
    {"name": "LANGUAGE", "available": false, "updatable": false, "requested": true, "source": "request", "timestamp": 1721495879},
    {"name": "SCREEN_READER", "available": false, "updatable": false, "requested": true, "source": "request", "timestamp": 1721495879},
    {"name": "SYSTEMTYPE", "available": false, "updatable": false, "requested": true, "source": "request", "timestamp": 1721495879},
    {"name": "USER", "available": false, "updatable": false, "requested": true, "source": "request", "timestamp": 1721495879}
]
Client.Variables.Set

Purpose: The server sets one or more previously requested, updatable client variables with Client.Variables.Set. The client will synchronously respond with a Client.Variables.Update with a source attribute of server.

Attribute Details
Attribute Description Value Required
name Client variable identifier. (text) Yes
value The value of the variable. (varies) Yes
// Client request with a valid and invalid value
Client.Variables.Set [
    {"name": "BOLD_IS_BRIGHT", "value": 1},
    {"name": "CHARSET", "value": "DEEP-6"}
]

// Server response to a valid and invalid value
Client.Variables.Update [
    {"name": "BOLD_IS_BRIGHT", "available": true, "updatable": true, "source": "server", "timestamp": 1721495900, "success": true, "value": 1},
    {"name": "CHARSET", "available": true, "updatable": true, "source": "server", "timestamp": 1721495900, "success": false, "value": "DEEP-6"}
]

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 or personal data variables. Prompts should inform users of requested data and allow them to opt-in or block requests.
  • Blocked Variables: Clients should not share a variable previously blocked by a user in Client.Variables.List messages, nor make the variable available to other protocols, such as NEW-ENVIRON, MNES, and MTTS.
  • Variable Naming Convention: Variables should be transferred in uppercase to maintain consistency and avoid issues with case sensitivity.
  • Legacy Support: Game drivers may not be able to send boolean values. Where boolean values are expected, clients will transform "true" or 1 to true, and "false" or 0 to false.

Example Flow

1. Client: Should advertise support.

Core.Supports.Set ["Client.Variables 1", ...]

2. Server: May acknowledge support.

Client.Variables.Default {}

3. Client: Must send available variables list. Variables previously blocked by the user should not be sent.

Client.Variables.List [
    {"name": "256_COLORS", "available": true, "updatable": false},
    {"name": "ANSI", "available": true, "updatable": false},
    {"name": "BOLD_IS_BRIGHT", "available": true, "updatable": true},
    {"name": "CHARSET", "available": true, "updatable": true},
    {"name": "CLIENT_NAME", "available": true, "updatable": false},
    {"name": "CLIENT_VERSION", "available": true, "updatable": false},
    {"name": "LANGUAGE", "available": false, "updatable": false},
    {"name": "MTTS", "available": true, "updatable": false},
    {"name": "OSC_COLOR_PALETTE", "available": true, "updatable": false},
    {"name": "SCREEN_READER", "available": false, "updatable": false},
    {"name": "SYSTEMTYPE", "available": false, "updatable": false},
    {"name": "TERMINAL_TYPE", "available": true, "updatable": false},
    {"name": "TLS", "available": true, "updatable": false},
    {"name": "TRUECOLOR", "available": true, "updatable": false},
    {"name": "USER", "available": false, "updatable": false},
    {"name": "UTF-8", "available": true, "updatable": false},
    {"name": "VT100", "available": true, "updatable": false},
    {"name": "WORD_WRAP", "available": true, "updatable": false}
]

4. Server: May requests specific variables. Once per connected session, the client may prompt the user with a request to share variables that are "available": false from the Client.Variables.List message.

Client.Variables.Request [
    {"name": "BOLD_IS_BRIGHT"},
    {"name": "CHARSET"},
    {"name": "LANGUAGE", "purpose": "Match client language to adjust game and user interface content"},
    {"name": "SCREEN_READER", "purpose": "Enable accessible features to adjust game and user interface content"},
    {"name": "SYSTEMTYPE", "purpose": "Consider client operating system to adjust game and user interface elements"},
    {"name": "USER", "purpose": "Indicate client account:character name to the game server"}
]

5. Client: Updates requested variables.

Client.Variables.Update [
    {"name": "BOLD_IS_BRIGHT", "available": true, "updatable": true, "requested": false, "source": "request", "timestamp": 1721495879, "value": 2},
    {"name": "CHARSET", "available": true, "updatable": true, "requested": false, "source": "request", "timestamp": 1721495879, "value": "UTF-8"},
    {"name": "LANGUAGE", "available": false, "updatable": false, "requested": true, "source": "request", "timestamp": 1721495879},
    {"name": "SCREEN_READER", "available": false, "updatable": false, "requested": true, "source": "request", "timestamp": 1721495879},
    {"name": "SYSTEMTYPE", "available": false, "updatable": false, "requested": true, "source": "request", "timestamp": 1721495879},
    {"name": "USER", "available": false, "updatable": false, "requested": true, "source": "request", "timestamp": 1721495879}
]

Flow Diagrams

Requesting and Receiving Variables

GMCP Client Variables Flow 1

Receiving Variable Updates

GMCP Client Variables Flow 2

Setting Updatable Variables

GMCP Client Variables Flow 3

Conclusion

The GMCP Client Variables Sharing extension standardizes the exchange of client-specific variables, ensuring seamless integration and enhanced user experiences. Adopting this standard streamlines variable management, enhances client-server communication, and enables 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 in the #mudlet-development channel of the Mudlet Discord.
  • Implementation should follow GMCP protocol specifications, and all messages must be well-formatted JSON objects.