diff --git a/worker/src/services/twitter.ts b/worker/src/services/twitter.ts index d9b916c..6b8ce9c 100644 --- a/worker/src/services/twitter.ts +++ b/worker/src/services/twitter.ts @@ -14,6 +14,28 @@ export class Twitter extends BaseService { this._twitter = new TwitterApi(pipeline.userData["Twitter"].accessToken); } + private async _refreshIfNeeded(): Promise { + if (Date.parse(this._pipeline.userData["Twitter"].expiresAt) >= Date.now() + 100_000) + return; + const ret = await (new TwitterApi({ + clientId: process.env["TWITTER_CLIENT_ID"], + clientSecret: process.env["TWITTER_SECRET"], + })).refreshOAuth2Token(this._pipeline.userData["Twitter"].refreshToken); + const data = this._pipeline.userData["Twitter"]; + this._twitter = ret.client; + data.accessToken = ret.accessToken; + if (ret.refreshToken) + data.refreshToken = ret.refreshToken; + data.expiresAt = new Date(Date.now() + ret.expiresIn * 1000).toISOString(); + fetch(`${process.env["WORKER_API_URL"]}/twitter/${this._pipeline.userId}?WORKER_API_KEY=${process.env["WORKER_API_KEY"]}`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + } + // private async _createStream(): Promise { // const stream = await this._.v2.sampleStream(); // stream.on(ETwitterStreamEvent.Connected, () => console.log('Stream is started.')); @@ -38,6 +60,7 @@ export class Twitter extends BaseService { @reaction(ReactionType.FollowUser, ['user_name']) async followUser(params: any): Promise { + await this._refreshIfNeeded(); let user = await this._twitter.v2.userByUsername(params['user_name']); const me = (await this._twitter.v2.me()).data.id; this._twitter.v2.follow(me, user.data.id); @@ -51,6 +74,7 @@ export class Twitter extends BaseService { @reaction(ReactionType.PostTweet, ['tweet_content']) async postTweet(params: any): Promise { + await this._refreshIfNeeded(); let tweet = await this._twitter.v2.tweet(params['tweet_content']); return { TWEET_ID: tweet.data.id, @@ -60,6 +84,7 @@ export class Twitter extends BaseService { @reaction(ReactionType.ReplyToTweet, ['tweet_id', 'reply_body']) async replyToTweet(params: any): Promise { + await this._refreshIfNeeded(); let reply = await this._twitter.v2.reply( params['reply_body'], params['tweet_id'], @@ -73,6 +98,7 @@ export class Twitter extends BaseService { @reaction(ReactionType.LikeTweet, ['tweet_id']) async likeTweet(params: any): Promise { + await this._refreshIfNeeded(); const me = (await this._twitter.v2.me()).data.id; await this._twitter.v2.like(me, params['tweet_id']); let tweet = (await this._twitter.v2.tweets([params['tweet_id']])).data[0]; @@ -85,6 +111,7 @@ export class Twitter extends BaseService { @reaction(ReactionType.Retweet, ['tweet_id']) async retweet(params: any): Promise { + await this._refreshIfNeeded(); let tweet = await this._twitter.v2.retweet((await this._twitter.v2.me()).data.id, params['tweet_id']); return { TWEET_ID: params['tweet_id']