@dotta/xc 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +348 -0
- package/dist/__tests__/bookmarks.test.d.ts +4 -0
- package/dist/__tests__/bookmarks.test.js +104 -0
- package/dist/__tests__/bookmarks.test.js.map +1 -0
- package/dist/__tests__/budget.test.d.ts +6 -0
- package/dist/__tests__/budget.test.js +105 -0
- package/dist/__tests__/budget.test.js.map +1 -0
- package/dist/__tests__/dm.test.d.ts +4 -0
- package/dist/__tests__/dm.test.js +115 -0
- package/dist/__tests__/dm.test.js.map +1 -0
- package/dist/__tests__/followers.test.d.ts +4 -0
- package/dist/__tests__/followers.test.js +129 -0
- package/dist/__tests__/followers.test.js.map +1 -0
- package/dist/__tests__/lib/api.test.d.ts +5 -0
- package/dist/__tests__/lib/api.test.js +202 -0
- package/dist/__tests__/lib/api.test.js.map +1 -0
- package/dist/__tests__/lib/budget.test.d.ts +5 -0
- package/dist/__tests__/lib/budget.test.js +194 -0
- package/dist/__tests__/lib/budget.test.js.map +1 -0
- package/dist/__tests__/lib/config.test.d.ts +6 -0
- package/dist/__tests__/lib/config.test.js +228 -0
- package/dist/__tests__/lib/config.test.js.map +1 -0
- package/dist/__tests__/lib/cost.test.d.ts +6 -0
- package/dist/__tests__/lib/cost.test.js +177 -0
- package/dist/__tests__/lib/cost.test.js.map +1 -0
- package/dist/__tests__/lib/format.test.d.ts +4 -0
- package/dist/__tests__/lib/format.test.js +139 -0
- package/dist/__tests__/lib/format.test.js.map +1 -0
- package/dist/__tests__/lib/oauth.test.d.ts +5 -0
- package/dist/__tests__/lib/oauth.test.js +123 -0
- package/dist/__tests__/lib/oauth.test.js.map +1 -0
- package/dist/__tests__/lib/resolve.test.d.ts +4 -0
- package/dist/__tests__/lib/resolve.test.js +154 -0
- package/dist/__tests__/lib/resolve.test.js.map +1 -0
- package/dist/__tests__/lists.test.d.ts +4 -0
- package/dist/__tests__/lists.test.js +96 -0
- package/dist/__tests__/lists.test.js.map +1 -0
- package/dist/__tests__/media.test.d.ts +4 -0
- package/dist/__tests__/media.test.js +132 -0
- package/dist/__tests__/media.test.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +93 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +191 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/block.d.ts +15 -0
- package/dist/commands/block.js +117 -0
- package/dist/commands/block.js.map +1 -0
- package/dist/commands/bookmarks.d.ts +12 -0
- package/dist/commands/bookmarks.js +100 -0
- package/dist/commands/bookmarks.js.map +1 -0
- package/dist/commands/budget.d.ts +9 -0
- package/dist/commands/budget.js +124 -0
- package/dist/commands/budget.js.map +1 -0
- package/dist/commands/cost.d.ts +5 -0
- package/dist/commands/cost.js +75 -0
- package/dist/commands/cost.js.map +1 -0
- package/dist/commands/delete.d.ts +8 -0
- package/dist/commands/delete.js +31 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/dm.d.ts +10 -0
- package/dist/commands/dm.js +179 -0
- package/dist/commands/dm.js.map +1 -0
- package/dist/commands/engagement.d.ts +14 -0
- package/dist/commands/engagement.js +167 -0
- package/dist/commands/engagement.js.map +1 -0
- package/dist/commands/followers.d.ts +14 -0
- package/dist/commands/followers.js +138 -0
- package/dist/commands/followers.js.map +1 -0
- package/dist/commands/get.d.ts +2 -0
- package/dist/commands/get.js +63 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/hide.d.ts +10 -0
- package/dist/commands/hide.js +58 -0
- package/dist/commands/hide.js.map +1 -0
- package/dist/commands/like.d.ts +3 -0
- package/dist/commands/like.js +52 -0
- package/dist/commands/like.js.map +1 -0
- package/dist/commands/lists.d.ts +20 -0
- package/dist/commands/lists.js +384 -0
- package/dist/commands/lists.js.map +1 -0
- package/dist/commands/media.d.ts +19 -0
- package/dist/commands/media.js +205 -0
- package/dist/commands/media.js.map +1 -0
- package/dist/commands/mentions.d.ts +8 -0
- package/dist/commands/mentions.js +59 -0
- package/dist/commands/mentions.js.map +1 -0
- package/dist/commands/mute.d.ts +12 -0
- package/dist/commands/mute.js +99 -0
- package/dist/commands/mute.js.map +1 -0
- package/dist/commands/post.d.ts +11 -0
- package/dist/commands/post.js +87 -0
- package/dist/commands/post.js.map +1 -0
- package/dist/commands/repost.d.ts +10 -0
- package/dist/commands/repost.js +59 -0
- package/dist/commands/repost.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +49 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/stream.d.ts +13 -0
- package/dist/commands/stream.js +251 -0
- package/dist/commands/stream.js.map +1 -0
- package/dist/commands/timeline.d.ts +2 -0
- package/dist/commands/timeline.js +61 -0
- package/dist/commands/timeline.js.map +1 -0
- package/dist/commands/trends.d.ts +10 -0
- package/dist/commands/trends.js +59 -0
- package/dist/commands/trends.js.map +1 -0
- package/dist/commands/usage.d.ts +2 -0
- package/dist/commands/usage.js +52 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/user.d.ts +2 -0
- package/dist/commands/user.js +43 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/usersearch.d.ts +8 -0
- package/dist/commands/usersearch.js +48 -0
- package/dist/commands/usersearch.js.map +1 -0
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.js +54 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/lib/api.d.ts +12 -0
- package/dist/lib/api.js +91 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/budget.d.ts +44 -0
- package/dist/lib/budget.js +119 -0
- package/dist/lib/budget.js.map +1 -0
- package/dist/lib/config.d.ts +39 -0
- package/dist/lib/config.js +63 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/cost.d.ts +43 -0
- package/dist/lib/cost.js +224 -0
- package/dist/lib/cost.js.map +1 -0
- package/dist/lib/format.d.ts +24 -0
- package/dist/lib/format.js +72 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/oauth.d.ts +32 -0
- package/dist/lib/oauth.js +132 -0
- package/dist/lib/oauth.js.map +1 -0
- package/dist/lib/resolve.d.ts +12 -0
- package/dist/lib/resolve.js +48 -0
- package/dist/lib/resolve.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engagement lookup commands: quote tweets, liking users, reposted-by, liked posts.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* xc quotes <post-id> — list quote tweets of a post
|
|
6
|
+
* xc likes <post-id> — list users who liked a post
|
|
7
|
+
* xc reposts <post-id> — list users who reposted a post
|
|
8
|
+
* xc liked [username] — list posts liked by a user
|
|
9
|
+
*/
|
|
10
|
+
import { getClient } from "../lib/api.js";
|
|
11
|
+
import { outputJson } from "../lib/cost.js";
|
|
12
|
+
import { buildUserMap, formatTweetList, formatUserLine, } from "../lib/format.js";
|
|
13
|
+
import { resolveAuthenticatedUserId, resolveUserId, } from "../lib/resolve.js";
|
|
14
|
+
const TWEET_FIELDS = ["created_at", "public_metrics", "author_id"];
|
|
15
|
+
const EXPANSIONS = ["author_id"];
|
|
16
|
+
const USER_FIELDS = ["name", "username", "public_metrics"];
|
|
17
|
+
export function registerQuotesCommand(program) {
|
|
18
|
+
program
|
|
19
|
+
.command("quotes <post-id>")
|
|
20
|
+
.description("List quote tweets of a post")
|
|
21
|
+
.option("-n, --limit <n>", "Max results (1-100)", "20")
|
|
22
|
+
.option("--json", "Output raw JSON")
|
|
23
|
+
.option("--account <name>", "Account to use")
|
|
24
|
+
.action(async (postId, opts) => {
|
|
25
|
+
try {
|
|
26
|
+
const client = await getClient(opts.account);
|
|
27
|
+
const result = await client.posts.getQuoted(postId, {
|
|
28
|
+
tweetFields: TWEET_FIELDS,
|
|
29
|
+
expansions: EXPANSIONS,
|
|
30
|
+
userFields: USER_FIELDS,
|
|
31
|
+
maxResults: parseInt(opts.limit, 10),
|
|
32
|
+
});
|
|
33
|
+
if (opts.json) {
|
|
34
|
+
outputJson(result);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const tweets = result.data ?? [];
|
|
38
|
+
if (tweets.length === 0) {
|
|
39
|
+
console.log("No quote tweets found.");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const usersById = buildUserMap(result.includes?.users);
|
|
43
|
+
console.log(`Quote tweets of ${postId}:\n`);
|
|
44
|
+
console.log(formatTweetList(tweets, usersById));
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
export function registerLikesCommand(program) {
|
|
53
|
+
program
|
|
54
|
+
.command("likes <post-id>")
|
|
55
|
+
.description("List users who liked a post")
|
|
56
|
+
.option("-n, --limit <n>", "Max results (1-100)", "100")
|
|
57
|
+
.option("--json", "Output raw JSON")
|
|
58
|
+
.option("--account <name>", "Account to use")
|
|
59
|
+
.action(async (postId, opts) => {
|
|
60
|
+
try {
|
|
61
|
+
const client = await getClient(opts.account);
|
|
62
|
+
const result = await client.posts.getLikingUsers(postId, {
|
|
63
|
+
userFields: ["username", "name", "public_metrics"],
|
|
64
|
+
maxResults: parseInt(opts.limit, 10),
|
|
65
|
+
});
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
outputJson(result);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const users = (result.data ?? []);
|
|
71
|
+
if (users.length === 0) {
|
|
72
|
+
console.log("No liking users found.");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
console.log(`Users who liked post ${postId}:\n`);
|
|
76
|
+
for (const user of users) {
|
|
77
|
+
console.log(formatUserLine(user));
|
|
78
|
+
}
|
|
79
|
+
console.log(`\n— ${users.length} shown`);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
export function registerRepostsCommand(program) {
|
|
88
|
+
program
|
|
89
|
+
.command("reposts <post-id>")
|
|
90
|
+
.description("List users who reposted a post")
|
|
91
|
+
.option("-n, --limit <n>", "Max results (1-100)", "100")
|
|
92
|
+
.option("--json", "Output raw JSON")
|
|
93
|
+
.option("--account <name>", "Account to use")
|
|
94
|
+
.action(async (postId, opts) => {
|
|
95
|
+
try {
|
|
96
|
+
const client = await getClient(opts.account);
|
|
97
|
+
const result = await client.posts.getRepostedBy(postId, {
|
|
98
|
+
userFields: ["username", "name", "public_metrics"],
|
|
99
|
+
maxResults: parseInt(opts.limit, 10),
|
|
100
|
+
});
|
|
101
|
+
if (opts.json) {
|
|
102
|
+
outputJson(result);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const users = (result.data ?? []);
|
|
106
|
+
if (users.length === 0) {
|
|
107
|
+
console.log("No reposting users found.");
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
console.log(`Users who reposted post ${postId}:\n`);
|
|
111
|
+
for (const user of users) {
|
|
112
|
+
console.log(formatUserLine(user));
|
|
113
|
+
}
|
|
114
|
+
console.log(`\n— ${users.length} shown`);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
export function registerLikedCommand(program) {
|
|
123
|
+
program
|
|
124
|
+
.command("liked [username]")
|
|
125
|
+
.description("List posts liked by a user (defaults to authenticated user)")
|
|
126
|
+
.option("-n, --limit <n>", "Max results (1-100)", "20")
|
|
127
|
+
.option("--json", "Output raw JSON")
|
|
128
|
+
.option("--account <name>", "Account to use")
|
|
129
|
+
.action(async (username, opts) => {
|
|
130
|
+
try {
|
|
131
|
+
const client = await getClient(opts.account);
|
|
132
|
+
let userId;
|
|
133
|
+
if (username) {
|
|
134
|
+
userId = await resolveUserId(username, opts.account);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
userId = await resolveAuthenticatedUserId(opts.account);
|
|
138
|
+
}
|
|
139
|
+
const result = await client.users.getLikedPosts(userId, {
|
|
140
|
+
tweetFields: TWEET_FIELDS,
|
|
141
|
+
expansions: EXPANSIONS,
|
|
142
|
+
userFields: USER_FIELDS,
|
|
143
|
+
maxResults: parseInt(opts.limit, 10),
|
|
144
|
+
});
|
|
145
|
+
if (opts.json) {
|
|
146
|
+
outputJson(result);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const tweets = result.data ?? [];
|
|
150
|
+
if (tweets.length === 0) {
|
|
151
|
+
console.log("No liked posts found.");
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const usersById = buildUserMap(result.includes?.users);
|
|
155
|
+
const label = username
|
|
156
|
+
? `@${username.replace(/^@/, "")}`
|
|
157
|
+
: "you";
|
|
158
|
+
console.log(`Posts liked by ${label}:\n`);
|
|
159
|
+
console.log(formatTweetList(tweets, usersById));
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=engagement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engagement.js","sourceRoot":"","sources":["../../src/commands/engagement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Followers/following commands: view and manage follow relationships.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* xc followers <@username> — list who follows a user
|
|
6
|
+
* xc following <@username> — list who a user follows
|
|
7
|
+
* xc follow <@username> — follow a user
|
|
8
|
+
* xc unfollow <@username> — unfollow a user
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from "commander";
|
|
11
|
+
export declare function registerFollowersCommand(program: Command): void;
|
|
12
|
+
export declare function registerFollowingCommand(program: Command): void;
|
|
13
|
+
export declare function registerFollowCommand(program: Command): void;
|
|
14
|
+
export declare function registerUnfollowCommand(program: Command): void;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Followers/following commands: view and manage follow relationships.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* xc followers <@username> — list who follows a user
|
|
6
|
+
* xc following <@username> — list who a user follows
|
|
7
|
+
* xc follow <@username> — follow a user
|
|
8
|
+
* xc unfollow <@username> — unfollow a user
|
|
9
|
+
*/
|
|
10
|
+
import { getClient } from "../lib/api.js";
|
|
11
|
+
import { outputJson } from "../lib/cost.js";
|
|
12
|
+
import { resolveUserId, resolveAuthenticatedUserId, } from "../lib/resolve.js";
|
|
13
|
+
import { formatUserLine } from "../lib/format.js";
|
|
14
|
+
export function registerFollowersCommand(program) {
|
|
15
|
+
program
|
|
16
|
+
.command("followers <username>")
|
|
17
|
+
.description("List followers of a user")
|
|
18
|
+
.option("-n, --limit <n>", "Max results (1-1000)", "100")
|
|
19
|
+
.option("--json", "Output raw JSON")
|
|
20
|
+
.option("--account <name>", "Account to use")
|
|
21
|
+
.action(async (username, opts) => {
|
|
22
|
+
try {
|
|
23
|
+
const userId = await resolveUserId(username, opts.account);
|
|
24
|
+
const client = await getClient(opts.account);
|
|
25
|
+
const result = await client.users.getFollowers(userId, {
|
|
26
|
+
userFields: ["username", "name", "public_metrics", "description"],
|
|
27
|
+
maxResults: parseInt(opts.limit, 10),
|
|
28
|
+
});
|
|
29
|
+
if (opts.json) {
|
|
30
|
+
outputJson(result);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const users = (result.data ?? []);
|
|
34
|
+
if (users.length === 0) {
|
|
35
|
+
console.log(`@${username.replace(/^@/, "")} has no followers.`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const clean = username.replace(/^@/, "");
|
|
39
|
+
console.log(`Followers of @${clean}:\n`);
|
|
40
|
+
for (const user of users) {
|
|
41
|
+
console.log(formatUserLine(user));
|
|
42
|
+
}
|
|
43
|
+
console.log(`\n— ${users.length} shown`);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export function registerFollowingCommand(program) {
|
|
52
|
+
program
|
|
53
|
+
.command("following <username>")
|
|
54
|
+
.description("List who a user follows")
|
|
55
|
+
.option("-n, --limit <n>", "Max results (1-1000)", "100")
|
|
56
|
+
.option("--json", "Output raw JSON")
|
|
57
|
+
.option("--account <name>", "Account to use")
|
|
58
|
+
.action(async (username, opts) => {
|
|
59
|
+
try {
|
|
60
|
+
const userId = await resolveUserId(username, opts.account);
|
|
61
|
+
const client = await getClient(opts.account);
|
|
62
|
+
const result = await client.users.getFollowing(userId, {
|
|
63
|
+
userFields: ["username", "name", "public_metrics", "description"],
|
|
64
|
+
maxResults: parseInt(opts.limit, 10),
|
|
65
|
+
});
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
outputJson(result);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const users = (result.data ?? []);
|
|
71
|
+
if (users.length === 0) {
|
|
72
|
+
console.log(`@${username.replace(/^@/, "")} follows no one.`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const clean = username.replace(/^@/, "");
|
|
76
|
+
console.log(`@${clean} is following:\n`);
|
|
77
|
+
for (const user of users) {
|
|
78
|
+
console.log(formatUserLine(user));
|
|
79
|
+
}
|
|
80
|
+
console.log(`\n— ${users.length} shown`);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export function registerFollowCommand(program) {
|
|
89
|
+
program
|
|
90
|
+
.command("follow <username>")
|
|
91
|
+
.description("Follow a user")
|
|
92
|
+
.option("--json", "Output raw JSON")
|
|
93
|
+
.option("--account <name>", "Account to use")
|
|
94
|
+
.action(async (username, opts) => {
|
|
95
|
+
try {
|
|
96
|
+
const myId = await resolveAuthenticatedUserId(opts.account);
|
|
97
|
+
const targetId = await resolveUserId(username, opts.account);
|
|
98
|
+
const client = await getClient(opts.account);
|
|
99
|
+
const result = await client.users.followUser(myId, {
|
|
100
|
+
body: { targetUserId: targetId },
|
|
101
|
+
});
|
|
102
|
+
if (opts.json) {
|
|
103
|
+
outputJson(result);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
console.log(`Followed @${username.replace(/^@/, "")}`);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
export function registerUnfollowCommand(program) {
|
|
115
|
+
program
|
|
116
|
+
.command("unfollow <username>")
|
|
117
|
+
.description("Unfollow a user")
|
|
118
|
+
.option("--json", "Output raw JSON")
|
|
119
|
+
.option("--account <name>", "Account to use")
|
|
120
|
+
.action(async (username, opts) => {
|
|
121
|
+
try {
|
|
122
|
+
const myId = await resolveAuthenticatedUserId(opts.account);
|
|
123
|
+
const targetId = await resolveUserId(username, opts.account);
|
|
124
|
+
const client = await getClient(opts.account);
|
|
125
|
+
const result = await client.users.unfollowUser(myId, targetId);
|
|
126
|
+
if (opts.json) {
|
|
127
|
+
outputJson(result);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
console.log(`Unfollowed @${username.replace(/^@/, "")}`);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=followers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"followers.js","sourceRoot":"","sources":["../../src/commands/followers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { getClient } from "../lib/api.js";
|
|
2
|
+
import { outputJson } from "../lib/cost.js";
|
|
3
|
+
import { buildUserMap, formatTweet } from "../lib/format.js";
|
|
4
|
+
const TWEET_FIELDS = ["created_at", "public_metrics", "author_id", "article", "note_tweet"];
|
|
5
|
+
const EXPANSIONS = ["author_id"];
|
|
6
|
+
const USER_FIELDS = ["name", "username"];
|
|
7
|
+
/**
|
|
8
|
+
* Extract a post ID from a string that may be an ID or a full x.com/twitter.com URL.
|
|
9
|
+
*/
|
|
10
|
+
function parsePostId(input) {
|
|
11
|
+
const urlMatch = input.match(/(?:twitter\.com|x\.com)\/\w+\/status\/(\d+)/);
|
|
12
|
+
return urlMatch ? urlMatch[1] : input;
|
|
13
|
+
}
|
|
14
|
+
export function registerGetCommand(program) {
|
|
15
|
+
program
|
|
16
|
+
.command("get <post-id-or-url>")
|
|
17
|
+
.description("Get a post by ID or URL")
|
|
18
|
+
.option("--json", "Output raw JSON")
|
|
19
|
+
.option("--account <name>", "Account to use")
|
|
20
|
+
.action(async (postIdOrUrl, opts) => {
|
|
21
|
+
try {
|
|
22
|
+
const id = parsePostId(postIdOrUrl);
|
|
23
|
+
const client = await getClient(opts.account);
|
|
24
|
+
const result = await client.posts.getById(id, {
|
|
25
|
+
tweetFields: TWEET_FIELDS,
|
|
26
|
+
expansions: EXPANSIONS,
|
|
27
|
+
userFields: USER_FIELDS,
|
|
28
|
+
});
|
|
29
|
+
if (opts.json) {
|
|
30
|
+
outputJson(result);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const tweet = result.data;
|
|
34
|
+
if (!tweet) {
|
|
35
|
+
console.log("Post not found.");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const usersById = buildUserMap(result.includes?.users);
|
|
39
|
+
console.log(formatTweet(tweet, usersById));
|
|
40
|
+
// Display article body if present
|
|
41
|
+
const article = tweet.article;
|
|
42
|
+
if (article?.plainText) {
|
|
43
|
+
if (article.title) {
|
|
44
|
+
console.log(`\n━━━ ${article.title} ━━━\n`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.log("\n━━━ Article ━━━\n");
|
|
48
|
+
}
|
|
49
|
+
console.log(article.plainText);
|
|
50
|
+
}
|
|
51
|
+
// Display note_tweet full text if present (long posts >280 chars)
|
|
52
|
+
const noteTweet = tweet.noteTweet ?? tweet.note_tweet;
|
|
53
|
+
if (noteTweet?.text) {
|
|
54
|
+
console.log(`\n${noteTweet.text}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hide/unhide reply moderation commands.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* xc hide <post-id> — hide a reply
|
|
6
|
+
* xc unhide <post-id> — unhide a reply
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from "commander";
|
|
9
|
+
export declare function registerHideCommand(program: Command): void;
|
|
10
|
+
export declare function registerUnhideCommand(program: Command): void;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hide/unhide reply moderation commands.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* xc hide <post-id> — hide a reply
|
|
6
|
+
* xc unhide <post-id> — unhide a reply
|
|
7
|
+
*/
|
|
8
|
+
import { getClient } from "../lib/api.js";
|
|
9
|
+
import { outputJson } from "../lib/cost.js";
|
|
10
|
+
export function registerHideCommand(program) {
|
|
11
|
+
program
|
|
12
|
+
.command("hide <post-id>")
|
|
13
|
+
.description("Hide a reply")
|
|
14
|
+
.option("--json", "Output raw JSON")
|
|
15
|
+
.option("--account <name>", "Account to use")
|
|
16
|
+
.action(async (postId, opts) => {
|
|
17
|
+
try {
|
|
18
|
+
const client = await getClient(opts.account);
|
|
19
|
+
const result = await client.posts.hideReply(postId, {
|
|
20
|
+
body: { hidden: true },
|
|
21
|
+
});
|
|
22
|
+
if (opts.json) {
|
|
23
|
+
outputJson(result);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
console.log(`Hidden reply ${postId}`);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export function registerUnhideCommand(program) {
|
|
35
|
+
program
|
|
36
|
+
.command("unhide <post-id>")
|
|
37
|
+
.description("Unhide a reply")
|
|
38
|
+
.option("--json", "Output raw JSON")
|
|
39
|
+
.option("--account <name>", "Account to use")
|
|
40
|
+
.action(async (postId, opts) => {
|
|
41
|
+
try {
|
|
42
|
+
const client = await getClient(opts.account);
|
|
43
|
+
const result = await client.posts.hideReply(postId, {
|
|
44
|
+
body: { hidden: false },
|
|
45
|
+
});
|
|
46
|
+
if (opts.json) {
|
|
47
|
+
outputJson(result);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
console.log(`Unhidden reply ${postId}`);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=hide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hide.js","sourceRoot":"","sources":["../../src/commands/hide.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,cAAc,CAAC;SAC3B,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SACnC,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE;gBAClD,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;aACvB,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,UAAU,CAAC,MAAM,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,gBAAgB,CAAC;SAC7B,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SACnC,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE;gBAClD,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;aACxB,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,UAAU,CAAC,MAAM,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { getClient } from "../lib/api.js";
|
|
2
|
+
import { outputJson } from "../lib/cost.js";
|
|
3
|
+
import { resolveAuthenticatedUserId } from "../lib/resolve.js";
|
|
4
|
+
export function registerLikeCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("like <post-id>")
|
|
7
|
+
.description("Like a post")
|
|
8
|
+
.option("--json", "Output raw JSON")
|
|
9
|
+
.option("--account <name>", "Account to use")
|
|
10
|
+
.action(async (postId, opts) => {
|
|
11
|
+
try {
|
|
12
|
+
const userId = await resolveAuthenticatedUserId(opts.account);
|
|
13
|
+
const client = await getClient(opts.account);
|
|
14
|
+
const result = await client.users.likePost(userId, {
|
|
15
|
+
body: { tweetId: postId },
|
|
16
|
+
});
|
|
17
|
+
if (opts.json) {
|
|
18
|
+
outputJson(result);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
console.log(`Liked post ${postId}`);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export function registerUnlikeCommand(program) {
|
|
30
|
+
program
|
|
31
|
+
.command("unlike <post-id>")
|
|
32
|
+
.description("Unlike a post")
|
|
33
|
+
.option("--json", "Output raw JSON")
|
|
34
|
+
.option("--account <name>", "Account to use")
|
|
35
|
+
.action(async (postId, opts) => {
|
|
36
|
+
try {
|
|
37
|
+
const userId = await resolveAuthenticatedUserId(opts.account);
|
|
38
|
+
const client = await getClient(opts.account);
|
|
39
|
+
const result = await client.users.unlikePost(userId, postId);
|
|
40
|
+
if (opts.json) {
|
|
41
|
+
outputJson(result);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
console.log(`Unliked post ${postId}`);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=like.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"like.js","sourceRoot":"","sources":["../../src/commands/like.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SACnC,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;gBACjD,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;aAC1B,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,UAAU,CAAC,MAAM,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SACnC,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAE7D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,UAAU,CAAC,MAAM,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lists commands: view, create, update, delete, manage members, follow/pin.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* xc lists — list your lists
|
|
6
|
+
* xc list <list-id> — view posts in a list
|
|
7
|
+
* xc list create <name> [options] — create a list
|
|
8
|
+
* xc list update <id> [options] — update a list
|
|
9
|
+
* xc list delete <id> — delete a list
|
|
10
|
+
* xc list members <id> — list members
|
|
11
|
+
* xc list add <id> <username> — add a member
|
|
12
|
+
* xc list remove <id> <username> — remove a member
|
|
13
|
+
* xc list follow <id> — follow a list
|
|
14
|
+
* xc list unfollow <id> — unfollow a list
|
|
15
|
+
* xc list pin <id> — pin a list
|
|
16
|
+
* xc list unpin <id> — unpin a list
|
|
17
|
+
*/
|
|
18
|
+
import { Command } from "commander";
|
|
19
|
+
export declare function registerListsCommand(program: Command): void;
|
|
20
|
+
export declare function registerListCommand(program: Command): void;
|