Receive alerts when specific accounts tweet.
// authenticates you with the API standard library
// type `await lib.` to display API autocomplete
const lib = require('lib')({token: process.env.STDLIB_SECRET_TOKEN});
/*** Set up ***/
/* Step one: */
// Enter twitter handles into array as strings.
let twitterAccounts = ['@jack', '@newsycombinator'];
/* Step two: */
// Enter the name of the channel you want to receive alerts from.
let alertChannel = 'general';
let twitterQuery = twitterAccounts
.map((twitterAccount) => {
return `from:${twitterAccount.slice(1)}`;
})
.join(' OR ');
let key = `__${context.service.identifier}:lastTweet__`;
let lastTweetId = await lib.utils.kv['@0.1.16'].get({
key: key,
});
let searchResponse = await lib.twitter.tweets['@1.1.0'].search.tweets.list({
q: twitterQuery,
since_id: lastTweetId,
count: 10,
});
let recentTweets = searchResponse.statuses
.filter((status) => {
return (
!status.retweeted_status &&
new Date(status.created_at).getTime() > new Date().getTime() - 3600000
);
})
.reverse();
let guilds = await lib.discord.guilds['@0.0.2'].list({
limit: 1,
});
let channels = await lib.discord.guilds['@0.0.2'].channels.list({
guild_id: guilds[0].id,
});
let alertsChannel = channels.find((channel) => {
return channel.name === alertChannel || `#${channel.name}` === alertChannel;
});
if (!alertsChannel) {
throw new Error(`No channel matching "${alertChannel}" found.`);
}
try {
for (let i = 0; i < recentTweets.length; i++) {
let tweet = recentTweets[i];
await lib.discord.channels['@0.0.3'].messages.create({
channel_id: alertsChannel.id,
content: `https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}/`,
});
lastTweetId = tweet.id_str;
}
} catch (e) {
// Likely due to Discord rate limits, remaining alerts should be sent on the next run
console.log(e);
}
if (lastTweetId) {
await lib.utils.kv['@0.1.16'].set({
key: key,
value: lastTweetId,
});
}
return recentTweets;