|
@@ -11,6 +11,9 @@ export class TwitterApiProvider {
|
|
|
this.initApi();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * initialize Twitter API provider
|
|
|
+ */
|
|
|
public async initApi() {
|
|
|
const access_token_key = await this.storage.get("accessTokenKey");
|
|
|
const access_token_secret = await this.storage.get("accessTokenSecret");
|
|
@@ -30,6 +33,10 @@ export class TwitterApiProvider {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * fetch home feed in batches of 20 tweets starting at maxId
|
|
|
+ * @param maxId tweet id
|
|
|
+ */
|
|
|
public async fetchHomeFeed(maxId?) {
|
|
|
const res = await this.client.get("statuses/home_timeline", {
|
|
|
count: 20,
|
|
@@ -40,11 +47,18 @@ export class TwitterApiProvider {
|
|
|
return res.data;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * fetch user object to given id
|
|
|
+ * @param userId user id
|
|
|
+ */
|
|
|
public async fetchUser(userId) {
|
|
|
const res = await this.client.get("users/show", { user_id: userId });
|
|
|
return res.data;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * lookup user for screenname
|
|
|
+ */
|
|
|
public async fetchUserFromScreenName(screenName) {
|
|
|
const res = await this.client.get("users/lookup", {
|
|
|
screen_name: screenName
|
|
@@ -52,6 +66,11 @@ export class TwitterApiProvider {
|
|
|
return res.data;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * fetch user feed in batches of 20 tweets starting at maxId
|
|
|
+ * @param userId user id
|
|
|
+ * @param maxId max tweet id
|
|
|
+ */
|
|
|
public async fetchUserTimeline(userId, maxId?) {
|
|
|
try {
|
|
|
const res = await this.client.get("statuses/user_timeline", {
|
|
@@ -68,30 +87,60 @@ export class TwitterApiProvider {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Follow user
|
|
|
+ * @param userId user id
|
|
|
+ */
|
|
|
public async createFriendship(userId) {
|
|
|
return await this.client.post("friendships/create", { user_id: userId });
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Unfollow user
|
|
|
+ * @param userId user id
|
|
|
+ */
|
|
|
public async destroyFriendship(userId) {
|
|
|
return await this.client.post("friendships/destroy", { user_id: userId });
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Mute user
|
|
|
+ * @param userId user id
|
|
|
+ */
|
|
|
public async muteUser(userId) {
|
|
|
return await this.client.post("mutes/users/create", { user_id: userId });
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Unmute user
|
|
|
+ * @param userId user id
|
|
|
+ */
|
|
|
public async unmuteUser(userId) {
|
|
|
return await this.client.post("mutes/users/destroy", { user_id: userId });
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Block user
|
|
|
+ * @param userId user id
|
|
|
+ */
|
|
|
public async blockUser(userId) {
|
|
|
return await this.client.post("blocks/create", { user_id: userId });
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Unblock user
|
|
|
+ * @param userId user id
|
|
|
+ */
|
|
|
public async unblockUser(userId) {
|
|
|
return await this.client.post("blocks/destroy", { user_id: userId });
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Post tweet
|
|
|
+ * @param status tweet message
|
|
|
+ * @param retweet tweet object to retweet
|
|
|
+ * @param replyToStatusId tweet id to reply to
|
|
|
+ */
|
|
|
public async tweet(status, retweet?, replyToStatusId?) {
|
|
|
if (status.length === 0 && retweet) {
|
|
|
// Simple retweet
|
|
@@ -120,6 +169,10 @@ export class TwitterApiProvider {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Fetch friends for user id
|
|
|
+ * @param userId user id
|
|
|
+ */
|
|
|
public async fetchFriends(userId) {
|
|
|
let friends = [];
|
|
|
let cursor = -1;
|
|
@@ -139,14 +192,26 @@ export class TwitterApiProvider {
|
|
|
return friends;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Like tweet
|
|
|
+ * @param tweetId tweet id
|
|
|
+ */
|
|
|
public async likeTweet(tweetId) {
|
|
|
return await this.client.post("favorites/create", { id: tweetId });
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Remove like from tweet
|
|
|
+ * @param tweetId tweet id
|
|
|
+ */
|
|
|
public async unlikeTweet(tweetId) {
|
|
|
return await this.client.post("favorites/destroy", { id: tweetId });
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Retrieve a single tweet
|
|
|
+ * @param tweetId tweet id
|
|
|
+ */
|
|
|
public async fetchTweet(tweetId) {
|
|
|
return await this.client.get("statuses/show", {
|
|
|
id: tweetId,
|
|
@@ -154,6 +219,12 @@ export class TwitterApiProvider {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Search Twitter for recent tweets
|
|
|
+ * Since the results are loaded in batches of 20 tweets, max tweet id is a reference for the next batch
|
|
|
+ * @param keyword keyword
|
|
|
+ * @param maxId max tweet id
|
|
|
+ */
|
|
|
public async searchRecentTweets(keyword: string, maxId?: string) {
|
|
|
const res = await this.client.get("search/tweets", {
|
|
|
q: keyword,
|
|
@@ -166,6 +237,12 @@ export class TwitterApiProvider {
|
|
|
return res.data;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Search Twitter for popular tweets
|
|
|
+ * Since the results are loaded in batches of 20 tweets, max tweet id is a reference for the next batch
|
|
|
+ * @param keyword keyword
|
|
|
+ * @param maxId max tweet id
|
|
|
+ */
|
|
|
public async searchPopularTweets(keyword: string, maxId?: string) {
|
|
|
const res = await this.client.get("search/tweets", {
|
|
|
q: keyword,
|
|
@@ -178,6 +255,12 @@ export class TwitterApiProvider {
|
|
|
return res.data;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Search Twitter for users
|
|
|
+ * Since the API returns users paginated, a page has to be provided
|
|
|
+ * @param keyword keyword
|
|
|
+ * @param page page number
|
|
|
+ */
|
|
|
public async searchUsers(keyword: string, page?: number) {
|
|
|
const res = await this.client.get("users/search", {
|
|
|
q: keyword,
|
|
@@ -188,6 +271,10 @@ export class TwitterApiProvider {
|
|
|
return res.data;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Updates the profile description
|
|
|
+ * @param description profile description
|
|
|
+ */
|
|
|
public async updateProfileDescription(description: string) {
|
|
|
const res = await this.client.post("account/update_profile", {
|
|
|
description: description
|