Estoy recuperando una estructura de datos compatible con JSON de una API de chat en vivo, pero cuando un mensaje de chat muestra una imagen, el valor del message muestra la URL en su propio formato, incrustado entre %%%[ y ]%%% .
El siguiente objeto ofrece una vista previa de lo que se acaba de describir...
{ events: [{ method: "chat", object: { message: { bgColor: null, color: "#494949", font: "default", message: "%%%[emoticon name|https://example.org/name.jpg|67|45|/emoticon_report/name/]%%%" }, user: { gender: "m", username: "" } }, id: "text" }], nextUrl: "text" } Al procesar la estructura de datos anterior, me gustaría reemplazar cada valor de mensaje que presenta el formato de emoticono de ... %%%[ ... ]%%% ... por "Emoticon" .
El código con el que estoy trabajando ahora es...
const baseUrl = "example.com" function getEvents(url) { fetch(url).then(response => response.json()) .then(jsonResponse => { // Process messages for (const message of jsonResponse["events"]) { const method = message["method"] const object = message["object"] console.log(`Message ID: ${message["id"]}`) if (method === "chat") { console.log(`${object["user"]["username"]} sent chat message: ${object["message"]["message"]}`) } else { console.error("Unknown method:", method) } } // Once messages are processed, call getEvents again with 'nextUrl' to get new messages getEvents(jsonResponse["nextUrl"]) }) .catch(err => { console.error("Error:", err) }) } getEvents(baseUrl)Por el momento el resultado del script es...
Username: Hi Username: %%%[emoticon name|https://example.org/name.jpg|67|45|/emoticon_report/name/]%%%... pero debería cambiarse a ...
Username: Hi Username: EmoticonGracias por todas las respuestas, ha ayudado mucho a descifrar parte del código. Ya casi lo tengo hecho. El único problema que sigo viendo es que si el chat ha publicado varias imágenes con un mensaje, limpia todo el mensaje.
Por ejemplo: Hola, esto es (imagen), así que intente (imagen) < esto solo muestra Hola, esto es Emoticon
Pero puedo vivir con eso;)
El código final que tengo incluye la siguiente línea para limpiarlo:
var cleanmessage = chat.replace(/%%%\[emoticon.*]%%%/g, `Emoticon`);De los comentarios anteriores...
"En primer lugar, el OP no funciona con un objeto json, no hay nada de eso. Pero el OP itera sobre los elementos de
eventde la estructura de datos del objeto de respuesta. Para cada elemento, el OP quiere verificar el valor de propiedad deitem.message.messagePor lo tanto, la verdadera pregunta del OP es... '¿Cómo se reconoce un formato de emoticón?' "
El OP podría echar un vistazo a ... String.prototype.startsWith
// faking the live chat API call for the further example code. function fetch(/* fake api call url */) { return new Promise(resolve => { const responseData = '{"events":[{"method":"chat","object":{"message":{"bgColor":null,"color":"#494949","font":"default","message":"%%%[emoticon name|https://example.org/name.jpg|67|45|/emoticon_report/name/]%%%"},"user":{"gender":"m","username":""}},"id":"text"}],"nextUrl":"text"}'; setTimeout(() => { resolve({ json: () => JSON.parse(responseData), }); }, 4000); }); } const baseUrl = "example.com"; function getEvents(url) { console.log(`... fetch('${ url }') ...`); fetch(url) .then(response => response.json()) .then(({ events, nextUrl }) => { // Process messages of chat events events .forEach(event => { const { method, object: { user, message }, id } = event; console.log(`Message event ID: ${ id }`); if ( (method === 'chat') && message.message.startsWith('%%%[emoticon') ) { // console.log(`${ user.username } sent chat message: ${ message.message }`); console.log(`${ user.username } sent chat message: ${ 'Emoticon' }`); // // and/or directly overwrite the data // message.message = 'Emoticon'; } else { console.error("Unknown method:", method); } }); // Once messages are processed, call `getEvents` // again with 'nextUrl' to get new messages. getEvents(nextUrl); }) .catch(err => { console.error("Error:", err); }); } getEvents(baseUrl); .as-console-wrapper { min-height: 100%!important; top: 0; }Antes de usar su objeto ["mensaje"]["mensaje"] (o incluso mejor simplemente object.message.message) simplemente haga un reemplazo de expresiones regulares como este:
object.message.message.replace(/%%%\[emoticon.*]%%%/, 'Emoticon')patio de recreo aquí: https://regex101.com/r/7Kf0VW/1