Repository: nonebot/nonebot2

Issue:
Feature: 对戳一戳事件的响应
**是否在使用中遇到某些问题而需要新的特性？请描述：**

虽然可以通过event.type来判断是否是戳一戳，但加一个对于戳一戳事件的完整支持我觉得还是更好一点

**描述你所需要的特性：**

支持对戳一戳事件的响应

Feature: 对戳一戳事件的响应
**是否在使用中遇到某些问题而需要新的特性？请描述：**

虽然可以通过event.type来判断是否是戳一戳，但加一个对于戳一戳事件的完整支持我觉得还是更好一点

**描述你所需要的特性：**

支持对戳一戳事件的响应



Discussion:
poke为cqhttp的特殊事件

你可以通过 `isinstance(event, PokeNotifyEvent)` 进行判断

nonebot不会为cqhttp添加一个内置响应，你可以自行编写一个rule

`on_notice(lambda b, e, s: isinstance(e, PokeNotifyEvent))`
不，我说的是对于Mirai的NudgeEvent（戳一戳事件）的响应，而不是cqhttp，我之前忘了说，抱歉。
无论是cqhttp还是mirai都可以自行编写rule，nonebot不会对这个进行处理
> 无论是cqhttp还是mirai都可以自行编写rule，nonebot不会对这个进行处理

现在MAH Adapter就没有戳一戳这个事件，会fallback回Event基类 :rofl:
（
poke为cqhttp的特殊事件

你可以通过 `isinstance(event, PokeNotifyEvent)` 进行判断

nonebot不会为cqhttp添加一个内置响应，你可以自行编写一个rule

`on_notice(lambda b, e, s: isinstance(e, PokeNotifyEvent))`
不，我说的是对于Mirai的NudgeEvent（戳一戳事件）的响应，而不是cqhttp，我之前忘了说，抱歉。
无论是cqhttp还是mirai都可以自行编写rule，nonebot不会对这个进行处理
> 无论是cqhttp还是mirai都可以自行编写rule，nonebot不会对这个进行处理

现在MAH Adapter就没有戳一戳这个事件，会fallback回Event基类 :rofl:
（

Resolving patch:
diff --git a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/event/base.py b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/event/base.py
--- a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/event/base.py
+++ b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/event/base.py
@@ -1,15 +1,15 @@
 import json
 from enum import Enum
-from typing import Any, Dict, Optional, Type
-
-from pydantic import BaseModel, Field, ValidationError
 from typing_extensions import Literal
+from typing import Any, Dict, Type, Optional
+
+from pydantic import Field, BaseModel, ValidationError
 
-from nonebot.adapters import Event as BaseEvent
-from nonebot.adapters import Message as BaseMessage
 from nonebot.log import logger
 from nonebot.typing import overrides
 from nonebot.utils import escape_tag
+from nonebot.adapters import Event as BaseEvent
+from nonebot.adapters import Message as BaseMessage
 
 
 class UserPermission(str, Enum):
@@ -18,15 +18,28 @@ class UserPermission(str, Enum):
 
       用户权限枚举类
 
-        * ``OWNER``: 群主
-        * ``ADMINISTRATOR``: 群管理
-        * ``MEMBER``: 普通群成员
+      * ``OWNER``: 群主
+      * ``ADMINISTRATOR``: 群管理
+      * ``MEMBER``: 普通群成员
     """
     OWNER = 'OWNER'
     ADMINISTRATOR = 'ADMINISTRATOR'
     MEMBER = 'MEMBER'
 
 
+class NudgeSubjectKind(str, Enum):
+    """
+    :说明:
+
+      戳一戳类型枚举类
+
+      * ``Group``: 群
+      * ``Friend``: 好友
+    """
+    Group = 'Group'
+    Friend = 'Friend'
+
+
 class GroupInfo(BaseModel):
     id: int
     name: str
@@ -46,6 +59,11 @@ class PrivateChatInfo(BaseModel):
     remark: str
 
 
+class NudgeSubject(BaseModel):
+    id: int
+    kind: NudgeSubjectKind
+
+
 class Event(BaseEvent):
     """
     mirai-api-http 协议事件，字段与 mirai-api-http 一致。各事件字段参考 `mirai-api-http 事件类型`_
@@ -89,7 +107,7 @@ def all_subclasses(cls: Type[Event]):
 
     @overrides(BaseEvent)
     def get_type(self) -> Literal["message", "notice", "request", "meta_event"]:
-        from . import message, meta, notice, request
+        from . import meta, notice, message, request
         if isinstance(self, message.MessageEvent):
             return 'message'
         elif isinstance(self, notice.NoticeEvent):
diff --git a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/event/notice.py b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/event/notice.py
--- a/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/event/notice.py
+++ b/packages/nonebot-adapter-mirai/nonebot/adapters/mirai/event/notice.py
@@ -2,7 +2,7 @@
 
 from pydantic import Field
 
-from .base import Event, GroupChatInfo, GroupInfo, UserPermission
+from .base import Event, GroupChatInfo, GroupInfo, NudgeSubject, UserPermission
 
 
 class NoticeEvent(Event):
@@ -154,3 +154,12 @@ class MemberPermissionChangeEvent(MemberStateChangeEvent):
     """成员权限改变的事件（该成员不是Bot）"""
     origin: UserPermission
     current: UserPermission
+
+
+class NudgeEvent(NoticeEvent):
+    """戳一戳触发事件"""
+    from_id: int = Field(alias='fromId')
+    target: int
+    subject: NudgeSubject
+    action: str
+    suffix: str


Test patch: