diff --git a/packages/skin-database/api/DiscordEventHandler.ts b/packages/skin-database/api/DiscordEventHandler.ts index 38676994..084b1e85 100644 --- a/packages/skin-database/api/DiscordEventHandler.ts +++ b/packages/skin-database/api/DiscordEventHandler.ts @@ -131,6 +131,12 @@ export default class DiscordEventHandler { await dest.send(message); break; } + case "TWEET_BOT_MILESTONE": { + const dest = await this.getChannel(Config.POPULAR_TWEETS_CHANNEL_ID); + const message = `🎉 Tweet Bot Milestone! Just passed ${action.bracket.toLocaleString()} Followers 🎉`; + await dest.send(message); + break + } } } diff --git a/packages/skin-database/api/app.ts b/packages/skin-database/api/app.ts index a118d1c1..0ef77522 100644 --- a/packages/skin-database/api/app.ts +++ b/packages/skin-database/api/app.ts @@ -23,7 +23,8 @@ export type ApiAction = | { type: "GOT_FEEDBACK"; message: string; email?: string; url?: string } | { type: "SYNCED_TO_ARCHIVE"; successes: number; errors: number } | { type: "STARTED_SYNC_TO_ARCHIVE"; count: number } - | { type: "POPULAR_TWEET"; bracket: number; url: string, likes: number, date: Date }; + | { type: "POPULAR_TWEET"; bracket: number; url: string, likes: number, date: Date } + | { type: "TWEET_BOT_MILESTONE"; bracket: number; count: number}; export type EventHandler = (event: ApiAction) => void; export type Logger = { diff --git a/packages/skin-database/cli.ts b/packages/skin-database/cli.ts index b6b9bfb4..3b72d77c 100755 --- a/packages/skin-database/cli.ts +++ b/packages/skin-database/cli.ts @@ -11,7 +11,7 @@ import md5Buffer from "md5"; import { addSkinFromBuffer } from "./addSkin"; import { searchIndex } from "./algolia"; import { scrapeLikeData } from "./tasks/scrapeLikes"; -import {popularTweets} from "./tasks/popularTweets" +import {followerCount, popularTweets} from "./tasks/tweetMilestones" import UserContext from "./data/UserContext"; import { integrityCheck } from "./tasks/integrityCheck"; import { ensureWebampLinks, syncWithArchive } from "./tasks/syncWithArchive"; @@ -25,9 +25,6 @@ import _temp from "temp"; import Shooter from "./shooter"; import rl from "readline"; -import _temp from "temp"; -import Shooter from "./shooter"; - const temp = _temp.track(); async function main() { @@ -205,6 +202,11 @@ async function main() { break; } + case "follower-count": { + await followerCount(handler); + break; + } + default: console.log(`Unknown command ${argv._[0]}`); } diff --git a/packages/skin-database/followerCount.json b/packages/skin-database/followerCount.json new file mode 100644 index 00000000..1746da63 --- /dev/null +++ b/packages/skin-database/followerCount.json @@ -0,0 +1 @@ +10000 \ No newline at end of file diff --git a/packages/skin-database/tasks/popularTweets.ts b/packages/skin-database/tasks/tweetMilestones.ts similarity index 71% rename from packages/skin-database/tasks/popularTweets.ts rename to packages/skin-database/tasks/tweetMilestones.ts index b1d1e54b..f1ba1f49 100644 --- a/packages/skin-database/tasks/popularTweets.ts +++ b/packages/skin-database/tasks/tweetMilestones.ts @@ -90,3 +90,36 @@ export async function popularTweets(handler: DiscordEventHandler) { } } } + +const FOLLOW_COUNT_FILE_NAME = "./followerCount.json"; +const FOLLOW_COUNT_BRACKET_SIZE = 1000; + +export async function followerCount(handler: DiscordEventHandler) { + const twitterClient = getTwitterClient(); + + const response = await twitterClient.get("users/show", { + screen_name: "winampskins", + }); + const user = response.data; + + const followerCount = user.followers_count; + const currentJSON = fs.readFileSync(FOLLOW_COUNT_FILE_NAME, "utf8"); + const current: { count: number } = JSON.parse(currentJSON); + const currentNumber = current.count; + + const nextMilestone = currentNumber + FOLLOW_COUNT_BRACKET_SIZE; + + if (followerCount > nextMilestone) { + await handler.handle({ + type: "TWEET_BOT_MILESTONE", + bracket: nextMilestone, + count: followerCount, + }); + fs.writeFileSync( + FOLLOW_COUNT_FILE_NAME, + JSON.stringify({ count: nextMilestone }, null, 2) + ); + } else { + console.log(`Not notifying: ${followerCount} < ${nextMilestone}`); + } +}