aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYarmo Mackenbach <yarmo@yarmo.eu>2022-04-13 00:02:05 +0200
committerYarmo Mackenbach <yarmo@yarmo.eu>2022-04-13 00:02:05 +0200
commit8dbc290c56bea1fac1cd8675ec550ae0b8db4e8b (patch)
tree36acf2024107a96572b385d6fe022d03be325370
parent555d6bc6a566c3fe7d16c6bccd24bf846152816d (diff)
Use userId in DB rather than name
-rw-r--r--src/index.js124
1 files 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',
'<b>!hi</b>: introduce yourself to Seb'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!e 42: add a new expense',
'<b>!e 42</b>: add a new expense'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!e 42 Saturday market: describe the expense',
'<b>!e 42 Saturday market</b>: describe the expense'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!e @zaphod 42: delegate the expense',
'<b>!e @zaphod 42</b>: delegate the expense'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!e 10 @trillian: transfer to a fellow user',
'<b>!e 10 @trillian</b>: transfer to a fellow user'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!b: get the balance',
'<b>!b</b>: get the balance'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!u: get the list of users',
'<b>!u</b>: get the list of users'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!l: list the last 4 actions',
'<b>!l</b>: list the last 4 actions'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!l 6: request a specific number of actions',
'<b>!l 6</b>: request a specific number of actions'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!undo: undo the last action',
'<b>!undo</b>: undo the last action'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!reset: remove all expenses and transactions (cannot be undone!)',
'<b>!reset</b>: remove all expenses and transactions (cannot be undone!)'
)
- sendMessage(
+ _sendMessage(
room.roomId,
'!fullreset: remove all data (cannot be undone!)',
'<b>!fullreset</b>: 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
}
})