11import re
22from typing_extensions import Self
33from contextlib import contextmanager
4- from typing import TYPE_CHECKING , Any , Dict , List , Union , Optional , Generator
4+ from typing import TYPE_CHECKING , Any , Dict , List , Union , Callable , Optional , Generator
55
66from nonebot .typing import overrides
77from githubkit .utils import UNSET , Unset
1010
1111from nonebot .adapters import Bot as BaseBot
1212
13- from .event import Event
14- from .utils import APIContext
15- from .message import MessageSegment
1613from .config import OAuthApp , GitHubApp
14+ from .message import Message , MessageSegment
15+ from .event import Event , CommitCommentCreated
16+ from .utils import APIContext , get_attr_or_item
1717
1818if TYPE_CHECKING :
1919 from githubkit .rest import RestNamespace
@@ -70,8 +70,47 @@ def _check_nickname(bot: "Bot", event: Event) -> None:
7070 message [0 ] = MessageSegment .markdown (text [m .end () :])
7171
7272
73+ async def send (
74+ bot : "Bot" , event : Event , message : Union [str , Message , MessageSegment ]
75+ ) -> Any :
76+ msg = message if isinstance (message , Message ) else Message (message )
77+ if isinstance (event , CommitCommentCreated ):
78+ return await bot .rest .repos .async_create_commit_comment (
79+ owner = event .payload .repository .owner .login ,
80+ repo = event .payload .repository .name ,
81+ commit_sha = event .payload .comment .commit_id ,
82+ body = msg .extract_plain_text (),
83+ )
84+
85+ owner : Optional [str ] = None
86+ repo : Optional [str ] = None
87+ if repository := get_attr_or_item (event .payload , "repository" ):
88+ owner_user = get_attr_or_item (repository , "owner" )
89+ owner = get_attr_or_item (owner_user , "login" )
90+ repo = get_attr_or_item (repository , "name" )
91+
92+ number : Optional [int ] = None
93+ if issue := get_attr_or_item (event .payload , "issue" ):
94+ number = get_attr_or_item (issue , "number" )
95+ elif pull_request := get_attr_or_item (event .payload , "pull_request" ):
96+ number = get_attr_or_item (pull_request , "number" )
97+
98+ if owner and repo and number :
99+ return await bot .rest .issues .async_create_comment (
100+ owner = owner , repo = repo , issue_number = number , body = msg .extract_plain_text ()
101+ )
102+
103+ raise RuntimeError (
104+ f"Cannot guess reply target for event type { event .__class__ .__name__ } "
105+ )
106+
107+
73108class Bot (BaseBot ):
74109
110+ send_handler : Callable [
111+ ["Bot" , Event , Union [str , Message , MessageSegment ]], Any
112+ ] = send
113+
75114 if TYPE_CHECKING :
76115 rest : RestNamespace
77116
@@ -98,8 +137,10 @@ async def handle_event(self, event: Event) -> None:
98137 await handle_event (self , event )
99138
100139 @overrides (BaseBot )
101- async def send (self , event : Event , message ):
102- ...
140+ async def send (
141+ self , event : Event , message : Union [str , Message , MessageSegment ]
142+ ) -> Any :
143+ return await self .__class__ .send_handler (self , event , message )
103144
104145
105146class OAuthBot (Bot ):
0 commit comments