mirror of
https://github.com/SrIzan10/prox2-discord.git
synced 2026-06-06 01:06:57 +00:00
feat: anonymous replies
This commit is contained in:
4
bun.lock
4
bun.lock
@@ -5,7 +5,7 @@
|
|||||||
"name": "ts-example",
|
"name": "ts-example",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/client": "^6.16.2",
|
"@prisma/client": "^6.16.2",
|
||||||
"@sern/handler": "^4.0.0",
|
"@sern/handler": "^4.2.6",
|
||||||
"@sern/publisher": "^1.1.1",
|
"@sern/publisher": "^1.1.1",
|
||||||
"discord.js": "latest",
|
"discord.js": "latest",
|
||||||
"dotenv": "^16.3.1",
|
"dotenv": "^16.3.1",
|
||||||
@@ -110,7 +110,7 @@
|
|||||||
|
|
||||||
"@sern/cli": ["@sern/cli@1.4.0", "", { "dependencies": { "@esbuild-kit/cjs-loader": "^2.4.2", "@esbuild-kit/esm-loader": "^2.5.5", "colorette": "2.0.20", "commander": "11.0.0", "dotenv": "^16.3.1", "esbuild": "^0.19.1", "execa": "7.2.0", "find-up": "6.3.0", "glob": "^10.3.3", "ora": "6.3.1", "prompts": "2.4.2", "undici": "5.23.0" }, "bin": { "sern": "dist/index.js" } }, "sha512-IePGYYJvIVwNtnukblYxE2X7hiFivLa/p4UVaMi0XLpZ+Fa3BAdsSiBKRzLtBYWl8J2Se9StLSFwBYQW7ik+/Q=="],
|
"@sern/cli": ["@sern/cli@1.4.0", "", { "dependencies": { "@esbuild-kit/cjs-loader": "^2.4.2", "@esbuild-kit/esm-loader": "^2.5.5", "colorette": "2.0.20", "commander": "11.0.0", "dotenv": "^16.3.1", "esbuild": "^0.19.1", "execa": "7.2.0", "find-up": "6.3.0", "glob": "^10.3.3", "ora": "6.3.1", "prompts": "2.4.2", "undici": "5.23.0" }, "bin": { "sern": "dist/index.js" } }, "sha512-IePGYYJvIVwNtnukblYxE2X7hiFivLa/p4UVaMi0XLpZ+Fa3BAdsSiBKRzLtBYWl8J2Se9StLSFwBYQW7ik+/Q=="],
|
||||||
|
|
||||||
"@sern/handler": ["@sern/handler@4.2.5", "", { "dependencies": { "@sern/ioc": "^1.1.2", "callsites": "^3.1.0", "cron": "^3.1.7", "deepmerge": "^4.3.1" } }, "sha512-ASvJMJf8agvn7J7jZVu7ujTEb8xycA34PG+sXu28HqxGXqvCea4LsRbX3MrAxw3FE+bPQRLc3mYreKc50lmChg=="],
|
"@sern/handler": ["@sern/handler@4.2.6", "", { "dependencies": { "@sern/ioc": "^1.1.2", "callsites": "^3.1.0", "cron": "^3.1.7", "deepmerge": "^4.3.1" } }, "sha512-LuRs56kVsZKNZ8KRSTdFDrjIv12u62rmHqfwHocjOEF/1LMA2Xd5qDjntaaHOLRTN4il1ZiY3mXRJUHVpMDHYA=="],
|
||||||
|
|
||||||
"@sern/ioc": ["@sern/ioc@1.1.2", "", {}, "sha512-n84w7n5hB1dl8N6dfSbeYIo0QYORMS1bpG/P7J7GoMNTu8c28EYVZ8uGs3Md9GB09UseOKn3mfv1QBDtRsbb1g=="],
|
"@sern/ioc": ["@sern/ioc@1.1.2", "", {}, "sha512-n84w7n5hB1dl8N6dfSbeYIo0QYORMS1bpG/P7J7GoMNTu8c28EYVZ8uGs3Md9GB09UseOKn3mfv1QBDtRsbb1g=="],
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/client": "^6.16.2",
|
"@prisma/client": "^6.16.2",
|
||||||
"@sern/handler": "^4.0.0",
|
"@sern/handler": "^4.2.6",
|
||||||
"@sern/publisher": "^1.1.1",
|
"@sern/publisher": "^1.1.1",
|
||||||
"discord.js": "latest",
|
"discord.js": "latest",
|
||||||
"dotenv": "^16.3.1"
|
"dotenv": "^16.3.1"
|
||||||
|
|||||||
16
prisma/migrations/20251005144059_reply_user/migration.sql
Normal file
16
prisma/migrations/20251005144059_reply_user/migration.sql
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "ReplyUser" (
|
||||||
|
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"guildId" TEXT NOT NULL,
|
||||||
|
"userId" INTEGER NOT NULL,
|
||||||
|
"postId" INTEGER NOT NULL,
|
||||||
|
"userHash" TEXT NOT NULL,
|
||||||
|
CONSTRAINT "ReplyUser_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "ReplyUser_userId_key" ON "ReplyUser"("userId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "ReplyUser_guildId_userHash_key" ON "ReplyUser"("guildId", "userHash");
|
||||||
@@ -23,6 +23,7 @@ model Post {
|
|||||||
publicMsgId String?
|
publicMsgId String?
|
||||||
|
|
||||||
votes Vote[]
|
votes Vote[]
|
||||||
|
replyUsers ReplyUser[]
|
||||||
}
|
}
|
||||||
|
|
||||||
model Vote {
|
model Vote {
|
||||||
@@ -43,4 +44,16 @@ model GuildConfig {
|
|||||||
guildId String @unique
|
guildId String @unique
|
||||||
verifChannelId String
|
verifChannelId String
|
||||||
publicChannelId String
|
publicChannelId String
|
||||||
|
}
|
||||||
|
|
||||||
|
model ReplyUser {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
guildId String
|
||||||
|
userId Int @unique
|
||||||
|
postId Int
|
||||||
|
post Post @relation(fields: [postId], references: [id])
|
||||||
|
userHash String
|
||||||
|
|
||||||
|
@@unique([guildId, userHash])
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { commandModule, CommandType } from '@sern/handler';
|
import { commandModule, CommandType } from '@sern/handler';
|
||||||
import { MessageFlags } from 'discord.js';
|
import { bold, MessageFlags } from 'discord.js';
|
||||||
|
|
||||||
export default commandModule({
|
export default commandModule({
|
||||||
type: CommandType.Modal,
|
type: CommandType.Modal,
|
||||||
@@ -7,6 +7,14 @@ export default commandModule({
|
|||||||
execute: async (ctx, sdt) => {
|
execute: async (ctx, sdt) => {
|
||||||
const db = sdt.deps.prisma;
|
const db = sdt.deps.prisma;
|
||||||
const text = ctx.fields.getTextInputValue('confessionReplyText');
|
const text = ctx.fields.getTextInputValue('confessionReplyText');
|
||||||
|
|
||||||
|
if (!ctx.channel?.isSendable()) {
|
||||||
|
return ctx.reply({
|
||||||
|
content: "i can't seem to send anything :heavysob:",
|
||||||
|
flags: MessageFlags.Ephemeral,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const hashedUser = new Bun.CryptoHasher('sha256')
|
const hashedUser = new Bun.CryptoHasher('sha256')
|
||||||
.update(`${process.env.SALT}-${ctx.user.id}`)
|
.update(`${process.env.SALT}-${ctx.user.id}`)
|
||||||
.digest('hex');
|
.digest('hex');
|
||||||
@@ -18,23 +26,48 @@ export default commandModule({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (dbPost?.posterHash !== hashedUser) {
|
if (!dbPost) {
|
||||||
return ctx.reply({
|
return ctx.reply({
|
||||||
content: "you don't seem to be op here...",
|
content: "there's no post?",
|
||||||
flags: MessageFlags.Ephemeral,
|
flags: MessageFlags.Ephemeral,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ctx.channel?.isSendable()) {
|
const isOp = dbPost.posterHash === hashedUser;
|
||||||
return ctx.reply({
|
let userReplyId: number | null = null;
|
||||||
content: "i can't seem to send anything :heavysob:",
|
|
||||||
flags: MessageFlags.Ephemeral,
|
if (!isOp) {
|
||||||
|
const replyUserExists = await db.replyUser.findFirst({
|
||||||
|
where: {
|
||||||
|
userHash: hashedUser,
|
||||||
|
guildId: ctx.guildId!,
|
||||||
|
postId: dbPost.id,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (replyUserExists) {
|
||||||
|
userReplyId = replyUserExists.id;
|
||||||
|
} else {
|
||||||
|
const maxUserId = await db.replyUser.aggregate({
|
||||||
|
where: { guildId: ctx.guildId!, postId: dbPost.id },
|
||||||
|
_max: { userId: true },
|
||||||
|
});
|
||||||
|
const nextUserId = (maxUserId._max.userId || 0) + 1;
|
||||||
|
const newReplyUser = await db.replyUser.create({
|
||||||
|
data: {
|
||||||
|
guildId: ctx.guildId!,
|
||||||
|
postId: dbPost.id,
|
||||||
|
userHash: hashedUser,
|
||||||
|
userId: nextUserId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
userReplyId = newReplyUser.id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await ctx.channel.send({
|
await ctx.channel.send({
|
||||||
content: text,
|
content: `${bold(isOp ? 'OP' : `Anon #${userReplyId}`)}: ${text}`,
|
||||||
allowedMentions: { parse: [] }
|
allowedMentions: { parse: [] },
|
||||||
});
|
});
|
||||||
return ctx.deferUpdate();
|
return ctx.deferUpdate();
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user