Alter SQL column names to be distinct
This commit is contained in:
		
							parent
							
								
									a49b46381c
								
							
						
					
					
						commit
						28abdac5b6
					
				
					 14 changed files with 40 additions and 25 deletions
				
			
		| 
						 | 
					@ -15,7 +15,7 @@ const api = sync.require("../../matrix/api")
 | 
				
			||||||
 * @param {import("discord-api-types/v10").APIThreadChannel} thread
 | 
					 * @param {import("discord-api-types/v10").APIThreadChannel} thread
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
async function announceThread(parentRoomID, threadRoomID, thread) {
 | 
					async function announceThread(parentRoomID, threadRoomID, thread) {
 | 
				
			||||||
	const creatorMxid = select("sim", "mxid", "WHERE discord_id = ?").pluck().get(thread.owner_id)
 | 
						const creatorMxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(thread.owner_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   const content = await threadToAnnouncement.threadToAnnouncement(parentRoomID, threadRoomID, creatorMxid, thread, {api})
 | 
					   const content = await threadToAnnouncement.threadToAnnouncement(parentRoomID, threadRoomID, creatorMxid, thread, {api})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,7 @@ async function createSim(user) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Save chosen name in the database forever
 | 
						// Save chosen name in the database forever
 | 
				
			||||||
	// Making this database change right away so that in a concurrent registration, the 2nd registration will already have generated a different localpart because it can see this row when it generates
 | 
						// Making this database change right away so that in a concurrent registration, the 2nd registration will already have generated a different localpart because it can see this row when it generates
 | 
				
			||||||
	db.prepare("INSERT INTO sim (discord_id, sim_name, localpart, mxid) VALUES (?, ?, ?, ?)").run(user.id, simName, localpart, mxid)
 | 
						db.prepare("INSERT INTO sim (user_id, sim_name, localpart, mxid) VALUES (?, ?, ?, ?)").run(user.id, simName, localpart, mxid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Register matrix user with that name
 | 
						// Register matrix user with that name
 | 
				
			||||||
	try {
 | 
						try {
 | 
				
			||||||
| 
						 | 
					@ -37,7 +37,7 @@ async function createSim(user) {
 | 
				
			||||||
	} catch (e) {
 | 
						} catch (e) {
 | 
				
			||||||
		// If user creation fails, manually undo the database change. Still isn't perfect, but should help.
 | 
							// If user creation fails, manually undo the database change. Still isn't perfect, but should help.
 | 
				
			||||||
		// (A transaction would be preferable, but I don't think it's safe to leave transaction open across event loop ticks.)
 | 
							// (A transaction would be preferable, but I don't think it's safe to leave transaction open across event loop ticks.)
 | 
				
			||||||
		db.prepare("DELETE FROM sim WHERE discord_id = ?").run(user.id)
 | 
							db.prepare("DELETE FROM sim WHERE user_id = ?").run(user.id)
 | 
				
			||||||
		throw e
 | 
							throw e
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return mxid
 | 
						return mxid
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ async function createSim(user) {
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
async function ensureSim(user) {
 | 
					async function ensureSim(user) {
 | 
				
			||||||
	let mxid = null
 | 
						let mxid = null
 | 
				
			||||||
	const existing = select("sim", "mxid", "WHERE discord_id = ?").pluck().get(user.id)
 | 
						const existing = select("sim", "mxid", "WHERE user_id = ?").pluck().get(user.id)
 | 
				
			||||||
	if (existing) {
 | 
						if (existing) {
 | 
				
			||||||
		mxid = existing
 | 
							mxid = existing
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
| 
						 | 
					@ -164,7 +164,7 @@ async function syncAllUsersInRoom(roomID) {
 | 
				
			||||||
	assert.ok(typeof guildID === "string")
 | 
						assert.ok(typeof guildID === "string")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (const mxid of mxids) {
 | 
						for (const mxid of mxids) {
 | 
				
			||||||
		const userID = select("sim", "discord_id", "WHERE mxid = ?").pluck().get(mxid)
 | 
							const userID = select("sim", "user_id", "WHERE mxid = ?").pluck().get(mxid)
 | 
				
			||||||
		assert.ok(typeof userID === "string")
 | 
							assert.ok(typeof userID === "string")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/** @ts-ignore @type {Required<import("discord-api-types/v10").APIGuildMember>} */
 | 
							/** @ts-ignore @type {Required<import("discord-api-types/v10").APIGuildMember>} */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,7 +42,7 @@ async function removeReaction(data) {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (!lookingAtMatrixReaction && !wantToRemoveMatrixReaction) {
 | 
								if (!lookingAtMatrixReaction && !wantToRemoveMatrixReaction) {
 | 
				
			||||||
				// We are removing a Discord user's reaction, so we just make the sim user remove it.
 | 
									// We are removing a Discord user's reaction, so we just make the sim user remove it.
 | 
				
			||||||
				const mxid = select("sim", "mxid", "WHERE discord_id = ?").pluck().get(data.user_id)
 | 
									const mxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(data.user_id)
 | 
				
			||||||
				if (mxid === event.sender) {
 | 
									if (mxid === event.sender) {
 | 
				
			||||||
					await api.redactEvent(roomID, event.event_id, mxid)
 | 
										await api.redactEvent(roomID, event.event_id, mxid)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ async function editToChanges(message, guild, api) {
 | 
				
			||||||
	// Figure out what events we will be replacing
 | 
						// Figure out what events we will be replacing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(message.channel_id)
 | 
						const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(message.channel_id)
 | 
				
			||||||
	let senderMxid = select("sim", "mxid", "WHERE discord_id = ?").pluck().get(message.author.id) || null
 | 
						let senderMxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(message.author.id) || null
 | 
				
			||||||
	if (senderMxid) {
 | 
						if (senderMxid) {
 | 
				
			||||||
		const senderIsInRoom = select("sim_member", "mxid", "WHERE room_id = ? AND mxid = ?").get(roomID, senderMxid)
 | 
							const senderIsInRoom = select("sim_member", "mxid", "WHERE room_id = ? AND mxid = ?").get(roomID, senderMxid)
 | 
				
			||||||
		if (!senderIsInRoom) {
 | 
							if (!senderIsInRoom) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,11 +35,11 @@ const Rlottie = (async () => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @param {DiscordTypes.APIStickerItem} stickerItem
 | 
					 * @param {DiscordTypes.APIStickerItem} stickerItem
 | 
				
			||||||
 * @returns {Promise<{mxc: string, info: typeof INFO}>}
 | 
					 * @returns {Promise<{mxc_url: string, info: typeof INFO}>}
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
async function convert(stickerItem) {
 | 
					async function convert(stickerItem) {
 | 
				
			||||||
	const existingMxc = select("lottie", "mxc", "WHERE id = ?").pluck().get(stickerItem.id)
 | 
						const existingMxc = select("lottie", "mxc_url", "WHERE sticker_id = ?").pluck().get(stickerItem.id)
 | 
				
			||||||
	if (existingMxc) return {mxc: existingMxc, info: INFO}
 | 
						if (existingMxc) return {mxc_url: existingMxc, info: INFO}
 | 
				
			||||||
	const r = await Rlottie
 | 
						const r = await Rlottie
 | 
				
			||||||
	const res = await fetch(file.DISCORD_IMAGES_BASE + file.sticker(stickerItem))
 | 
						const res = await fetch(file.DISCORD_IMAGES_BASE + file.sticker(stickerItem))
 | 
				
			||||||
	if (res.status !== 200) throw new Error("Sticker data file not found.")
 | 
						if (res.status !== 200) throw new Error("Sticker data file not found.")
 | 
				
			||||||
| 
						 | 
					@ -67,8 +67,8 @@ async function convert(stickerItem) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	assert(root.content_uri)
 | 
						assert(root.content_uri)
 | 
				
			||||||
	db.prepare("INSERT INTO lottie (id, mxc) VALUES (?, ?)").run(stickerItem.id, root.content_uri)
 | 
						db.prepare("INSERT INTO lottie (sticker_id, mxc_url) VALUES (?, ?)").run(stickerItem.id, root.content_uri)
 | 
				
			||||||
	return {mxc: root.content_uri, info: INFO}
 | 
						return {mxc_url: root.content_uri, info: INFO}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports.convert = convert
 | 
					module.exports.convert = convert
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ function getDiscordParseCallbacks(message, useHTML) {
 | 
				
			||||||
	return {
 | 
						return {
 | 
				
			||||||
		/** @param {{id: string, type: "discordUser"}} node */
 | 
							/** @param {{id: string, type: "discordUser"}} node */
 | 
				
			||||||
		user: node => {
 | 
							user: node => {
 | 
				
			||||||
			const mxid = select("sim", "mxid", "WHERE discord_id = ?").pluck().get(node.id)
 | 
								const mxid = select("sim", "mxid", "WHERE user_id = ?").pluck().get(node.id)
 | 
				
			||||||
			const username = message.mentions.find(ment => ment.id === node.id)?.username || node.id
 | 
								const username = message.mentions.find(ment => ment.id === node.id)?.username || node.id
 | 
				
			||||||
			if (mxid && useHTML) {
 | 
								if (mxid && useHTML) {
 | 
				
			||||||
				return `<a href="https://matrix.to/#/${mxid}">@${username}</a>`
 | 
									return `<a href="https://matrix.to/#/${mxid}">@${username}</a>`
 | 
				
			||||||
| 
						 | 
					@ -405,13 +405,13 @@ async function messageToEvent(message, guild, options = {}, di) {
 | 
				
			||||||
			const format = file.stickerFormat.get(stickerItem.format_type)
 | 
								const format = file.stickerFormat.get(stickerItem.format_type)
 | 
				
			||||||
			if (format?.mime === "lottie") {
 | 
								if (format?.mime === "lottie") {
 | 
				
			||||||
				try {
 | 
									try {
 | 
				
			||||||
					const {mxc, info} = await lottie.convert(stickerItem)
 | 
										const {mxc_url, info} = await lottie.convert(stickerItem)
 | 
				
			||||||
					return {
 | 
										return {
 | 
				
			||||||
						$type: "m.sticker",
 | 
											$type: "m.sticker",
 | 
				
			||||||
						"m.mentions": mentions,
 | 
											"m.mentions": mentions,
 | 
				
			||||||
						body: stickerItem.name,
 | 
											body: stickerItem.name,
 | 
				
			||||||
						info,
 | 
											info,
 | 
				
			||||||
						url: mxc
 | 
											url: mxc_url
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				} catch (e) {
 | 
									} catch (e) {
 | 
				
			||||||
					return {
 | 
										return {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,7 +53,7 @@ function userToSimName(user) {
 | 
				
			||||||
	assert.notEqual(user.discriminator, "0000", "cannot create user for a webhook")
 | 
						assert.notEqual(user.discriminator, "0000", "cannot create user for a webhook")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 1. Is sim user already registered?
 | 
						// 1. Is sim user already registered?
 | 
				
			||||||
	const existing = select("sim", "sim_name", "WHERE discord_id = ?").pluck().get(user.id)
 | 
						const existing = select("sim", "sim_name", "WHERE user_id = ?").pluck().get(user.id)
 | 
				
			||||||
	if (existing) return existing
 | 
						if (existing) return existing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 2. Register based on username (could be new or old format)
 | 
						// 2. Register based on username (could be new or old format)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -251,7 +251,7 @@ module.exports = {
 | 
				
			||||||
	async onTypingStart(client, data) {
 | 
						async onTypingStart(client, data) {
 | 
				
			||||||
		const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(data.channel_id)
 | 
							const roomID = select("channel_room", "room_id", "WHERE channel_id = ?").pluck().get(data.channel_id)
 | 
				
			||||||
		if (!roomID) return
 | 
							if (!roomID) return
 | 
				
			||||||
		const mxid = from("sim").join("sim_member", "mxid").and("WHERE discord_id = ? AND room_id = ?").pluck("mxid").get(data.user_id, roomID)
 | 
							const mxid = from("sim").join("sim_member", "mxid").and("WHERE user_id = ? AND room_id = ?").pluck("mxid").get(data.user_id, roomID)
 | 
				
			||||||
		if (!mxid) return
 | 
							if (!mxid) return
 | 
				
			||||||
		// Each Discord user triggers the notification every 8 seconds as long as they remain typing.
 | 
							// Each Discord user triggers the notification every 8 seconds as long as they remain typing.
 | 
				
			||||||
		// Discord does not send typing stopped events, so typing only stops if the timeout is reached or if the user sends their message.
 | 
							// Discord does not send typing stopped events, so typing only stops if the timeout is reached or if the user sends their message.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										15
									
								
								db/migrations/0003-distinguish-column-names.sql
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								db/migrations/0003-distinguish-column-names.sql
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					BEGIN TRANSACTION;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Rename mxc to mxc_url for consistency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ALTER TABLE lottie RENAME COLUMN mxc TO mxc_url;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Rename id to sticker_id so joins make sense in the future
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ALTER TABLE lottie RENAME COLUMN id TO sticker_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Rename discord_id to user_id so joins make sense in the future
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ALTER TABLE sim RENAME COLUMN discord_id TO user_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					COMMIT;
 | 
				
			||||||
							
								
								
									
										6
									
								
								db/orm-utils.d.ts
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								db/orm-utils.d.ts
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -28,8 +28,8 @@ export type Models = {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	lottie: {
 | 
						lottie: {
 | 
				
			||||||
		id: string
 | 
							sticker_id: string
 | 
				
			||||||
		mxc: string
 | 
							mxc_url: string
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	member_cache: {
 | 
						member_cache: {
 | 
				
			||||||
| 
						 | 
					@ -45,7 +45,7 @@ export type Models = {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sim: {
 | 
						sim: {
 | 
				
			||||||
		discord_id: string
 | 
							user_id: string
 | 
				
			||||||
		sim_name: string
 | 
							sim_name: string
 | 
				
			||||||
		localpart: string
 | 
							localpart: string
 | 
				
			||||||
		mxid: string
 | 
							mxid: string
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,6 @@ test("orm: from: get pluck works", t => {
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test("orm: from: join and pluck works", t => {
 | 
					test("orm: from: join and pluck works", t => {
 | 
				
			||||||
	const mxid = from("sim").join("sim_member", "mxid").and("WHERE discord_id = ? AND room_id = ?").pluck("mxid").get("771520384671416320", "!hYnGGlPHlbujVVfktC:cadence.moe")
 | 
						const mxid = from("sim").join("sim_member", "mxid").and("WHERE user_id = ? AND room_id = ?").pluck("mxid").get("771520384671416320", "!hYnGGlPHlbujVVfktC:cadence.moe")
 | 
				
			||||||
	t.equal(mxid, "@_ooye_bojack_horseman:cadence.moe")
 | 
						t.equal(mxid, "@_ooye_bojack_horseman:cadence.moe")
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -324,7 +324,7 @@ async function eventToMessage(event, guild, di) {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			const sender = repliedToEvent.sender
 | 
								const sender = repliedToEvent.sender
 | 
				
			||||||
			const senderName = sender.match(/@([^:]*)/)?.[1] || sender
 | 
								const senderName = sender.match(/@([^:]*)/)?.[1] || sender
 | 
				
			||||||
			const authorID = select("sim", "discord_id", "WHERE mxid = ?").pluck().get(repliedToEvent.sender)
 | 
								const authorID = select("sim", "user_id", "WHERE mxid = ?").pluck().get(repliedToEvent.sender)
 | 
				
			||||||
			if (authorID) {
 | 
								if (authorID) {
 | 
				
			||||||
				replyLine += `<@${authorID}>`
 | 
									replyLine += `<@${authorID}>`
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
| 
						 | 
					@ -367,7 +367,7 @@ async function eventToMessage(event, guild, di) {
 | 
				
			||||||
			// Handling mentions of Discord users
 | 
								// Handling mentions of Discord users
 | 
				
			||||||
			input = input.replace(/("https:\/\/matrix.to\/#\/(@[^"]+)")>/g, (whole, attributeValue, mxid) => {
 | 
								input = input.replace(/("https:\/\/matrix.to\/#\/(@[^"]+)")>/g, (whole, attributeValue, mxid) => {
 | 
				
			||||||
				if (!utils.eventSenderIsFromDiscord(mxid)) return whole
 | 
									if (!utils.eventSenderIsFromDiscord(mxid)) return whole
 | 
				
			||||||
				const userID = select("sim", "discord_id", "WHERE mxid = ?").pluck().get(mxid)
 | 
									const userID = select("sim", "user_id", "WHERE mxid = ?").pluck().get(mxid)
 | 
				
			||||||
				if (!userID) return whole
 | 
									if (!userID) return whole
 | 
				
			||||||
				return `${attributeValue} data-user-id="${userID}">`
 | 
									return `${attributeValue} data-user-id="${userID}">`
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,5 +41,5 @@ const utils = require("../m2d/converters/utils")
 | 
				
			||||||
	await api.profileSetAvatarUrl(mxid, avatarUrl)
 | 
						await api.profileSetAvatarUrl(mxid, avatarUrl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// add initial rows to database, like adding the bot to sim...
 | 
						// add initial rows to database, like adding the bot to sim...
 | 
				
			||||||
	db.prepare("INSERT INTO sim (discord_id, sim_name, localpart, mxid) VALUES (?, ?, ?, ?)").run("0", reg.sender_localpart.slice(reg.ooye.namespace_prefix.length), reg.sender_localpart, mxid)
 | 
						db.prepare("INSERT INTO sim (user_id, sim_name, localpart, mxid) VALUES (?, ?, ?, ?)").run("0", reg.sender_localpart.slice(reg.ooye.namespace_prefix.length), reg.sender_localpart, mxid)
 | 
				
			||||||
})()
 | 
					})()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@ INSERT INTO channel_room (channel_id, room_id, name, nick, thread_parent, custom
 | 
				
			||||||
('1100319550446252084', '!BnKuBPCvyfOkhcUjEu:cadence.moe', 'worm-farm', NULL, NULL, NULL),
 | 
					('1100319550446252084', '!BnKuBPCvyfOkhcUjEu:cadence.moe', 'worm-farm', NULL, NULL, NULL),
 | 
				
			||||||
('297272183716052993', '!rEOspnYqdOalaIFniV:cadence.moe', 'general', NULL, NULL, NULL);
 | 
					('297272183716052993', '!rEOspnYqdOalaIFniV:cadence.moe', 'general', NULL, NULL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
INSERT INTO sim (discord_id, sim_name, localpart, mxid) VALUES
 | 
					INSERT INTO sim (user_id, sim_name, localpart, mxid) VALUES
 | 
				
			||||||
('0', 'bot', '_ooye_bot', '@_ooye_bot:cadence.moe'),
 | 
					('0', 'bot', '_ooye_bot', '@_ooye_bot:cadence.moe'),
 | 
				
			||||||
('820865262526005258', 'crunch_god', '_ooye_crunch_god', '@_ooye_crunch_god:cadence.moe'),
 | 
					('820865262526005258', 'crunch_god', '_ooye_crunch_god', '@_ooye_crunch_god:cadence.moe'),
 | 
				
			||||||
('771520384671416320', 'bojack_horseman', '_ooye_bojack_horseman', '@_ooye_bojack_horseman:cadence.moe'),
 | 
					('771520384671416320', 'bojack_horseman', '_ooye_bojack_horseman', '@_ooye_bojack_horseman:cadence.moe'),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue