String clean_chat_field(String raw, u32 max_length) { String value = trim(raw); value = replace(value, "\r", " "); value = replace(value, "\n", " "); if(value.length() > max_length) value.resize(max_length); return(value); } DTree chat_event(Request& context, String type, String body) { DTree event; event["type"] = type; event["body"] = body; event["connection_id"] = ws_connection_id(); event["scope"] = first(context.params["DOCUMENT_URI"], ws_scope()); event["online"] = (f64)ws_connection_count(); event["at"] = time_format_utc("%H:%M:%S"); event["name"] = context.connection["name"].to_string(); event["message_count"] = context.connection["message_count"]; return(event); } RENDER(Request& context) { String ws_url = context.params["DOCUMENT_URI"]; u64 online = ws_connection_count(); <>
Page scope: = ws_url ?> Connected right now: = online ?> Status: Connecting...> } WS(Request& context) { if(ws_is_binary()) { ws_send_to( ws_connection_id(), json_encode(chat_event(context, "notice", "Binary messages are not handled by this demo")) ); return; } DTree payload = json_decode(ws_message()); String type = clean_chat_field(payload["type"].to_string(), 24); String name = clean_chat_field(payload["name"].to_string(), 32); String body = clean_chat_field(payload["body"].to_string(), 500); u64 message_count = int_val(context.connection["message_count"].to_string()); if(name == "") name = first(context.connection["name"].to_string(), "guest"); context.connection["name"] = name; if(type == "join") { context.connection["joined_at"] = time_format_utc("%Y-%m-%d %H:%M:%S"); context.connection["last_type"] = type; ws_send(json_encode(chat_event(context, "join", name + " joined the room"))); return; } if(type == "message" && body != "") { context.connection["last_type"] = type; context.connection["last_body"] = body; context.connection["message_count"] = (f64)(message_count + 1); DTree event = chat_event(context, "message", body); ws_send(json_encode(event)); return; } if(type != "") { context.connection["last_type"] = type; ws_send_to(ws_connection_id(), json_encode(chat_event(context, "notice", "Unknown message type: " + type))); } }