From 8dbc290c56bea1fac1cd8675ec550ae0b8db4e8b Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Wed, 13 Apr 2022 00:02:05 +0200 Subject: Use userId in DB rather than name --- src/index.js | 124 ++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 49 deletions(-) diff --git a/src/index.js b/src/index.js index a8b50fc..fb605f4 100644 --- a/src/index.js +++ b/src/index.js @@ -14,7 +14,7 @@ const matrixClient = sdk.createClient({ }) // Prepare Matrix functions -const sendMessage = (roomId, message, formattedMessage) => { +const _sendMessage = (roomId, message, formattedMessage) => { let content = { body: message, msgtype: 'm.text', @@ -36,6 +36,31 @@ const sendMessage = (roomId, message, formattedMessage) => { ) } +// Prepare local utility functions +const _findUserIdInFormattedMessage = (name, formattedMessage) => { + let userId = null + + if (!formattedMessage) { + return null + } + + const re = /href="https:\/\/matrix.to\/#\/(.*)">(.*)<\/a>/ + + formattedMessage.split(' ').forEach(element => { + if (userId) { + return + } + + const match = element.match(re) + + if (match && match[2] === name) { + userId = decodeURIComponent(match[1]) + } + }) + + return userId +} + // Automatically join new rooms matrixClient.on('RoomMember.membership', function (event, member) { if (member.membership === 'invite' && member.userId === botUserId) { @@ -70,8 +95,7 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { // Get the message const message = `${event.getContent().body}` - // Idea: use event.getContent().formatted_body to prevent account name collision - // -> have fun parsing HTML + const formattedMessage = event.getContent().formatted_body || null // Log the message console.log('(%s) %s :: %s', room.name, event.getSender(), message) @@ -85,6 +109,7 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { let users = await db.getUsers(room.roomId) let from + let potentialFrom let to let amount let description @@ -92,62 +117,62 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { switch (command) { case 'h': case 'help': - sendMessage( + _sendMessage( room.roomId, '!hi: introduce yourself to Seb', '!hi: introduce yourself to Seb' ) - sendMessage( + _sendMessage( room.roomId, '!e 42: add a new expense', '!e 42: add a new expense' ) - sendMessage( + _sendMessage( room.roomId, '!e 42 Saturday market: describe the expense', '!e 42 Saturday market: describe the expense' ) - sendMessage( + _sendMessage( room.roomId, '!e @zaphod 42: delegate the expense', '!e @zaphod 42: delegate the expense' ) - sendMessage( + _sendMessage( room.roomId, '!e 10 @trillian: transfer to a fellow user', '!e 10 @trillian: transfer to a fellow user' ) - sendMessage( + _sendMessage( room.roomId, '!b: get the balance', '!b: get the balance' ) - sendMessage( + _sendMessage( room.roomId, '!u: get the list of users', '!u: get the list of users' ) - sendMessage( + _sendMessage( room.roomId, '!l: list the last 4 actions', '!l: list the last 4 actions' ) - sendMessage( + _sendMessage( room.roomId, '!l 6: request a specific number of actions', '!l 6: request a specific number of actions' ) - sendMessage( + _sendMessage( room.roomId, '!undo: undo the last action', '!undo: undo the last action' ) - sendMessage( + _sendMessage( room.roomId, '!reset: remove all expenses and transactions (cannot be undone!)', '!reset: remove all expenses and transactions (cannot be undone!)' ) - sendMessage( + _sendMessage( room.roomId, '!fullreset: remove all data (cannot be undone!)', '!fullreset: remove all data (cannot be undone!)' @@ -157,7 +182,7 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { case 'hi': from = args[0] || event.getSender() if (users.includes(from)) { - sendMessage(room.roomId, `👋 We've already met, ${from}`) + _sendMessage(room.roomId, `👋 We've already met, ${from}`) return } @@ -171,13 +196,13 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { }, }) .then(() => { - sendMessage( + _sendMessage( room.roomId, `👋 Pleased to meet you, ${from}` ) }) .catch((e) => { - sendMessage( + _sendMessage( room.roomId, `❌ Whoops, something went wrong (${e})` ) @@ -187,13 +212,13 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { case 'u': case 'users': if (users.length === 0) { - sendMessage( + _sendMessage( room.roomId, "🤷 I don't know anyone here. Do say !hi to get started" ) } users.forEach((user) => { - sendMessage(room.roomId, user) + _sendMessage(room.roomId, user) }) break @@ -220,14 +245,14 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { switch (event.type) { case 'introduction': - sendMessage( + _sendMessage( room.roomId, `⌚ ${formattedTs} → ${event.type}\n 👋 ${event.userId}` ) break case 'expense': - sendMessage( + _sendMessage( room.roomId, `⌚ ${formattedTs} → ${ event.type @@ -250,14 +275,16 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { case 'e': case 'exp': case 'expense': - if (users.includes(args[0])) { + potentialFrom = _findUserIdInFormattedMessage(args[0], formattedMessage) + console.log(potentialFrom); + + if (potentialFrom && users.includes(potentialFrom)) { // Use delegated sender - from = args[0] + from = potentialFrom amount = parseFloat(args[1]) description = args .slice(2) .filter((a) => { - console.log(a, a[0]) return a[0] !== '?' }) .join(' ') @@ -268,7 +295,6 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { description = args .slice(1) .filter((a) => { - console.log(a, a[0]) return a[0] !== '?' }) .join(' ') @@ -276,7 +302,7 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { // Check amount if (!amount) { - sendMessage( + _sendMessage( room.roomId, '❌ That expense is invalid, need !help ?' ) @@ -296,10 +322,10 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { }, }) .then(() => { - sendMessage(room.roomId, '👍 Expense noted') + _sendMessage(room.roomId, '👍 Expense noted') }) .catch((e) => { - sendMessage( + _sendMessage( room.roomId, `❌ Whoops, something went wrong (${e})` ) @@ -308,15 +334,16 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { case 't': case 'transfer': - if (users.includes(args[0])) { + potentialFrom = _findUserIdInFormattedMessage(args[0], formattedMessage) + + if (potentialFrom && users.includes(potentialFrom)) { // Use delegated sender - from = args[0] + from = potentialFrom amount = parseFloat(args[1]) - to = args[2] + to = _findUserIdInFormattedMessage(args[2], formattedMessage) description = args .slice(3) .filter((a) => { - console.log(a, a[0]) return a[0] !== '?' }) .join(' ') @@ -324,11 +351,10 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { // Use event sender from = event.getSender() amount = parseFloat(args[0]) - to = args[1] + to = _findUserIdInFormattedMessage(args[1], formattedMessage) description = args .slice(2) .filter((a) => { - console.log(a, a[0]) return a[0] !== '?' }) .join(' ') @@ -336,7 +362,7 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { // Check amount if (!amount) { - sendMessage( + _sendMessage( room.roomId, '❌ That expense is invalid, need !help ?' ) @@ -345,7 +371,7 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { // Check recipient if (!users.includes(to)) { - sendMessage( + _sendMessage( room.roomId, `❌ I don't know any "${to}", please try !users` ) @@ -366,10 +392,10 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { }, }) .then(() => { - sendMessage(room.roomId, '👍 Transfer noted') + _sendMessage(room.roomId, '👍 Transfer noted') }) .catch((e) => { - sendMessage( + _sendMessage( room.roomId, `❌ Whoops, something went wrong (${e})` ) @@ -379,7 +405,7 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { case 'b': case 'balance': if (users.length === 0) { - sendMessage( + _sendMessage( room.roomId, '🤷 No users to make a balance for' ) @@ -403,7 +429,7 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { (balance[userId2].sentToUserId[userId1] || 0) - (balance[userId1].sentToUserId[userId2] || 0) - sendMessage( + _sendMessage( room.roomId, `${userId1} ${ diff == 0 ? '=' : diff > 0 ? '→' : '←' @@ -416,10 +442,10 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { case 'undo': db.undo(room.roomId) .then(() => { - sendMessage(room.roomId, '👍 Last action was undone') + _sendMessage(room.roomId, '👍 Last action was undone') }) .catch((e) => { - sendMessage( + _sendMessage( room.roomId, `❌ Whoops, something went wrong (${e})` ) @@ -429,13 +455,13 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { case 'reset': db.reset(room.roomId) .then(() => { - sendMessage( + _sendMessage( room.roomId, '👍 All expenses and transactions have been erased' ) }) .catch((e) => { - sendMessage( + _sendMessage( room.roomId, `❌ Whoops, something went wrong (${e})` ) @@ -445,10 +471,10 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { case 'fullreset': db.fullreset(room.roomId) .then(() => { - sendMessage(room.roomId, '👍 All data has been erased') + _sendMessage(room.roomId, '👍 All data has been erased') }) .catch((e) => { - sendMessage( + _sendMessage( room.roomId, `❌ Whoops, something went wrong (${e})` ) @@ -456,7 +482,7 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { break default: - sendMessage( + _sendMessage( room.roomId, '🤷 Not sure what you are asking for. Need !help ?' ) @@ -467,7 +493,7 @@ matrixClient.on('Room.timeline', async (event, room, toStartOfTimeline) => { // Reply to cookie if (message.toLowerCase().includes('cookie')) { - sendMessage(room.roomId, 'Did someone say cookie?') + _sendMessage(room.roomId, 'Did someone say cookie?') return } }) -- cgit v1.2.3