From c6ec1b08ad7f5d1cffc92f32477770292dd2dbf4 Mon Sep 17 00:00:00 2001 From: ghuet Date: Wed, 21 Feb 2024 17:21:51 +0100 Subject: [PATCH 1/2] add pinned messages migration --- db.sqlite.old | Bin 0 -> 110592 bytes src/handlers/messages.ts | 86 +++++++++++++++++++++++++++++++++++---- 2 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 db.sqlite.old diff --git a/db.sqlite.old b/db.sqlite.old new file mode 100644 index 0000000000000000000000000000000000000000..92a958b944d82a9d99955ab20b7732ba7063b134 GIT binary patch literal 110592 zcmeFa2Xre}x%aK!OL}w4aT2F0IkIJ|q`JtqY`IA;vXr8zOO`F!DsB+MDGq_qL+D%x zHKB)cL+_Aq2_>O~k_5P+1QG~=0D(}xJtIq+(f`r--0%IqwcfkdIcw!`nEC0MXFs!N z&))mL_cODBiCiVMFI_CH#47t7vSVa&xvYQRKABARRrX&8`>*~-!TzDD{~z|ha>2jb z{qw7`OVhtGTc4GwEd4U;@zyU}`Yn&PgO46R8iAt`I2wVY5jYxwqY*e7fuj*P8iAt` zI2wVY5%|A10tY&j+LJpwBwfQgAP;hu)Zg}6^z~IF2zO$Pr z&fa&y*`-9VSX>!Pp1p59R!U@JrF~P=bNi;|CnjwB*va{Fszjfh364z;1jGCM!(pKr z;jb>d(4o?tJlZLjbXm|79>I0X^Yenkficn zL}nJ|+In#zZ=&iB%*?Lz1qL??j>yFL=ul^3BeCQiSl>u`y|c-o^2~Cmt%(bG6OMtY zm8JMnawwhKjE_gs8=cdUE#GWm&Yu|{Nsk9s;_I7jO`Ol0m>8NG7~NX*`GzJZU778H zRA(?hI+$A+_iqH&hetAApTB)L&*M$_a=zh+b2}d^%?*u&2Yr#wl6N#e7B0_Zmm{gz z$aZXDqpcTRyopTMx#-K5a*6a}VlwDoEp+Aw2j{9|xx`v^c6w`ceke8C*2KBI2~W5> z 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 literal 0 HcmV?d00001 diff --git a/src/handlers/messages.ts b/src/handlers/messages.ts index 11c1393..ae20e80 100644 --- a/src/handlers/messages.ts +++ b/src/handlers/messages.ts @@ -53,6 +53,14 @@ export type RcMessage = { usernames: string[] } } + md?: { + type: string + language?: string + value: { + type: string + value: string + }[] + }[] } /** @@ -70,6 +78,11 @@ export type MatrixMessage = { event_id: string } } + 'm.mentions'?: { + user_ids: string[] + } + 'format'?: string + 'formatted_body'?: string } /** @@ -215,6 +228,20 @@ export async function handleReactions( } } + +export function replaceFirstTripleBackticks(str: string, toreplace: string, replacement: string): string { + // Find the index of the first occurrence of triple backticks + const index = str.indexOf(toreplace); + if (index === -1) { + return str; // Return the original string if no triple backticks found + } + + // Replace the first occurrence of triple backticks with the replacement string + const replacedString = str.slice(0, index) + replacement + str.slice(index + toreplace.length); + + return replacedString; +} + /** * Handle a line of a Rocket.Chat message JSON export * @param rcMessage A Rocket.Chat message object @@ -241,6 +268,7 @@ export async function handle(rcMessage: RcMessage): Promise { case 'ru': // User removed by case 'ul': // User left case 'ult': // User left team + /* case 'removed-user-from-team': // Removed user from team log.info( `Message ${rcMessage._id} is of type ${rcMessage.t}, removing member ${rcMessage.msg} from room ${room_id}` @@ -278,7 +306,7 @@ export async function handle(rcMessage: RcMessage): Promise { formatUserSessionOptions(userMapping.accessToken) ) return - + */ case 'uj': // User joined channel case 'ujt': // User joined team case 'ut': // User joined conversation @@ -287,16 +315,16 @@ export async function handle(rcMessage: RcMessage): Promise { case 'added-user-to-team': // Added user to team case 'r': // Room name changed case 'rm': // Message removed - log.warn( - `Message ${rcMessage._id} is of type ${rcMessage.t}, for which Rocket.Chat does not provide the initial state information, skipping.` - ) + //log.warn( + // `Message ${rcMessage._id} is of type ${rcMessage.t}, for which Rocket.Chat does not provide the initial state information, skipping.` + //) return case 'user-muted': // User muted by default: - log.warn( - `Message ${rcMessage._id} is of unhandled type ${rcMessage.t}, skipping.` - ) + //log.warn( + // `Message ${rcMessage._id} is of unhandled type ${rcMessage.t}, skipping.` + //) return } } @@ -327,6 +355,50 @@ export async function handle(rcMessage: RcMessage): Promise { } } } + if (rcMessage.md) { + for (const item of rcMessage.md) { + let formatted_body: string = matrixMessage.body; + if (item.type === 'CODE') { + formatted_body = replaceFirstTripleBackticks(formatted_body, '```\n','
')
+        formatted_body = replaceFirstTripleBackticks(formatted_body, '\n```','
\n') + log.warn(matrixMessage.body) + log.warn(formatted_body) + matrixMessage.formatted_body = formatted_body + matrixMessage.format = `org.matrix.custom.html` + } else if (item.type === 'PARAGRAPH') { + for (const val of item.value) { + if (val.type === 'LINK') { + log.warn(`inside link`) + const regex: RegExp = /\[ \]\(https:\/[^?]+\?msg=([^)]+)\)/; + const replacedStr: string = matrixMessage.body.replace(regex, "aa"); + const match: RegExpExecArray | null = regex.exec(matrixMessage.body); + if (match && match[1]) { + const msgValue: string = match[1]; + log.warn(msgValue); // Output: "rwq7eGNCD7b4LqKaR" + } else { + log.warn("No match found"); + } + } + } + } + } + /* + const event_id = await getMessageId(rcMessage.tmid) + if (!event_id) { + log.warn(`Related message ${rcMessage.tmid} missing, skipping.`) + return + } else { + matrixMessage['m.relates_to'] = { + rel_type: 'm.thread', + event_id, + is_falling_back: true, + 'm.in_reply_to': { + event_id, + }, + } + } + */ + } await executeAndHandleMissingMember(() => createEventsAndMapping(matrixMessage, room_id, user_id, ts, rcMessage) ) From 261e62bf322ae84967ac213340bdb592dd5068b4 Mon Sep 17 00:00:00 2001 From: ghuet Date: Tue, 9 Apr 2024 16:42:12 +0200 Subject: [PATCH 2/2] add support for linked messages --- src/handlers/messages.ts | 276 +++++++++++++++++++++++++++------------ src/helpers/synapse.ts | 20 +++ 2 files changed, 213 insertions(+), 83 deletions(-) diff --git a/src/handlers/messages.ts b/src/handlers/messages.ts index ae20e80..f9bc89d 100644 --- a/src/handlers/messages.ts +++ b/src/handlers/messages.ts @@ -10,7 +10,11 @@ import { getUserMappingByName, save, } from '../helpers/storage' -import { axios, formatUserSessionOptions } from '../helpers/synapse' +import { + axios, + formatUserSessionOptions, + getDomainName, +} from '../helpers/synapse' import reactionKeys from '../reactions.json' import { executeAndHandleMissingMember } from './rooms' import { AxiosError } from 'axios' @@ -22,6 +26,24 @@ if (!applicationServiceToken) { throw new Error(message) } +export type Md = { + type: string + language?: string + value: { + type: string + value: string + }[] +}[] + +export type Attachements = { + text: string + md?: Md + message_link?: string + author_name?: string + author_icon?: string + type?: string +}[] + /** * Type of Rocket.Chat messages */ @@ -53,14 +75,8 @@ export type RcMessage = { usernames: string[] } } - md?: { - type: string - language?: string - value: { - type: string - value: string - }[] - }[] + md?: Md + attachments?: Attachements } /** @@ -81,8 +97,8 @@ export type MatrixMessage = { 'm.mentions'?: { user_ids: string[] } - 'format'?: string - 'formatted_body'?: string + format?: string + formatted_body?: string } /** @@ -228,18 +244,119 @@ export async function handleReactions( } } +/** + * format message body to handle Links + * @param formatted_body, matrixMessage + */ +export async function formatLink(formatted_body: string): Promise { + const regexMessageId: RegExp = /\[ \]\(https:\/[^?]+\?msg=([^)]+)\)/ + let msgMatrixId: string = '' + let messageMatrixId: string = '' + + const match: RegExpExecArray | null = regexMessageId.exec(formatted_body) + if (match && match[1]) { + const msgId: string = match[1] + log.warn(msgId) + const msgMatrixId = await getMessageId(msgId) + if (msgMatrixId) { + messageMatrixId = msgMatrixId + log.debug(`message matrix id ${messageMatrixId}`) + } + } else { + log.warn('No message ID found') + } + return [formatted_body, messageMatrixId] +} + +/** + * get text and author from linked message and compute new formatted body + * @param formatted_body, attachments + */ +export async function getFromAttachement( + formatted_body: string, + attachements: Attachements, + matrixMessage: MatrixMessage +): Promise { + const regexMessageId: RegExp = /\[ \]\(https:\/[^?]+\?msg=([^)]+)\)/ + const regexUserName: RegExp = /\/avatar\/([^?]+)/ + let authorMatrixId: string = '' + let message: string = '' + for (const item of attachements) { + if (item.message_link && item.author_icon && item.text) { + const match: RegExpExecArray | null = regexUserName.exec(item.author_icon) + if (match && match[1]) { + const username: string = match[1] + log.warn(username) + const userMapping = await getUserMappingByName(username) + if (!userMapping || !userMapping.matrixId) { + log.warn(`Could not find user mapping for name: ${username}`) + } else { + log.warn(userMapping.matrixId) + authorMatrixId = userMapping.matrixId + } + } else { + log.warn('No message ID found') + } + const textInside: string = item.text.replace(regexMessageId, '') + message = textInside + break + } + } + return [authorMatrixId, formatted_body, message] +} + +/** + * format message body to handle code + * @param formatted_body, matrixMessage + */ +export function formatCode( + formatted_body: string, + matrixMessage: MatrixMessage +): string { + let concat: string = '' + const substrings = formatted_body.split('```') + for (let i = 0; i < substrings.length; i++) { + if (i !== 0 && i !== substrings.length - 1) { + if (substrings[i].startsWith('\n')) { + substrings[i] = substrings[i].substring(1) + } + if (substrings[i].endsWith('\n')) { + substrings[i] = substrings[i].substring(0, substrings[i].length - 1) + } + substrings[i] = '
' + substrings[i] + '
' + } + if (substrings.length === 2) { + substrings[1] = '
' + substrings[1] + '
' + } + concat = concat + substrings[i] + } + if (concat !== formatted_body) { + matrixMessage.formatted_body = concat + matrixMessage.format = `org.matrix.custom.html` + } + return concat +} -export function replaceFirstTripleBackticks(str: string, toreplace: string, replacement: string): string { +/** + * replace string by other string + * @param input string, string to replace, replacement string + */ +export function replaceString( + str: string, + toreplace: string, + replacement: string +): string { // Find the index of the first occurrence of triple backticks - const index = str.indexOf(toreplace); + const index = str.indexOf(toreplace) if (index === -1) { - return str; // Return the original string if no triple backticks found + return str // Return the original string if no triple backticks found } // Replace the first occurrence of triple backticks with the replacement string - const replacedString = str.slice(0, index) + replacement + str.slice(index + toreplace.length); + const replacedString = + str.slice(0, index) + replacement + str.slice(index + toreplace.length) - return replacedString; + return replacedString } /** @@ -268,7 +385,6 @@ export async function handle(rcMessage: RcMessage): Promise { case 'ru': // User removed by case 'ul': // User left case 'ult': // User left team - /* case 'removed-user-from-team': // Removed user from team log.info( `Message ${rcMessage._id} is of type ${rcMessage.t}, removing member ${rcMessage.msg} from room ${room_id}` @@ -306,7 +422,6 @@ export async function handle(rcMessage: RcMessage): Promise { formatUserSessionOptions(userMapping.accessToken) ) return - */ case 'uj': // User joined channel case 'ujt': // User joined team case 'ut': // User joined conversation @@ -315,16 +430,16 @@ export async function handle(rcMessage: RcMessage): Promise { case 'added-user-to-team': // Added user to team case 'r': // Room name changed case 'rm': // Message removed - //log.warn( - // `Message ${rcMessage._id} is of type ${rcMessage.t}, for which Rocket.Chat does not provide the initial state information, skipping.` - //) + log.warn( + `Message ${rcMessage._id} is of type ${rcMessage.t}, for which Rocket.Chat does not provide the initial state information, skipping.` + ) return case 'user-muted': // User muted by default: - //log.warn( - // `Message ${rcMessage._id} is of unhandled type ${rcMessage.t}, skipping.` - //) + log.warn( + `Message ${rcMessage._id} is of unhandled type ${rcMessage.t}, skipping.` + ) return } } @@ -336,72 +451,67 @@ export async function handle(rcMessage: RcMessage): Promise { ) return } - const matrixMessage = mapMessage(rcMessage) - const ts = new Date(rcMessage.ts.$date).valueOf() - - if (rcMessage.tmid) { - const event_id = await getMessageId(rcMessage.tmid) - if (!event_id) { - log.warn(`Related message ${rcMessage.tmid} missing, skipping.`) - return - } else { - matrixMessage['m.relates_to'] = { - rel_type: 'm.thread', - event_id, - is_falling_back: true, - 'm.in_reply_to': { + if (rcMessage.msg) { + const matrixMessage = mapMessage(rcMessage) + + const ts = new Date(rcMessage.ts.$date).valueOf() + + if (rcMessage.tmid) { + const event_id = await getMessageId(rcMessage.tmid) + if (!event_id) { + log.warn(`Related message ${rcMessage.tmid} missing, skipping.`) + return + } else { + matrixMessage['m.relates_to'] = { + rel_type: 'm.thread', event_id, - }, - } - } - } - if (rcMessage.md) { - for (const item of rcMessage.md) { - let formatted_body: string = matrixMessage.body; - if (item.type === 'CODE') { - formatted_body = replaceFirstTripleBackticks(formatted_body, '```\n','
')
-        formatted_body = replaceFirstTripleBackticks(formatted_body, '\n```','
\n') - log.warn(matrixMessage.body) - log.warn(formatted_body) - matrixMessage.formatted_body = formatted_body - matrixMessage.format = `org.matrix.custom.html` - } else if (item.type === 'PARAGRAPH') { - for (const val of item.value) { - if (val.type === 'LINK') { - log.warn(`inside link`) - const regex: RegExp = /\[ \]\(https:\/[^?]+\?msg=([^)]+)\)/; - const replacedStr: string = matrixMessage.body.replace(regex, "aa"); - const match: RegExpExecArray | null = regex.exec(matrixMessage.body); - if (match && match[1]) { - const msgValue: string = match[1]; - log.warn(msgValue); // Output: "rwq7eGNCD7b4LqKaR" - } else { - log.warn("No match found"); - } - } + is_falling_back: true, + 'm.in_reply_to': { + event_id, + }, } } } - /* - const event_id = await getMessageId(rcMessage.tmid) - if (!event_id) { - log.warn(`Related message ${rcMessage.tmid} missing, skipping.`) - return - } else { - matrixMessage['m.relates_to'] = { - rel_type: 'm.thread', - event_id, - is_falling_back: true, - 'm.in_reply_to': { - event_id, - }, + let domain: string = getDomainName() + let formatted_body: string = matrixMessage.body + formatted_body = formatCodeBis(formatted_body, matrixMessage) + if (rcMessage.attachments) { + for (const attach of rcMessage.attachments) { + if (!attach.type) { + const regexMessageId: RegExp = /\[ \]\(https:\/[^?]+\?msg=([^)]+)\)/ + let messageMatrixId: string = '' + let authorMatrixId: string = '' + let message: string = '' + ;[formatted_body, messageMatrixId] = await formatLink(formatted_body) + ;[authorMatrixId, formatted_body, message] = await getFromAttachement( + formatted_body, + rcMessage.attachments, + matrixMessage + ) + const new_body: string = `> <${authorMatrixId}> ${message}` + const form_body: string = `
In reply to ${authorMatrixId}
${message}
` + const replacedStr: string = matrixMessage.body.replace( + regexMessageId, + new_body + ) + const replacedStrForm: string = formatted_body.replace( + regexMessageId, + form_body + ) + matrixMessage.body = replacedStr + formatted_body = replacedStrForm + matrixMessage.formatted_body = formatted_body + matrixMessage.format = `org.matrix.custom.html` + } } } - */ + await executeAndHandleMissingMember(() => + createEventsAndMapping(matrixMessage, room_id, user_id, ts, rcMessage) + ) + } else { + log.warn('no msg') + return } - await executeAndHandleMissingMember(() => - createEventsAndMapping(matrixMessage, room_id, user_id, ts, rcMessage) - ) } /** diff --git a/src/helpers/synapse.ts b/src/helpers/synapse.ts index c300aeb..42f5721 100644 --- a/src/helpers/synapse.ts +++ b/src/helpers/synapse.ts @@ -77,3 +77,23 @@ export async function getMatrixMembers( ).data.joined ) } + +/** + * Return domain name + * @param nothing + * @returns domain name + */ +export function getDomainName(): string { + let domain: string = ""; + const regexDomain: RegExp = /https:\/\/([^/]+)/; + if (process.env.SYNAPSE_URL) { + const matchh: RegExpExecArray | null = regexDomain.exec(process.env.SYNAPSE_URL); + if (matchh && matchh[1]) { + domain = matchh[1]; + log.warn(domain); + } else { + log.warn("No env SYNAPSE_URL provided"); + } + } + return domain +}