Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'server-only';
- import { env } from '@/lib/config/env';
- import { cookies } from 'next/headers';
- class TwitterService {
- private static instance: TwitterService | null = null;
- private constructor() {}
- public static getInstance(): TwitterService {
- if (!TwitterService.instance) {
- TwitterService.instance = new TwitterService();
- }
- return TwitterService.instance;
- }
- async like({
- tweetId,
- accessToken,
- }: {
- tweetId: string;
- accessToken: string;
- }) {
- const userId = await this.getCurrentUserId({ accessToken });
- console.log('Making like request:', {
- userId,
- tweetId,
- accessToken: accessToken.substring(0, 10) + '...', // Log partial token
- });
- const response = await fetch(
- `https://api.twitter.com/2/users/${userId}/likes`,
- {
- method: 'POST',
- headers: {
- Authorization: `Bearer ${accessToken}`,
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({ tweet_id: tweetId }),
- },
- );
- if (!response.ok) {
- throw new Error(`Failed to like: ${response.status} ${response}`);
- }
- return response.json();
- }
- async retweet({
- tweetId,
- accessToken,
- }: {
- tweetId: string;
- accessToken: string;
- }) {
- const userId = await this.getCurrentUserId({ accessToken });
- const response = await fetch(
- `https://api.twitter.com/2/users/${userId}/retweets`,
- {
- method: 'POST',
- headers: {
- Authorization: `Bearer ${accessToken}`,
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- tweet_id: tweetId,
- }),
- },
- );
- if (!response.ok) {
- throw new Error(`Failed to retweet: ${response.status} ${response}`);
- }
- return response.json();
- }
- async boost({
- tweetId,
- accessToken,
- }: {
- tweetId: string;
- accessToken: string;
- }) {
- const like = await this.like({ tweetId, accessToken });
- await new Promise((resolve) => setTimeout(resolve, 2000));
- const retweet = await this.retweet({ tweetId, accessToken });
- return {
- like,
- retweet,
- };
- }
- async getCurrentUserId({ accessToken }: { accessToken: string }) {
- const cookieStore = await cookies();
- const userId = cookieStore.get('twitter_user_id');
- if (userId) {
- console.log('User twee id from cookies');
- return userId.value;
- }
- const response = await fetch('https://api.twitter.com/2/users/me', {
- headers: {
- Authorization: `Bearer ${accessToken}`,
- },
- });
- if (!response.ok) {
- throw new Error(`Failed to get user info: ${response.status}`);
- }
- const data = await response.json();
- cookieStore.set('twitter_user_id', data.data.id);
- return data.data.id;
- }
- }
- // Export a singleton instance
- export const twitterService = TwitterService.getInstance();
Advertisement
Add Comment
Please, Sign In to add comment