2026-08-21 16:39:33 -04:00
|
|
|
|
extends SceneTree
|
|
|
|
|
|
|
|
|
|
|
|
const EDGE_PADDING: String = " \t\n ⠀"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _initialize() -> void:
|
|
|
|
|
|
call_deferred("_validate_protocol")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _validate_protocol() -> void:
|
|
|
|
|
|
_validate_type_and_empty_handling()
|
|
|
|
|
|
_validate_message_cleanup()
|
2026-09-01 17:30:50 -04:00
|
|
|
|
_validate_roleplay_commands()
|
2026-08-21 16:39:33 -04:00
|
|
|
|
_validate_protocol_limits()
|
|
|
|
|
|
print("Network chat protocol validation: PASS")
|
|
|
|
|
|
quit()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _validate_type_and_empty_handling() -> void:
|
|
|
|
|
|
assert(NetworkChatProtocol.sanitize_body(null) == "")
|
|
|
|
|
|
assert(NetworkChatProtocol.sanitize_body(42) == "")
|
|
|
|
|
|
assert(NetworkChatProtocol.sanitize_body(EDGE_PADDING) == "")
|
|
|
|
|
|
assert(NetworkChatProtocol.sanitize_body("\u0001") == "")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _validate_message_cleanup() -> void:
|
|
|
|
|
|
assert(NetworkChatProtocol.sanitize_body(" hello ") == "hello")
|
|
|
|
|
|
assert(NetworkChatProtocol.sanitize_body("a\tb\nc") == "a b c")
|
|
|
|
|
|
assert(NetworkChatProtocol.sanitize_body("word word") == "word word")
|
|
|
|
|
|
assert(NetworkChatProtocol.sanitize_body(" !!! ") == "!!!")
|
|
|
|
|
|
assert(
|
|
|
|
|
|
NetworkChatProtocol.sanitize_body(
|
|
|
|
|
|
EDGE_PADDING + "visible" + EDGE_PADDING
|
|
|
|
|
|
) == "visible"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-09-01 17:30:50 -04:00
|
|
|
|
func _validate_roleplay_commands() -> void:
|
|
|
|
|
|
assert(NetworkChatProtocol.is_roleplay_body("/me waves"))
|
|
|
|
|
|
assert(NetworkChatProtocol.is_roleplay_body("/ME waves"))
|
|
|
|
|
|
assert(NetworkChatProtocol.is_roleplay_body("/me"))
|
|
|
|
|
|
assert(not NetworkChatProtocol.is_roleplay_body("/meow"))
|
|
|
|
|
|
assert(NetworkChatProtocol.roleplay_action("/me waves") == "waves")
|
|
|
|
|
|
assert(NetworkChatProtocol.roleplay_action(
|
|
|
|
|
|
"/me [color=red]waves[/color]"
|
|
|
|
|
|
) == "[color=red]waves[/color]")
|
|
|
|
|
|
assert(NetworkChatProtocol.valid_user_body("/me waves"))
|
|
|
|
|
|
assert(not NetworkChatProtocol.valid_user_body("/me"))
|
|
|
|
|
|
assert(not NetworkChatProtocol.valid_user_body("/me "))
|
|
|
|
|
|
assert(NetworkChatProtocol.valid_user_body("/meow"))
|
|
|
|
|
|
var signed_fields: Array = NetworkChatProtocol.signature_fields({
|
|
|
|
|
|
"session_id": "session",
|
|
|
|
|
|
"request_id": "request",
|
|
|
|
|
|
"sender_fingerprint": "fingerprint",
|
|
|
|
|
|
"body": "/me waves",
|
|
|
|
|
|
})
|
|
|
|
|
|
assert(signed_fields.back() == "/me waves")
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-08-21 16:39:33 -04:00
|
|
|
|
func _validate_protocol_limits() -> void:
|
|
|
|
|
|
var maximum_body: String = "a".repeat(
|
|
|
|
|
|
NetworkChatProtocol.MAX_VISIBLE_CHARACTERS
|
|
|
|
|
|
)
|
|
|
|
|
|
assert(NetworkChatProtocol.sanitize_body(maximum_body) == maximum_body)
|
|
|
|
|
|
assert(
|
|
|
|
|
|
NetworkChatProtocol.sanitize_body(maximum_body + "a") == ""
|
|
|
|
|
|
)
|
|
|
|
|
|
var maximum_utf8_body: String = "🐟".repeat(
|
|
|
|
|
|
NetworkChatProtocol.MAX_VISIBLE_CHARACTERS
|
|
|
|
|
|
)
|
|
|
|
|
|
assert(
|
|
|
|
|
|
maximum_utf8_body.to_utf8_buffer().size()
|
|
|
|
|
|
== NetworkChatProtocol.MAX_UTF8_BYTES
|
|
|
|
|
|
)
|
|
|
|
|
|
assert(
|
|
|
|
|
|
NetworkChatProtocol.sanitize_body(maximum_utf8_body)
|
|
|
|
|
|
== maximum_utf8_body
|
|
|
|
|
|
)
|