@@ -256,10 +256,14 @@ query($owner: String!, $repo: String!, $number: Int!, $prCursor: String, $review
256256 id
257257 createdAt
258258 actor {
259+ __typename
259260 login
260261 ... on User {
261262 id
262263 }
264+ ... on Bot {
265+ id
266+ }
263267 }
264268 assignee {
265269 ... on User {
@@ -276,6 +280,7 @@ query($owner: String!, $repo: String!, $number: Int!, $prCursor: String, $review
276280 id
277281 createdAt
278282 actor {
283+ __typename
279284 login
280285 }
281286 assignee {
@@ -292,6 +297,7 @@ query($owner: String!, $repo: String!, $number: Int!, $prCursor: String, $review
292297 name
293298 }
294299 actor {
300+ __typename
295301 login
296302 }
297303 }
@@ -302,6 +308,7 @@ query($owner: String!, $repo: String!, $number: Int!, $prCursor: String, $review
302308 name
303309 }
304310 actor {
311+ __typename
305312 login
306313 }
307314 }
@@ -310,6 +317,7 @@ query($owner: String!, $repo: String!, $number: Int!, $prCursor: String, $review
310317 createdAt
311318 milestoneTitle
312319 actor {
320+ __typename
313321 login
314322 }
315323 }
@@ -318,13 +326,15 @@ query($owner: String!, $repo: String!, $number: Int!, $prCursor: String, $review
318326 createdAt
319327 milestoneTitle
320328 actor {
329+ __typename
321330 login
322331 }
323332 }
324333 ... on ReviewRequestedEvent {
325334 id
326335 createdAt
327336 actor {
337+ __typename
328338 login
329339 }
330340 requestedReviewer {
@@ -346,6 +356,7 @@ query($owner: String!, $repo: String!, $number: Int!, $prCursor: String, $review
346356 id
347357 createdAt
348358 actor {
359+ __typename
349360 login
350361 }
351362 requestedReviewer {
@@ -361,62 +372,71 @@ query($owner: String!, $repo: String!, $number: Int!, $prCursor: String, $review
361372 id
362373 createdAt
363374 actor {
375+ __typename
364376 login
365377 }
366378 }
367379 ... on ReopenedEvent {
368380 id
369381 createdAt
370382 actor {
383+ __typename
371384 login
372385 }
373386 }
374387 ... on MergedEvent {
375388 id
376389 createdAt
377390 actor {
391+ __typename
378392 login
379393 }
380394 }
381395 ... on MentionedEvent {
382396 id
383397 createdAt
384398 actor {
399+ __typename
385400 login
386401 }
387402 }
388403 ... on ReadyForReviewEvent {
389404 id
390405 createdAt
391406 actor {
407+ __typename
392408 login
393409 }
394410 }
395411 ... on ConvertToDraftEvent {
396412 id
397413 createdAt
398414 actor {
415+ __typename
399416 login
400417 }
401418 }
402419 ... on AutoMergeEnabledEvent {
403420 id
404421 createdAt
405422 actor {
423+ __typename
406424 login
407425 }
408426 }
409427 ... on AutoMergeDisabledEvent {
410428 id
411429 createdAt
412430 actor {
431+ __typename
413432 login
414433 }
415434 }
416435 ... on ReviewDismissedEvent {
417436 id
418437 createdAt
419438 actor {
439+ __typename
420440 login
421441 }
422442 dismissalMessage
@@ -425,13 +445,15 @@ query($owner: String!, $repo: String!, $number: Int!, $prCursor: String, $review
425445 id
426446 createdAt
427447 actor {
448+ __typename
428449 login
429450 }
430451 }
431452 ... on RenamedTitleEvent {
432453 id
433454 createdAt
434455 actor {
456+ __typename
435457 login
436458 }
437459 previousTitle
@@ -441,153 +463,175 @@ query($owner: String!, $repo: String!, $number: Int!, $prCursor: String, $review
441463 id
442464 createdAt
443465 actor {
466+ __typename
444467 login
445468 }
446469 }
447470 ... on BaseRefForcePushedEvent {
448471 id
449472 createdAt
450473 actor {
474+ __typename
451475 login
452476 }
453477 }
454478 ... on HeadRefForcePushedEvent {
455479 id
456480 createdAt
457481 actor {
482+ __typename
458483 login
459484 }
460485 }
461486 ... on HeadRefRestoredEvent {
462487 id
463488 createdAt
464489 actor {
490+ __typename
465491 login
466492 }
467493 }
468494 ... on LockedEvent {
469495 id
470496 createdAt
471497 actor {
498+ __typename
472499 login
473500 }
474501 }
475502 ... on UnlockedEvent {
476503 id
477504 createdAt
478505 actor {
506+ __typename
479507 login
480508 }
481509 }
482510 ... on AddedToMergeQueueEvent {
483511 id
484512 createdAt
485513 actor {
514+ __typename
486515 login
487516 }
488517 }
489518 ... on RemovedFromMergeQueueEvent {
490519 id
491520 createdAt
492521 actor {
522+ __typename
493523 login
494524 }
495525 }
496526 ... on AutomaticBaseChangeSucceededEvent {
497527 id
498528 createdAt
499529 actor {
530+ __typename
500531 login
501532 }
502533 }
503534 ... on AutomaticBaseChangeFailedEvent {
504535 id
505536 createdAt
506537 actor {
538+ __typename
507539 login
508540 }
509541 }
510542 ... on ConnectedEvent {
511543 id
512544 createdAt
513545 actor {
546+ __typename
514547 login
515548 }
516549 }
517550 ... on DisconnectedEvent {
518551 id
519552 createdAt
520553 actor {
554+ __typename
521555 login
522556 }
523557 }
524558 ... on CrossReferencedEvent {
525559 id
526560 createdAt
527561 actor {
562+ __typename
528563 login
529564 }
530565 }
531566 ... on ReferencedEvent {
532567 id
533568 createdAt
534569 actor {
570+ __typename
535571 login
536572 }
537573 }
538574 ... on SubscribedEvent {
539575 id
540576 createdAt
541577 actor {
578+ __typename
542579 login
543580 }
544581 }
545582 ... on UnsubscribedEvent {
546583 id
547584 createdAt
548585 actor {
586+ __typename
549587 login
550588 }
551589 }
552590 ... on DeployedEvent {
553591 id
554592 createdAt
555593 actor {
594+ __typename
556595 login
557596 }
558597 }
559598 ... on DeploymentEnvironmentChangedEvent {
560599 id
561600 createdAt
562601 actor {
602+ __typename
563603 login
564604 }
565605 }
566606 ... on PinnedEvent {
567607 id
568608 createdAt
569609 actor {
610+ __typename
570611 login
571612 }
572613 }
573614 ... on UnpinnedEvent {
574615 id
575616 createdAt
576617 actor {
618+ __typename
577619 login
578620 }
579621 }
580622 ... on TransferredEvent {
581623 id
582624 createdAt
583625 actor {
626+ __typename
584627 login
585628 }
586629 }
587630 ... on UserBlockedEvent {
588631 id
589632 createdAt
590633 actor {
634+ __typename
591635 login
592636 }
593637 }
@@ -917,13 +961,20 @@ type graphQLPullRequestComplete struct {
917961type graphQLActor struct {
918962 Login string `json:"login"`
919963 ID string `json:"id,omitempty"`
964+ Type string `json:"type,omitempty"`
920965}
921966
922967// isBot determines if an actor is a bot.
923968func isBot (actor graphQLActor ) bool {
924969 if actor .Login == "" {
925970 return false
926971 }
972+
973+ // Check the Type field first - most reliable signal from GitHub API
974+ if actor .Type == "Bot" {
975+ return true
976+ }
977+
927978 // Check for bot patterns in login (case-insensitive for better detection)
928979 login := actor .Login
929980 lowerLogin := strings .ToLower (login )
@@ -1303,6 +1354,9 @@ func (*Client) parseGraphQLTimelineEvent(_ /* ctx */ context.Context, item map[s
13031354 if id , ok := actor ["id" ].(string ); ok {
13041355 actorObj .ID = id
13051356 }
1357+ if typ , ok := actor ["__typename" ].(string ); ok {
1358+ actorObj .Type = typ
1359+ }
13061360 return isBot (actorObj )
13071361 }
13081362 return false
0 commit comments