-
Notifications
You must be signed in to change notification settings - Fork 0
/
user.js
105 lines (85 loc) · 2.79 KB
/
user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
const rwClient = require("./twitterClient.js");
const config = require("./config.js");
class User{
constructor(loggedInUser){
this.loggedInUserId = loggedInUser.data.id;
}
async followUser(userId){
await this.runFollowPolicy()
await rwClient.v2.follow(this.loggedInUserId, userId);
}
//The bot must follow a FIFO policy once it reaches 2k following due to Twitter restrictions
async runFollowPolicy(){
let following = [];
try{
const userFollowingPaginater = await rwClient.v2.following(this.loggedInUserId, { asPaginator: true});
for await (const user of userFollowingPaginater){
following.push(user);
}
}
catch(err){
throw err;
}
if(following.length < config.maxFollowing){
return
}
const userToUnfollow = following.pop();
if(userToUnfollow){
return rwClient.v2.unfollow(this.loggedInUserId, userToUnfollow.id);
}
}
//Actions a user can make against a tweet
async tweet(description){
try {
await rwClient.v2.tweet(description)
} catch (err) {
throw err;
}
}
async like(tweetId){
try{
await rwClient.v2.like(this.loggedInUserId, tweetId)
}
catch(err){
throw err;
}
}
async retweet(tweetId){
try{
await rwClient.v2.retweet(this.loggedInUserId, tweetId)
}
catch(err){
throw err;
}
}
async tagFriends(tweetDescription, tweetId){
const tweetToSearch = tweetDescription.toLowerCase();
//Attempt to extract single digit number of friends
let numberOfFriendsToTag = Number(tweetToSearch.split('tag ')[1].split('')[0]);
//If null (eg. 'a' friend) just tag 1
if(isNaN(numberOfFriendsToTag)){
numberOfFriendsToTag = 1;
}
//Combine the necessary number of friends to tag into a string
let usersToTagString = config.friendsToTag
.slice(0, numberOfFriendsToTag)
.flatMap((x)=>x.handle)
.join()
.replaceAll(',', ' ')
//Random emoji appends the comment to avoid Twitter ban on duplicate comments
let comment = `${usersToTagString} 🤞 ${this.getRandomEmoji()}`
return await this.commentOnTweet(comment, tweetId)
}
async commentOnTweet(comment, tweetId){
return await rwClient.v2.reply(
comment,
tweetId,
);
}
//Can be used to make a tweet appear unique when tagging the same users repetitively
getRandomEmoji(){
const emojis = config.emojis;
return emojis[Math.floor(Math.random()*emojis.length)]
}
}
module.exports = User