mirror of
https://github.com/Burn-E99/TheArtificer.git
synced 2026-01-08 21:37:54 -05:00
Converted 90% of bot messages into Embeds
Bot messages will now be pretty :3
This commit is contained in:
14
src/api.ts
14
src/api.ts
@ -22,10 +22,13 @@ import {
|
||||
import solver from "./solver.ts";
|
||||
import { LogTypes as LT } from "./utils.enums.ts";
|
||||
import utils from "./utils.ts";
|
||||
import {
|
||||
generateApiKeyEmail, generateApiDeleteEmail, generateDMFailed
|
||||
} from "./constantCmds.ts";
|
||||
|
||||
import config from "../config.ts";
|
||||
|
||||
// start(databaseClient, botCache, sendMessage, sendDirectMessage) returns nothing
|
||||
// start(databaseClient) returns nothing
|
||||
// start initializes and runs the entire API for the bot
|
||||
const start = async (dbClient: Client): Promise<void> => {
|
||||
const server = Deno.listen({ port: config.api.port });
|
||||
@ -291,11 +294,13 @@ const start = async (dbClient: Client): Promise<void> => {
|
||||
|
||||
// Send the return message as a DM or normal message depening on if the channel is set
|
||||
if ((query.get("channel") || "").length > 0) {
|
||||
// todo: embedify
|
||||
m = await sendMessage(BigInt(query.get("channel") || ""), normalText).catch(() => {
|
||||
requestEvent.respondWith(new Response("Message 00 failed to send.", { status: Status.InternalServerError }));
|
||||
errorOut = true;
|
||||
});
|
||||
} else {
|
||||
// todo: embedify
|
||||
m = await sendDirectMessage(BigInt(query.get("user") || ""), normalText).catch(() => {
|
||||
requestEvent.respondWith(new Response("Message 01 failed to send.", { status: Status.InternalServerError }));
|
||||
errorOut = true;
|
||||
@ -320,7 +325,7 @@ const start = async (dbClient: Client): Promise<void> => {
|
||||
utils.log(LT.LOG, `Messaging GM ${e} roll results`);
|
||||
// Attempt to DM the GMs and send a warning if it could not DM a GM
|
||||
await sendDirectMessage(BigInt(e), newMessage).catch(async () => {
|
||||
const failedSend = `WARNING: <@${e}> could not be messaged. If this issue persists, make sure direct messages are allowed from this server.`
|
||||
const failedSend = generateDMFailed(e);
|
||||
// Send the return message as a DM or normal message depening on if the channel is set
|
||||
if ((query.get("channel") || "").length > 0) {
|
||||
m = await sendMessage(BigInt(query.get("channel") || ""), failedSend).catch(() => {
|
||||
@ -349,6 +354,7 @@ const start = async (dbClient: Client): Promise<void> => {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// todo: embedify
|
||||
const newMessage: CreateMessage = {};
|
||||
newMessage.content = returnText;
|
||||
|
||||
@ -644,7 +650,7 @@ const start = async (dbClient: Client): Promise<void> => {
|
||||
}
|
||||
|
||||
// "Send" the email
|
||||
await sendMessage(config.api.email, `<@${config.api.admin}> A USER HAS REQUESTED A DELETE CODE\n\nEmail Address: ${apiUserEmail}\n\nSubject: \`Artificer API Delete Code\`\n\n\`\`\`Hello Artificer API User,\n\nI am sorry to see you go. If you would like, please respond to this email detailing what I could have done better.\n\nAs requested, here is your delete code: ${deleteCode}\n\nSorry to see you go,\nThe Artificer Developer - Ean Milligan\`\`\``).catch(() => {
|
||||
await sendMessage(config.api.email, generateApiDeleteEmail(apiUserEmail, deleteCode)).catch(() => {
|
||||
requestEvent.respondWith(new Response("Message 30 failed to send.", { status: Status.InternalServerError }));
|
||||
erroredOut = true;
|
||||
});
|
||||
@ -721,7 +727,7 @@ const start = async (dbClient: Client): Promise<void> => {
|
||||
}
|
||||
|
||||
// "Send" the email
|
||||
await sendMessage(config.api.email, `<@${config.api.admin}> A USER HAS REQUESTED AN API KEY\n\nEmail Address: ${query.get("email")}\n\nSubject: \`Artificer API Key\`\n\n\`\`\`Hello Artificer API User,\n\nWelcome aboard The Artificer's API. You can find full details about the API on the GitHub: https://github.com/Burn-E99/TheArtificer\n\nYour API Key is: ${newKey}\n\nGuard this well, as there is zero tolerance for API abuse.\n\nWelcome aboard,\nThe Artificer Developer - Ean Milligan\`\`\``).catch(() => {
|
||||
await sendMessage(config.api.email, generateApiKeyEmail(query.get("email") || "no email", newKey)).catch(() => {
|
||||
requestEvent.respondWith(new Response("Message 31 failed to send.", { status: Status.InternalServerError }));
|
||||
erroredOut = true;
|
||||
});
|
||||
|
||||
428
src/constantCmds.ts
Normal file
428
src/constantCmds.ts
Normal file
@ -0,0 +1,428 @@
|
||||
import config from "../config.ts";
|
||||
|
||||
export const constantCmds = {
|
||||
apiDeleteFail: {
|
||||
embeds: [{
|
||||
fields: [{
|
||||
name: "Failed to delete this guild from the database.",
|
||||
value: "If this issue persists, please report this to the developers."
|
||||
}]
|
||||
}]
|
||||
},
|
||||
apiGuildOnly: {
|
||||
embeds: [{
|
||||
title: "API commands are only available in guilds."
|
||||
}]
|
||||
},
|
||||
apiHelp: {
|
||||
embeds: [
|
||||
{
|
||||
fields: [
|
||||
{
|
||||
name: "The Artificer's API Details:",
|
||||
value: `The Artificer has a built in API that allows user to roll dice into Discord using third party programs.
|
||||
By default, API rolls are blocked from being sent in your guild.
|
||||
These commands may only be used by the Owner or Admins of your guild.
|
||||
|
||||
For information on how to use the API, please check the GitHub README for more information [here](https://github.com/Burn-E99/TheArtificer).
|
||||
|
||||
You may enable and disable the API rolls for your guild as needed.`
|
||||
}
|
||||
]
|
||||
}, {
|
||||
title: "Available API Commands:",
|
||||
fields: [
|
||||
{
|
||||
name: "[[api help",
|
||||
value: "This command",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[api status",
|
||||
value: "Shows the current status of the API for this guild",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[api allow/enable",
|
||||
value: "Allows API Rolls to be sent to this guild",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[api block/disable",
|
||||
value: "Blocks API Rolls from being sent to this guild",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[api delete",
|
||||
value: "Deletes this guild from The Artificer's database",
|
||||
inline: true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
apiPermError: {
|
||||
embeds: [{
|
||||
fields: [{
|
||||
name: "API commands are powerful and can only be used by guild Owners and Admins.",
|
||||
value: "For information on how to use the API, please check the GitHub README for more information [here](https://github.com/Burn-E99/TheArtificer)."
|
||||
}]
|
||||
}]
|
||||
},
|
||||
apiRemoveGuild: {
|
||||
embeds: [{
|
||||
title: "This guild's API setting has been removed from The Artifier's Database."
|
||||
}]
|
||||
},
|
||||
apiStatusFail: {
|
||||
embeds: [{
|
||||
fields: [{
|
||||
name: "Failed to check API rolls status for this guild.",
|
||||
value: "If this issue persists, please report this to the developers."
|
||||
}]
|
||||
}]
|
||||
},
|
||||
help: {
|
||||
embeds: [{
|
||||
title: "The Artificer's Available Commands:",
|
||||
fields: [
|
||||
{
|
||||
name: "[[?",
|
||||
value: "This command",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[rollhelp or [[??",
|
||||
value: "Details on how to use the roll command, listed as `[[xdy...]]` below",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[api [subcommand]",
|
||||
value: "Administrative tools for the bots's API, run [[api help for more details",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[ping",
|
||||
value: "Pings the bot to check connectivity",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[info",
|
||||
value: "Prints some information and links relating to the bot",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[privacy",
|
||||
value: "Prints some information about the Privacy Policy",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[version",
|
||||
value: "Prints the bots version",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[popcat",
|
||||
value: "Popcat",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[report [text]",
|
||||
value: "Report a command that failed to run",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[stats",
|
||||
value: "Statistics on the bot",
|
||||
inline: true
|
||||
}, {
|
||||
name: "[[xdydzracsq!]] ...",
|
||||
value: "Rolls all configs requested, you may repeat the command multiple times in the same message (just ensure you close each roll with ]]), run [[?? for more details",
|
||||
inline: true
|
||||
}
|
||||
]
|
||||
}]
|
||||
},
|
||||
indev: {
|
||||
embeds: [{
|
||||
title: "Command is in development, please try again later."
|
||||
}]
|
||||
},
|
||||
info: {
|
||||
embeds: [{
|
||||
fields: [{
|
||||
name: "The Artificer, a Discord bot that specializing in rolling dice and calculating math",
|
||||
value: `The Artificer is developed by Ean AKA Burn_E99.
|
||||
Additional information can be found on my website [here](https://discord.burne99.com/TheArtificer/).
|
||||
Want to check out my source code? Check it out [here](https://github.com/Burn-E99/TheArtificer).
|
||||
Need help with this bot? Join my support server [here](https://discord.gg/peHASXMZYv).`
|
||||
}]
|
||||
}]
|
||||
},
|
||||
privacy: {
|
||||
embeds: [{
|
||||
title: "Privacy Policy",
|
||||
fields: [{
|
||||
name: "The Artificer does not track or collect user information via Discord.",
|
||||
value: `The only user submitted information that is stored is submitted via the \`[[report\` command. This information is only stored for a short period of time in a location that only the Developer of The Artificer can see.
|
||||
|
||||
For more details, please check out the Privacy Policy on the GitHub [here](https://github.com/Burn-E99/TheArtificer/blob/master/PRIVACY.md).
|
||||
|
||||
Terms of Service can also be found on GitHub [here](https://github.com/Burn-E99/TheArtificer/blob/master/TERMS.md).`
|
||||
}]
|
||||
}]
|
||||
},
|
||||
report: {
|
||||
embeds: [{
|
||||
fields: [{
|
||||
name: "Failed command has been reported to my developer.",
|
||||
value: `For more in depth support, and information about planned maintenance, please join the support server [here](https://discord.gg/peHASXMZYv).`
|
||||
}]
|
||||
}]
|
||||
},
|
||||
rip: {
|
||||
embeds: [{
|
||||
fields: [{
|
||||
name: "The Artificer was built in memory of my Grandmother, Babka",
|
||||
value: `With much love, Ean
|
||||
|
||||
December 21, 2020`
|
||||
}]
|
||||
}]
|
||||
},
|
||||
rollHelp: {
|
||||
embeds: [
|
||||
{
|
||||
title: "The Artificer's Roll Command Details:",
|
||||
fields: [
|
||||
{
|
||||
name: "Details:",
|
||||
value: `You can chain as many of these options as you want, as long as the option does not disallow it.
|
||||
|
||||
This command also can fully solve math equations with parenthesis.`
|
||||
}, {
|
||||
name: "[[xdydzracsq!]] ...",
|
||||
value: "Rolls all configs requested, you may repeat the command multiple times in the same message (just ensure you close each roll with ]])",
|
||||
inline: true
|
||||
}, {
|
||||
name: "x [Optional]",
|
||||
value: "Number of dice to roll, if omitted, 1 is used",
|
||||
inline: true
|
||||
}, {
|
||||
name: "dy [Required]",
|
||||
value: "Size of dice to roll, d20 = 20 sided die",
|
||||
inline: true
|
||||
}, {
|
||||
name: "dz or dlz [Optional]",
|
||||
value: "Drops the lowest z dice, cannot be used with kz",
|
||||
inline: true
|
||||
}, {
|
||||
name: "kz or khz [Optional]",
|
||||
value: "Keeps the highest z dice, cannot be used with dz",
|
||||
inline: true
|
||||
}, {
|
||||
name: "dhz [Optional]",
|
||||
value: "Drops the highest z dice, cannot be used with kz",
|
||||
inline: true
|
||||
}, {
|
||||
name: "klz [Optional]",
|
||||
value: "Keeps the lowest z dice, cannot be used with dz",
|
||||
inline: true
|
||||
}, {
|
||||
name: "ra [Optional]",
|
||||
value: "Rerolls any rolls that match a, r3 will reroll any dice that land on 3, throwing out old rolls",
|
||||
inline: true
|
||||
}, {
|
||||
name: "csq or cs=q [Optional]",
|
||||
value: "Changes crit score to q",
|
||||
inline: true
|
||||
}, {
|
||||
name: "cs<q [Optional]",
|
||||
value: "Changes crit score to be less than or equal to q",
|
||||
inline: true
|
||||
}, {
|
||||
name: "cs>q [Optional]",
|
||||
value: "Changes crit score to be greater than or equal to q",
|
||||
inline: true
|
||||
}, {
|
||||
name: "cfq or cf=q [Optional]",
|
||||
value: "Changes crit fail to q",
|
||||
inline: true
|
||||
}, {
|
||||
name: "cf<q [Optional]",
|
||||
value: "Changes crit fail to be less than or equal to q",
|
||||
inline: true
|
||||
}, {
|
||||
name: "cf>q [Optional]",
|
||||
value: "Changes crit fail to be greater than or equal to q",
|
||||
inline: true
|
||||
}, {
|
||||
name: "! [Optional]",
|
||||
value: "Exploding, rolls another dy for every crit roll",
|
||||
inline: true
|
||||
}
|
||||
]
|
||||
}, {
|
||||
title: "Roll Command Flags:",
|
||||
fields: [
|
||||
{
|
||||
name: "Details",
|
||||
value: `This command also has some useful flags that can used. These flags simply need to be placed after all rolls in the message.
|
||||
|
||||
Examples: \`[[d20]] -nd\`, \`[[d20]] -nd -s\``
|
||||
}, {
|
||||
name: "-nd",
|
||||
value: "No Details - Suppresses all details of the requested roll",
|
||||
inline: true
|
||||
}, {
|
||||
name: "-s",
|
||||
value: "Spoiler - Spoilers all details of the requested roll",
|
||||
inline: true
|
||||
}, {
|
||||
name: "-m",
|
||||
value: "Maximize Roll - Rolls the theoretical maximum roll, cannot be used with -n",
|
||||
inline: true
|
||||
}, {
|
||||
name: "-n",
|
||||
value: "Nominal Roll - Rolls the theoretical nominal roll, cannot be used with -m",
|
||||
inline: true
|
||||
}, {
|
||||
name: "-gm @user1 @user2 @usern",
|
||||
value: "GM Roll - Rolls the requested roll in GM mode, suppressing all publicly shown results and details and sending the results directly to the specified GMs",
|
||||
inline: true
|
||||
}, {
|
||||
name: "-o a or -o d",
|
||||
value: "Order Roll - Rolls the requested roll and orders the results in the requested direction",
|
||||
inline: true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
rolling: {
|
||||
embeds: [{
|
||||
title: "Rolling. . ."
|
||||
}]
|
||||
},
|
||||
version: {
|
||||
embeds: [{
|
||||
title: `My current version is ${config.version}`
|
||||
}]
|
||||
}
|
||||
};
|
||||
|
||||
export const generatePing = (time: number) => ({
|
||||
embeds: [{
|
||||
title: time === -1 ? "Ping?" : `Pong! Latency is ${time}ms.`
|
||||
}]
|
||||
});
|
||||
|
||||
export const generateReport = (msg: string) => ({
|
||||
embeds: [{
|
||||
fields: [{
|
||||
name: "USER REPORT:",
|
||||
value: msg || "No message"
|
||||
}]
|
||||
}]
|
||||
});
|
||||
|
||||
export const generateStats = (guildCount: number, channelCount: number, memberCount: number, rollCount: bigint, utilityCount: bigint) => ({
|
||||
embeds: [{
|
||||
title: "The Artificer's Statistics:",
|
||||
fields: [
|
||||
{
|
||||
name: "Guilds:",
|
||||
value: `${guildCount}`,
|
||||
inline: true
|
||||
}, {
|
||||
name: "Channels:",
|
||||
value: `${channelCount}`,
|
||||
inline: true
|
||||
}, {
|
||||
name: "Active Members:",
|
||||
value: `${memberCount}`,
|
||||
inline: true
|
||||
}, {
|
||||
name: "Roll Commands:",
|
||||
value: `${rollCount}`,
|
||||
inline: true
|
||||
}, {
|
||||
name: "Utility Commands:",
|
||||
value: `${utilityCount}`,
|
||||
inline: true
|
||||
}
|
||||
]
|
||||
}]
|
||||
});
|
||||
|
||||
export const generateApiFailed = (args: string) => ({
|
||||
embeds: [{
|
||||
fields: [{
|
||||
name: `Failed to ${args} API rolls for this guild.`,
|
||||
value: "If this issue persists, please report this to the developers."
|
||||
}]
|
||||
}]
|
||||
});
|
||||
|
||||
export const generateApiStatus = (banned: boolean, active: boolean) => ({
|
||||
embeds: [{
|
||||
fields: [{
|
||||
name: `The Artificer's API is ${config.api.enable ? "currently enabled" : "currently disabled"}.`,
|
||||
value: banned ? "API rolls are banned from being used in this guild.\n\nThis will not be reversed." : `API rolls are ${active ? "allowed" : "blocked from being used"} in this guild.`
|
||||
}]
|
||||
}]
|
||||
});
|
||||
|
||||
export const generateApiSuccess = (args: string) => ({
|
||||
embeds: [{
|
||||
title: `API rolls have successfully been ${args}ed for this guild.`
|
||||
}]
|
||||
});
|
||||
|
||||
export const generateDMFailed = (user: string) => ({
|
||||
embeds: [{
|
||||
fields: [{
|
||||
name: `WARNING: ${user} could not be messaged.`,
|
||||
value: "If this issue persists, make sure direct messages are allowed from this server."
|
||||
}]
|
||||
}]
|
||||
});
|
||||
|
||||
export const generateApiKeyEmail = (email: string, key: string) => ({
|
||||
content: `<@${config.api.admin}> A USER HAS REQUESTED AN API KEY`,
|
||||
embeds: [{
|
||||
fields: [
|
||||
{
|
||||
name: "Send to:",
|
||||
value: email
|
||||
}, {
|
||||
name: "Subject:",
|
||||
value: "Artificer API Key"
|
||||
}, {
|
||||
name: "Body:",
|
||||
value: `Hello Artificer API User,
|
||||
|
||||
Welcome aboard The Artificer's API. You can find full details about the API on the GitHub: https://github.com/Burn-E99/TheArtificer
|
||||
|
||||
Your API Key is: ${key}
|
||||
|
||||
Guard this well, as there is zero tolerance for API abuse.
|
||||
|
||||
Welcome aboard,
|
||||
The Artificer Developer - Ean Milligan`
|
||||
}
|
||||
]
|
||||
}]
|
||||
});
|
||||
|
||||
export const generateApiDeleteEmail = (email: string, deleteCode: string) => ({
|
||||
content: `<@${config.api.admin}> A USER HAS REQUESTED A DELETE CODE`,
|
||||
embeds: [{
|
||||
fields: [
|
||||
{
|
||||
name: "Send to:",
|
||||
value: email
|
||||
}, {
|
||||
name: "Subject:",
|
||||
value: "Artificer API Delete Code"
|
||||
}, {
|
||||
name: "Body:",
|
||||
value: `Hello Artificer API User,
|
||||
|
||||
I am sorry to see you go. If you would like, please respond to this email detailing what I could have done better.
|
||||
|
||||
As requested, here is your delete code: ${deleteCode}
|
||||
|
||||
Sorry to see you go,
|
||||
The Artificer Developer - Ean Milligan`
|
||||
}
|
||||
]
|
||||
}]
|
||||
});
|
||||
Reference in New Issue
Block a user