diff --git a/src/d2m/actions/announce-thread.js b/src/d2m/actions/announce-thread.js index 324c7a5..c8cbf9d 100644 --- a/src/d2m/actions/announce-thread.js +++ b/src/d2m/actions/announce-thread.js @@ -1,6 +1,6 @@ // @ts-check -const assert = require("assert") +const assert = require("assert").strict const passthrough = require("../../passthrough") const {discord, sync, db, select} = passthrough diff --git a/src/d2m/actions/create-room.js b/src/d2m/actions/create-room.js index 61e79f3..009e31e 100644 --- a/src/d2m/actions/create-room.js +++ b/src/d2m/actions/create-room.js @@ -228,7 +228,10 @@ async function createRoom(channel, guild, spaceID, kstate, privacyLevel) { ...spaceCreationContent }) - db.prepare("INSERT INTO channel_room (channel_id, room_id, name, nick, thread_parent) VALUES (?, ?, ?, NULL, ?)").run(channel.id, roomID, channel.name, threadParent) + db.transaction(() => { + db.prepare("INSERT INTO channel_room (channel_id, room_id, name, nick, thread_parent) VALUES (?, ?, ?, NULL, ?)").run(channel.id, roomID, channel.name, threadParent) + db.prepare("INSERT INTO historical_channel_room (channel_id, room_id) VALUES (?, ?)").run(channel.id, roomID) + })() return roomID }) @@ -400,7 +403,7 @@ async function _syncRoom(channelID, shouldActuallySync) { } const roomDiff = ks.diffKState(roomKState, channelKState) const roomApply = ks.applyKStateDiffToRoom(roomID, roomDiff) - db.prepare("UPDATE channel_room SET name = ? WHERE room_id = ?").run(channel.name, roomID) + db.prepare("UPDATE channel_room SET name = ? WHERE channel_id = ?").run(channel.name, channel.id) // sync room as space member const spaceApply = _syncSpaceMember(channel, spaceID, roomID, guild.id) @@ -464,7 +467,7 @@ async function unbridgeDeletedChannel(channel, guildID) { // delete room from database db.prepare("DELETE FROM member_cache WHERE room_id = ?").run(roomID) - db.prepare("DELETE FROM channel_room WHERE room_id = ? AND channel_id = ?").run(roomID, channel.id) // cascades to most other tables, like messages + db.prepare("DELETE FROM channel_room WHERE room_id = ? AND channel_id = ?").run(roomID, channel.id) // cascades to most other tables, like messages and historical rooms if (!botInRoom) return diff --git a/src/d2m/actions/delete-message.js b/src/d2m/actions/delete-message.js index e9e0b08..39b9fc8 100644 --- a/src/d2m/actions/delete-message.js +++ b/src/d2m/actions/delete-message.js @@ -14,11 +14,13 @@ async function deleteMessage(data) { const row = select("channel_room", ["room_id", "speedbump_checked", "thread_parent"], {channel_id: data.channel_id}).get() if (!row) return - const eventsToRedact = select("event_message", "event_id", {message_id: data.id}).pluck().all() - db.prepare("DELETE FROM message_channel WHERE message_id = ?").run(data.id) - for (const eventID of eventsToRedact) { + // Assume we can redact from tombstoned rooms. + const eventsToRedact = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") + .select("event_id", "room_id").where({message_id: data.id}).all() + db.prepare("DELETE FROM message_room WHERE message_id = ?").run(data.id) + for (const {event_id, room_id} of eventsToRedact) { // Unfortunately, we can't specify a sender to do the redaction as, unless we find out that info via the audit logs - await api.redactEvent(row.room_id, eventID) + await api.redactEvent(room_id, event_id) } await speedbump.updateCache(row.thread_parent || data.channel_id, row.speedbump_checked) @@ -28,15 +30,17 @@ async function deleteMessage(data) { * @param {import("discord-api-types/v10").GatewayMessageDeleteBulkDispatchData} data */ async function deleteMessageBulk(data) { - const roomID = select("channel_room", "room_id", {channel_id: data.channel_id}).pluck().get() - if (!roomID) return + const row = select("channel_room", "room_id", {channel_id: data.channel_id}).get() + if (!row) return const sids = JSON.stringify(data.ids) - const eventsToRedact = from("event_message").pluck("event_id").and("WHERE message_id IN (SELECT value FROM json_each(?))").all(sids) - db.prepare("DELETE FROM message_channel WHERE message_id IN (SELECT value FROM json_each(?))").run(sids) - for (const eventID of eventsToRedact) { + // Assume we can redact from tombstoned rooms. + const eventsToRedact = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") + .select("event_id", "room_id").and("WHERE message_id IN (SELECT value FROM json_each(?))").all(sids) + db.prepare("DELETE FROM message_room WHERE message_id IN (SELECT value FROM json_each(?))").run(sids) + for (const {event_id, room_id} of eventsToRedact) { // Awaiting will make it go slower, but since this could be a long-running operation either way, we want to leave rate limit capacity for other operations - await api.redactEvent(roomID, eventID) + await api.redactEvent(room_id, event_id) } } diff --git a/src/d2m/actions/edit-message.js b/src/d2m/actions/edit-message.js index 7f1bff7..5970b59 100644 --- a/src/d2m/actions/edit-message.js +++ b/src/d2m/actions/edit-message.js @@ -3,7 +3,7 @@ const assert = require("assert").strict const passthrough = require("../../passthrough") -const {sync, db, select} = passthrough +const {sync, db, select, from} = passthrough /** @type {import("../converters/edit-to-changes")} */ const editToChanges = sync.require("../converters/edit-to-changes") /** @type {import("./register-pk-user")} */ @@ -19,6 +19,12 @@ const mreq = sync.require("../../matrix/mreq") * @param {{speedbump_id: string, speedbump_webhook_id: string} | null} row data about the webhook which is proxying messages in this channel */ async function editMessage(message, guild, row) { + const historicalRoomOfMessage = from("message_room").join("historical_channel_room", "historical_room_index").where({message_id: message.id}).select("room_id").get() + const currentRoom = from("channel_room").join("historical_channel_room", "room_id").where({channel_id: message.channel_id}).select("room_id", "historical_room_index").get() + assert(currentRoom) + + if (historicalRoomOfMessage && historicalRoomOfMessage.room_id !== currentRoom.room_id) return // tombstoned rooms should not have new events (including edits) sent to them + let {roomID, eventsToRedact, eventsToReplace, eventsToSend, senderMxid, promotions} = await editToChanges.editToChanges(message, guild, api) if (row && row.speedbump_webhook_id === message.webhook_id) { @@ -61,7 +67,7 @@ async function editMessage(message, guild, row) { // 4. Send all the things. if (eventsToSend.length) { - db.prepare("INSERT OR IGNORE INTO message_channel (message_id, channel_id) VALUES (?, ?)").run(message.id, message.channel_id) + db.prepare("INSERT OR IGNORE INTO message_room (message_id, historical_room_index) VALUES (?, ?)").run(message.id, currentRoom.historical_room_index) } for (const content of eventsToSend) { const eventType = content.$type diff --git a/src/d2m/actions/register-user.js b/src/d2m/actions/register-user.js index 674853a..4bb8e98 100644 --- a/src/d2m/actions/register-user.js +++ b/src/d2m/actions/register-user.js @@ -4,10 +4,9 @@ const assert = require("assert").strict const {reg} = require("../../matrix/read-registration") const DiscordTypes = require("discord-api-types/v10") const Ty = require("../../types") -const mixin = require("@cloudrac3r/mixin-deep") const passthrough = require("../../passthrough") -const {discord, sync, db, select} = passthrough +const {discord, sync, db, from, select} = passthrough /** @type {import("../../matrix/api")} */ const api = sync.require("../../matrix/api") /** @type {import("../../matrix/file")} */ @@ -222,7 +221,8 @@ async function syncUser(user, member, channel, guild, roomID) { * @param {string} roomID */ async function syncAllUsersInRoom(roomID) { - const mxids = select("sim_member", "mxid", {room_id: roomID}).pluck().all() + const users = from("sim_member").join("sim", "mxid") + .where({room_id: roomID}).and("and user_id not like '%-%' and user_id not like '%\\_%' escape '\\'").pluck("user_id").all() const channelID = select("channel_room", "channel_id", {room_id: roomID}).pluck().get() assert.ok(typeof channelID === "string") @@ -234,10 +234,7 @@ async function syncAllUsersInRoom(roomID) { /** @ts-ignore @type {DiscordTypes.APIGuild} */ const guild = discord.guilds.get(guildID) - for (const mxid of mxids) { - const userID = select("sim", "user_id", {mxid}).pluck().get() - assert.ok(typeof userID === "string") - + for (const userID of users) { /** @ts-ignore @type {Required} */ const member = await discord.snow.guild.getGuildMember(guildID, userID) /** @ts-ignore @type {Required} user */ diff --git a/src/d2m/actions/remove-reaction.js b/src/d2m/actions/remove-reaction.js index 06c4b59..0f7eec9 100644 --- a/src/d2m/actions/remove-reaction.js +++ b/src/d2m/actions/remove-reaction.js @@ -4,7 +4,7 @@ const Ty = require("../../types") const DiscordTypes = require("discord-api-types/v10") const passthrough = require("../../passthrough") -const {discord, sync, db, select} = passthrough +const {discord, sync, db, from, select} = passthrough /** @type {import("../../matrix/api")} */ const api = sync.require("../../matrix/api") /** @type {import("../converters/emoji-to-key")} */ @@ -18,12 +18,15 @@ const converter = sync.require("../converters/remove-reaction") * @param {DiscordTypes.GatewayMessageReactionRemoveDispatchData | DiscordTypes.GatewayMessageReactionRemoveEmojiDispatchData | DiscordTypes.GatewayMessageReactionRemoveAllDispatchData} data */ async function removeSomeReactions(data) { - const roomID = select("channel_room", "room_id", {channel_id: data.channel_id}).pluck().get() - if (!roomID) return - const eventIDForMessage = select("event_message", "event_id", {message_id: data.message_id, reaction_part: 0}).pluck().get() - if (!eventIDForMessage) return + const row = select("channel_room", "room_id", {channel_id: data.channel_id}).get() + if (!row) return - const reactions = await api.getFullRelations(roomID, eventIDForMessage, "m.annotation") + const eventReactedTo = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") + .where({message_id: data.message_id, reaction_part: 0}).select("event_id", "room_id").get() + if (!eventReactedTo) return + + // Due to server restrictions, all relations (i.e. reactions) have to be in the same room as the original event. + const reactions = await api.getFullRelations(eventReactedTo.room_id, eventReactedTo.event_id, "m.annotation") // Run the proper strategy and any strategy-specific database changes const removals = await @@ -33,7 +36,7 @@ async function removeSomeReactions(data) { // Redact the events and delete individual stored events in the database for (const removal of removals) { - await api.redactEvent(roomID, removal.eventID, removal.mxid) + await api.redactEvent(eventReactedTo.room_id, removal.eventID, removal.mxid) if (removal.hash) db.prepare("DELETE FROM reaction WHERE hashed_event_id = ?").run(removal.hash) } } diff --git a/src/d2m/actions/send-message.js b/src/d2m/actions/send-message.js index d1be138..e9c5105 100644 --- a/src/d2m/actions/send-message.js +++ b/src/d2m/actions/send-message.js @@ -28,6 +28,8 @@ const dUtils = sync.require("../../discord/utils") */ async function sendMessage(message, channel, guild, row) { const roomID = await createRoom.ensureRoom(message.channel_id) + const historicalRoomIndex = select("historical_channel_room", "historical_room_index", {room_id: roomID}).pluck().get() + assert(historicalRoomIndex) let senderMxid = null if (dUtils.isWebhookMessage(message)) { @@ -52,7 +54,7 @@ async function sendMessage(message, channel, guild, row) { const events = await messageToEvent.messageToEvent(message, guild, {}, {api, snow: discord.snow}) const eventIDs = [] if (events.length) { - db.prepare("INSERT OR IGNORE INTO message_channel (message_id, channel_id) VALUES (?, ?)").run(message.id, message.channel_id) + db.prepare("INSERT OR IGNORE INTO message_room (message_id, historical_room_index) VALUES (?, ?)").run(message.id, historicalRoomIndex) if (senderMxid) api.sendTyping(roomID, false, senderMxid).catch(() => {}) } for (const event of events) { diff --git a/src/d2m/converters/message-to-event.js b/src/d2m/converters/message-to-event.js index 9a975d2..bafe018 100644 --- a/src/d2m/converters/message-to-event.js +++ b/src/d2m/converters/message-to-event.js @@ -265,7 +265,7 @@ async function messageToEvent(message, guild, options = {}, di) { - So make sure we don't do anything in this case. */ const mentions = {} - /** @type {{event_id: string, room_id: string, source: number}?} */ + /** @type {{event_id: string, room_id: string, source: number, channel_id: string}?} */ let repliedToEventRow = null let repliedToUnknownEvent = false let repliedToEventSenderMxid = null @@ -280,9 +280,9 @@ async function messageToEvent(message, guild, options = {}, di) { // Mentions scenarios 1 and 2, part A. i.e. translate relevant message.mentions to m.mentions // (Still need to do scenarios 1 and 2 part B, and scenario 3.) if (message.type === DiscordTypes.MessageType.Reply && message.message_reference?.message_id) { - const row = from("event_message").join("message_channel", "message_id").join("channel_room", "channel_id").select("event_id", "room_id", "source").and("WHERE message_id = ? AND part = 0").get(message.message_reference.message_id) + const row = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index").select("event_id", "room_id", "reference_channel_id", "source").and("WHERE message_id = ? AND part = 0").get(message.message_reference.message_id) if (row) { - repliedToEventRow = row + repliedToEventRow = Object.assign(row, {channel_id: row.reference_channel_id}) } else if (message.referenced_message) { repliedToUnknownEvent = true } @@ -294,7 +294,7 @@ async function messageToEvent(message, guild, options = {}, di) { assert(message.embeds[0].description) const match = message.embeds[0].description.match(/\/channels\/[0-9]*\/[0-9]*\/([0-9]{2,})/) if (match) { - const row = from("event_message").join("message_channel", "message_id").join("channel_room", "channel_id").select("event_id", "room_id", "source").and("WHERE message_id = ? AND part = 0").get(match[1]) + const row = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index").select("event_id", "room_id", "reference_channel_id", "source").and("WHERE message_id = ? AND part = 0").get(match[1]) if (row) { /* we generate a partial referenced_message based on what PK provided. we don't need everything, since this will only be used for further message-to-event converting. @@ -313,7 +313,7 @@ async function messageToEvent(message, guild, options = {}, di) { } } message.embeds.shift() - repliedToEventRow = row + repliedToEventRow = Object.assign(row, {channel_id: row.reference_channel_id}) } } } @@ -485,8 +485,12 @@ async function messageToEvent(message, guild, options = {}, di) { const {body: repliedToBody, html: repliedToHtml} = await transformContent(repliedToContent) if (repliedToEventRow) { // Generate a reply pointing to the Matrix event we found - html = `
In reply to ${repliedToUserHtml}` - + `
${repliedToHtml}
` + const latestRoomID = select("channel_room", "room_id", {channel_id: repliedToEventRow.channel_id}).pluck().get() // native replies don't work across room upgrades, so make sure the old and new message are in the same room + html = + (latestRoomID === repliedToEventRow.room_id ? "" : "") + + `
In reply to ${repliedToUserHtml}` + + `
${repliedToHtml}
` + + (latestRoomID === repliedToEventRow.room_id ? "
" : "") + html body = (`${repliedToDisplayName}: ` // scenario 1 part B for mentions + repliedToBody).split("\n").map(line => "> " + line).join("\n") @@ -544,21 +548,23 @@ async function messageToEvent(message, guild, options = {}, di) { // Forwarded content appears first if (message.message_reference?.type === DiscordTypes.MessageReferenceType.Forward && message.message_snapshots?.length) { // Forwarded notice - const eventID = select("event_message", "event_id", {message_id: message.message_reference.message_id}).pluck().get() + const event = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") + .select("event_id", "room_id").where({message_id: message.message_reference.message_id}).get() const room = select("channel_room", ["room_id", "name", "nick"], {channel_id: message.message_reference.channel_id}).get() const forwardedNotice = new mxUtils.MatrixStringBuilder() if (room) { const roomName = room && (room.nick || room.name) - const via = await getViaServersMemo(room.room_id) - if (eventID) { + if (event) { + const via = await getViaServersMemo(event.room_id) forwardedNotice.addLine( `[๐Ÿ”€ Forwarded from #${roomName}]`, - tag`๐Ÿ”€ Forwarded from ${roomName}` + tag`๐Ÿ”€ Forwarded from ${roomName} [jump to event]` ) } else { + const via = await getViaServersMemo(room.room_id) forwardedNotice.addLine( `[๐Ÿ”€ Forwarded from #${roomName}]`, - tag`๐Ÿ”€ Forwarded from ${roomName}` + tag`๐Ÿ”€ Forwarded from ${roomName} [jump to room]` ) } } else { diff --git a/src/d2m/converters/message-to-event.test.js b/src/d2m/converters/message-to-event.test.js index ee4ec03..cae88b3 100644 --- a/src/d2m/converters/message-to-event.test.js +++ b/src/d2m/converters/message-to-event.test.js @@ -1152,7 +1152,7 @@ test("message2event: constructed forwarded message", async t => { body: "[๐Ÿ”€ Forwarded from #wonderland]" + "\nยป What's cooking, good looking? :hipposcope:", format: "org.matrix.custom.html", - formatted_body: `๐Ÿ”€ Forwarded from wonderland` + formatted_body: `๐Ÿ”€ Forwarded from wonderland [jump to event]` + `
What's cooking, good looking? :hipposcope:
`, "m.mentions": {}, msgtype: "m.notice", @@ -1210,7 +1210,7 @@ test("message2event: constructed forwarded text", async t => { body: "[๐Ÿ”€ Forwarded from #amanda-spam]" + "\nยป What's cooking, good looking?", format: "org.matrix.custom.html", - formatted_body: `๐Ÿ”€ Forwarded from amanda-spam` + formatted_body: `๐Ÿ”€ Forwarded from amanda-spam [jump to room]` + `
What's cooking, good looking?
`, "m.mentions": {}, msgtype: "m.notice", diff --git a/src/d2m/converters/user-to-mxid.js b/src/d2m/converters/user-to-mxid.js index c011b92..f7a49b1 100644 --- a/src/d2m/converters/user-to-mxid.js +++ b/src/d2m/converters/user-to-mxid.js @@ -99,6 +99,10 @@ function webhookAuthorToFakeUserID(author) { return `webhook_${downcased}` } +function isWebhookUserID(userID) { + return userID.match(/^webhook_[a-z90-9._=/-]+$/) +} + /** * @param {Ty.WebhookAuthor} author * @returns {string} @@ -132,3 +136,4 @@ function webhookAuthorToSimName(author) { module.exports.userToSimName = userToSimName module.exports.webhookAuthorToFakeUserID = webhookAuthorToFakeUserID module.exports.webhookAuthorToSimName = webhookAuthorToSimName +module.exports.isWebhookUserID = isWebhookUserID diff --git a/src/d2m/discord-packets.js b/src/d2m/discord-packets.js index 017d50e..ed45324 100644 --- a/src/d2m/discord-packets.js +++ b/src/d2m/discord-packets.js @@ -6,10 +6,6 @@ const DiscordTypes = require("discord-api-types/v10") const passthrough = require("../passthrough") const {sync, db} = passthrough -function populateGuildID(guildID, channelID) { - db.prepare("UPDATE channel_room SET guild_id = ? WHERE channel_id = ?").run(guildID, channelID) -} - const utils = { /** * @param {import("./discord-client")} client @@ -41,14 +37,12 @@ const utils = { channel.guild_id = message.d.id arr.push(channel.id) client.channels.set(channel.id, channel) - populateGuildID(message.d.id, channel.id) } for (const thread of message.d.threads || []) { // @ts-ignore thread.guild_id = message.d.id arr.push(thread.id) client.channels.set(thread.id, thread) - populateGuildID(message.d.id, thread.id) } if (listen === "full") { @@ -112,7 +106,6 @@ const utils = { } else if (message.t === "THREAD_CREATE") { client.channels.set(message.d.id, message.d) if (message.d["guild_id"]) { - populateGuildID(message.d["guild_id"], message.d.id) const channels = client.guildChannelMap.get(message.d["guild_id"]) if (channels && !channels.includes(message.d.id)) channels.push(message.d.id) } @@ -140,7 +133,6 @@ const utils = { } else if (message.t === "CHANNEL_CREATE") { client.channels.set(message.d.id, message.d) if (message.d["guild_id"]) { // obj[prop] notation can be used to access a property without typescript complaining that it doesn't exist on all values something can have - populateGuildID(message.d["guild_id"], message.d.id) const channels = client.guildChannelMap.get(message.d["guild_id"]) if (channels && !channels.includes(message.d.id)) channels.push(message.d.id) } diff --git a/src/d2m/event-dispatcher.js b/src/d2m/event-dispatcher.js index 49352d7..bf7efb9 100644 --- a/src/d2m/event-dispatcher.js +++ b/src/d2m/event-dispatcher.js @@ -67,7 +67,7 @@ module.exports = { async checkMissedMessages(client, guild) { if (guild.unavailable) return const bridgedChannels = select("channel_room", "channel_id").pluck().all() - const preparedExists = db.prepare("SELECT channel_id FROM message_channel WHERE channel_id = ? LIMIT 1") + const preparedExists = from("message_room").join("historical_channel_room", "historical_room_index").pluck("message_id").and("WHERE reference_channel_id = ? LIMIT 1").prepare() const preparedGet = select("event_message", "event_id", {}, "WHERE message_id = ?").pluck() /** @type {(DiscordTypes.APIChannel & {type: DiscordTypes.GuildChannelType})[]} */ let channels = [] diff --git a/src/db/migrations/0017-analyze.sql b/src/db/migrations/0017-analyze.sql deleted file mode 100644 index 802fca2..0000000 --- a/src/db/migrations/0017-analyze.sql +++ /dev/null @@ -1,225 +0,0 @@ --- https://www.sqlite.org/lang_analyze.html - -BEGIN TRANSACTION; - -ANALYZE sqlite_schema; - -DELETE FROM "sqlite_stat1"; -INSERT INTO "sqlite_stat1" ("tbl","idx","stat") VALUES ('sim','sim','625 1'), - ('reaction','reaction','3242 1'), - ('channel_room','channel_room','389 1'), - ('channel_room','sqlite_autoindex_channel_room_1','389 1'), - ('media_proxy','media_proxy','5068 1'), - ('sim_proxy','sim_proxy','36 1'), - ('webhook','webhook','155 1'), - ('member_cache','member_cache','784 3 1'), - ('member_power','member_power','1 1 1'), - ('file','file','21862 1'), - ('message_channel','message_channel','366884 1'), - ('lottie','lottie','19 1'), - ('event_message','event_message','382920 1 1'), - ('migration',NULL,'1'), - ('sim_member','sim_member','2871 7 1'), - ('guild_space','guild_space','32 1'), - ('guild_active','guild_active','34 1'), - ('emoji','emoji','2563 1'), - ('auto_emoji','auto_emoji','3 1'); - -DELETE FROM "sqlite_stat4"; -INSERT INTO "sqlite_stat4" ("tbl","idx","neq","nlt","ndlt","sample") VALUES ('sim','sim','1','69','69',X'0231313137363631373038303932333039353039'), - ('sim','sim','1','139','139',X'0231313530383936363934333439373931323332'), - ('sim','sim','1','209','209',X'0231323231383737363334373737323139303732'), - ('sim','sim','1','279','279',X'0231333039313431353735353334313136383636'), - ('sim','sim','1','349','349',X'0231333935343433383235363034313635363434'), - ('sim','sim','1','419','419',X'0231353335363239373830383338353134373030'), - ('sim','sim','1','489','489',X'0231363930333339333730353930363636383034'), - ('sim','sim','1','559','559',X'0231383535353736303637393137323137383133'), - ('reaction','reaction','1','360','360',X'020699d5faceefb5fb4f'), - ('reaction','reaction','1','721','721',X'0206b61095e98b6b2fb1'), - ('reaction','reaction','1','1082','1082',X'0206d1dcb418603a5eaa'), - ('reaction','reaction','1','1443','1443',X'0206ef9fc42b9df746ad'), - ('reaction','reaction','1','1804','1804',X'02060f38c1f98f130605'), - ('reaction','reaction','1','2165','2165',X'02062b53df6dab7b1067'), - ('reaction','reaction','1','2526','2526',X'020645dd7e7f60c4aac7'), - ('reaction','reaction','1','2887','2887',X'0206658d2fe735805979'), - ('channel_room','channel_room','1','43','43',X'023331313434393131333330393139333231363330'), - ('channel_room','channel_room','1','87','87',X'023331313835343033343830303934303335393738'), - ('channel_room','channel_room','1','131','131',X'023331323139353036353836343139303638393839'), - ('channel_room','channel_room','1','175','175',X'023331323336353538333034323331303334393630'), - ('channel_room','channel_room','1','219','219',X'023331323933373932323135333930323234343235'), - ('channel_room','channel_room','1','263','263',X'023331333333323139363936393333323038303937'), - ('channel_room','channel_room','1','307','307',X'0231343835363635393733363433333738363938'), - ('channel_room','channel_room','1','351','351',X'0231373039303432313039353632323234363731'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','6 6','6 6',X'034b3321416a6c4c49464e6248646474424a6d4d73503a636164656e63652e6d6f6531313531333434383735363139343833373233'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','34 34','34 34',X'034b3321474b4a63424a6b527a47634e4855686c50613a636164656e63652e6d6f6531303237393433323532323237323630343637'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','43 43','43 43',X'034b3121484b50534d62736d694673506d6268414f513a636164656e63652e6d6f65313931343837343839393433343034353434'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','58 58','58 58',X'034b33214a4479425a685545706874784f6e6f6569513a636164656e63652e6d6f6531323937323836373434353633313236333532'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','87 87','87 87',X'034b33214e544d724e686e715271695755654d494d523a636164656e63652e6d6f6531323235323434353738393939373031353536'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','108 108','108 108',X'034b332151444e44796656674e7657565345656876713a636164656e63652e6d6f6531313432333134303935353535363435343830'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','131 131','131 131',X'034b3121544171536b575752654b43506f584c6a75483a636164656e63652e6d6f65383737303730363531343733363631393532'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','175 175','175 175',X'034b3321594249486864714e697255585941587845563a636164656e63652e6d6f6531323335303831373939353936373639333730'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','177 177','177 177',X'034b3321594b46454e79716667696951686956496b533a636164656e63652e6d6f6531323934363237303431343530333933373034'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','186 186','186 186',X'034b3321596f54644f55766a53765349767266716c653a636164656e63652e6d6f6531323734313936373733383435333430323933'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','202 202','202 202',X'034b3121625877616673695372655647676470535a463a636164656e63652e6d6f65373339303137363739373936343336393932'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','208 208','208 208',X'034b3321634a4b6843764943795377717a47634551423a636164656e63652e6d6f6531323732363632303331323238373331343834'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','219 219','219 219',X'034b3121656455786a56647a6755765844554951434b3a636164656e63652e6d6f65343937313631333530393334353630373738'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','242 242','242 242',X'034b31216a4d746e6e6f51414e4278466a486458494d3a636164656e63652e6d6f65373634353135323932303539323731313939'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','263 263','263 263',X'034b31216c7a776870666a5a6e59797468656a7453483a636164656e63652e6d6f65383838343831373132383438343030343534'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','264 264','264 264',X'034b33216d454c5846716a426958726d7558796943723a636164656e63652e6d6f6531313936393134373631303430393234373432'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','268 268','268 268',X'034b33216d557765577571546761574a767769576a653a636164656e63652e6d6f6531323936373131393236333032333830303834'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','291 291','291 291',X'034b3321704761494e45534643587a634e42497a724e3a636164656e63652e6d6f6531303237343531333333333533313532353232'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','306 306','306 306',X'034b3321717646656248564f4b6876454e54494563763a636164656e63652e6d6f6531323737373238383139323232303230313436'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','307 307','307 307',X'034b332171767370666d716f476449634a66794c506c3a636164656e63652e6d6f6531323936393138333638393539343633343735'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','351 351','351 351',X'034b3321774e7a7741724a47796f4c5168426f544e4b3a636164656e63652e6d6f6531303238303436373930333435333739383930'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','368 368','368 368',X'034b3321794e6d504c7765654a69756570725a677a733a636164656e63652e6d6f6531323531393631373233373731313632363234'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','376 376','376 376',X'034b3121796a4879795772466f704c66646878564e423a636164656e63652e6d6f65333336313537353037303734353233313336'), - ('channel_room','sqlite_autoindex_channel_room_1','1 1','379 379','379 379',X'034b31217a4c4f6b62766b44587551465948594555673a636164656e63652e6d6f65393933383838313433373030393330363331'), - ('media_proxy','media_proxy','1','563','563',X'02069e6054680b610946'), - ('media_proxy','media_proxy','1','1127','1127',X'0206bb489b717c9320e4'), - ('media_proxy','media_proxy','1','1691','1691',X'0206d75f602775b7a27c'), - ('media_proxy','media_proxy','1','2255','2255',X'0206f2c705ddca4e2b14'), - ('media_proxy','media_proxy','1','2819','2819',X'02061060db7a5151967b'), - ('media_proxy','media_proxy','1','3383','3383',X'02062cc47366f7550d22'), - ('media_proxy','media_proxy','1','3947','3947',X'020647d275ec0d781fc7'), - ('media_proxy','media_proxy','1','4511','4511',X'02066402024a7ea38249'), - ('sim_proxy','sim_proxy','1','4','4',X'025531316564343731342d636635652d346333372d393331382d376136353266383732636634'), - ('sim_proxy','sim_proxy','1','9','9',X'025533346636333932642d323263372d346337382d393063372d326536323734313535613266'), - ('sim_proxy','sim_proxy','1','14','14',X'025535396662363131392d626133392d346565382d393738612d386432376366303631393633'), - ('sim_proxy','sim_proxy','1','19','19',X'025539373066366536332d646234632d346531342d383063362d336639343938643961363665'), - ('sim_proxy','sim_proxy','1','24','24',X'025561636231613335642d313336662d343362332d626365622d326566646634616265306436'), - ('sim_proxy','sim_proxy','1','29','29',X'025563316635623735392d336136342d343633342d623634632d643461656436316539656632'), - ('sim_proxy','sim_proxy','1','34','34',X'025566323230373135632d633436332d343532622d626233612d373662646662306365353537'), - ('webhook','webhook','1','17','17',X'023331313532383834313435343038373230393936'), - ('webhook','webhook','1','35','35',X'023331313939303936333434333830343631313138'), - ('webhook','webhook','1','53','53',X'023331323331383036353337373032353736313938'), - ('webhook','webhook','1','71','71',X'023331323933373836383939343238383036363536'), - ('webhook','webhook','1','89','89',X'023331333132363031353130363535353537373132'), - ('webhook','webhook','1','107','107',X'0231323937323734313733303636333133373339'), - ('webhook','webhook','1','125','125',X'0231353239313736313536333938363832313137'), - ('webhook','webhook','1','143','143',X'0231363837303238373334333232313437333434'), - ('member_cache','member_cache','4 1','73 74','48 74',X'034b3921496f4866536e67625a6762747061747a494e3a636164656e63652e6d6f65406875636b6c65746f6e3a636164656e63652e6d6f65'), - ('member_cache','member_cache','2 1','86 87','57 87',X'034b2d214b5169714663546e764f6f4f424475746a7a3a636164656e63652e6d6f6540726e6c3a636164656e63652e6d6f65'), - ('member_cache','member_cache','4 1','101 104','68 104',X'034b43214e446249714e704a795076664b526e4e63723a636164656e63652e6d6f6540776f756e6465645f77617272696f723a6d61747269782e6f7267'), - ('member_cache','member_cache','4 1','110 113','73 113',X'034b3b214f485844457370624d485348716c4445614f3a636164656e63652e6d6f6540717561647261646963616c3a6d61747269782e6f7267'), - ('member_cache','member_cache','5 1','171 175','111 175',X'034b3b215450616f6a5454444446444847776c7276743a636164656e63652e6d6f6540766962656973766572796f3a6d61747269782e6f7267'), - ('member_cache','member_cache','39 1','180 208','116 208',X'034b4d2154716c79516d69667847556767456d64424e3a636164656e63652e6d6f6540726f626c6b796f6772653a6372616674696e67636f6d72616465732e6e6574'), - ('member_cache','member_cache','4 1','231 231','126 231',X'034b3b2156624f77675559777146614e4c5345644e413a636164656e63652e6d6f654061666c6f7765723a73796e646963617465642e676179'), - ('member_cache','member_cache','9 1','262 263','141 263',X'034b3b21594b46454e79716667696951686956496b533a636164656e63652e6d6f654062656e6d61633a636861742e62656e6d61632e78797a'), - ('member_cache','member_cache','3 1','283 283','149 283',X'034b35215a615a4d78456f52724d6d4e49554d79446c3a636164656e63652e6d6f6540636164656e63653a636164656e63652e6d6f65'), - ('member_cache','member_cache','88 1','307 351','166 351',X'034b3b2163427874565278446c5a765356684a58564b3a636164656e63652e6d6f65406a61736b617274683a736c656570696e672e746f776e'), - ('member_cache','member_cache','11 1','408 415','177 415',X'034b5121654856655270706e6c6f57587177704a6e553a636164656e63652e6d6f65406a61636b736f6e6368656e3636363a6a61636b736f6e6368656e3636362e636f6d'), - ('member_cache','member_cache','7 1','423 424','181 424',X'034b4b2165724f7079584e465a486a48724568784e583a636164656e63652e6d6f6540616d796973636f6f6c7a3a6d61747269782e6174697573616d792e636f6d'), - ('member_cache','member_cache','96 1','436 439','187 439',X'034b4b21676865544b5a7451666c444e7070684c49673a636164656e63652e6d6f6540616c65783a73706163652e67616d65727374617665726e2e6f6e6c696e65'), - ('member_cache','member_cache','96 1','436 527','187 527',X'034b3121676865544b5a7451666c444e7070684c49673a636164656e63652e6d6f654078796c6f626f6c3a616d6265722e74656c'), - ('member_cache','member_cache','10 1','546 555','197 555',X'0351312169537958674e7851634575586f587073536e3a707573737468656361742e6f726740797562697175653a6e6f70652e63686174'), - ('member_cache','member_cache','13 1','594 601','224 601',X'034b2b216c7570486a715444537a774f744d59476d493a636164656e63652e6d6f6540656c6c69753a68617368692e7265'), - ('member_cache','member_cache','2 1','614 615','229 615',X'034b2f216d584978494644676c4861734e53427371773a636164656e63652e6d6f654077696e673a666561746865722e6f6e6c'), - ('member_cache','member_cache','4 1','616 619','230 619',X'034b2f216d616767455367755a427147425a74536e723a636164656e63652e6d6f654077696e673a666561746865722e6f6e6c'), - ('member_cache','member_cache','4 1','659 660','259 660',X'034b332172454f73706e5971644f414c4149466e69563a636164656e63652e6d6f6540656c797369613a636164656e63652e6d6f65'), - ('member_cache','member_cache','4 1','699 701','284 701',X'034b3521766e717a56767678534a586c5a504f5276533a636164656e63652e6d6f6540636164656e63653a636164656e63652e6d6f65'), - ('member_cache','member_cache','1 1','703 703','285 703',X'034b3521767165714c474851616842464a56566779483a636164656e63652e6d6f654063696465723a6361746769726c2e636c6f7564'), - ('member_cache','member_cache','4 1','705 705','287 705',X'034b35217750454472596b77497a6f744e66706e57503a636164656e63652e6d6f6540636164656e63653a636164656e63652e6d6f65'), - ('member_cache','member_cache','35 1','709 709','288 709',X'034b2d2177574f667376757356486f4e4e567242585a3a636164656e63652e6d6f654061613a6361747669626572732e6d65'), - ('member_cache','member_cache','14 1','747 749','291 749',X'034b3721776c534544496a44676c486d42474b7254703a636164656e63652e6d6f654062616461746e616d65733a62616461742e646576'), - ('member_power','member_power','1 1','0 0','0 0',X'03350f40636164656e63653a636164656e63652e6d6f652a'), - ('file','file','1','2429','2429',X'03815f68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f313039393033313838373530303033343038382f313333313336303134333238333036303833372f50584c5f32303235303132315f3230323934323137372e6a7067'), - ('file','file','1','4859','4859',X'03817568747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f313134353832313533383832323637323436362f313330323232393131303834373936373331352f53637265656e73686f745f32303234313130325f3034313332365f5265646469742e6a7067'), - ('file','file','1','7289','7289',X'03815968747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f313231393439383932363436363636323433302f313239373634363930353038353636313234362f494d475f32303234313032305f3135323230302e6a7067'), - ('file','file','1','9719','9719',X'03814168747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3135393136353731343139343735393638302f313236383537333933363531343337313635392f494d475f353433362e6a7067'), - ('file','file','1','12149','12149',X'03813b68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3236363736373539303634313233383032372f313237323430333931313939383730313630392f696d6167652e706e67'), - ('file','file','1','14579','14579',X'03816b68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3539383730363933323736303434343936392f313237373532343532343330383632373437372f45585445524e414c5f454449545f323032345f4d5f64726166745f322e646f6378'), - ('file','file','1','17009','17009',X'03815768747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3635353231363137333639363238363734362f313333333630333132383634313036303938342f323032352d30312d32375f31372e30312e31352e706e67'), - ('file','file','1','19439','19439',X'027f68747470733a2f2f63646e2e646973636f72646170702e636f6d2f656d6f6a69732f313230323936303730343936313931323836322e706e67'), - ('message_channel','message_channel','1','40764','40764',X'023331313630333434353733303030383232383735'), - ('message_channel','message_channel','1','81529','81529',X'023331313830323437393130343238393837343333'), - ('message_channel','message_channel','1','122294','122294',X'023331313938303533383732383337363131363230'), - ('message_channel','message_channel','1','163059','163059',X'023331323237373739373330333839303738303537'), - ('message_channel','message_channel','1','203824','203824',X'023331323437303438333039303031313538373137'), - ('message_channel','message_channel','1','244589','244589',X'023331323635363939353734333034303830303034'), - ('message_channel','message_channel','1','285354','285354',X'023331323835343637363238323434313732383234'), - ('message_channel','message_channel','1','326119','326119',X'023331333038373932333935313031333736353732'), - ('lottie','lottie','1','2','2',X'0231373439303534363630373639323138363331'), - ('lottie','lottie','1','5','5',X'0231373534313037353339323030363731373635'), - ('lottie','lottie','1','8','8',X'0231373936313430363338303933343433303932'), - ('lottie','lottie','1','11','11',X'0231373936313431373032363935343835353030'), - ('lottie','lottie','1','14','14',X'0231383136303837373932323931323832393434'), - ('lottie','lottie','1','17','17',X'0231383233393736313032393736323930383636'), - ('event_message','event_message','11 1','14788 14796','14356 14796',X'03336531313532303033373639343137303839303434246d44714a474b3530424a715170394273684e534d64365f3768494354776e70362d793130786d6669766563'), - ('event_message','event_message','11 1','33806 33815','32914 33815',X'033365313135373630333638373035373836363736322459526f7139484b376e55677a397668796f6e3053424a49497978497a5750734e4f6e39756f765644664d45'), - ('event_message','event_message','1 1','42546 42546','41335 42546',X'03336531313630363236383737353835363938393237245033436e4f6d6a35462d6939454e4e79586b70796f5679306b74324a654464764276326e746d33566a4355'), - ('event_message','event_message','2 1','85093 85093','81999 85093',X'0333653131383039393939363531323930343831303424496748666562784533746e623047412d534f7176594a354e4e55385735706c68523159676854636a554734'), - ('event_message','event_message','11 1','116157 116165','111525 116165',X'03336531313933363837333730363137333237363536245a32305734766c737079566e387a6e2d526a6f64694a51745f5a7851644f5f33744e415169453755356477'), - ('event_message','event_message','1 1','127640 127640','122328 127640',X'0333653132303132353637313733373633303332323624702d626f415672476a4b45327a7158664f3738387a5a597a376a42624648717431334d386464705467476f'), - ('event_message','event_message','16 1','140270 140281','134379 140281',X'03336531323039333735363534373138343830343235246c374a4f7543526b7756306d627a69356e5843496b4538416a6951374f67473455456c2d7053445a516649'), - ('event_message','event_message','11 1','162065 162071','154933 162071',X'0333653132323434383135393033313937373537373424674c77513179796e4b6d5859496b5a597a4a55627a66557a55552d714c4b5f524f454e4250325f6e44766b'), - ('event_message','event_message','1 1','170187 170187','162530 170187',X'0333653132323937373533363839343532373038333424656c6c76416a544a5847627936767249767470677a555572787231716f5a75536e50525f474b4e35455945'), - ('event_message','event_message','11 1','178736 178736','170762 178736',X'03336531323333353238303533323338333337353537242d39304668552d36455373594b6435484d7237666d6a414a5f6a576149616e356c4776384e655436564959'), - ('event_message','event_message','10 1','180317 180325','172228 180325',X'03336531323334363237303030393333383130323637246a4679416449665a4f54432d2d735971715472473735374c7a50504f34386439657963485477686d797751'), - ('event_message','event_message','1 1','212734 212734','203278 212734',X'03336531323438303131373930303633373637363734246557493950456f4d576b614b4d33416a7030782d6d455f6c4b4a6c495f6d6d44686f6379464b5170534f59'), - ('event_message','event_message','11 1','228100 228103','217856 228103',X'033365313235333734353736363733373132313336322447326a7a746e5977716a3676304a7a4168576e30725950596470667a5f496f76426771574a4876434c516b'), - ('event_message','event_message','11 1','240172 240181','229123 240181',X'033365313235393239383538323233303630313735382472635679454c5a76647453547a37366f3669434a4f614a316a756f683835535778494d546c5072517a676f'), - ('event_message','event_message','10 1','240259 240264','229132 240264',X'0333653132353933303030343035333535373235323024535849376a465f696e71424d714c4f564b347659746852644b31724747502d435a5f355a354f6b774e3751'), - ('event_message','event_message','2 1','255280 255281','243230 255281',X'03336531323636373837343338353137343234313738246e6e4e576f526a54495757723441463770625454746b7a73784c4d336b312d6d6645665031496b43586e59'), - ('event_message','event_message','1 1','297828 297828','283436 297828',X'0333653132383637303937353334363834323032313024544342465970356f39767a2d4f6b2d33654f4e433772426d354966615934476b48536e58445257474f4767'), - ('event_message','event_message','1 1','340375 340375','323489 340375',X'033365313330393336363936343530353934303030392431664536386d2d50546e786d5474345458584c35754847594139353779396c76582d50797150496d395f30'), - ('event_message','event_message','11 1','343791 343799','326730 343799',X'03336531333131353731333337393331363537323737246731767241315269725951592d3933304f6973587142372d6961686e34684e492d6462374952714176616b'), - ('event_message','event_message','10 1','363207 363216','344868 363216',X'0333653133323434393732323633393438393834393524784f78636e4749364269545941734d7a4f7557316f526e68356b675378544e30466442386a3037695f4f67'), - ('event_message','event_message','10 1','363219 363219','344871 363219',X'033365313332343439373532363733323039393732352432586f7938567937643843375a47767472657966326b4c4f4159397546386b4755364c3642435f446b6d77'), - ('event_message','event_message','10 1','363340 363343','344918 363343',X'03336531333234353037313732333634373530393830244f46645731396649534176706d34646c36367a2d5543337236432d436354506e34752d63444f7036733345'), - ('event_message','event_message','11 1','369452 369456','350712 369456',X'0333653133323736353831313733343439323336383024574d774330644574417277375f4562554a534465546532577174506d3747584347774570646c4f79326d30'), - ('event_message','event_message','10 1','372353 372356','353425 372356',X'0333653133323933313737353039313234353035373224366259364d313472667163486d5854476349716d4a4366467471796839794472375a6a487463715a6d4f34'), - ('sim_member','sim_member','225 1','0 12','0 12',X'034b4721414956694e775a64636b4652764c4f4567433a636164656e63652e6d6f65405f6f6f79655f616b6972615f6e6965723a636164656e63652e6d6f65'), - ('sim_member','sim_member','2 1','319 319','14 319',X'034b43214456706f6e54524d56456570486378744c423a636164656e63652e6d6f65405f6f6f79655f656e746f6c6f6d613a636164656e63652e6d6f65'), - ('sim_member','sim_member','68 1','391 440','26 440',X'034b4921457a54624a496c496d45534f746b4e644e4a3a636164656e63652e6d6f65405f6f6f79655f73617475726461797465643a636164656e63652e6d6f65'), - ('sim_member','sim_member','8 1','638 639','59 639',X'034b3f21497a4f675169446e757346516977796d614c3a636164656e63652e6d6f65405f6f6f79655f636f6f6b69653a636164656e63652e6d6f65'), - ('sim_member','sim_member','31 1','743 771','86 771',X'034b49214d5071594e414a62576b72474f544a7461703a636164656e63652e6d6f65405f6f6f79655f746865666f6f6c323239343a636164656e63652e6d6f65'), - ('sim_member','sim_member','26 1','774 787','87 787',X'034b49214d687950614b4250506f496c7365794d6d743a636164656e63652e6d6f65405f6f6f79655f6b79757567727970686f6e3a636164656e63652e6d6f65'), - ('sim_member','sim_member','27 1','877 881','104 881',X'034b45215063734371724f466a48476f41424270414c3a636164656e63652e6d6f65405f6f6f79655f62696c6c795f626f623a636164656e63652e6d6f65'), - ('sim_member','sim_member','16 1','956 959','117 959',X'034b43215158526f4a777a63506d5047546d454b454d3a636164656e63652e6d6f65405f6f6f79655f626f7472616334723a636164656e63652e6d6f65'), - ('sim_member','sim_member','32 1','997 1012','121 1012',X'034b3f215170676c734e587a4c7751594d4c6c734f503a636164656e63652e6d6f65405f6f6f79655f6a75746f6d693a636164656e63652e6d6f65'), - ('sim_member','sim_member','7 1','1274 1279','157 1279',X'034b4121554d6f6e68556765644d47585a78466658753a636164656e63652e6d6f65405f6f6f79655f6d696e696d75733a636164656e63652e6d6f65'), - ('sim_member','sim_member','27 1','1415 1439','188 1439',X'034b3d21595868717249786d586e47736961796a59783a636164656e63652e6d6f65405f6f6f79655f73746161663a636164656e63652e6d6f65'), - ('sim_member','sim_member','16 1','1597 1599','217 1599',X'034b512163466a4479477274466d48796d794c6652453a636164656e63652e6d6f65405f6f6f79655f626f6a61636b5f686f7273656d616e3a636164656e63652e6d6f65'), - ('sim_member','sim_member','27 1','1758 1761','248 1761',X'034b3d2168665a74624d656f5355564e424850736a743a636164656e63652e6d6f65405f6f6f79655f617a7572653a636164656e63652e6d6f65'), - ('sim_member','sim_member','25 1','1865 1886','270 1886',X'034b3f216b4c52714b4b555158636962494d744f706c3a636164656e63652e6d6f65405f6f6f79655f7361796f72693a636164656e63652e6d6f65'), - ('sim_member','sim_member','19 1','1918 1919','276 1919',X'034b3d216b68497350756c465369736d43646c596e493a636164656e63652e6d6f65405f6f6f79655f617a7572653a636164656e63652e6d6f65'), - ('sim_member','sim_member','33 1','1986 2015','286 2015',X'034b3d216d5451744d736a534c4f646c576f7265594d3a636164656e63652e6d6f65405f6f6f79655f73746161663a636164656e63652e6d6f65'), - ('sim_member','sim_member','37 1','2027 2028','289 2028',X'034b4d216d616767455367755a427147425a74536e723a636164656e63652e6d6f65405f6f6f79655f2e7265616c2e706572736f6e2e3a636164656e63652e6d6f65'), - ('sim_member','sim_member','28 1','2117 2130','297 2130',X'034b3f216e4e595a794b6f4e70797859417a50466f733a636164656e63652e6d6f65405f6f6f79655f6a75746f6d693a636164656e63652e6d6f65'), - ('sim_member','sim_member','20 1','2230 2239','310 2239',X'034b41217046504c7270594879487a784e4c69594b413a636164656e63652e6d6f65405f6f6f79655f686578676f61743a636164656e63652e6d6f65'), - ('sim_member','sim_member','30 1','2381 2398','332 2398',X'034b3b21717a44626c4b6c69444c577a52524f6e465a3a636164656e63652e6d6f65405f6f6f79655f6d6e696b3a636164656e63652e6d6f65'), - ('sim_member','sim_member','38 1','2490 2518','344 2518',X'034b3d2173445250714549546e4f4e57474176496b423a636164656e63652e6d6f65405f6f6f79655f727974686d3a636164656e63652e6d6f65'), - ('sim_member','sim_member','11 1','2555 2559','358 2559',X'034b4321746751436d526b426e6474516362687150583a636164656e63652e6d6f65405f6f6f79655f6a6f7365707065793a636164656e63652e6d6f65'), - ('sim_member','sim_member','47 1','2633 2666','377 2666',X'034b4b217750454472596b77497a6f744e66706e57503a636164656e63652e6d6f65405f6f6f79655f6e61706f6c656f6e333038393a636164656e63652e6d6f65'), - ('sim_member','sim_member','52 1','2817 2837','414 2837',X'034b43217a66654e574d744b4f764f48766f727979563a636164656e63652e6d6f65405f6f6f79655f696e736f676e69613a636164656e63652e6d6f65'), - ('guild_space','guild_space','1','3','3',X'0231313132373630363639313738323431303234'), - ('guild_space','guild_space','1','7','7',X'023331313534383638343234373234343633363837'), - ('guild_space','guild_space','1','11','11',X'023331323139303338323637383430393235383138'), - ('guild_space','guild_space','1','15','15',X'023331323839353939363232353930383930313335'), - ('guild_space','guild_space','1','19','19',X'0231323733383737363437323234393935383431'), - ('guild_space','guild_space','1','23','23',X'0231353239313736313536333938363832313135'), - ('guild_space','guild_space','1','27','27',X'0231373535303134333534373334313533383138'), - ('guild_space','guild_space','1','31','31',X'0231393933383838313432343535323130303834'), - ('guild_active','guild_active','1','3','3',X'0231313132373630363639313738323431303234'), - ('guild_active','guild_active','1','7','7',X'023331313534383638343234373234343633363837'), - ('guild_active','guild_active','1','11','11',X'023331323139303338323637383430393235383138'), - ('guild_active','guild_active','1','15','15',X'023331323839353939363232353930383930313335'), - ('guild_active','guild_active','1','19','19',X'023331333333323139363936393333323038303934'), - ('guild_active','guild_active','1','23','23',X'0231343735353939303338353336373434393630'), - ('guild_active','guild_active','1','27','27',X'022f3636313932393535373737343836383438'), - ('guild_active','guild_active','1','31','31',X'0231383737303635303431393930353136373637'), - ('emoji','emoji','1','284','284',X'023331313132323031303430303637303339333332'), - ('emoji','emoji','1','569','569',X'023331323334393032303131393436383630363638'), - ('emoji','emoji','1','854','854',X'0231323735313734373438353034313935303732'), - ('emoji','emoji','1','1139','1139',X'0231333837343730383630303134393737303235'), - ('emoji','emoji','1','1424','1424',X'0231353435363639393734303130383838313932'), - ('emoji','emoji','1','1709','1709',X'0231363339313034333030393139393437323634'), - ('emoji','emoji','1','1994','1994',X'0231373532363932363230303638373832313231'), - ('emoji','emoji','1','2279','2279',X'0231383935343737353331303434363138323430'), - ('auto_emoji','auto_emoji','1','0','0',X'02114c31'), - ('auto_emoji','auto_emoji','1','1','1',X'02114c32'), - ('auto_emoji','auto_emoji','1','2','2',X'020f5f'); - -ANALYZE sqlite_schema; - -COMMIT; diff --git a/src/db/migrations/0026-make-rooms-historical.sql b/src/db/migrations/0026-make-rooms-historical.sql new file mode 100644 index 0000000..f9f4b48 --- /dev/null +++ b/src/db/migrations/0026-make-rooms-historical.sql @@ -0,0 +1,62 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; + +-- *** historical_channel_room *** + +CREATE TABLE "historical_channel_room" ( + "historical_room_index" INTEGER NOT NULL, + "reference_channel_id" TEXT NOT NULL, + "room_id" TEXT NOT NULL UNIQUE, + PRIMARY KEY("historical_room_index" AUTOINCREMENT), + FOREIGN KEY("reference_channel_id") REFERENCES "channel_room"("channel_id") ON DELETE CASCADE +); + +INSERT INTO historical_channel_room (reference_channel_id, room_id) SELECT channel_id, room_id FROM channel_room; + +-- *** message_channel -> message_room *** + +CREATE TABLE "message_room" ( + "message_id" TEXT NOT NULL, + "historical_room_index" INTEGER NOT NULL, + PRIMARY KEY("message_id"), + FOREIGN KEY("historical_room_index") REFERENCES "historical_channel_room"("historical_room_index") ON DELETE CASCADE +) WITHOUT ROWID; +INSERT INTO message_room (message_id, historical_room_index) SELECT message_id, max(historical_room_index) as historical_room_index FROM message_channel INNER JOIN historical_channel_room ON historical_channel_room.reference_channel_id = message_channel.channel_id GROUP BY message_id; + +-- *** event_message *** + +CREATE TABLE "new_event_message" ( + "event_id" TEXT NOT NULL, + "event_type" TEXT, + "event_subtype" TEXT, + "message_id" TEXT NOT NULL, + "part" INTEGER NOT NULL, + "reaction_part" INTEGER NOT NULL, + "source" INTEGER NOT NULL, + PRIMARY KEY("message_id","event_id"), + FOREIGN KEY("message_id") REFERENCES "message_room"("message_id") ON DELETE CASCADE +) WITHOUT ROWID; +INSERT INTO new_event_message (event_id, event_type, event_subtype, message_id, part, reaction_part, source) SELECT event_id, event_type, event_subtype, message_id, part, reaction_part, source from event_message; +DROP TABLE event_message; +ALTER TABLE new_event_message RENAME TO event_message; + +-- *** reaction *** + +CREATE TABLE "new_reaction" ( + "hashed_event_id" INTEGER NOT NULL, + "message_id" TEXT NOT NULL, + "encoded_emoji" TEXT NOT NULL, original_encoding TEXT, + PRIMARY KEY("hashed_event_id"), + FOREIGN KEY("message_id") REFERENCES "message_room"("message_id") ON DELETE CASCADE +) WITHOUT ROWID; +INSERT INTO new_reaction (hashed_event_id, message_id, encoded_emoji) SELECT hashed_event_id, message_id, encoded_emoji FROM reaction; +DROP TABLE reaction; +ALTER TABLE new_reaction RENAME TO reaction; + +-- *** + +DROP TABLE message_channel; +PRAGMA foreign_key_check; + +COMMIT; +PRAGMA foreign_keys=ON; diff --git a/src/db/migrations/0027-analyze.sql b/src/db/migrations/0027-analyze.sql new file mode 100644 index 0000000..0357393 --- /dev/null +++ b/src/db/migrations/0027-analyze.sql @@ -0,0 +1,256 @@ +-- https://www.sqlite.org/lang_analyze.html + +BEGIN TRANSACTION; + +ANALYZE sqlite_schema; + +DELETE FROM "sqlite_stat1"; +INSERT INTO "sqlite_stat1" ("tbl","idx","stat") VALUES ('reaction','reaction','4706 1'), +('event_message','event_message','535744 1 1'), +('historical_channel_room','sqlite_autoindex_historical_channel_room_1','996 1'), +('message_room','message_room','508753 1'), +('invite','invite','3 2 1'), +('auto_emoji','auto_emoji','2 1'), +('sim','sim','1072 1'), +('webhook','webhook','205 1'), +('channel_room','channel_room','996 1'), +('channel_room','sqlite_autoindex_channel_room_1','996 1'), +('guild_active','guild_active','45 1'), +('media_proxy','media_proxy','19581 1'), +('sim_member','sim_member','5501 6 1'), +('emoji','emoji','3470 1'), +('guild_space','guild_space','42 1'), +('member_power','member_power','1 1 1'), +('sim_proxy','sim_proxy','213 1'), +('migration',NULL,'1'), +('member_cache','member_cache','1099 3 1'), +('direct','direct','1 1'), +('file','file','36309 1'), +('lottie','lottie','22 1'); + +DELETE FROM "sqlite_stat4"; +INSERT INTO "sqlite_stat4" ("tbl","idx","neq","nlt","ndlt","sample") VALUES ('reaction','reaction','1','522','522',X'02069c21bd28f26ae025'), + ('reaction','reaction','1','1045','1045',X'0206b8b64d2a67851518'), + ('reaction','reaction','1','1568','1568',X'0206d45580ee5b75848e'), + ('reaction','reaction','1','2091','2091',X'0206f103da3779e1cf70'), + ('reaction','reaction','1','2614','2614',X'02061028b6f24ae55f1a'), + ('reaction','reaction','1','3137','3137',X'02062bd1ffb636826ad6'), + ('reaction','reaction','1','3660','3660',X'020647c632b246bf22ae'), + ('reaction','reaction','1','4183','4183',X'020664ebb265471ad34e'), + ('event_message','event_message','11 1','14790 14800','14356 14800',X'033365313135323030333736393431373038393034342471375f4b666676763631582d30794639334b7532776459377a56553068745a744c2d705272367142473851'), + ('event_message','event_message','11 1','33809 33817','32914 33817',X'03336531313537363033363837303537383636373632245646504363595144413134586c664d4f5041786c58596b4432595a503562656d6f63336b39787735596141'), + ('event_message','event_message','1 1','59527 59527','57719 59527',X'03336531313636383130343235323637303737323031244e343074365465464f3841585255766a353568312d31345f3533476c686b586a43364b6142534442647677'), + ('event_message','event_message','10 1','104218 104225','100236 104225',X'03336531313838373238363331323637313736343538246c6f35326a6332723637734b4b5f4b767a4361702d62627573506d423931454f76776f5f614a6a5a6e6f4d'), + ('event_message','event_message','11 1','116172 116174','111525 116174',X'03336531313933363837333730363137333237363536244546764673764c6c62316a446a4f616b4838584f68636d556161316f6d7651494143374575723146686567'), + ('event_message','event_message','10 1','116223 116230','111530 116230',X'03336531313933363837363335343238393231343636246a7243703367546f676a4930525a315561655931577978724d67737874704431494b3769454d6972754e73'), + ('event_message','event_message','1 1','119055 119055','114207 119055',X'0333653131393530353035383636333130363537353124335561353079304c7044386248725f7142574f44306d6569794f37524a4c746238755755725a716c665477'), + ('event_message','event_message','16 1','140286 140286','134379 140286',X'033365313230393337353635343731383438303432352430347938482d444f49634270597873576b31756d417a4e424e3061774634487457636e3177426476755255'), + ('event_message','event_message','11 1','162080 162090','154932 162090',X'0333653132323434383135393033313937373537373424784753744170626668647074526f4a755a2d4d416c557446424e524939344f7661506e4a55694952366138'), + ('event_message','event_message','1 1','178583 178583','170598 178583',X'033365313233333436343838383836393931363736352444643279534c3857704f666268576b626d684758716c49746f6e7237384b6656456956334b664a43702d38'), + ('event_message','event_message','11 1','178659 178662','170672 178662',X'03336531323333353238303533323338333337353537244e482d334a42617864424f53724c3259766b715534696c6e54724d485f57454973524b556c684b744f4977'), + ('event_message','event_message','11 1','215266 215274','205302 215274',X'03336531323533373435373636373337313231333632246a4b63784e434f784b627558315746346e59696538783472753559724a2d756c38455756715731796a4349'), + ('event_message','event_message','11 1','224498 224504','213831 224504',X'03336531323539323938353832323330363031373538246646483237794b4f75554a5943723671762d676b324b6f636f784663574b766c654b3167636d6445377177'), + ('event_message','event_message','10 1','224585 224593','213840 224593',X'03336531323539333030303430353335353732353230247164484754527353717138524376756735435349457a6d73717633396c4335746e334942487a4b6366646b'), + ('event_message','event_message','1 1','238111 238111','226382 238111',X'0333653132363833333233363330323132383735333724766f6261774b476a5742357770795970364c4a3931615136524a6b7330597a7a717a6e715953344d325467'), + ('event_message','event_message','1 1','297639 297639','282242 297639',X'0333653133303634313236363735393832373837333624502d47394f59667430735143334d6a475a532d445242376a586b4e62366147734c6a6b39544c7561434763'), + ('event_message','event_message','11 1','304605 304606','288785 304606',X'03336531333131353731333337393331363537323737243031717a505a477a35764a475276464f716533653570513930705a6a43644c326a33485635415571504559'), + ('event_message','event_message','10 1','322247 322256','305183 322256',X'03336531333234353034393632373530383737373937247a58477647646d614b6f6e4a497232767246354c523235796e4e4b476b5a357a774a696a44645433694f49'), + ('event_message','event_message','11 1','327028 327032','309699 327032',X'0333653133323736353831313733343439323336383024574d774330644574417277375f4562554a534465546532577174506d3747584347774570646c4f79326d30'), + ('event_message','event_message','1 1','357167 357167','338131 357167',X'033365313334353735363437313239393933363237362436755847477632536e727a63346353616e3937686a6562356a6a77516d6d4c66464f4c305f74316d627130'), + ('event_message','event_message','10 1','365779 365781','346205 365781',X'03336531333439393933323736353839323135373835244f484162596f6b67435748704a36556a6e74545f74774452484743624e52656e617a5a3658776f464a4e55'), + ('event_message','event_message','1 1','416695 416695','394011 416695',X'0333653133363737343039323037343035383134363624486e346e6d784571634758767153577a7343656a586733696c517930554869705f34547073504e71684f55'), + ('event_message','event_message','11 1','422263 422266','399248 422266',X'0333653133363938333439303532363130343738313824436a34597373765a46544877415a5236724c77472d635250716c426b7a3749626d473261766653562d4e55'), + ('event_message','event_message','1 1','476223 476223','449789 476223',X'033365313430313837343437373832313732363834312455414d51397a6c2d775a39572d327231687866584162746f447143314734646239554b384573596e657359'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','8 8','8 8',X'034b022141534d746248706d6f4b4e736765574274733a636164656e63652e6d6f65025d'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','18 18','18 18',X'034b02214173786a53777176484e444f4665587a676b3a636164656e63652e6d6f65014c'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','94 94','94 94',X'034b0221464d5346425a536d59596964656f4a58594b3a636164656e63652e6d6f65017e'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','100 100','100 100',X'034b0221466875676b616e45716943627448734644483a636164656e63652e6d6f6502d2'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','103 103','103 103',X'034b0221466a7167556258447a474a75796a464746613a636164656e63652e6d6f6503c6'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','110 110','110 110',X'034b0221474650514f614e7a517465534c4b485374543a636164656e63652e6d6f65013e'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','221 221','221 221',X'034b02214c506d4c664f6b796d63646d725644624a463a636164656e63652e6d6f6501ee'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','311 311','311 311',X'034b02215157735a4a7042716c716548686c616962443a636164656e63652e6d6f65029a'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','332 332','332 332',X'034b022152547356547675424f4555506d52687347633a636164656e63652e6d6f650255'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','408 408','408 408',X'034b022155635059696f48454f426761664f576b694f3a636164656e63652e6d6f6502ea'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','443 443','443 443',X'034b01215754625a53764a66524a72736348574b78563a636164656e63652e6d6f6529'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','450 450','450 450',X'034b022157695842616d5676586279476565657a50413a636164656e63652e6d6f650157'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','468 468','468 468',X'034b022158717470725744744f5761667a72486f477a3a636164656e63652e6d6f65018b'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','526 526','526 526',X'034b022162574b794f596c6468484b7a784b757667623a636164656e63652e6d6f650127'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','554 554','554 554',X'034b0221637779454c6c6b55714a565942646a4250543a636164656e63652e6d6f6501b0'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','597 597','597 597',X'034b02216668587668437279724e525661777572636f3a636164656e63652e6d6f6503bd'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','608 608','608 608',X'034b022167636d734472716442706f7463586b4545703a636164656e63652e6d6f6501d5'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','665 665','665 665',X'034b02216a6c4e64496a62687654486b5a74745166773a636164656e63652e6d6f650131'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','708 708','708 708',X'034b01216d454c5846716a426958726d7558796943723a636164656e63652e6d6f656b'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','768 768','768 768',X'034b02216f7a6f494e55494261685177775a6f586b7a3a636164656e63652e6d6f6501d8'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','776 776','776 776',X'034b022170506f63657a415046506f584c6a6a5750443a636164656e63652e6d6f6503aa'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','877 877','877 877',X'034b02217474644e4b6b4b4f49757879566869794b6a3a636164656e63652e6d6f6502e1'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','887 887','887 887',X'034b02217568496f63597a4e41714244694b5645506d3a636164656e63652e6d6f650080'), + ('historical_channel_room','sqlite_autoindex_historical_channel_room_1','1 1','943 943','943 943',X'034b02217863655a4641624250425a6d7842677a51523a636164656e63652e6d6f65036b'), + ('message_room','message_room','1','56528','56528',X'023331313635393437353536363733363334333635'), + ('message_room','message_room','1','113057','113057',X'023331313932353536323035343730363538363132'), + ('message_room','message_room','1','169586','169586',X'023331323331373432353832313033373430343937'), + ('message_room','message_room','1','226115','226115',X'023331323635333430353738363135333934333034'), + ('message_room','message_room','1','282644','282644',X'023331333033373933303435323632353635343637'), + ('message_room','message_room','1','339173','339173',X'023331333434343332333234333137363735363733'), + ('message_room','message_room','1','395702','395702',X'023331333637303635303537373939393636383631'), + ('message_room','message_room','1','452231','452231',X'023331343030353931393936323333373131373238'), + ('invite','invite','1 1','0 0','0 0',X'033549406d616c6b696572693a6d61747269782e6f7267216877535462776967674c584a6f6756506b763a6d61747269782e6f7267'), + ('invite','invite','2 1','1 1','1 1',X'03334b406d65636879613a636164656e63652e6d6f652172486b466c6d724e6e664157455943494a703a636164656e63652e6d6f65'), + ('invite','invite','2 1','1 2','1 2',X'03334b406d65636879613a636164656e63652e6d6f65217549514e424f4f68735976514c645368726b3a636164656e63652e6d6f65'), + ('auto_emoji','auto_emoji','1','0','0',X'02114c31'), + ('auto_emoji','auto_emoji','1','1','1',X'02114c32'), + ('sim','sim','1','119','119',X'025531316564343731342d636635652d346333372d393331382d376136353266383732636634'), + ('sim','sim','1','239','239',X'0231313530373435393839383336333038343830'), + ('sim','sim','1','359','359',X'0231323235393737393435323133313038323234'), + ('sim','sim','1','479','479',X'0231333038323937303732373738343132303332'), + ('sim','sim','1','599','599',X'0231343135373135363735313031373234363735'), + ('sim','sim','1','719','719',X'0231353732363938363739363138353638313933'), + ('sim','sim','1','839','839',X'0231373332373338333838303431343030343231'), + ('sim','sim','1','959','959',X'0231393437373336313831393732353636303636'), + ('webhook','webhook','1','22','22',X'023331313630383933333337303239353836393536'), + ('webhook','webhook','1','45','45',X'023331323139343938393236343636363632343330'), + ('webhook','webhook','1','68','68',X'023331323432383939363632343734373131303630'), + ('webhook','webhook','1','91','91',X'023331323937323836383730393534323833313533'), + ('webhook','webhook','1','114','114',X'023331333430353438363133363931393332373133'), + ('webhook','webhook','1','137','137',X'023331343034313334383236303530383436393331'), + ('webhook','webhook','1','160','160',X'0231333639373535303430343638303431373238'), + ('webhook','webhook','1','183','183',X'0231363035353930343336333230333738383930'), + ('channel_room','channel_room','1','110','110',X'023331313939353030313137393834363733393133'), + ('channel_room','channel_room','1','221','221',X'023331323734313935333432323131393430353434'), + ('channel_room','channel_room','1','332','332',X'023331333437303939353439343430363735383732'), + ('channel_room','channel_room','1','443','443',X'023331343035323432323838343138303632333636'), + ('channel_room','channel_room','1','554','554',X'023331343036373736363630393936333935323830'), + ('channel_room','channel_room','1','665','665',X'023331343039363536363537383835323635393830'), + ('channel_room','channel_room','1','776','776',X'023331343139353132333134363234383638343632'), + ('channel_room','channel_room','1','887','887',X'0231333735373135343638383937353530333631'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','8 8','8 8',X'034b332141534d746248706d6f4b4e736765574274733a636164656e63652e6d6f6531343037333239313938393039303330353135'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','18 18','18 18',X'034b33214173786a53777176484e444f4665587a676b3a636164656e63652e6d6f6531333437303036333637393639343433383430'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','94 94','94 94',X'034b3321464d5346425a536d59596964656f4a58594b3a636164656e63652e6d6f6531343034313333323339303736393530313631'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','100 100','100 100',X'034b3321466875676b616e45716943627448734644483a636164656e63652e6d6f6531343132383936323333373839353837353036'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','103 103','103 103',X'034b3121466a7167556258447a474a75796a464746613a636164656e63652e6d6f65383034363236313139333938393136313037'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','110 110','110 110',X'034b3321474650514f614e7a517465534c4b485374543a636164656e63652e6d6f6531333435363431343537323035323532313737'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','221 221','221 221',X'034b33214c506d4c664f6b796d63646d725644624a463a636164656e63652e6d6f6531343035393733313637323535353834383830'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','311 311','311 311',X'034b33215157735a4a7042716c716548686c616962443a636164656e63652e6d6f6531343039363536363537383835323635393830'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','332 332','332 332',X'034b332152547356547675424f4555506d52687347633a636164656e63652e6d6f6531343037323235393932313935333432343237'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','408 408','408 408',X'034b332155635059696f48454f426761664f576b694f3a636164656e63652e6d6f6531343134303334313437323032303434303134'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','443 443','443 443',X'034b33215754625a53764a66524a72736348574b78563a636164656e63652e6d6f6531313433313231353134393235393238353431'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','450 450','450 450',X'034b332157695842616d5676586279476565657a50413a636164656e63652e6d6f6531333536353037353335313132323738303839'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','468 468','468 468',X'034b332158717470725744744f5761667a72486f477a3a636164656e63652e6d6f6531343034353137353530393634303830363530'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','526 526','526 526',X'034b332162574b794f596c6468484b7a784b757667623a636164656e63652e6d6f6531333239353237383038343232333138313030'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','554 554','554 554',X'034b3321637779454c6c6b55714a565942646a4250543a636164656e63652e6d6f6531343034393538363332363830303939393931'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','597 597','597 597',X'034b31216668587668437279724e525661777572636f3a636164656e63652e6d6f65373535373235353231333731303034393739'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','608 608','608 608',X'034b332167636d734472716442706f7463586b4545703a636164656e63652e6d6f6531343035353833303939383532363139393137'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','665 665','665 665',X'034b33216a6c4e64496a62687654486b5a74745166773a636164656e63652e6d6f6531333339343132353232373538393633323030'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','708 708','708 708',X'034b33216d454c5846716a426958726d7558796943723a636164656e63652e6d6f6531313936393134373631303430393234373432'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','768 768','768 768',X'034b33216f7a6f494e55494261685177775a6f586b7a3a636164656e63652e6d6f6531343035363036393133303638313039383735'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','776 776','776 776',X'034b312170506f63657a415046506f584c6a6a5750443a636164656e63652e6d6f65363832333334343939393136333439353231'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','877 877','877 877',X'034b33217474644e4b6b4b4f49757879566869794b6a3a636164656e63652e6d6f6531343133323134313538383631373632363430'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','887 887','887 887',X'034b33217568496f63597a4e41714244694b5645506d3a636164656e63652e6d6f6531323137383839303233393831323536373534'), + ('channel_room','sqlite_autoindex_channel_room_1','1 1','943 943','943 943',X'034b31217863655a4641624250425a6d7842677a51523a636164656e63652e6d6f65323937323734343934303737333730333638'), + ('guild_active','guild_active','1','5','5',X'023331313433333336323438373631363437313534'), + ('guild_active','guild_active','1','11','11',X'023331313630383933333336333234393331353834'), + ('guild_active','guild_active','1','17','17',X'023331323839353936343835343631323137333430'), + ('guild_active','guild_active','1','23','23',X'023331333338363530383035363233393834333030'), + ('guild_active','guild_active','1','29','29',X'023331343338363132393630393137353836313233'), + ('guild_active','guild_active','1','35','35',X'0231343937313539373236343535343535373534'), + ('guild_active','guild_active','1','41','41',X'0231383730313138363530373638363730373530'), + ('media_proxy','media_proxy','1','2175','2175',X'02069ccd283fa260cb90'), + ('media_proxy','media_proxy','1','4351','4351',X'0206b95c95635f40b3d8'), + ('media_proxy','media_proxy','1','6527','6527',X'0206d546a2d00310b6cc'), + ('media_proxy','media_proxy','1','8703','8703',X'0206f0b1fb70331afcb3'), + ('media_proxy','media_proxy','1','10879','10879',X'02060e48cd55947d2372'), + ('media_proxy','media_proxy','1','13055','13055',X'02062ac70844c1762329'), + ('media_proxy','media_proxy','1','15231','15231',X'0206470a46ab937760c8'), + ('media_proxy','media_proxy','1','17407','17407',X'0206632a367225280573'), + ('sim_member','sim_member','225 1','14 104','4 104',X'034b4521414956694e775a64636b4652764c4f4567433a636164656e63652e6d6f65405f6f6f79655f6a6a6a6a6a363634343a636164656e63652e6d6f65'), + ('sim_member','sim_member','124 1','598 611','85 611',X'034b4921457a54624a496c496d45534f746b4e644e4a3a636164656e63652e6d6f65405f6f6f79655f61726a756e3034323236393a636164656e63652e6d6f65'), + ('sim_member','sim_member','35 1','817 845','107 845',X'034b532147486e4d476978756867527255546d4b77683a636164656e63652e6d6f65405f6f6f79655f6e65637461726f66616d62726f7369613a636164656e63652e6d6f65'), + ('sim_member','sim_member','63 1','943 948','140 948',X'034b452148725979716b6f7942485a4a4e634455564f3a636164656e63652e6d6f65405f6f6f79655f5f706b5f64717a76613a636164656e63652e6d6f65'), + ('sim_member','sim_member','48 1','1022 1037','148 1037',X'034b47214943566475566c646e6774484b64567070503a636164656e63652e6d6f65405f6f6f79655f5f706b5f7078677679783a636164656e63652e6d6f65'), + ('sim_member','sim_member','39 1','1203 1223','174 1223',X'034b45214a48614a714258706d6b49654963615562513a636164656e63652e6d6f65405f6f6f79655f6d69647473756d61723a636164656e63652e6d6f65'), + ('sim_member','sim_member','48 1','1736 1781','289 1781',X'034b472150747969527851614879636777626c636f743a636164656e63652e6d6f65405f6f6f79655f76616e746164656c69613a636164656e63652e6d6f65'), + ('sim_member','sim_member','5 1','1834 1835','299 1835',X'034b472151544372636e695373616f626957444c516f3a636164656e63652e6d6f65405f6f6f79655f68756d616e67616d65723a636164656e63652e6d6f65'), + ('sim_member','sim_member','64 1','2099 2137','353 2137',X'034b4721536c7664497a734f6f534469434e6a6e77733a636164656e63652e6d6f65405f6f6f79655f5f706b5f777768667a6f3a636164656e63652e6d6f65'), + ('sim_member','sim_member','81 1','2215 2276','361 2276',X'034b4321544f61794476734c735a566d5779745166483a636164656e63652e6d6f65405f6f6f79655f6171756173316d703a636164656e63652e6d6f65'), + ('sim_member','sim_member','42 1','2370 2389','373 2389',X'034b47215468436b4b5857434a77657451496d747a573a636164656e63652e6d6f65405f6f6f79655f5f706b5f7465736361723a636164656e63652e6d6f65'), + ('sim_member','sim_member','36 1','2424 2447','380 2447',X'034b472154716c79516d69667847556767456d64424e3a636164656e63652e6d6f65405f6f6f79655f657665727970697a7a613a636164656e63652e6d6f65'), + ('sim_member','sim_member','65 1','2691 2723','438 2723',X'034b472157755a5549494e7457456a64656658414c473a636164656e63652e6d6f65405f6f6f79655f5f706b5f77797a63686a3a636164656e63652e6d6f65'), + ('sim_member','sim_member','2 1','3059 3059','497 3059',X'034b3f21616f764c6d776a674d6c44414c6e666c426e3a636164656e63652e6d6f65405f6f6f79655f6f6363696d793a636164656e63652e6d6f65'), + ('sim_member','sim_member','32 1','3127 3147','520 3147',X'034b392163427874565278446c5a765356684a58564b3a636164656e63652e6d6f65405f6f6f79655f626f743a636164656e63652e6d6f65'), + ('sim_member','sim_member','8 1','3666 3671','630 3671',X'034b39216966636d75794e6e544861464163636575543a636164656e63652e6d6f65405f6f6f79655f726e6c3a636164656e63652e6d6f65'), + ('sim_member','sim_member','43 1','3849 3855','668 3855',X'034b47216b6b4b714249664c45596a4b534b626b4a633a636164656e63652e6d6f65405f6f6f79655f5f706b5f6f77617a76663a636164656e63652e6d6f65'), + ('sim_member','sim_member','8 1','4280 4283','746 4283',X'034b3f216f705748554e6b46646247796b7579564b6a3a636164656e63652e6d6f65405f6f6f79655f636f6f6b69653a636164656e63652e6d6f65'), + ('sim_member','sim_member','158 1','4424 4526','770 4526',X'034b472170757146464b59487750677073554e6d6e443a636164656e63652e6d6f65405f6f6f79655f5f706b5f77797a63686a3a636164656e63652e6d6f65'), + ('sim_member','sim_member','44 1','4807 4843','824 4843',X'034b4521734b4c6f784a4e62547a6c72436d4a796f533a636164656e63652e6d6f65405f6f6f79655f7370696e6e657265743a636164656e63652e6d6f65'), + ('sim_member','sim_member','11 1','4889 4895','841 4895',X'034b45217443744769524448676e4a62505a4f5479573a636164656e63652e6d6f65405f6f6f79655f6a656d74616e756b693a636164656e63652e6d6f65'), + ('sim_member','sim_member','73 1','5069 5107','888 5107',X'034b4721766576446275617472435946704e71426d583a636164656e63652e6d6f65405f6f6f79655f5f706b5f75616e6766633a636164656e63652e6d6f65'), + ('sim_member','sim_member','59 1','5179 5207','903 5207',X'034b5f217750454472596b77497a6f744e66706e57503a636164656e63652e6d6f65405f6f6f79655f66756a69776172615f6e6f5f6d6f6b6f755f66756d6f3a636164656e63652e6d6f65'), + ('sim_member','sim_member','52 1','5438 5453','968 5453',X'034b41217a66654e574d744b4f764f48766f727979563a636164656e63652e6d6f65405f6f6f79655f666f67656c38323a636164656e63652e6d6f65'), + ('emoji','emoji','1','385','385',X'023331313035373039393137313237353737363733'), + ('emoji','emoji','1','771','771',X'023331323230353735323436303531303533353638'), + ('emoji','emoji','1','1157','1157',X'023331333530383339313335363836313033303730'), + ('emoji','emoji','1','1543','1543',X'0231333530373039313634383434323533313934'), + ('emoji','emoji','1','1929','1929',X'0231343934393031383434343036303432363337'), + ('emoji','emoji','1','2315','2315',X'0231363432383535303135363835323932303438'), + ('emoji','emoji','1','2701','2701',X'0231373738353731303433363339333934333134'), + ('emoji','emoji','1','3087','3087',X'0231393031313133373739343135333134343332'), + ('guild_space','guild_space','1','4','4',X'023331313333333135333632353636343535333336'), + ('guild_space','guild_space','1','9','9',X'023331313534383638343234373234343633363837'), + ('guild_space','guild_space','1','14','14',X'023331323139303338323637383430393235383138'), + ('guild_space','guild_space','1','19','19',X'023331323839363030383537323437303535383733'), + ('guild_space','guild_space','1','24','24',X'023331333536353037353335313132323738303836'), + ('guild_space','guild_space','1','29','29',X'0231323937323732313833373136303532393933'), + ('guild_space','guild_space','1','34','34',X'0231363437393532363337373630363334383831'), + ('guild_space','guild_space','1','39','39',X'0231383737303635303431393930353136373637'), + ('member_power','member_power','1 1','0 0','0 0',X'03350f40636164656e63653a636164656e63652e6d6f652a'), + ('sim_proxy','sim_proxy','1','23','23',X'025531363733363165392d656137652d343530392d623533302d356531613863613735336237'), + ('sim_proxy','sim_proxy','1','47','47',X'025532653561626332312d326332622d346133352d386237642d366432383162363036653932'), + ('sim_proxy','sim_proxy','1','71','71',X'025534383131393165322d393462302d346534632d623934352d336330323932623135356238'), + ('sim_proxy','sim_proxy','1','95','95',X'025536346331346631642d663834342d346535622d386665332d336162336163363239616230'), + ('sim_proxy','sim_proxy','1','119','119',X'025538376562363463322d363763352d346432352d383161642d666664333235663266303639'), + ('sim_proxy','sim_proxy','1','143','143',X'025561616630313539652d623165312d343231342d396266652d313334613536303738323231'), + ('sim_proxy','sim_proxy','1','167','167',X'025563396534393633372d663061352d343566352d383234382d366436393565643861316434'), + ('sim_proxy','sim_proxy','1','191','191',X'025565333734613634362d386231332d343365392d393635392d653233326366653866626265'), + ('member_cache','member_cache','1 1','122 122','82 122',X'034b2d214d5071594e414a62576b72474f544a7461703a636164656e63652e6d6f6540726e6c3a636164656e63652e6d6f65'), + ('member_cache','member_cache','5 1','126 130','85 130',X'034b43214e446249714e704a795076664b526e4e63723a636164656e63652e6d6f6540776f756e6465645f77617272696f723a6d61747269782e6f7267'), + ('member_cache','member_cache','4 1','136 137','90 137',X'034b3d214f485844457370624d485348716c4445614f3a636164656e63652e6d6f6540616d693a7468652d61706f746865636172792e636c7562'), + ('member_cache','member_cache','5 1','204 206','135 206',X'034b51215450616f6a5454444446444847776c7276743a636164656e63652e6d6f65406a61636b736f6e6368656e3636363a6a61636b736f6e6368656e3636362e636f6d'), + ('member_cache','member_cache','76 1','213 245','140 245',X'034b412154716c79516d69667847556767456d64424e3a636164656e63652e6d6f65406869726f616e7461676f6e6973743a6d61747269782e6f7267'), + ('member_cache','member_cache','4 1','301 303','150 303',X'034b352156624f77675559777146614e4c5345644e413a636164656e63652e6d6f6540636164656e63653a636164656e63652e6d6f65'), + ('member_cache','member_cache','4 1','338 340','170 340',X'034b3321586f4c466b65786a45466c57447959544d453a636164656e63652e6d6f65406d65636879613a636164656e63652e6d6f65'), + ('member_cache','member_cache','10 1','344 344','173 344',X'034b3d21594b46454e79716667696951686956496b533a636164656e63652e6d6f6540616d693a7468652d61706f746865636172792e636c7562'), + ('member_cache','member_cache','2 1','368 368','183 368',X'034b35215a51714f4757704f52676e544f7254474f583a636164656e63652e6d6f6540636164656e63653a636164656e63652e6d6f65'), + ('member_cache','member_cache','152 1','396 491','203 491',X'034b412163427874565278446c5a765356684a58564b3a636164656e63652e6d6f65406d61727368616d616c6c6f773a616c74686165612e7a6f6e65'), + ('member_cache','member_cache','4 1','553 555','207 555',X'034b33216356514d45455158494d5047554b43467a763a636164656e63652e6d6f65406d65636879613a636164656e63652e6d6f65'), + ('member_cache','member_cache','8 1','571 576','219 576',X'034b2b21654856655270706e6c6f57587177704a6e553a636164656e63652e6d6f6540656c6c69753a68617368692e7265'), + ('member_cache','member_cache','7 1','583 584','223 584',X'034b4b2165724f7079584e465a486a48724568784e583a636164656e63652e6d6f6540616d796973636f6f6c7a3a6d61747269782e6174697573616d792e636f6d'), + ('member_cache','member_cache','165 1','599 614','230 614',X'034b3321676865544b5a7451666c444e7070684c49673a636164656e63652e6d6f65406172636f6e79783a6d61747269782e6f7267'), + ('member_cache','member_cache','165 1','599 737','230 737',X'034b3921676865544b5a7451666c444e7070684c49673a636164656e63652e6d6f654073756368616372636b723a6d61747269782e6f7267'), + ('member_cache','member_cache','6 1','764 764','231 764',X'034b3d21676b6b686f756d42506643415055664554783a636164656e63652e6d6f6540616d693a7468652d61706f746865636172792e636c7562'), + ('member_cache','member_cache','10 1','772 775','234 775',X'034b412168424a766e654e4f63646b77694e464c67483a636164656e63652e6d6f65406265617264616e64726f7365733a636164656e63652e6d6f65'), + ('member_cache','member_cache','13 1','795 800','244 800',X'03513d2169537958674e7851634575586f587073536e3a707573737468656361742e6f72674063726f6e793a63726f6e79616b617473756b692e78797a'), + ('member_cache','member_cache','12 1','851 860','274 860',X'034b35216c7570486a715444537a774f744d59476d493a636164656e63652e6d6f654068656c6c63703a6f70656e737573652e6f7267'), + ('member_cache','member_cache','4 1','872 874','280 874',X'034b39216d616767455367755a427147425a74536e723a636164656e63652e6d6f65406875636b6c65746f6e3a636164656e63652e6d6f65'), + ('member_cache','member_cache','4 1','924 924','315 924',X'034b352172454f73706e5971644f414c4149466e69563a636164656e63652e6d6f6540636164656e63653a636164656e63652e6d6f65'), + ('member_cache','member_cache','4 1','966 966','342 966',X'034b3d21766e717a56767678534a586c5a504f5276533a636164656e63652e6d6f6540616d693a7468652d61706f746865636172792e636c7562'), + ('member_cache','member_cache','71 1','981 983','350 983',X'034b3d2177574f667376757356486f4e4e567242585a3a636164656e63652e6d6f6540616c65783a6d61747269782e7370656564626f792e6368'), + ('member_cache','member_cache','14 1','1056 1062','354 1062',X'034b3d21776c534544496a44676c486d42474b7254703a636164656e63652e6d6f65406b61746c796e3a69732d686172646c792e6f6e6c696e65'), + ('direct','direct','1','0','0',X'024d4070726f666573736f725f706f6f7469735f7068643a6d61747269782e6f7267'), + ('file','file','1','4034','4034',X'03821368747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3131323736303636393137383234313032342f313135303430343234303037393036393237362f636d64726e656f6e2d313632383534343535313536373635303831362d32303233303232325f3134353733322d766964312e6d7034'), + ('file','file','1','8069','8069',X'03814968747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3131393239333936393731353639313532322f313230393030323833373230383630343638322f636869702d77696c736f6e2e77656270'), + ('file','file','1','12104','12104',X'03813b68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3133343037373735333438353033333437322f313139383038373532313531393830303436312f696d6167652e706e67'), + ('file','file','1','16139','16139',X'03814168747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f313337363732343737393830353034383838322f313339323632373139373133383730323336362f707265766965772e706e67'), + ('file','file','1','20174','20174',X'03817568747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3135393136353731343139343735393638302f313236383537313138333330363131373230302f53637265656e73686f745f32303234303830315f3130303834315f446973636f72642e6a7067'), + ('file','file','1','24209','24209',X'03816568747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3238383838323935333331343839333832352f313135343539393530343936303537333533322f53637265656e73686f745f32303233303631302d3130333631332e706e67'), + ('file','file','1','28244','28244',X'03813b68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3635353231363137333639363238363734362f313330383839373634363434353938393930392f696d6167652e706e67'), + ('file','file','1','32279','32279',X'027f68747470733a2f2f63646e2e646973636f72646170702e636f6d2f656d6f6a69732f313034393232363234323836313332323238312e706e67'), + ('lottie','lottie','1','2','2',X'0231373439303532393434363832353832303336'), + ('lottie','lottie','1','5','5',X'0231373531363036333739333430333635383634'), + ('lottie','lottie','1','8','8',X'0231373534313038373731383532323232353634'), + ('lottie','lottie','1','11','11',X'0231373936313430363338303933343433303932'), + ('lottie','lottie','1','14','14',X'0231373936313431373032363935343835353030'), + ('lottie','lottie','1','17','17',X'0231383136303837373932323931323832393434'), + ('lottie','lottie','1','20','20',X'0231383233393736313032393736323930383636'); + +ANALYZE sqlite_schema; + +COMMIT; diff --git a/src/db/orm-defs.d.ts b/src/db/orm-defs.d.ts index b0b74a5..a3fcf0d 100644 --- a/src/db/orm-defs.d.ts +++ b/src/db/orm-defs.d.ts @@ -60,6 +60,12 @@ export type Models = { autocreate: 0 | 1 } + historical_channel_room: { + historical_room_index: number + reference_channel_id: string + room_id: string + } + invite: { mxid: string room_id: string @@ -91,15 +97,15 @@ export type Models = { power_level: number } - message_channel: { + message_room: { message_id: string - channel_id: string + historical_room_index: number } sim: { user_id: string + username: string sim_name: string - localpart: string mxid: string } diff --git a/src/db/orm.js b/src/db/orm.js index 4d9b6f1..d14e8ae 100644 --- a/src/db/orm.js +++ b/src/db/orm.js @@ -104,6 +104,21 @@ class From { return r } + /** + * @template {Col} Select + * @param {string} what + * @param {Select} col + */ + pluckAs(what, col) { + /** @type {Pluck} */ + // @ts-ignore + const r = this + r.cols = [`${what} AS ${col}`] + this.makeColsSafe = false + r.isPluck = true + return r + } + /** * @param {string} sql */ diff --git a/src/db/orm.test.js b/src/db/orm.test.js index 4549b9e..56a3257 100644 --- a/src/db/orm.test.js +++ b/src/db/orm.test.js @@ -21,8 +21,8 @@ test("orm: select: get pluck works", t => { }) test("orm: select: get, where and pluck works", t => { - const channelID = select("message_channel", "channel_id", {message_id: "1128118177155526666"}).pluck().get() - t.equal(channelID, "112760669178241024") + const emojiName = select("emoji", "name", {emoji_id: "230201364309868544"}).pluck().get() + t.equal(emojiName, "hippo") }) test("orm: select: all, where and pluck works on multiple columns", t => { diff --git a/src/discord/interactions/matrix-info.js b/src/discord/interactions/matrix-info.js index b7551f1..e35cde1 100644 --- a/src/discord/interactions/matrix-info.js +++ b/src/discord/interactions/matrix-info.js @@ -1,7 +1,8 @@ // @ts-check const DiscordTypes = require("discord-api-types/v10") -const {discord, sync, from} = require("../../passthrough") +const {discord, sync, select, from} = require("../../passthrough") +const assert = require("assert").strict /** @type {import("../../matrix/api")} */ const api = sync.require("../../matrix/api") @@ -11,9 +12,9 @@ const api = sync.require("../../matrix/api") * @param {{api: typeof api}} di * @returns {Promise} */ -async function _interact({guild_id, data}, {api}) { - const message = from("event_message").join("message_channel", "message_id").join("channel_room", "channel_id") - .select("name", "nick", "source", "channel_id", "room_id", "event_id").where({message_id: data.target_id, part: 0}).get() +async function _interact({guild_id, channel, data}, {api}) { + const message = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") + .select("source", "reference_channel_id", "room_id", "event_id").where({message_id: data.target_id, part: 0}).get() if (!message) { return { @@ -25,15 +26,19 @@ async function _interact({guild_id, data}, {api}) { } } + const channel_id = message.reference_channel_id + const room = select("channel_room", ["name", "nick"], {channel_id}).get() + assert(room) + const idInfo = `\n-# Room ID: \`${message.room_id}\`\n-# Event ID: \`${message.event_id}\`` - const roomName = message.nick || message.name + const roomName = room.nick || room.name if (message.source === 1) { // from Discord const userID = data.resolved.messages[data.target_id].author.id return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { - content: `Bridged <@${userID}> https://discord.com/channels/${guild_id}/${message.channel_id}/${data.target_id} on Discord to [${roomName}]() on Matrix.` + content: `Bridged <@${userID}> https://discord.com/channels/${guild_id}/${channel_id}/${data.target_id} on Discord to [${roomName}]() on Matrix.` + idInfo, flags: DiscordTypes.MessageFlags.Ephemeral } @@ -45,7 +50,7 @@ async function _interact({guild_id, data}, {api}) { return { type: DiscordTypes.InteractionResponseType.ChannelMessageWithSource, data: { - content: `Bridged [${event.sender}]()'s message in [${roomName}]() on Matrix to https://discord.com/channels/${guild_id}/${message.channel_id}/${data.target_id} on Discord.` + content: `Bridged [${event.sender}]()'s message in [${roomName}]() on Matrix to https://discord.com/channels/${guild_id}/${channel_id}/${data.target_id} on Discord.` + idInfo, flags: DiscordTypes.MessageFlags.Ephemeral } diff --git a/src/discord/interactions/permissions.js b/src/discord/interactions/permissions.js index 0a573e3..07324ac 100644 --- a/src/discord/interactions/permissions.js +++ b/src/discord/interactions/permissions.js @@ -18,8 +18,8 @@ const api = sync.require("../../matrix/api") async function* _interact({data, guild_id}, {api}) { // Get message info const row = from("event_message") - .join("message_channel", "message_id") - .select("event_id", "source", "channel_id") + .join("message_room", "message_id").join("historical_channel_room", "historical_room_index") + .select("event_id", "source", "room_id", "reference_channel_id") .where({message_id: data.target_id}) .get() @@ -35,10 +35,9 @@ async function* _interact({data, guild_id}, {api}) { } // Get the message sender, the person that will be inspected/edited - const eventID = row.event_id - const roomID = select("channel_room", "room_id", {channel_id: row.channel_id}).pluck().get() + const roomID = select("channel_room", "room_id", {channel_id: row.reference_channel_id}).pluck().get() assert(roomID) - const event = await api.getEvent(roomID, eventID) + const event = await api.getEvent(row.room_id, row.event_id) const sender = event.sender // Get the space, where the power levels will be inspected/edited diff --git a/src/discord/interactions/reactions.js b/src/discord/interactions/reactions.js index 13dbd69..59bf065 100644 --- a/src/discord/interactions/reactions.js +++ b/src/discord/interactions/reactions.js @@ -16,7 +16,7 @@ const utils = sync.require("../../m2d/converters/utils") * @returns {AsyncGenerator<{[k in keyof InteractionMethods]?: Parameters[2]}>} */ async function* _interact({data}, {api}) { - const row = from("event_message").join("message_channel", "message_id").join("channel_room", "channel_id") + const row = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") .select("event_id", "room_id").where({message_id: data.target_id}).get() if (!row) { return yield {createInteractionResponse: { diff --git a/src/m2d/actions/add-reaction.js b/src/m2d/actions/add-reaction.js index 277c475..268888c 100644 --- a/src/m2d/actions/add-reaction.js +++ b/src/m2d/actions/add-reaction.js @@ -14,7 +14,7 @@ const emoji = sync.require("../converters/emoji") * @param {Ty.Event.Outer} event */ async function addReaction(event) { - const channelID = select("channel_room", "channel_id", {room_id: event.room_id}).pluck().get() + const channelID = select("historical_channel_room", "reference_channel_id", {room_id: event.room_id}).pluck().get() if (!channelID) return // We just assume the bridge has already been created const messageID = select("event_message", "message_id", {event_id: event.content["m.relates_to"].event_id}, "ORDER BY reaction_part").pluck().get() if (!messageID) return // Nothing can be done if the parent message was never bridged. diff --git a/src/m2d/actions/redact.js b/src/m2d/actions/redact.js index 1d3aa67..f980a54 100644 --- a/src/m2d/actions/redact.js +++ b/src/m2d/actions/redact.js @@ -12,13 +12,14 @@ const utils = sync.require("../converters/utils") * @param {Ty.Event.Outer_M_Room_Redaction} event */ async function deleteMessage(event) { - const rows = from("event_message").join("message_channel", "message_id").select("channel_id", "message_id").where({event_id: event.redacts}).all() + const rows = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") + .select("reference_channel_id", "message_id").where({event_id: event.redacts}).all() if (!rows.length) return for (const row of rows) { - await discord.snow.channel.deleteMessage(row.channel_id, row.message_id, event.content.reason) + await discord.snow.channel.deleteMessage(row.reference_channel_id, row.message_id, event.content.reason) db.prepare("DELETE FROM event_message WHERE message_id = ?").run(row.message_id) } - db.prepare("DELETE FROM message_channel WHERE message_id = ?").run(rows[0].message_id) + db.prepare("DELETE FROM message_room WHERE message_id = ?").run(rows[0].message_id) } /** @@ -26,9 +27,10 @@ async function deleteMessage(event) { */ async function removeReaction(event) { const hash = utils.getEventIDHash(event.redacts) - const row = from("reaction").join("message_channel", "message_id").select("channel_id", "message_id", "encoded_emoji").where({hashed_event_id: hash}).get() + const row = from("reaction").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") + .select("reference_channel_id", "message_id", "encoded_emoji").where({hashed_event_id: hash}).get() if (!row) return - await discord.snow.channel.deleteReactionSelf(row.channel_id, row.message_id, row.encoded_emoji) + await discord.snow.channel.deleteReactionSelf(row.reference_channel_id, row.message_id, row.encoded_emoji) db.prepare("DELETE FROM reaction WHERE hashed_event_id = ?").run(hash) } diff --git a/src/m2d/actions/send-event.js b/src/m2d/actions/send-event.js index 6b4eb26..7ed70c7 100644 --- a/src/m2d/actions/send-event.js +++ b/src/m2d/actions/send-event.js @@ -6,7 +6,7 @@ const stream = require("stream") const assert = require("assert").strict const crypto = require("crypto") const passthrough = require("../../passthrough") -const {sync, discord, db, select} = passthrough +const {sync, discord, db, from, select} = passthrough /** @type {import("./channel-webhook")} */ const channelWebhook = sync.require("./channel-webhook") @@ -61,7 +61,7 @@ async function resolvePendingFiles(message) { /** @param {Ty.Event.Outer_M_Room_Message | Ty.Event.Outer_M_Room_Message_File | Ty.Event.Outer_M_Sticker} event */ async function sendEvent(event) { - const row = select("channel_room", ["channel_id", "thread_parent"], {room_id: event.room_id}).get() + const row = from("channel_room").where({room_id: event.room_id}).select("channel_id", "thread_parent").get() if (!row) return [] // allow the bot to exist in unbridged rooms, just don't do anything with it let channelID = row.channel_id let threadID = undefined @@ -73,6 +73,8 @@ async function sendEvent(event) { const guildID = discord.channels.get(channelID).guild_id const guild = discord.guilds.get(guildID) assert(guild) + const historicalRoomIndex = select("historical_channel_room", "historical_room_index", {room_id: event.room_id}).pluck().get() + assert(historicalRoomIndex) // no need to sync the matrix member to the other side. but if I did need to, this is where I'd do it @@ -98,15 +100,17 @@ async function sendEvent(event) { } for (const id of messagesToDelete) { - db.prepare("DELETE FROM message_channel WHERE message_id = ?").run(id) + db.prepare("DELETE FROM message_room WHERE message_id = ?").run(id) await channelWebhook.deleteMessageWithWebhook(channelID, id, threadID) } for (const message of messagesToSend) { const reactionPart = messagesToEdit.length === 0 && message === messagesToSend[messagesToSend.length - 1] ? 0 : 1 const messageResponse = await channelWebhook.sendMessageWithWebhook(channelID, message, threadID) - db.prepare("INSERT INTO message_channel (message_id, channel_id) VALUES (?, ?)").run(messageResponse.id, threadID || channelID) - db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, reaction_part, source) VALUES (?, ?, ?, ?, ?, ?, 0)").run(event.event_id, event.type, event.content["msgtype"] || null, messageResponse.id, eventPart, reactionPart) // source 0 = matrix + db.transaction(() => { + db.prepare("INSERT INTO message_room (message_id, historical_room_index) VALUES (?, ?)").run(messageResponse.id, historicalRoomIndex) + db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, reaction_part, source) VALUES (?, ?, ?, ?, ?, ?, 0)").run(event.event_id, event.type, event.content["msgtype"] || null, messageResponse.id, eventPart, reactionPart) // source 0 = matrix + })() eventPart = 1 messageResponses.push(messageResponse) diff --git a/src/m2d/actions/update-pins.js b/src/m2d/actions/update-pins.js index 46074c6..d06f6e8 100644 --- a/src/m2d/actions/update-pins.js +++ b/src/m2d/actions/update-pins.js @@ -12,12 +12,13 @@ const diffPins = sync.require("../converters/diff-pins") async function updatePins(pins, prev) { const diff = diffPins.diffPins(pins, prev) for (const [event_id, added] of diff) { - const row = from("event_message").join("message_channel", "message_id").where({event_id, part: 0}).select("channel_id", "message_id").get() + const row = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") + .select("reference_channel_id", "message_id").get() if (!row) continue if (added) { - discord.snow.channel.addChannelPinnedMessage(row.channel_id, row.message_id, "Message pinned on Matrix") + discord.snow.channel.addChannelPinnedMessage(row.reference_channel_id, row.message_id, "Message pinned on Matrix") } else { - discord.snow.channel.removeChannelPinnedMessage(row.channel_id, row.message_id, "Message unpinned on Matrix") + discord.snow.channel.removeChannelPinnedMessage(row.reference_channel_id, row.message_id, "Message unpinned on Matrix") } } } diff --git a/src/m2d/converters/event-to-message.js b/src/m2d/converters/event-to-message.js index fd9289d..a941509 100644 --- a/src/m2d/converters/event-to-message.js +++ b/src/m2d/converters/event-to-message.js @@ -24,6 +24,8 @@ const file = sync.require("../../matrix/file") const emojiSheet = sync.require("./emoji-sheet") /** @type {import("../actions/setup-emojis")} */ const setupEmojis = sync.require("../actions/setup-emojis") +/** @type {import("../../d2m/converters/user-to-mxid")} */ +const userToMxid = sync.require("../../d2m/converters/user-to-mxid") /** @type {[RegExp, string][]} */ const markdownEscapes = [ @@ -332,10 +334,11 @@ function splitDisplayName(displayName) { * Convert a Matrix user ID into a Discord user ID for mentioning, where if the user is a PK proxy, it will mention the proxy owner. * @param {string} mxid */ -function getUserOrProxyOwnerID(mxid) { - const row = from("sim").join("sim_proxy", "user_id", "left").select("user_id", "proxy_owner_id").where({mxid}).get() +function getUserOrProxyOwnerMention(mxid) { + const row = from("sim").join("sim_proxy", "user_id", "left").select("user_id", "username", "proxy_owner_id").where({mxid}).get() if (!row) return null - return row.proxy_owner_id || row.user_id + if (userToMxid.isWebhookUserID(row.user_id)) return `**@${row.username}**` + return `<@${row.proxy_owner_id || row.user_id}>` } /** @@ -398,7 +401,7 @@ async function handleRoomOrMessageLinks(input, di) { } } - const channelID = select("channel_room", "channel_id", {room_id: roomID}).pluck().get() + const channelID = select("historical_channel_room", "reference_channel_id", {room_id: roomID}).pluck().get() if (!channelID) continue if (!eventID) { // 1: It's a room link, so <#link> to the channel @@ -681,9 +684,10 @@ async function eventToMessage(event, guild, di) { } replyLine = await getL1L2ReplyLine() - const row = from("event_message").join("message_channel", "message_id").select("channel_id", "message_id").where({event_id: repliedToEventId}).and("ORDER BY part").get() + const row = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index") + .select("reference_channel_id", "message_id").where({event_id: repliedToEventId}).and("ORDER BY part").get() if (row) { - replyLine += `https://discord.com/channels/${guild.id}/${row.channel_id}/${row.message_id} ` + replyLine += `https://discord.com/channels/${guild.id}/${row.reference_channel_id}/${row.message_id} ` } // If the event has been edited, the homeserver will include the relation in `unsigned`. if (repliedToEvent.unsigned?.["m.relations"]?.["m.replace"]?.content?.["m.new_content"]) { @@ -727,9 +731,9 @@ async function eventToMessage(event, guild, di) { } } const sender = repliedToEvent.sender - const authorID = getUserOrProxyOwnerID(sender) - if (authorID) { - replyLine += `<@${authorID}>` + const authorMention = getUserOrProxyOwnerMention(sender) + if (authorMention) { + replyLine += authorMention } else { let senderName = select("member_cache", "displayname", {mxid: sender}).pluck().get() if (!senderName) senderName = sender.match(/@([^:]*)/)?.[1] diff --git a/src/web/routes/info.js b/src/web/routes/info.js index 0ccdeca..9c202fa 100644 --- a/src/web/routes/info.js +++ b/src/web/routes/info.js @@ -26,16 +26,28 @@ as.router.get("/api/message", defineEventHandler(async event => { const api = getAPI(event) const {message_id} = await getValidatedQuery(event, schema.message.parse) - const metadatas = from("event_message").join("message_channel", "message_id").join("channel_room", "channel_id").where({message_id}) - .select("event_id", "event_type", "event_subtype", "part", "reaction_part", "room_id", "source").and("ORDER BY part ASC, reaction_part DESC").all() + const metadatas = from("event_message").join("message_room", "message_id").join("historical_channel_room", "historical_room_index").where({message_id}) + .select("event_id", "event_type", "event_subtype", "part", "reaction_part", "reference_channel_id", "room_id", "source").and("ORDER BY part ASC, reaction_part DESC").all() if (metadatas.length === 0) { return new Response("Message not found", {status: 404, statusText: "Not Found"}) } + const current_room_id = select("channel_room", "room_id", {channel_id: metadatas[0].reference_channel_id}).pluck().get() const events = await Promise.all(metadatas.map(metadata => api.getEvent(metadata.room_id, metadata.event_id).then(raw => ({ - metadata: Object.assign({sender: raw.sender}, metadata), + metadata: { + event_id: metadata.event_id, + event_type: metadata.event_type, + event_subtype: metadata.event_subtype, + part: metadata.part, + reaction_part: metadata.reaction_part, + channel_id: metadata.reference_channel_id, + room_id: metadata.room_id, + source: metadata.source, + sender: raw.sender, + current_room_id: current_room_id + }, raw })) )) diff --git a/src/web/routes/info.test.js b/src/web/routes/info.test.js index 28dac3b..39b2c00 100644 --- a/src/web/routes/info.test.js +++ b/src/web/routes/info.test.js @@ -57,14 +57,16 @@ test("web info: returns data for a matrix message and profile", async t => { }, events: [{ metadata: { - event_id: "$51gH61p_eJc2RylOdE2lAr4-ogP7dS0WJI62lCFzBvk", - event_subtype: "m.text", - event_type: "m.room.message", - part: 0, - reaction_part: 0, - room_id: "!qzDBLKlildpzrrOnFZ:cadence.moe", - sender: "@cadence:cadence.moe", - source: 0 + event_id: "$51gH61p_eJc2RylOdE2lAr4-ogP7dS0WJI62lCFzBvk", + event_subtype: "m.text", + event_type: "m.room.message", + part: 0, + reaction_part: 0, + room_id: "!qzDBLKlildpzrrOnFZ:cadence.moe", + channel_id: "176333891320283136", + current_room_id: "!qzDBLKlildpzrrOnFZ:cadence.moe", + sender: "@cadence:cadence.moe", + source: 0 }, raw }] @@ -113,14 +115,16 @@ test("web info: returns data for a matrix message without profile", async t => { }, events: [{ metadata: { - event_id: "$51gH61p_eJc2RylOdE2lAr4-ogP7dS0WJI62lCFzBvk", - event_subtype: "m.text", - event_type: "m.room.message", - part: 0, - reaction_part: 0, - room_id: "!qzDBLKlildpzrrOnFZ:cadence.moe", - sender: "@cadence:cadence.moe", - source: 0 + event_id: "$51gH61p_eJc2RylOdE2lAr4-ogP7dS0WJI62lCFzBvk", + event_subtype: "m.text", + event_type: "m.room.message", + part: 0, + reaction_part: 0, + room_id: "!qzDBLKlildpzrrOnFZ:cadence.moe", + channel_id: "176333891320283136", + current_room_id: "!qzDBLKlildpzrrOnFZ:cadence.moe", + sender: "@cadence:cadence.moe", + source: 0 }, raw }] @@ -191,14 +195,16 @@ test("web info: returns data for a discord message", async t => { matrix_author: undefined, events: [{ metadata: { - event_id: "$AfrB8hzXkDMvuoWjSZkDdFYomjInWH7jMBPkwQMN8AI", - event_subtype: "m.text", - event_type: "m.room.message", - part: 0, - reaction_part: 1, - room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe", - sender: "@_ooye_accavish:cadence.moe", - source: 1 + event_id: "$AfrB8hzXkDMvuoWjSZkDdFYomjInWH7jMBPkwQMN8AI", + event_subtype: "m.text", + event_type: "m.room.message", + part: 0, + reaction_part: 1, + room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe", + channel_id: "112760669178241024", + current_room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe", + sender: "@_ooye_accavish:cadence.moe", + source: 1 }, raw: raw1 }, { @@ -209,6 +215,8 @@ test("web info: returns data for a discord message", async t => { part: 1, reaction_part: 0, room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe", + channel_id: "112760669178241024", + current_room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe", sender: "@_ooye_accavish:cadence.moe", source: 1 }, diff --git a/test/ooye-test-data.sql b/test/ooye-test-data.sql index 6571954..78ab2b4 100644 --- a/test/ooye-test-data.sql +++ b/test/ooye-test-data.sql @@ -23,6 +23,8 @@ INSERT INTO channel_room (channel_id, room_id, name, nick, thread_parent, custom ('1161864271370666075', '!mHmhQQPwXNananMUqq:cadence.moe', 'updates', NULL, NULL, NULL), ('1438284564815548418', '!MHxNpwtgVqWOrmyoTn:cadence.moe', 'sin-cave', NULL, NULL, NULL); +INSERT INTO historical_channel_room (reference_channel_id, room_id) SELECT channel_id, room_id FROM channel_room; + INSERT INTO sim (user_id, username, sim_name, mxid) VALUES ('0', 'Matrix Bridge', 'bot', '@_ooye_bot:cadence.moe'), ('820865262526005258', 'Crunch God', 'crunch_god', '@_ooye_crunch_god:cadence.moe'), @@ -42,7 +44,8 @@ INSERT INTO sim_member (mxid, room_id, hashed_profile_content) VALUES INSERT INTO sim_proxy (user_id, proxy_owner_id, displayname) VALUES ('43d378d5-1183-47dc-ab3c-d14e21c3fe58', '196188877885538304', 'Azalea &flwr; ๐ŸŒบ'); -INSERT INTO message_channel (message_id, channel_id) VALUES +INSERT INTO message_room (message_id, historical_room_index) +WITH a (message_id, channel_id) AS (VALUES ('1106366167788044450', '122155380120748034'), ('1106366167788044451', '122155380120748034'), ('1106366167788044452', '122155380120748034'), @@ -75,7 +78,8 @@ INSERT INTO message_channel (message_id, channel_id) VALUES ('1339000288144658482', '176333891320283136'), ('1381212840957972480', '112760669178241024'), ('1401760355339862066', '112760669178241024'), -('1439351590262800565', '1438284564815548418'); +('1439351590262800565', '1438284564815548418')) +SELECT message_id, max(historical_room_index) as historical_room_index FROM a INNER JOIN historical_channel_room ON historical_channel_room.reference_channel_id = a.channel_id GROUP BY message_id; INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, reaction_part, source) VALUES ('$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg', 'm.room.message', 'm.text', '1126786462646550579', 0, 0, 1),