/** * @copyright nhcarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import { TwitterApi } from "twitter-api-v2"; /** * Forwards an announcement to our Twitter account. * @param content - The main body of the announcement. * @returns A message indicating the success or failure of the operation. */ export const announceOnTwitter = async(content: Array): Promise => { if ( process.env.TWITTER_CONSUMER_KEY === undefined || process.env.TWITTER_CONSUMER_SECRET === undefined || process.env.TWITTER_TOKEN === undefined || process.env.TWITTER_SECRET === undefined ) { return "Twitter credentials are not set."; } const twitterClient = new TwitterApi({ accessSecret: process.env.TWITTER_SECRET, accessToken: process.env.TWITTER_TOKEN, appKey: process.env.TWITTER_CONSUMER_KEY, appSecret: process.env.TWITTER_CONSUMER_SECRET, }); const [ firstPost, ...restOfPosts ] = content; const failedReplies: Array = []; if (firstPost === undefined) { return "No posts to send to Twitter."; } const result = await twitterClient.v2. tweet(firstPost). catch((error: unknown) => { return error instanceof Error ? error.message : String(error); }); if (typeof result === "string") { return `Failed to send message to Twitter. ${result}`; } let { id } = result.data; for (const post of restOfPosts) { // eslint-disable-next-line no-await-in-loop -- We need to do this sequentially. const twitterResponse = await twitterClient.v2.reply(post, id); if (typeof twitterResponse !== "string") { const { id: replyId } = twitterResponse.data; id = replyId; continue; } failedReplies.push(post); } return `Successfully sent initial post to Twitter. ${failedReplies.length > 0 ? `Failed to send ${failedReplies.length.toString()} replies: ${failedReplies.join(", ")}` : `All ${(content.length - 1).toString()} replies were sent successfully.`}`; };