import { Util } from "discord.js"; import humanizeDuration from "humanize-duration"; import moment from "moment-timezone"; import { createChunkedMessage, DBDateFormat, deactivateMentions, sorter, trimLines } from "../../../utils"; import { TimeAndDatePlugin } from "../../TimeAndDate/TimeAndDatePlugin"; import { postCmd } from "../types"; const SCHEDULED_POST_PREVIEW_TEXT_LENGTH = 50; export const ScheduledPostsListCmd = postCmd({ trigger: ["scheduled_posts", "scheduled_posts list"], permission: "can_post", async run({ message: msg, pluginData }) { const scheduledPosts = await pluginData.state.scheduledPosts.all(); if (scheduledPosts.length === 0) { msg.channel.send("No scheduled posts"); return; } scheduledPosts.sort(sorter("post_at")); let i = 1; const postLines = scheduledPosts.map((p) => { let previewText = p.content.content || p.content.embeds?.[0]?.description || p.content.embeds?.[0]?.title || ""; const isTruncated = previewText.length > SCHEDULED_POST_PREVIEW_TEXT_LENGTH; previewText = Util.escapeCodeBlock(deactivateMentions(previewText)) .replace(/\s+/g, " ") .slice(0, SCHEDULED_POST_PREVIEW_TEXT_LENGTH); const timeAndDate = pluginData.getPlugin(TimeAndDatePlugin); const prettyPostAt = timeAndDate .inGuildTz(moment.utc(p.post_at!, DBDateFormat)) .format(timeAndDate.getDateFormat("pretty_datetime")); const parts = [`\`#${i++}\` \`[${prettyPostAt}]\` ${previewText}${isTruncated ? "..." : ""}`]; if (p.attachments.length) parts.push("*(with attachment)*"); if (p.content.embeds?.length) parts.push("*(embed)*"); if (p.repeat_until) { parts.push(`*(repeated every ${humanizeDuration(p.repeat_interval)} until ${p.repeat_until})*`); } if (p.repeat_times) { parts.push( `*(repeated every ${humanizeDuration(p.repeat_interval)}, ${p.repeat_times} more ${ p.repeat_times === 1 ? "time" : "times" })*`, ); } parts.push(`*(${p.author_name})*`); return parts.join(" "); }); const finalMessage = trimLines(` ${postLines.join("\n")} Use \`scheduled_posts \` to view a scheduled post in full Use \`scheduled_posts delete \` to delete a scheduled post `); createChunkedMessage(msg.channel, finalMessage); }, });