/ clis / lesswrong / user.js
user.js
 1  import { cli, Strategy } from '@jackwener/opencli/registry';
 2  import { EmptyResultError } from '@jackwener/opencli/errors';
 3  import { DOMAIN, SITE, gqlEscape, gqlRequest, stripHtml } from './_helpers.js';
 4  cli({
 5      site: SITE,
 6      name: 'user',
 7      description: 'User profile',
 8      domain: DOMAIN,
 9      strategy: Strategy.PUBLIC,
10      browser: false,
11      args: [
12          {
13              name: 'username',
14              type: 'string',
15              required: true,
16              positional: true,
17              help: 'LessWrong username or slug',
18          },
19      ],
20      columns: ['field', 'value'],
21      func: async (_page, kwargs) => {
22          const slug = gqlEscape(String(kwargs.username).toLowerCase());
23          const query = `query UserProfile {
24        user(input: {selector: {slug: "${slug}"}}) {
25          result { _id displayName slug bio karma postCount commentCount createdAt }
26        }
27      }`;
28          const data = await gqlRequest(query);
29          const user = data?.user?.result;
30          if (!user?._id) {
31              throw new EmptyResultError(`lesswrong user ${String(kwargs.username)}`, 'Check the username — LessWrong slugs are lowercase (e.g. "zvi", "eliezer-yudkowsky")');
32          }
33          return [
34              { field: 'Name', value: user.displayName ?? '' },
35              { field: 'Username', value: user.slug ?? '' },
36              { field: 'Karma', value: user.karma ?? 0 },
37              { field: 'Posts', value: user.postCount ?? 0 },
38              { field: 'Comments', value: user.commentCount ?? 0 },
39              { field: 'Joined', value: user.createdAt ?? '' },
40              { field: 'Bio', value: stripHtml(user.bio ?? '') },
41              { field: 'URL', value: `https://${DOMAIN}/users/${user.slug}` },
42          ];
43      },
44  });