From 3ef569d855ce96236e4df6e155bbcf79427d5b1f Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Sat, 7 Oct 2023 23:39:49 +1300 Subject: [PATCH] seed.js should now upload the L1 & L2 emojis --- db/migrations/0004-auto-emoji-guild.sql | 10 ++++ db/orm-defs.d.ts | 6 +++ docs/img/L1.png | Bin 0 -> 1610 bytes docs/img/L2.png | Bin 0 -> 514 bytes package-lock.json | 3 +- package.json | 1 + readme.md | 2 +- scripts/seed.js | 59 ++++++++++++++++++++++++ 8 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 db/migrations/0004-auto-emoji-guild.sql create mode 100644 docs/img/L1.png create mode 100644 docs/img/L2.png diff --git a/db/migrations/0004-auto-emoji-guild.sql b/db/migrations/0004-auto-emoji-guild.sql new file mode 100644 index 0000000..6d92f2b --- /dev/null +++ b/db/migrations/0004-auto-emoji-guild.sql @@ -0,0 +1,10 @@ +BEGIN TRANSACTION; + +CREATE TABLE auto_emoji ( + name TEXT NOT NULL, + emoji_id TEXT NOT NULL, + guild_id TEXT NOT NULL, + PRIMARY KEY (name) +) WITHOUT ROWID; + +COMMIT; diff --git a/db/orm-defs.d.ts b/db/orm-defs.d.ts index 9524f20..ffb9728 100644 --- a/db/orm-defs.d.ts +++ b/db/orm-defs.d.ts @@ -75,6 +75,12 @@ export type Models = { message_id: string encoded_emoji: string } + + auto_emoji: { + name: string + emoji_id: string + guild_id: string + } } export type Prepared = { diff --git a/docs/img/L1.png b/docs/img/L1.png new file mode 100644 index 0000000000000000000000000000000000000000..4e66a092eff7812fc4cfdb06cd6b3be5749918dd GIT binary patch literal 1610 zcmd5-`#;lb9Dg>$*K*l%Sq(MIVU1j>qlh-PVX1Lkl9Z;xaY@TCNoxn?R=Fk7#U&0a zQPwL(m(fkRb)tx)b~Nh5C?%$u^Id<%dA**`^Lag==l#4t@6YG?;gjXV^3Xx!(EtD) zrYGGO_5zhb8u0#bb7%+bv^btYTmYCGRfcF;B20#Z%i|e4;{6VW$MZtt!T^uQvx$t2 z=I#sSgxMU7i#R{&j0ZrypGkN1Pr4u*-o`Zu!-&63UK-Xm&nr)-lNn4qpLEVLMs1}} z#|Zn`0ZJB5FHSn9DVd1i9K4VsEGUHPeeH<`?l;biJVqyZCMMPl<&a1ldp7TH9O_-z z#7RCYyRtB~PE>fbb^BHIZX5h}5PRDhy#IeL{KFO0v~W>LXV)6pR=;!R_#s#IToEUm zG(;y=qx?v0V*t#l$bppjU@VJ?%5X^0(v#TB5{-K}+6(T1>{= z0j_|K0w_Ab$|G!x9xNgNK!Mi$qY4*+b%#YxLh00!Zd*Pl#&*jwZS%t;5>l>9dBVQ6 zg2D{eM{oe=^fqsEdOs69u4+-!f96GcQTf!LA!NL~EUyQKvs zp*?G(qD-l0!`{oC?ysh1w3f-d1BSrq6;8JXc4stU*)ap6lZ}JBp{ORxlgDWd7x$*~ z6s@)y3G*|bkN)^xUHHCt3jIP!p7H<=R8AV?aIQM1eK)54msXQ`F#vRPLSCTb)9~6Z zGj{mcR&Lx#tQS3G@Z_Q%15IeQI>}pV%`Zl-H0qN6qg-fN8FHIb(X@Ql9vy{+CH2YP zINpvSdPNi{-Q)1;WBX!rGMn;8hcw6i zHXIzDzuEFebjoQ4Vd5C4AmQ$=pIh^Mhepqc=Q|*Y%GZ26R_v4FcVj-9~gNwSA|70Z}>f zX*TeFeX`Agz7U95pg!StAF~R7$qE4Xs<7Xh%Y;E9${T-=06-nJJZ9}% z6?wl|y|*v56b#B7km8s(&F-mJFR~(}?=tPleJIZ40=I=$|AU*$f17>yliM~ht}|%d z$SR!+hErvgf~CwqJ6;pE*ly!eeykLfg1jFs&tKcUzsRcjTGn*vPK2MnU_IV1EE>~Z zwxH&#`Ycr2CNG?Wq}Ax8pA{LoBRGu-ohwS7Kxlh1fWH2zth@vr8)pGR2$hoxWM<=& zA8eJs%~&T~CIaHy?YA@-QiXh0ftCpTQQ}?c6TtY|_6~~LW`ZGt;P$UB0WuD@_Zt2P zm3z8v9+M&HK3Kq(f52gc4rK$wTgXVvSXGS9<+<~eRke@+@={Cs_EjR zS29uy5m1F?YVa9o+(lCj^awCIm4#d|A!KI*w?u&RU;s0P6V=2JF_$3t^br!c)vL|v zVrUG|&NnS5!}3D~Mp4D|ime7ApFi9KX=0+J=bq z&omVql%crEeK7AD1@~|n2O`1nN+QUgHYG5f1+s>wj#G&$jjNpOAC?tLff{>;2H3RU7-d yxT+;(?fd$#>^Jhif1V>Z(Q+=`9Zg&?{buAmD)|3Payu|Gfl=w|=d#Wzp$PyozoUl$ literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 15b4b76..2cf30c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "out-of-your-element", "version": "1.0.0", - "license": "MIT", + "license": "AGPL-3.0-or-later", "dependencies": { "@chriscdn/promise-semaphore": "^2.0.1", "better-sqlite3": "^8.3.0", @@ -18,6 +18,7 @@ "heatsync": "^2.4.1", "js-yaml": "^4.1.0", "matrix-appservice": "^2.0.0", + "minimist": "^1.2.8", "mixin-deep": "github:cloudrac3r/mixin-deep#v3.0.0", "node-fetch": "^2.6.7", "pngjs": "^7.0.0", diff --git a/package.json b/package.json index e40e82c..333aae9 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "heatsync": "^2.4.1", "js-yaml": "^4.1.0", "matrix-appservice": "^2.0.0", + "minimist": "^1.2.8", "mixin-deep": "github:cloudrac3r/mixin-deep#v3.0.0", "node-fetch": "^2.6.7", "pngjs": "^7.0.0", diff --git a/readme.md b/readme.md index f1a35c7..2a217e5 100644 --- a/readme.md +++ b/readme.md @@ -59,7 +59,6 @@ You'll need: * Administrative access to a homeserver * Discord bot -* Custom emojis named `L1` and `L2` for replies sent to Discord (TODO: provide) Follow these steps: @@ -148,6 +147,7 @@ Follow these steps: * (1) heatsync: Module hot-reloader that I trust. * (1) js-yaml: It seems to do what I want, and it's already pulled in by matrix-appservice. * (70) matrix-appservice: I wish it didn't pull in express :( +* (0) minimist: It's already pulled in by better-sqlite3->prebuild-install * (0) mixin-deep: This is my fork! It fixes a bug in regular mixin-deep. * (3) node-fetch@2: I like it and it does what I want. * (0) pngjs: Lottie stickers are converted to bitmaps with the vendored Rlottie WASM build, then the bitmaps are converted to PNG with pngjs. diff --git a/scripts/seed.js b/scripts/seed.js index 2a0c279..0f2f23d 100644 --- a/scripts/seed.js +++ b/scripts/seed.js @@ -1,10 +1,14 @@ // @ts-check +console.log("This could take up to 30 seconds. Please be patient.") + const assert = require("assert").strict const fs = require("fs") const sqlite = require("better-sqlite3") const HeatSync = require("heatsync") +const args = require("minimist")(process.argv.slice(2), {string: ["emoji-guild"]}) + const config = require("../config") const passthrough = require("../passthrough") const db = new sqlite("db/ooye.db") @@ -27,6 +31,24 @@ const file = require("../matrix/file") const reg = require("../matrix/read-registration") const utils = require("../m2d/converters/utils") +function die(message) { + console.error(message) + process.exit(1) +} + +async function uploadAutoEmoji(guild, name, filename) { + let emoji = guild.emojis.find(e => e.name === name) + if (!emoji) { + console.log(` Uploading ${name}...`) + const data = fs.readFileSync(filename, null) + emoji = await discord.snow.guildAssets.createEmoji(guild.id, {name, image: "data:image/png;base64," + data.toString("base64")}) + } else { + console.log(` Reusing ${name}...`) + } + db.prepare("REPLACE INTO auto_emoji (name, emoji_id, guild_id) VALUES (?, ?, ?)").run(emoji.name, emoji.id, guild.id) + return emoji +} + ;(async () => { const mxid = `@${reg.sender_localpart}:${reg.ooye.server_name}` @@ -45,6 +67,43 @@ const utils = require("../m2d/converters/utils") console.log("✅ Database is ready...") + // upload the L1 L2 emojis to some guild + const emojis = db.prepare("SELECT name FROM auto_emoji WHERE name = 'L1' OR name = 'L2'").pluck().all() + if (emojis.length !== 2) { + // If an argument was supplied, always use that one + let guild = null + if (args["emoji-guild"]) { + if (typeof args["emoji-guild"] === "string") { + guild = await discord.snow.guild.getGuild(args["emoji-guild"]) + } + if (!guild) return die(`Error: You asked emojis to be uploaded to guild ID ${args["emoji-guild"]}, but the bot isn't in that guild.`) + } + // Otherwise, check if we have already registered an auto emoji guild + if (!guild) { + const guildID = passthrough.select("auto_emoji", "guild_id", {name: "_"}).pluck().get() + if (guildID) { + guild = await discord.snow.guild.getGuild(guildID, false) + } + } + // Otherwise, check if we should create a new guild + if (!guild) { + const guilds = await discord.snow.user.getGuilds({limit: 11, with_counts: false}) + if (guilds.length < 10) { + console.log(" Creating a guild for emojis...") + guild = await discord.snow.guild.createGuild({name: "OOYE Emojis"}) + } + } + // Otherwise, it's the user's problem + if (!guild) { + return die(`Error: The bot needs to upload some emojis. Please say where to upload them to. Run seed.js again with --emoji-guild=GUILD_ID`) + } + // Upload those emojis to the chosen location + db.prepare("REPLACE INTO auto_emoji (name, emoji_id, guild_id) VALUES ('_', '_', ?)").run(guild.id) + await uploadAutoEmoji(guild, "L1", "docs/img/L1.png") + await uploadAutoEmoji(guild, "L2", "docs/img/L2.png") + } + console.log("✅ Emojis are ready...") + // ensure homeserver well-known is valid and returns reg.ooye.server_name... // upload initial images...