Commit 89aa0e8
Changed files (4)
src
src/collect/collect.ts
@@ -6,6 +6,10 @@ import { userQuery, UserQuery } from './user.js'
import { IssueTimelineQuery, issueTimelineQuery } from './issue-timeline.js'
import { Data } from './types.js'
import { issueCommentsQuery, IssueCommentsQuery } from './issue-comments.js'
+import {
+ discussionCommentsQuery,
+ DiscussionCommentsQuery,
+} from './discussion-comments.js'
export async function collect(
octokit: Octokit,
@@ -21,6 +25,7 @@ export async function collect(
pulls: [],
issues: [],
issueComments: [],
+ discussionComments: [],
}
const repos = octokit.paginate.iterator('GET /users/{username}/repos', {
@@ -173,5 +178,26 @@ export async function collect(
console.error(err)
}
+ const discussionComments =
+ octokit.graphql.paginate.iterator<DiscussionCommentsQuery>(
+ discussionCommentsQuery,
+ {
+ login: username,
+ },
+ )
+ try {
+ for await (const resp of discussionComments) {
+ for (const comment of resp.user.repositoryDiscussionComments.nodes) {
+ data.discussionComments.push(comment)
+ }
+ console.log(
+ `| discussion comments ${data.discussionComments.length}/${resp.user.repositoryDiscussionComments.totalCount} (cost: ${resp.rateLimit.cost}, remaining: ${resp.rateLimit.remaining})`,
+ )
+ }
+ } catch (err) {
+ console.error(`Failed to load discussion comments`)
+ console.error(err)
+ }
+
return data
}
src/collect/discussion-comments.ts
@@ -0,0 +1,103 @@
+export const discussionCommentsQuery = `#graphql
+query DiscussionCommentsQuery($login: String!, $num: Int = 100, $cursor: String) {
+ user(login: $login) {
+ repositoryDiscussionComments(first: $num, after: $cursor) {
+ totalCount
+ nodes {
+ author {
+ login
+ }
+ discussion {
+ number
+ repository {
+ nameWithOwner
+ }
+ author {
+ login
+ }
+ }
+ body
+ createdAt
+ updatedAt
+ editor {
+ login
+ }
+ reactions(first: 100) {
+ totalCount
+ nodes {
+ content
+ user {
+ login
+ }
+ }
+ }
+ }
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ }
+ }
+ rateLimit {
+ limit
+ cost
+ remaining
+ resetAt
+ }
+}
+`
+
+export type DiscussionCommentsQuery = {
+ user: {
+ repositoryDiscussionComments: {
+ totalCount: number
+ nodes: Array<{
+ author: {
+ login: string
+ }
+ discussion: {
+ number: number
+ repository: {
+ nameWithOwner: string
+ }
+ author: {
+ login: string
+ }
+ }
+ body: string
+ createdAt: string
+ updatedAt: string
+ editor: {
+ login: string
+ } | null
+ reactions: {
+ totalCount: number
+ nodes: Array<{
+ content:
+ | 'CONFUSED'
+ | 'EYES'
+ | 'HEART'
+ | 'HOORAY'
+ | 'LAUGH'
+ | 'ROCKET'
+ | 'THUMBS_DOWN'
+ | 'THUMBS_UP'
+ user: {
+ login: string
+ }
+ }>
+ }
+ }>
+ pageInfo: {
+ hasNextPage: boolean
+ endCursor: string
+ }
+ }
+ }
+ rateLimit: {
+ limit: number
+ cost: number
+ remaining: number
+ resetAt: string
+ }
+}
src/collect/issue-comments.ts
@@ -4,6 +4,9 @@ query IssueCommentsQuery($login: String!, $num: Int = 100, $cursor: String) {
issueComments(first: $num, after: $cursor) {
totalCount
nodes {
+ author {
+ login
+ }
repository {
nameWithOwner
}
@@ -49,6 +52,9 @@ export type IssueCommentsQuery = {
issueComments: {
totalCount: number
nodes: Array<{
+ author: {
+ login: string
+ }
repository: {
nameWithOwner: string
}
src/collect/types.ts
@@ -4,6 +4,7 @@ import { IssuesQuery } from './issues.js'
import { UserQuery } from './user.js'
import { PullsQuery } from './pulls.js'
import { IssueCommentsQuery } from './issue-comments.js'
+import { DiscussionCommentsQuery } from './discussion-comments.js'
// Extra<T> represents additional data that is not returned by the GraphQL API,
// but enriched by some other means (e.g., separate queries).
@@ -15,6 +16,7 @@ export type Data = {
pulls: Pull[]
issues: Issue[]
issueComments: IssueComment[]
+ discussionComments: DiscussionComment[]
}
export type User = UserQuery['user']
@@ -33,3 +35,6 @@ export type Issue = IssuesQuery['user']['issues']['nodes'][0]
export type IssueComment =
IssueCommentsQuery['user']['issueComments']['nodes'][0]
+
+export type DiscussionComment =
+ DiscussionCommentsQuery['user']['repositoryDiscussionComments']['nodes'][0]