Compare commits

..

2 commits

Author SHA1 Message Date
powermaker450 6f8435b699 Prettier 2024-10-12 18:51:09 -04:00
powermaker450 9da9926fac Cast some nets 2024-10-12 18:50:34 -04:00
21 changed files with 273 additions and 203 deletions

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Client } from "discord.js"; import { Client } from "discord.js";

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import dotenv from "dotenv"; import dotenv from "dotenv";
import Logger from "../utils/Logger"; import Logger from "../utils/Logger";

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { REST, Routes } from "discord.js"; import { REST, Routes } from "discord.js";
import { commands } from "../commands"; import { commands } from "../commands";

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
export * from "./client"; export * from "./client";
export * from "./config"; export * from "./config";

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
export type DeployCommandsProps = { export type DeployCommandsProps = {
guildId: string; guildId: string;

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { import {
CommandInteraction, CommandInteraction,
@ -26,11 +26,14 @@ import { BotClient } from "../bot";
import { dt } from "../main"; import { dt } from "../main";
import { StoreMan } from "../storeman"; import { StoreMan } from "../storeman";
import getRandomColor from "../utils/getRandomColor"; import getRandomColor from "../utils/getRandomColor";
import Logger from "../utils/Logger";
const logger = new Logger("(/) confess");
export const data = new SlashCommandBuilder() export const data = new SlashCommandBuilder()
.setName("confess") .setName("confess")
.setDescription("Send a confession") .setDescription("Send a confession")
.addStringOption(option => .addStringOption((option) =>
option option
.setName("message") .setName("message")
.setRequired(true) .setRequired(true)
@ -38,68 +41,76 @@ export const data = new SlashCommandBuilder()
); );
export async function execute(interaction: CommandInteraction) { export async function execute(interaction: CommandInteraction) {
if (dt.isBanned(interaction.guild?.id!, interaction.user.id)) { try {
return interaction.reply({ if (dt.isBanned(interaction.guild?.id!, interaction.user.id)) {
content: "You are banned from confessions in this server!", return interaction.reply({
ephemeral: true content: "You are banned from confessions in this server!",
}); ephemeral: true,
} });
}
if (!dt.getGuildInfo(interaction.guild?.id!)) { if (!dt.getGuildInfo(interaction.guild?.id!)) {
return interaction.reply({ return interaction.reply({
content: content:
"The bot hasn't been set up yet! Ask the server admins to set it up.", "The bot hasn't been set up yet! Ask the server admins to set it up.",
ephemeral: true, ephemeral: true,
}); });
} }
const confessChannel = dt.getGuildInfo(interaction.guild?.id!)?.settings
const confessChannel = dt.getGuildInfo(interaction.guild?.id!)?.settings .confessChannel;
.confessChannel; const adminChannel = dt.getGuildInfo(interaction.guild?.id!)?.settings
const adminChannel = dt.getGuildInfo(interaction.guild?.id!)?.settings .modChannel;
.modChannel;
// @ts-ignore
const messageContent = interaction.options.getString("message");
const color = getRandomColor();
const messageId = StoreMan.genId();
const userConfessionEmbed = new EmbedBuilder()
.setColor(color)
.setTitle(`Anonymous Confession \`${messageId}\``)
// @ts-ignore // @ts-ignore
.setDescription(messageContent); const messageContent = interaction.options.getString("message");
const adminConfessionEmbed = new EmbedBuilder() const color = getRandomColor();
.setColor(color) const messageId = StoreMan.genId();
.setTitle(`Anonymous Confession \`${messageId}\``) const userConfessionEmbed = new EmbedBuilder()
// @ts-ignore .setColor(color)
.setDescription(messageContent) .setTitle(`Anonymous Confession \`${messageId}\``)
.addFields({ // @ts-ignore
name: "Author", .setDescription(messageContent);
value: interaction.user.displayName
}, const adminConfessionEmbed = new EmbedBuilder()
{ .setColor(color)
name: "Author ID", .setTitle(`Anonymous Confession \`${messageId}\``)
value: interaction.user.id // @ts-ignore
} .setDescription(messageContent)
.addFields(
{
name: "Author",
value: interaction.user.displayName,
},
{
name: "Author ID",
value: interaction.user.id,
},
);
const message = await (
BotClient.channels.cache.get(confessChannel!) as TextChannel
).send({
embeds: [userConfessionEmbed],
});
await (BotClient.channels.cache.get(adminChannel!) as TextChannel).send({
embeds: [adminConfessionEmbed],
});
dt.addConfession(
message,
messageId,
interaction.user.displayName,
interaction.user.id,
messageContent,
); );
const message = await ( return interaction.reply({
BotClient.channels.cache.get(confessChannel!) as TextChannel content: "Confession sent!",
) ephemeral: true,
.send({
embeds: [userConfessionEmbed]
}); });
} catch (err) {
await (BotClient.channels.cache.get(adminChannel!) as TextChannel) logger.error("An error occured:", err);
.send({ }
embeds: [adminConfessionEmbed]
});
dt.addConfession(message, messageId, interaction.user.displayName, interaction.user.id, messageContent);
return interaction.reply({
content: "Confession sent!",
ephemeral: true,
});
} }

View file

@ -14,19 +14,26 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { CommandInteraction, PermissionFlagsBits, SlashCommandBuilder } from "discord.js"; import {
CommandInteraction,
PermissionFlagsBits,
SlashCommandBuilder,
} from "discord.js";
import { dt } from "../main"; import { dt } from "../main";
import Logger from "../utils/Logger";
const logger = new Logger("(/) confessban");
export const data = new SlashCommandBuilder() export const data = new SlashCommandBuilder()
.setName("confessban") .setName("confessban")
.setDescription("Ban a user from submitting confessions.") .setDescription("Ban a user from submitting confessions.")
.addStringOption(option => .addStringOption((option) =>
option option
.setName("id") .setName("id")
.setDescription("The confession ID to ban") .setDescription("The confession ID to ban")
.setRequired(true) .setRequired(true),
) )
.setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers); .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers);
@ -34,16 +41,20 @@ export async function execute(interaction: CommandInteraction) {
const result = dt.addBan( const result = dt.addBan(
interaction.guild?.id!, interaction.guild?.id!,
// @ts-ignore // @ts-ignore
interaction.options.getString("id") interaction.options.getString("id"),
); );
return result try {
? interaction.reply({ return result
content: "User was banned.", ? interaction.reply({
ephemeral: true content: "User was banned.",
}) ephemeral: true,
: interaction.reply({ })
content: "No confession with that ID was found.", : interaction.reply({
ephemeral: true content: "No confession with that ID was found.",
}); ephemeral: true,
});
} catch (err) {
logger.error("An error occured:", err);
}
} }

View file

@ -14,22 +14,27 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { CommandInteraction, EmbedBuilder, SlashCommandBuilder, TextChannel } from "discord.js"; import {
CommandInteraction,
EmbedBuilder,
SlashCommandBuilder,
TextChannel,
} from "discord.js";
import { dt } from "../main"; import { dt } from "../main";
import { BotClient } from "../bot"; import { BotClient } from "../bot";
import getRandomColor from "../utils/getRandomColor"; import getRandomColor from "../utils/getRandomColor";
import Logger from "../utils/Logger";
const logger = new Logger("(/) confessdel");
export const data = new SlashCommandBuilder() export const data = new SlashCommandBuilder()
.setName("confessdel") .setName("confessdel")
.setDescription("Deletes a confession") .setDescription("Deletes a confession")
.addStringOption(option => .addStringOption((option) =>
option option.setName("id").setDescription("The confession id").setRequired(true),
.setName("id") );
.setDescription("The confession id")
.setRequired(true)
)
export async function execute(interaction: CommandInteraction) { export async function execute(interaction: CommandInteraction) {
if (!dt.getGuildInfo(interaction.guild?.id!)) { if (!dt.getGuildInfo(interaction.guild?.id!)) {
@ -39,36 +44,47 @@ export async function execute(interaction: CommandInteraction) {
ephemeral: true, ephemeral: true,
}); });
} }
// @ts-ignore // @ts-ignore
const idVal = interaction.options.getString("id"); const idVal = interaction.options.getString("id");
const result = dt.getConfession(interaction.guild?.id!, idVal); const result = dt.getConfession(interaction.guild?.id!, idVal);
if (result) { if (result) {
const confession = dt.getConfession(interaction.guild?.id!, idVal)?.messageId; try {
const channelId = dt.getGuildInfo(interaction.guild?.id!)?.settings.confessChannel!; const confession = dt.getConfession(
const emptyEmbed = new EmbedBuilder() interaction.guild?.id!,
.setColor(getRandomColor()) idVal,
.setTitle("Confession Deleted") )?.messageId;
// @ts-ignore const channelId = dt.getGuildInfo(interaction.guild?.id!)?.settings
.setDescription("[Confession Deleted]"); .confessChannel!;
const emptyEmbed = new EmbedBuilder()
.setColor(getRandomColor())
.setTitle("Confession Deleted")
// @ts-ignore
.setDescription("[Confession Deleted]");
await (BotClient.channels.cache.get(channelId) as TextChannel).messages.fetch(confession!).then(e => { await (BotClient.channels.cache.get(channelId) as TextChannel).messages
e.edit({ .fetch(confession!)
embeds: [emptyEmbed] .then((e) => {
}) e.edit({
}); embeds: [emptyEmbed],
});
});
dt.delConfesssion(interaction, idVal); dt.delConfesssion(interaction, idVal);
return interaction.reply({ return interaction.reply({
content: "Confession removed.", content: "Confession removed.",
ephemeral: true ephemeral: true,
}) });
} catch (err) {
logger.error("An error occured:", err);
}
} else { } else {
return interaction.reply({ return interaction.reply({
content: "Either the confession wasn't found or you may not be allowed to remove it.", content:
ephemeral: true "Either the confession wasn't found or you may not be allowed to remove it.",
ephemeral: true,
}); });
} }
} }

View file

@ -14,36 +14,47 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { CommandInteraction, PermissionFlagsBits, SlashCommandBuilder } from "discord.js"; import {
CommandInteraction,
PermissionFlagsBits,
SlashCommandBuilder,
} from "discord.js";
import { dt } from "../main"; import { dt } from "../main";
import Logger from "../utils/Logger";
const logger = new Logger("(/) confesspardon");
export const data = new SlashCommandBuilder() export const data = new SlashCommandBuilder()
.setName("confesspardon") .setName("confesspardon")
.setDescription("Unbans a user from confessions") .setDescription("Unbans a user from confessions")
.addStringOption(option => .addStringOption((option) =>
option option
.setName("id") .setName("id")
.setDescription("The confession ID to unban") .setDescription("The confession ID to unban")
.setRequired(true) .setRequired(true),
) )
.setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages) .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages);
export function execute(interaction: CommandInteraction) { export function execute(interaction: CommandInteraction) {
const result = dt.removeBan( const result = dt.removeBan(
interaction.guild?.id!, interaction.guild?.id!,
// @ts-ignore // @ts-ignore
interaction.options.getString("id") interaction.options.getString("id"),
); );
return result try {
? interaction.reply({ return result
content: "User was unbanned.", ? interaction.reply({
ephemeral: true content: "User was unbanned.",
}) ephemeral: true,
: interaction.reply({ })
content: "No confession with that ID was found.", : interaction.reply({
ephemeral: true content: "No confession with that ID was found.",
}); ephemeral: true,
});
} catch (err) {
logger.error("An error occured:", err);
}
} }

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import * as confess from "./confess"; import * as confess from "./confess";
import * as confessdel from "./confessdel"; import * as confessdel from "./confessdel";

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { CommandInteraction, SlashCommandBuilder } from "discord.js"; import { CommandInteraction, SlashCommandBuilder } from "discord.js";

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { import {
ActionRowBuilder, ActionRowBuilder,
@ -28,6 +28,8 @@ import {
import { dt } from "../main"; import { dt } from "../main";
import Logger from "../utils/Logger"; import Logger from "../utils/Logger";
const logger = new Logger("(/) setup");
export const data = new SlashCommandBuilder() export const data = new SlashCommandBuilder()
.setName("setup") .setName("setup")
.setDescription("Setup the bot.") .setDescription("Setup the bot.")
@ -52,83 +54,87 @@ export async function execute(interaction: CommandInteraction) {
const channelRow = const channelRow =
new ActionRowBuilder<ChannelSelectMenuBuilder>().addComponents(channelList); new ActionRowBuilder<ChannelSelectMenuBuilder>().addComponents(channelList);
const response = await interaction.reply({ try {
content: `# Let's get started, ${interaction.user.displayName}!\nFirst, let's choose a channel for your confessions.`, const response = await interaction.reply({
ephemeral: true, content: `# Let's get started, ${interaction.user.displayName}!\nFirst, let's choose a channel for your confessions.`,
components: [channelRow],
});
const collector = response.createMessageComponentCollector({
componentType: ComponentType.ChannelSelect,
time: 45_000,
});
collector.on("collect", async (i) => {
confessChannel = i.values[0];
await i.update({
content: "Awesome!",
components: [],
});
collector.stop();
const logChannelList = new ChannelSelectMenuBuilder()
.addChannelTypes(ChannelType.GuildText)
.setCustomId("logChannels")
.setPlaceholder("Choose a channel.");
const logChannelRow =
new ActionRowBuilder<ChannelSelectMenuBuilder>().addComponents(
logChannelList,
);
const logResponse = await interaction.followUp({
content: "# Now, select a logging channel, for moderation purposes.",
ephemeral: true, ephemeral: true,
components: [logChannelRow], components: [channelRow],
}); });
const logCollector = logResponse.createMessageComponentCollector({ const collector = response.createMessageComponentCollector({
componentType: ComponentType.ChannelSelect, componentType: ComponentType.ChannelSelect,
time: 45_000, time: 45_000,
}); });
logCollector.on("collect", async (ij) => { collector.on("collect", async (i) => {
logChannel = ij.values[0]; confessChannel = i.values[0];
await ij.update({ await i.update({
content: "Setup Complete!", content: "Awesome!",
components: [], components: [],
}); });
dt.setup(guildId!, { collector.stop();
confessChannel: confessChannel,
modChannel: logChannel, const logChannelList = new ChannelSelectMenuBuilder()
bans: [], .addChannelTypes(ChannelType.GuildText)
.setCustomId("logChannels")
.setPlaceholder("Choose a channel.");
const logChannelRow =
new ActionRowBuilder<ChannelSelectMenuBuilder>().addComponents(
logChannelList,
);
const logResponse = await interaction.followUp({
content: "# Now, select a logging channel, for moderation purposes.",
ephemeral: true,
components: [logChannelRow],
}); });
logCollector.stop(); const logCollector = logResponse.createMessageComponentCollector({
componentType: ComponentType.ChannelSelect,
time: 45_000,
});
logCollector.on("collect", async (ij) => {
logChannel = ij.values[0];
await ij.update({
content: "Setup Complete!",
components: [],
});
dt.setup(guildId!, {
confessChannel: confessChannel,
modChannel: logChannel,
bans: [],
});
logCollector.stop();
});
logCollector.on("end", (content) => {
// If there is no content, follow up with an error message.
!content.size &&
interaction.followUp({
content: "No channel selected. Please try again.",
ephemeral: true,
components: [],
});
});
}); });
logCollector.on("end", (content) => { collector.on("end", (collected) => {
// If there is no content, follow up with an error message. // Same as above logCollector end
!content.size && !collected.size &&
interaction.followUp({ interaction.followUp({
content: "No channel selected. Please try again.", content: "No channel selected. Try again.",
ephemeral: true, ephemeral: true,
components: [], components: [],
}); });
}); });
}); } catch (err) {
logger.error("An error occured:", err);
collector.on("end", (collected) => { }
// Same as above logCollector end
!collected.size &&
interaction.followUp({
content: "No channel selected. Try again.",
ephemeral: true,
components: []
});
});
} }

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
declare global { declare global {
namespace NodeJS { namespace NodeJS {

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { BotClient, BOT_TOKEN, deployCommands } from "./bot"; import { BotClient, BOT_TOKEN, deployCommands } from "./bot";
import { commands } from "./commands"; import { commands } from "./commands";

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import fs from "fs"; import fs from "fs";
import crypto from "crypto"; import crypto from "crypto";
@ -38,14 +38,14 @@ export class StoreMan {
id: string, id: string,
author: string, author: string,
authorId: string, authorId: string,
content: string content: string,
): Confession { ): Confession {
return { return {
id: id, id: id,
messageId: message.id, messageId: message.id,
author: author, author: author,
authorId: authorId, authorId: authorId,
content: content content: content,
}; };
} }
@ -117,7 +117,13 @@ export class StoreMan {
} }
// Attempts to add a confession. Returns true if the confession is sent, false if otherwise. // Attempts to add a confession. Returns true if the confession is sent, false if otherwise.
public addConfession(message: Message, id: string, author: string, authorId: string, content: string): boolean { public addConfession(
message: Message,
id: string,
author: string,
authorId: string,
content: string,
): boolean {
const guildId = message.guild?.id; const guildId = message.guild?.id;
for (const guild of this.data) { for (const guild of this.data) {
@ -127,7 +133,9 @@ export class StoreMan {
return false; return false;
} }
guild.confessions.push(StoreMan.toConfession(message, id, author, authorId, content)); guild.confessions.push(
StoreMan.toConfession(message, id, author, authorId, content),
);
this.saveFile(); this.saveFile();
return true; return true;
} }
@ -138,7 +146,10 @@ export class StoreMan {
); );
} }
public getConfession(guildId: string, confessionId: string): Confession | null { public getConfession(
guildId: string,
confessionId: string,
): Confession | null {
for (const guild of this.data) { for (const guild of this.data) {
if (guild.id === guildId) { if (guild.id === guildId) {
for (const confession of guild.confessions) { for (const confession of guild.confessions) {
@ -153,7 +164,10 @@ export class StoreMan {
} }
// Attempts to delete a confession. If it is sucessfully deleted, returns true, else false. // Attempts to delete a confession. If it is sucessfully deleted, returns true, else false.
public delConfesssion({ guild, user }: CommandInteraction, confessionId: string): boolean { public delConfesssion(
{ guild, user }: CommandInteraction,
confessionId: string,
): boolean {
const guildId = guild?.id; const guildId = guild?.id;
const userId = user.id; const userId = user.id;
@ -161,7 +175,7 @@ export class StoreMan {
if (guild.id === guildId) { if (guild.id === guildId) {
for (const confession of guild.confessions) { for (const confession of guild.confessions) {
if (confession.authorId === userId) { if (confession.authorId === userId) {
guild.confessions = guild.confessions.filter(confession => { guild.confessions = guild.confessions.filter((confession) => {
return confession.id !== confessionId; return confession.id !== confessionId;
}); });
@ -208,7 +222,8 @@ export class StoreMan {
if (guild.id === guildId) { if (guild.id === guildId) {
if (confession) { if (confession) {
// Only add the user to the ban list if they aren't banned already // Only add the user to the ban list if they aren't banned already
!this.isBanned(guildId, confession.authorId) && guild.settings.bans.push(confession.authorId!); !this.isBanned(guildId, confession.authorId) &&
guild.settings.bans.push(confession.authorId!);
this.saveFile(); this.saveFile();
return true; return true;
@ -224,7 +239,7 @@ export class StoreMan {
for (const guild of this.data) { for (const guild of this.data) {
if (guild.id === guildId) { if (guild.id === guildId) {
if (this.getConfession(guildId, confessionId)) { if (this.getConfession(guildId, confessionId)) {
guild.settings.bans = guild.settings.bans.filter(ban => { guild.settings.bans = guild.settings.bans.filter((ban) => {
return ban !== this.getConfession(guildId, confessionId)?.authorId!; return ban !== this.getConfession(guildId, confessionId)?.authorId!;
}); });

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import dotenv from "dotenv"; import dotenv from "dotenv";
dotenv.config(); dotenv.config();

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
export * from "./client"; export * from "./client";
export * from "./config"; export * from "./config";

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
export interface Confession { export interface Confession {
id: string; id: string;

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import chalk from "chalk"; import chalk from "chalk";
import { LOG_LEVEL } from "./config"; import { LOG_LEVEL } from "./config";

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import dotenv from "dotenv"; import dotenv from "dotenv";
dotenv.config(); dotenv.config();

View file

@ -14,8 +14,8 @@
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
const getRandomColor = () => (Math.random() * 0xFFFFFF << 0); const getRandomColor = () => (Math.random() * 0xffffff) << 0;
export default getRandomColor; export default getRandomColor;