forked from cosmic/scythe
Compare commits
7 Commits
fix/channe
...
main
| Author | SHA1 | Date |
|---|---|---|
|
|
4d57b25bbb | |
|
|
303aba80b1 | |
|
|
5cf1d4f58d | |
|
|
49d3cbc0af | |
|
|
e847e22aa8 | |
|
|
e923afed4a | |
|
|
ed553e2f52 |
|
|
@ -1,15 +1,12 @@
|
|||
module "bun" {
|
||||
interface Env {
|
||||
TOKEN: string;
|
||||
WELCOME: string;
|
||||
GOODBYE: string;
|
||||
GUILD: string;
|
||||
BAD_ROLE: string;
|
||||
BOT_ROLE: string;
|
||||
BOT_CHANNEL: string;
|
||||
OWNER: string;
|
||||
SCYTHE_CHANNEL: string;
|
||||
UPTIME_MESSAGE: string;
|
||||
TICKET_CATEGORY: string;
|
||||
TICKET_CHANNEL: string;
|
||||
MOD_ROLE: string;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,61 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1731533236,
|
||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1745930157,
|
||||
"narHash": "sha256-y3h3NLnzRSiUkYpnfvnS669zWZLoqqI6NprtLQ+5dck=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "46e634be05ce9dc6d4db8e664515ba10b78151ae",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
description = "Bun development environment";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
in {
|
||||
devShells.default = pkgs.mkShell {
|
||||
packages = with pkgs; [
|
||||
bun
|
||||
nodejs
|
||||
];
|
||||
};
|
||||
});
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
import {
|
||||
ApplicationCommandOptionType,
|
||||
CommandInteraction,
|
||||
MessageFlags,
|
||||
TextChannel,
|
||||
} from "discord.js";
|
||||
import { Discord, Slash, SlashOption } from "discordx";
|
||||
import db from "../db";
|
||||
import { starboardSettingsTable } from "../db/schema";
|
||||
import { eq } from "drizzle-orm";
|
||||
|
||||
@Discord()
|
||||
export class StarboardCmds {
|
||||
@Slash({ name: "starboard-setup", description: "setup the starboard" })
|
||||
async starboardSetup(
|
||||
@SlashOption({
|
||||
name: "channel",
|
||||
description: "channel to post starboard messages to",
|
||||
type: ApplicationCommandOptionType.Channel,
|
||||
required: true,
|
||||
})
|
||||
channel: TextChannel,
|
||||
@SlashOption({
|
||||
name: "threshold",
|
||||
description: "number of reacts needed to post to starboard",
|
||||
type: ApplicationCommandOptionType.Integer,
|
||||
required: true,
|
||||
})
|
||||
threshold: number,
|
||||
inter: CommandInteraction,
|
||||
) {
|
||||
if (inter.user.id !== inter.guild?.ownerId) {
|
||||
return await inter.reply("can't use this one silly!");
|
||||
}
|
||||
await db.insert(starboardSettingsTable).values({
|
||||
guild: inter.guildId!,
|
||||
channel: channel.id,
|
||||
threshold,
|
||||
enabled: 1,
|
||||
});
|
||||
await inter.reply({ content: "Done", flags: MessageFlags.Ephemeral });
|
||||
}
|
||||
@Slash({
|
||||
name: "starboard-enable",
|
||||
description: "enable/disable the starboard",
|
||||
})
|
||||
async starboardEnable(
|
||||
@SlashOption({
|
||||
name: "setting",
|
||||
description: "enable/disable",
|
||||
type: ApplicationCommandOptionType.Boolean,
|
||||
required: true,
|
||||
})
|
||||
setting: boolean,
|
||||
inter: CommandInteraction,
|
||||
) {
|
||||
if (inter.user.id !== inter.guild?.ownerId) {
|
||||
return await inter.reply("can't use this one silly!");
|
||||
}
|
||||
await db
|
||||
.update(starboardSettingsTable)
|
||||
.set({
|
||||
enabled: setting ? 1 : 0,
|
||||
})
|
||||
.where(eq(starboardSettingsTable.guild, inter.guildId!));
|
||||
await inter.reply({
|
||||
content: "Setting Changed",
|
||||
flags: MessageFlags.Ephemeral,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -59,9 +59,9 @@ export class TicketComponenets {
|
|||
id: inter.client.user.id,
|
||||
allow: [
|
||||
PermissionsBitField.Flags.ViewChannel,
|
||||
PermissionsBitField.Flags.SendMessages
|
||||
PermissionsBitField.Flags.SendMessages,
|
||||
],
|
||||
}
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
CREATE TABLE `starboard_messages` (
|
||||
`message` text PRIMARY KEY NOT NULL
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `starboard_settings` (
|
||||
`guild` text PRIMARY KEY NOT NULL,
|
||||
`threshold` integer NOT NULL,
|
||||
`channel` text NOT NULL,
|
||||
`enabled` integer NOT NULL
|
||||
);
|
||||
|
|
@ -0,0 +1,269 @@
|
|||
{
|
||||
"version": "6",
|
||||
"dialect": "sqlite",
|
||||
"id": "f14a1768-d64d-47dc-a9bd-ad3646ab3c6e",
|
||||
"prevId": "dea3a962-3fb8-4c45-90fa-baff2f53bfb2",
|
||||
"tables": {
|
||||
"bye": {
|
||||
"name": "bye",
|
||||
"columns": {
|
||||
"guild": {
|
||||
"name": "guild",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"channel": {
|
||||
"name": "channel",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"message": {
|
||||
"name": "message",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"colonthree": {
|
||||
"name": "colonthree",
|
||||
"columns": {
|
||||
"user": {
|
||||
"name": "user",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"amount": {
|
||||
"name": "amount",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"messages_count": {
|
||||
"name": "messages_count",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"confess": {
|
||||
"name": "confess",
|
||||
"columns": {
|
||||
"guild": {
|
||||
"name": "guild",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"channel": {
|
||||
"name": "channel",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"greets": {
|
||||
"name": "greets",
|
||||
"columns": {
|
||||
"guild": {
|
||||
"name": "guild",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"channel": {
|
||||
"name": "channel",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"message": {
|
||||
"name": "message",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"intro": {
|
||||
"name": "intro",
|
||||
"columns": {
|
||||
"guild": {
|
||||
"name": "guild",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"channel": {
|
||||
"name": "channel",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"starboard_messages": {
|
||||
"name": "starboard_messages",
|
||||
"columns": {
|
||||
"message": {
|
||||
"name": "message",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"starboard_settings": {
|
||||
"name": "starboard_settings",
|
||||
"columns": {
|
||||
"guild": {
|
||||
"name": "guild",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"threshold": {
|
||||
"name": "threshold",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"channel": {
|
||||
"name": "channel",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"enabled": {
|
||||
"name": "enabled",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"tickets": {
|
||||
"name": "tickets",
|
||||
"columns": {
|
||||
"user": {
|
||||
"name": "user",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"channel": {
|
||||
"name": "channel",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"uptime": {
|
||||
"name": "uptime",
|
||||
"columns": {
|
||||
"guild": {
|
||||
"name": "guild",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"channel": {
|
||||
"name": "channel",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"message": {
|
||||
"name": "message",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
}
|
||||
},
|
||||
"views": {},
|
||||
"enums": {},
|
||||
"_meta": {
|
||||
"schemas": {},
|
||||
"tables": {},
|
||||
"columns": {}
|
||||
},
|
||||
"internal": {
|
||||
"indexes": {}
|
||||
}
|
||||
}
|
||||
|
|
@ -36,6 +36,13 @@
|
|||
"when": 1744606507294,
|
||||
"tag": "0004_keen_bedlam",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 5,
|
||||
"version": "6",
|
||||
"when": 1746568313383,
|
||||
"tag": "0005_shallow_dragon_lord",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,4 +41,15 @@ export const confessTable = sqliteTable("confess", {
|
|||
channel: text().notNull(),
|
||||
});
|
||||
|
||||
export const starboardMessagesTable = sqliteTable("starboard_messages", {
|
||||
message: text().primaryKey(),
|
||||
});
|
||||
|
||||
export const starboardSettingsTable = sqliteTable("starboard_settings", {
|
||||
guild: text().primaryKey(),
|
||||
threshold: int().notNull(),
|
||||
channel: text().notNull(),
|
||||
enabled: int().notNull(),
|
||||
});
|
||||
|
||||
export type ColonThreeType = InferSelectModel<typeof colonTable>;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
import { type Client, Discord, On, type ArgsOf } from "discordx";
|
||||
import db from "../db";
|
||||
import { starboardMessagesTable, starboardSettingsTable } from "../db/schema";
|
||||
import { eq } from "drizzle-orm";
|
||||
import { Colors, EmbedBuilder, type TextChannel } from "discord.js";
|
||||
|
||||
@Discord()
|
||||
export class ReactionAdd {
|
||||
@On({ event: "messageReactionAdd" })
|
||||
async reactionAdd([re]: ArgsOf<"messageReactionAdd">, client: Client) {
|
||||
const settings = await db
|
||||
.select()
|
||||
.from(starboardSettingsTable)
|
||||
.where(eq(starboardSettingsTable.guild, re.message.guildId!));
|
||||
if (
|
||||
re.count === settings[0].threshold &&
|
||||
re.emoji.name === "⭐" &&
|
||||
re.message.channelId !== settings[0].channel &&
|
||||
settings[0].enabled === 1
|
||||
) {
|
||||
await db
|
||||
.insert(starboardMessagesTable)
|
||||
.values({ message: re.message.id });
|
||||
const author = client.guilds.cache
|
||||
.get(re.message.guildId!)!
|
||||
.members.cache.get(re.message.author!.id);
|
||||
const embed = new EmbedBuilder()
|
||||
.setAuthor({
|
||||
name: author?.displayName!,
|
||||
iconURL: author?.displayAvatarURL(),
|
||||
})
|
||||
.setTitle(`New message from ${author?.displayName}`)
|
||||
.setURL(re.message.url)
|
||||
// Sapphire returns ExpectedValidationError & ExpectedConstraintError
|
||||
// without specifying null for whatever reason
|
||||
// Even though .content is already typed as "string | null"
|
||||
.setDescription(re.message.content || null)
|
||||
.setImage(re.message.attachments.first()?.url || null)
|
||||
.setFooter({ text: "\u{00002b50}" })
|
||||
.setTimestamp(re.message.createdAt)
|
||||
.setColor(Colors.Yellow);
|
||||
|
||||
const channel = client.channels.cache.get(
|
||||
settings[0].channel,
|
||||
) as TextChannel;
|
||||
await channel.send({ embeds: [embed] });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -15,6 +15,8 @@ const client = new Client({
|
|||
IntentsBitField.Flags.GuildMessages,
|
||||
IntentsBitField.Flags.GuildMembers,
|
||||
IntentsBitField.Flags.MessageContent,
|
||||
IntentsBitField.Flags.GuildMessageReactions,
|
||||
IntentsBitField.Flags.DirectMessageReactions,
|
||||
],
|
||||
silent: false,
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue