/ clis / lesswrong / user-posts.js
user-posts.js
 1  import { cli, Strategy } from '@jackwener/opencli/registry';
 2  import { DOMAIN, SITE, gqlEscape, gqlRequest, resolveUserId } from './_helpers.js';
 3  cli({
 4      site: SITE,
 5      name: 'user-posts',
 6      description: "List a user's posts",
 7      domain: DOMAIN,
 8      strategy: Strategy.PUBLIC,
 9      browser: false,
10      args: [
11          {
12              name: 'username',
13              type: 'string',
14              required: true,
15              positional: true,
16              help: 'LessWrong username or slug',
17          },
18          { name: 'limit', type: 'int', default: 10, help: 'Number of results' },
19      ],
20      columns: ['rank', 'title', 'karma', 'comments', 'date', 'url'],
21      func: async (_page, kwargs) => {
22          const username = String(kwargs.username);
23          const limit = Number(kwargs.limit ?? 10);
24          const user = await resolveUserId(username);
25          const query = `query UserPosts {
26        posts(input: {terms: {view: "userPosts", userId: "${gqlEscape(user._id)}", limit: ${limit}}}) {
27          results { _id title baseScore commentCount slug postedAt }
28        }
29      }`;
30          const data = await gqlRequest(query);
31          const posts = (data?.posts?.results ?? []);
32          return posts.map((item, i) => ({
33              rank: i + 1,
34              title: item.title ?? '',
35              karma: item.baseScore ?? 0,
36              comments: item.commentCount ?? 0,
37              date: item.postedAt ?? '',
38              url: `https://${DOMAIN}/posts/${item._id}/${item.slug}`,
39          }));
40      },
41  });