require("dotenv").config(); const Twitter = require("twitter"); const Octokit = require("@octokit/rest"); const wordwrap = require("wordwrap"); const { formatDistanceStrict } = require("date-fns"); const { TWITTER_USER: twitterHandle, GIST_ID: gistId, TWITTER_CONSUMER_KEY: consumerKey, TWITTER_CONSUMER_SECRET: consumerSecret, TWITTER_ACCESS_TOKEN_KEY: accessTokenKey, TWITTER_ACCESS_TOKEN_SECRET: accessTokenSecret, GITHUB_TOKEN: githubToken } = process.env; const twitter = new Twitter({ consumer_key: consumerKey, consumer_secret: consumerSecret, access_token_key: accessTokenKey, access_token_secret: accessTokenSecret }); const octokit = new Octokit({ auth: `token ${githubToken}` }); async function main() { const timeline = await twitter.get("statuses/user_timeline", { screen_name: twitterHandle, count: 1, trim_user: 1, exclude_replies: true }); const tweet = timeline[0]; await updateGist(tweet); } async function updateGist(tweet) { const wrap = wordwrap(46); let gist; try { gist = await octokit.gists.get({ gist_id: gistId }); } catch (error) { console.error(`Unable to get gist\n${error}`); } // Get original filename to update that same file const filename = Object.keys(gist.data.files)[0]; const parsedDate = new Date(tweet.created_at); const timeAgo = formatDistanceStrict(parsedDate, new Date()); try { await octokit.gists.update({ gist_id: gistId, files: { [filename]: { filename: `@${twitterHandle} - ${timeAgo} ago | ❤ ${ tweet.favorite_count } | 🔁 ${tweet.retweet_count}`, content: wrap(tweet.text) } } }); } catch (error) { console.error(`Unable to update gist\n${error}`); } } (async () => { await main(); })();