Skip to content

Commit 31087fc

Browse files
authored
Merge pull request #18 from teamboostify/change/selfhost-brand
Made embeds brandable for selfhosted versions
2 parents acadd52 + d125709 commit 31087fc

10 files changed

Lines changed: 117 additions & 65 deletions

File tree

package-lock.json

Lines changed: 24 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"type": "module",
77
"scripts": {
88
"build": "tsc",
9-
"start": "node --env-file=.env dist/index.js",
9+
"start": "node --env-file=.env .",
1010
"dev": "tsx --env-file=.env src/index.ts",
1111
"prisma:generate": "prisma generate"
1212
},
@@ -20,8 +20,8 @@
2020
"typescript": "^7.0.2"
2121
},
2222
"dependencies": {
23-
"@prisma/adapter-pg": "^7.8.0",
24-
"@prisma/client": "^7.8.0",
23+
"@prisma/adapter-pg": "^7.9.0",
24+
"@prisma/client": "^7.9.0",
2525
"axios": "^1.16.0",
2626
"chalk": "^4.1.2",
2727
"discord.js": "^14.27.0",
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { ColorResolvable } from "discord.js";
2+
import { client } from "../../index.js";
3+
import { SystemColors } from "../../libs/colors.js";
4+
import { logger } from "../../libs/logger.js";
5+
6+
const cachedColors = new Map<string, ColorResolvable>();
7+
8+
export async function resolveColor(): Promise<ColorResolvable> {
9+
if (process.env.CLIENT_ID == '1453802179789066442') return SystemColors.main; // custom branding coming as a future update
10+
11+
const guildid = process.env.GUILD_ID! || process.env.MASTER_GUILD!;
12+
13+
if (!guildid) {
14+
return SystemColors.main;
15+
}
16+
17+
if (cachedColors.has(guildid)) {
18+
return cachedColors.get(guildid)!;
19+
}
20+
21+
try {
22+
const guild = await client.guilds.fetch(guildid);
23+
const me = await guild.members.fetchMe();
24+
25+
const color = me.displayColor;
26+
const resolved: ColorResolvable = color !== 0 ? color : SystemColors.main;
27+
28+
cachedColors.set(guildid, resolved);
29+
return resolved;
30+
} catch (err) {
31+
logger.error(`Failed to resolve color for guild ${guildid}: ${err}`);
32+
return SystemColors.main;
33+
}
34+
}

src/base/functions/embed.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { EmbedBuilder, ColorResolvable, ContainerBuilder, resolveColor as resolveColorValue } from "discord.js";
2+
import { resolveColor } from "./color-resolve.js";
3+
4+
export async function Embed(color?: ColorResolvable): Promise<EmbedBuilder> {
5+
const embedColor = color ?? await resolveColor();
6+
7+
return new EmbedBuilder().setColor(embedColor);
8+
}
9+
10+
export async function Container(color?: ColorResolvable): Promise<ContainerBuilder> {
11+
const embedColor = color ?? await resolveColor();
12+
const accentColor = resolveColorValue(embedColor);
13+
14+
return new ContainerBuilder().setAccentColor(accentColor);
15+
}

src/commands/booster.ts

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
SeparatorSpacingSize,
99
ButtonBuilder,
1010
ButtonStyle,
11+
Colors,
1112
} from "discord.js";
1213
import {
1314
getBooster,
@@ -21,6 +22,7 @@ import {
2122
} from "../services/boosterService.js";
2223
import { Command } from "../base/classes/command.js";
2324
import { logger } from "../libs/logger.js";
25+
import { Container, Embed } from "../base/functions/embed.js";
2426

2527
export default new Command({
2628
info: new SlashCommandBuilder()
@@ -106,9 +108,8 @@ export default new Command({
106108
if (!result.data) {
107109
if (isBoostingServer && member && member.premiumSince) {
108110
const discordBoost = `🟢 Boosting since <t:${Math.floor(member.premiumSince.getTime() / 1000)}:D>`;
109-
const embed = new EmbedBuilder()
110-
.setColor(0xff73fa)
111-
.setTitle(`Here is the Booster Information for ${user.id}!`)
111+
const embed = await Embed();
112+
embed.setTitle(`Here is the Booster Information for ${user.id}!`)
112113
.setThumbnail(avatarUrl)
113114
.addFields(
114115
{
@@ -126,8 +127,8 @@ export default new Command({
126127
return;
127128
}
128129

129-
const container = new ContainerBuilder()
130-
.setAccentColor(0xe642a4)
130+
const container = await Container();
131+
container.setAccentColor(0xe642a4)
131132
.addTextDisplayComponents(
132133
new TextDisplayBuilder().setContent("**Uh oh!**"),
133134
new TextDisplayBuilder().setContent(
@@ -157,9 +158,8 @@ export default new Command({
157158
.setLabel("Our Support Server")
158159
.setURL("https://discord.gg/NUtyKs7hA6");
159160

160-
const container = new ContainerBuilder()
161-
.setAccentColor(0xe642a4)
162-
.addTextDisplayComponents(
161+
const container = await Container(Colors.Red)
162+
container.addTextDisplayComponents(
163163
new TextDisplayBuilder().setContent("**Uh oh!**"),
164164
new TextDisplayBuilder().setContent(
165165
`It looks like we ran into an issue\n-# If this issue is persistent, please consult your console logs if you're using a self-hosted version of Boostify, and create an issue on our [Repository](https://github.com/teamboostify/boostify/issues), or use our support server!.`,
@@ -184,8 +184,8 @@ export default new Command({
184184
const isActiveBooster =
185185
booster.active && booster.boostCounts > 0 && !!premiumSince;
186186

187-
const embed = new EmbedBuilder()
188-
.setColor(booster.active ? 0xf47fff : 0x99aab5)
187+
const embed = await Embed();
188+
embed.setColor(booster.active ? 0xf47fff : 0x99aab5)
189189
.setTitle(`Booster Info: ${user.username}`)
190190
.setThumbnail(avatarUrl)
191191
.addFields(
@@ -253,9 +253,8 @@ export default new Command({
253253
}
254254

255255
const boostWord = amount === 1 ? "boost" : "boosts";
256-
const container = new ContainerBuilder()
257-
.setAccentColor(0xe642a4)
258-
.addTextDisplayComponents(
256+
const container = await Container();
257+
container.addTextDisplayComponents(
259258
new TextDisplayBuilder().setContent(`**Boost successfully added!**`),
260259
new TextDisplayBuilder().setContent(
261260
`We've successfully added ${amount} ${boostWord} to ${user}'s profile.`,
@@ -294,9 +293,8 @@ export default new Command({
294293
getTotalBoosts(discordGuild.id),
295294
]);
296295

297-
const embed = new EmbedBuilder()
298-
.setColor(0xf47fff)
299-
.setTitle("Server Boost Statistics")
296+
const embed = await Embed();
297+
embed.setTitle("Server Boost Statistics")
300298
.addFields(
301299
{
302300
name: "Current Boosters",

src/commands/help.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
} from "discord.js";
77
import { Command } from "../base/classes/command.js";
88
import { SystemColors } from "../libs/colors.js";
9+
import { Container } from "../base/functions/embed.js";
910

1011
const knowledgebase: Record<string, string> = {
1112
booster:
@@ -574,17 +575,16 @@ export default new Command({
574575
const sub = interaction.options.getString("command", true);
575576

576577
if (knowledgebase[sub]) {
577-
const container = new ContainerBuilder()
578-
.setAccentColor(SystemColors.main)
579-
.addTextDisplayComponents(txt => txt.setContent(
578+
const container = await Container()
579+
container.addTextDisplayComponents(txt => txt.setContent(
580580
`## Command info: \`/${sub}\`\n`+
581581
knowledgebase[sub]
582582
));
583583

584584
await interaction.reply({ components: [container], flags: [MessageFlags.IsComponentsV2]})
585585
} else {
586-
const container = new ContainerBuilder()
587-
.setAccentColor(Colors.Red)
586+
const container = await Container(Colors.Red);
587+
container.setAccentColor(Colors.Red)
588588
.addTextDisplayComponents(txt => txt.setContent(
589589
`## Command not found\n`+
590590
`We couldn't find any resources matching the command \`${sub}\`, please try later.`

src/commands/info.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
import axios from "axios";
99
import { Command } from "../base/classes/command.js";
1010
import packageInfo from "../../package.json" with { type: "json" };
11+
import { Embed } from "../base/functions/embed.js";
1112

1213
interface GithubRes {
1314
login: string,
@@ -33,16 +34,15 @@ export default new Command({
3334

3435
const uptimeString = `${days}d ${hours}h ${minutes}m ${seconds}s`;
3536

36-
const embed = new EmbedBuilder()
37-
.setColor(16712630)
38-
.setThumbnail(interaction.client.user.displayAvatarURL({ size: 2048 }))
37+
const embed = await Embed();
38+
embed.setThumbnail(interaction.client.user.displayAvatarURL({ size: 2048 }))
3939
.setTitle("Bot information")
4040
.setDescription(
4141
"Boostify is a Discord bot designed to help you manage your server boosts."
4242
)
4343
.addFields(
4444
{
45-
name: "Developers",
45+
name: `Contributors [${info.data.length}]`,
4646
value: info.data
4747
.map((user) => `[@${user.login}](${user.html_url})`)
4848
.join("\n"),

0 commit comments

Comments
 (0)