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 });