mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-06-15 00:27:40 +00:00
commit
049d14295e
@ -11,7 +11,7 @@ pip install nonebot-adapter-feishu
|
|||||||
## 创建应用与启用应用“机器人”能力
|
## 创建应用与启用应用“机器人”能力
|
||||||
|
|
||||||
::: tip
|
::: tip
|
||||||
此部分可参考[飞书开放平台-快速开发机器人-创建应用](https://open.feishu.cn/document/home/develop-a-bot-in-5-minutes/create-an-app)部分文档。
|
此部分可参考[飞书开放平台-快速开发机器人-创建应用](https://open.feishu.cn/document/home/develop-a-bot-in-5-minutes/create-an-app)部分的文档。
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ pip install nonebot-adapter-feishu
|
|||||||
|
|
||||||
## 在 NoneBot 配置中添加相应配置
|
## 在 NoneBot 配置中添加相应配置
|
||||||
|
|
||||||
在 `.env` 文件中添加以下部分
|
在 `.env` 文件中添加以下配置
|
||||||
|
|
||||||
```
|
```
|
||||||
APP_ID=<yourAppId>
|
APP_ID=<yourAppId>
|
||||||
@ -52,6 +52,51 @@ APP_SECRET=<yourAppSecret>
|
|||||||
VERIFICATION_TOKEN=<yourVerificationToken>
|
VERIFICATION_TOKEN=<yourVerificationToken>
|
||||||
```
|
```
|
||||||
|
|
||||||
复制所创建应用**“凭证和基础信息”**中的**App ID**与**App Secret**及**“事件订阅”**中的**Verification Token**,替换上面相应的配置的值。
|
复制所创建应用**“凭证和基础信息”**中的 **App ID** 、 **App Secret** 和 **“事件订阅”** 中的 **Verification Token** ,替换上面相应的配置的值。
|
||||||
|
|
||||||
|
此外,对于飞书平台的事件订阅加密机制,飞书适配器也提供 `ENCRYPT_KEY` 配置项。
|
||||||
|
|
||||||
|
```
|
||||||
|
ENCRYPT_KEY=<yourEncryptKey>
|
||||||
|
```
|
||||||
|
|
||||||
|
当此项不为空时,飞书适配器会认为用户启用了加密机制,并对事件上报中的密文进行解密。
|
||||||
|
|
||||||
|
对于[Lark(飞书平台海外版)](https://www.larksuite.com) 的用户,飞书适配器也提供**实验性**支持,仅需要在配置文件中添加 `IS_LARK=true` 即可。
|
||||||
|
|
||||||
|
```
|
||||||
|
IS_LARK=true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注册飞书适配器
|
||||||
|
|
||||||
|
在 `bot.py` 中添加:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from nonebot.adapters.feishu import Bot as FeishuBot
|
||||||
|
|
||||||
|
driver.register_adapter("feishu", FeishuBot)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 编写一个适用于飞书适配器的插件并加载
|
||||||
|
|
||||||
|
插件代码范例:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from nonebot.plugin import on_command
|
||||||
|
from nonebot.typing import T_State
|
||||||
|
from nonebot.adapters.feishu import Bot as FeishuBot, MessageEvent
|
||||||
|
|
||||||
|
helper = on_command("say")
|
||||||
|
|
||||||
|
|
||||||
|
@helper.handle()
|
||||||
|
async def feishu_helper(bot: FeishuBot, event: MessageEvent, state: T_State):
|
||||||
|
message = event.get_message()
|
||||||
|
await helper.finish(message, at_sender=True)
|
||||||
|
```
|
||||||
|
|
||||||
|
以上代码注册了一个对飞书平台适用的`say`指令,并会提取`/say`之后的内容发送到事件所对应的群或私聊。
|
||||||
|
|
||||||
|
大功告成!现在可以试试向机器人发送类似`/say Hello, Feishu!`的消息进行测试了。
|
||||||
|
|
||||||
大功告成!现在可以试试向机器人发送消息进行测试了。
|
|
||||||
|
@ -18,6 +18,8 @@ class EventHeader(BaseModel):
|
|||||||
token: str
|
token: str
|
||||||
app_id: str
|
app_id: str
|
||||||
tenant_key: str
|
tenant_key: str
|
||||||
|
resource_id: Optional[str]
|
||||||
|
user_list: Optional[List[dict]]
|
||||||
|
|
||||||
|
|
||||||
class Event(BaseEvent):
|
class Event(BaseEvent):
|
||||||
@ -27,8 +29,9 @@ class Event(BaseEvent):
|
|||||||
.. _飞书文档:
|
.. _飞书文档:
|
||||||
https://open.feishu.cn/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-list
|
https://open.feishu.cn/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-list
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__event__ = ""
|
__event__ = ""
|
||||||
schema_: str = Field("", alias='schema')
|
schema_: str = Field("", alias="schema")
|
||||||
header: EventHeader
|
header: EventHeader
|
||||||
event: Any
|
event: Any
|
||||||
|
|
||||||
@ -136,8 +139,10 @@ class EventMessage(BaseModel):
|
|||||||
@root_validator(pre=True)
|
@root_validator(pre=True)
|
||||||
def parse_message(cls, values: dict):
|
def parse_message(cls, values: dict):
|
||||||
values["content"] = MessageDeserializer(
|
values["content"] = MessageDeserializer(
|
||||||
values["message_type"], json.loads(values["content"]),
|
values["message_type"],
|
||||||
values.get("mentions")).deserialize()
|
json.loads(values["content"]),
|
||||||
|
values.get("mentions"),
|
||||||
|
).deserialize()
|
||||||
return values
|
return values
|
||||||
|
|
||||||
|
|
||||||
@ -187,7 +192,8 @@ class MessageEvent(Event):
|
|||||||
return (
|
return (
|
||||||
f"{self.event.message.message_id} from {self.get_user_id()}"
|
f"{self.event.message.message_id} from {self.get_user_id()}"
|
||||||
f"@[{self.event.message.chat_type}:{self.event.message.chat_id}]"
|
f"@[{self.event.message.chat_type}:{self.event.message.chat_id}]"
|
||||||
f" {self.get_message()}")
|
f" {self.get_message()}"
|
||||||
|
)
|
||||||
|
|
||||||
@overrides(Event)
|
@overrides(Event)
|
||||||
def get_message(self) -> Message:
|
def get_message(self) -> Message:
|
||||||
@ -395,6 +401,460 @@ class GroupMemberUserDeletedEvent(NoticeEvent):
|
|||||||
event: GroupMemberUserDeletedEventDetail
|
event: GroupMemberUserDeletedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class AvatarInfo(BaseModel):
|
||||||
|
avatar_72: str
|
||||||
|
avatar_240: str
|
||||||
|
avatar_640: str
|
||||||
|
avatar_origin: str
|
||||||
|
|
||||||
|
|
||||||
|
class UserStatus(BaseModel):
|
||||||
|
is_frozen: bool
|
||||||
|
is_resigned: bool
|
||||||
|
is_activated: bool
|
||||||
|
|
||||||
|
|
||||||
|
class UserOrder(BaseModel):
|
||||||
|
department_id: str
|
||||||
|
user_order: int
|
||||||
|
department_order: int
|
||||||
|
|
||||||
|
|
||||||
|
class UserCustomAttrValue(BaseModel):
|
||||||
|
text: str
|
||||||
|
url: str
|
||||||
|
pc_url: str
|
||||||
|
|
||||||
|
|
||||||
|
class UserCustomAttr(BaseModel):
|
||||||
|
type: str
|
||||||
|
id: str
|
||||||
|
value: UserCustomAttrValue
|
||||||
|
|
||||||
|
|
||||||
|
class ContactUser(BaseModel):
|
||||||
|
open_id: str
|
||||||
|
user_id: str
|
||||||
|
name: str
|
||||||
|
en_name: str
|
||||||
|
email: str
|
||||||
|
mobile: str
|
||||||
|
gender: int
|
||||||
|
avatar: AvatarInfo
|
||||||
|
status: UserStatus
|
||||||
|
department_ids: Optional[List[str]]
|
||||||
|
leader_user_id: str
|
||||||
|
city: str
|
||||||
|
country: str
|
||||||
|
work_station: str
|
||||||
|
join_time: int
|
||||||
|
employee_no: str
|
||||||
|
employee_type: int
|
||||||
|
orders: Optional[List[UserOrder]]
|
||||||
|
custom_attrs: List[UserCustomAttr]
|
||||||
|
|
||||||
|
|
||||||
|
class OldContactUser(BaseModel):
|
||||||
|
department_ids: List[str]
|
||||||
|
open_id: str
|
||||||
|
|
||||||
|
|
||||||
|
class ContactUserUpdatedEventDetail(BaseModel):
|
||||||
|
object: ContactUser
|
||||||
|
old_object: ContactUser
|
||||||
|
|
||||||
|
|
||||||
|
class ContactUserUpdatedEvent(NoticeEvent):
|
||||||
|
__event__ = "contact.user.updated_v3"
|
||||||
|
event: ContactUserUpdatedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class ContactUserDeletedEventDetail(NoticeEvent):
|
||||||
|
object: ContactUser
|
||||||
|
old_object: OldContactUser
|
||||||
|
|
||||||
|
|
||||||
|
class ContactUserDeletedEvent(NoticeEvent):
|
||||||
|
__event__ = "contact.user.deleted_v3"
|
||||||
|
event: ContactUserDeletedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class ContactUserCreatedEventDetail(BaseModel):
|
||||||
|
object: ContactUser
|
||||||
|
|
||||||
|
|
||||||
|
class ContactUserCreatedEvent(NoticeEvent):
|
||||||
|
__event__ = "contact.user.created_v3"
|
||||||
|
event: ContactUserCreatedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class ContactDepartmentStatus(BaseModel):
|
||||||
|
is_deleted: bool
|
||||||
|
|
||||||
|
|
||||||
|
class ContactDepartment(BaseModel):
|
||||||
|
name: str
|
||||||
|
parent_department_id: str
|
||||||
|
department_id: str
|
||||||
|
open_department_id: str
|
||||||
|
leader_user_id: str
|
||||||
|
chat_id: str
|
||||||
|
order: int
|
||||||
|
status: ContactDepartmentStatus
|
||||||
|
|
||||||
|
|
||||||
|
class ContactDepartmentUpdatedEventDetail(BaseModel):
|
||||||
|
object: ContactDepartment
|
||||||
|
old_object: ContactDepartment
|
||||||
|
|
||||||
|
|
||||||
|
class ContactDepartmentUpdatedEvent(NoticeEvent):
|
||||||
|
__event__ = "contact.department.updated_v3"
|
||||||
|
event: ContactDepartmentUpdatedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class OldContactDepartment(BaseModel):
|
||||||
|
status: ContactDepartmentStatus
|
||||||
|
open_department_id: str
|
||||||
|
|
||||||
|
|
||||||
|
class ContactDepartmentDeletedEventDetail(NoticeEvent):
|
||||||
|
object: ContactDepartment
|
||||||
|
old_object: OldContactDepartment
|
||||||
|
|
||||||
|
|
||||||
|
class ContactDepartmentDeletedEvent(NoticeEvent):
|
||||||
|
__event__ = "contact.department.deleted_v3"
|
||||||
|
event: ContactDepartmentDeletedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class ContactDepartmentCreatedEventDetail(BaseModel):
|
||||||
|
object: ContactDepartment
|
||||||
|
|
||||||
|
|
||||||
|
class ContactDepartmentCreatedEvent(NoticeEvent):
|
||||||
|
__event__ = "contact.department.created_v3"
|
||||||
|
event: ContactDepartmentCreatedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class CalendarAclScope(BaseModel):
|
||||||
|
type: str
|
||||||
|
user_id: str
|
||||||
|
|
||||||
|
|
||||||
|
class CalendarAclCreatedEventDetail(BaseModel):
|
||||||
|
acl_id: str
|
||||||
|
role: str
|
||||||
|
scope: CalendarAclScope
|
||||||
|
|
||||||
|
|
||||||
|
class CalendarAclCreatedEvent(NoticeEvent):
|
||||||
|
__event__ = "calendar.calendar.acl.created_v4"
|
||||||
|
event: CalendarAclCreatedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class CalendarAclDeletedEventDetail(BaseModel):
|
||||||
|
acl_id: str
|
||||||
|
role: str
|
||||||
|
scope: CalendarAclScope
|
||||||
|
|
||||||
|
|
||||||
|
class CalendarAclDeletedEvent(NoticeEvent):
|
||||||
|
__event__ = "calendar.calendar.acl.deleted_v4"
|
||||||
|
event: CalendarAclDeletedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class CalendarChangedEvent(NoticeEvent):
|
||||||
|
__event__ = "calendar.calendar.changed_v4"
|
||||||
|
event: dict
|
||||||
|
|
||||||
|
|
||||||
|
class CalendarEventChangedEventDetail(BaseModel):
|
||||||
|
calendar_id: str
|
||||||
|
|
||||||
|
|
||||||
|
class CalendarEventChangedEvent(NoticeEvent):
|
||||||
|
__event__ = "calendar.calendar.event.changed_v4"
|
||||||
|
event: CalendarEventChangedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFileReadEventDetail(BaseModel):
|
||||||
|
file_token: str
|
||||||
|
file_type: str
|
||||||
|
operator_id_list: List[UserId]
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFileReadEvent(NoticeEvent):
|
||||||
|
__event__ = "drive.file.read_v1"
|
||||||
|
event: DriveFileReadEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFileTitleUpdatedEventDetail(BaseModel):
|
||||||
|
file_token: str
|
||||||
|
file_type: str
|
||||||
|
operator_id: UserId
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFileTitleUpdatedEvent(NoticeEvent):
|
||||||
|
__event__ = "drive.file.title_updated_v1"
|
||||||
|
event: DriveFileTitleUpdatedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFilePermissionMemberAddedEventDetail(BaseModel):
|
||||||
|
chat_list: List[str]
|
||||||
|
file_token: str
|
||||||
|
file_type: str
|
||||||
|
operator_id: UserId
|
||||||
|
user_list: List[UserId]
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFilePermissionMemberAddedEvent(NoticeEvent):
|
||||||
|
__event__ = "drive.file.permission_member_added_v1"
|
||||||
|
event: DriveFilePermissionMemberAddedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFilePermissionMemberRemovedEventDetail(BaseModel):
|
||||||
|
chat_list: List[str]
|
||||||
|
file_token: str
|
||||||
|
file_type: str
|
||||||
|
operator_id: UserId
|
||||||
|
user_list: List[UserId]
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFilePermissionMemberRemovedEvent(NoticeEvent):
|
||||||
|
__event__ = "drive.file.permission_member_removed_v1"
|
||||||
|
event: DriveFilePermissionMemberRemovedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFileTrashedEventDetail(BaseModel):
|
||||||
|
file_token: str
|
||||||
|
file_type: str
|
||||||
|
operator_id: UserId
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFileTrashedEvent(NoticeEvent):
|
||||||
|
__event__ = "drive.file.trashed_v1"
|
||||||
|
event: DriveFileTrashedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFileDeletedEventDetail(BaseModel):
|
||||||
|
file_token: str
|
||||||
|
file_type: str
|
||||||
|
operator_id: UserId
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFileDeletedEvent(NoticeEvent):
|
||||||
|
__event__ = "drive.file.deleted_v1"
|
||||||
|
event: DriveFileDeletedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFileEditedEventDetail(BaseModel):
|
||||||
|
file_token: str
|
||||||
|
file_type: str
|
||||||
|
operator_id_list: List[UserId]
|
||||||
|
subscriber_id_list: List[UserId]
|
||||||
|
|
||||||
|
|
||||||
|
class DriveFileEditedEvent(NoticeEvent):
|
||||||
|
__event__ = "drive.file.edit_v1"
|
||||||
|
event: DriveFileEditedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class MeetingRoomCreatedEventDetail(BaseModel):
|
||||||
|
room_id: str
|
||||||
|
room_name: str
|
||||||
|
|
||||||
|
|
||||||
|
class MeetingRoomCreatedEvent(NoticeEvent):
|
||||||
|
__event__ = "meeting_room.meeting_room.created_v1"
|
||||||
|
event: MeetingRoomCreatedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class MeetingRoomUpdatedEventDetail(BaseModel):
|
||||||
|
room_id: str
|
||||||
|
room_name: str
|
||||||
|
|
||||||
|
|
||||||
|
class MeetingRoomUpdatedEvent(NoticeEvent):
|
||||||
|
__event__ = "meeting_room.meeting_room.updated_v1"
|
||||||
|
event: MeetingRoomUpdatedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class MeetingRoomDeletedEventDetail(BaseModel):
|
||||||
|
room_id: str
|
||||||
|
room_name: str
|
||||||
|
|
||||||
|
|
||||||
|
class MeetingRoomDeletedEvent(NoticeEvent):
|
||||||
|
__event__ = "meeting_room.meeting_room.deleted_v1"
|
||||||
|
event: MeetingRoomDeletedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class MeetingRoomStatusChangedEventDetail(BaseModel):
|
||||||
|
room_id: str
|
||||||
|
room_name: str
|
||||||
|
|
||||||
|
|
||||||
|
class MeetingRoomStatusChangedEvent(NoticeEvent):
|
||||||
|
__event__ = "meeting_room.meeting_room.status_changed_v1"
|
||||||
|
event: MeetingRoomStatusChangedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class MeetingUser(BaseModel):
|
||||||
|
id: UserId
|
||||||
|
user_role: Optional[int]
|
||||||
|
user_type: Optional[int]
|
||||||
|
|
||||||
|
|
||||||
|
class Meeting(BaseModel):
|
||||||
|
id: str
|
||||||
|
topic: str
|
||||||
|
meeting_no: str
|
||||||
|
start_time: Optional[str]
|
||||||
|
end_time: Optional[str]
|
||||||
|
host_user: Optional[MeetingUser]
|
||||||
|
owner: MeetingUser
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingStartedEventDetail(BaseModel):
|
||||||
|
meeting: Meeting
|
||||||
|
operator: MeetingUser
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingStartedEvent(NoticeEvent):
|
||||||
|
__event__ = "vc.meeting.meeting_started_v1"
|
||||||
|
event: VCMeetingStartedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingEndedEventDetail(BaseModel):
|
||||||
|
meeting: Meeting
|
||||||
|
operator: MeetingUser
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingEndedEvent(NoticeEvent):
|
||||||
|
__event__ = "vc.meeting.meeting_ended_v1"
|
||||||
|
event: VCMeetingEndedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingJoinedEventDetail(BaseModel):
|
||||||
|
meeting: Meeting
|
||||||
|
operator: MeetingUser
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingJoinedEvent(NoticeEvent):
|
||||||
|
__event__ = "vc.meeting.join_meeting_v1"
|
||||||
|
event: VCMeetingJoinedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingLeftEventDetail(BaseModel):
|
||||||
|
meeting: Meeting
|
||||||
|
operator: MeetingUser
|
||||||
|
leave_reason: int
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingLeftEvent(NoticeEvent):
|
||||||
|
__event__ = "vc.meeting.leave_meeting_v1"
|
||||||
|
event: VCMeetingLeftEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingRecordingStartedEventDetail(BaseModel):
|
||||||
|
meeting: Meeting
|
||||||
|
operator: MeetingUser
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingRecordingStartedEvent(NoticeEvent):
|
||||||
|
__event__ = "vc.meeting.recording_started_v1"
|
||||||
|
event: VCMeetingRecordingStartedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingRecordingEndedEventDetail(BaseModel):
|
||||||
|
meeting: Meeting
|
||||||
|
operator: MeetingUser
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingRecordingEndedEvent(NoticeEvent):
|
||||||
|
__event__ = "vc.meeting.recording_ended_v1"
|
||||||
|
event: VCMeetingRecordingEndedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingRecordingReadyEventDetail(BaseModel):
|
||||||
|
meeting: Meeting
|
||||||
|
url: str
|
||||||
|
duration: str
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingRecordingReadyEvent(NoticeEvent):
|
||||||
|
__event__ = "vc.meeting.recording_ready_v1"
|
||||||
|
event: VCMeetingRecordingReadyEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingShareStartedEventDetail(BaseModel):
|
||||||
|
meeting: Meeting
|
||||||
|
operator: MeetingUser
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingShareStartedEvent(NoticeEvent):
|
||||||
|
__event__ = "vc.meeting.share_started_v1"
|
||||||
|
event: VCMeetingShareStartedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingShareEndedEventDetail(BaseModel):
|
||||||
|
meeting: Meeting
|
||||||
|
operator: MeetingUser
|
||||||
|
|
||||||
|
|
||||||
|
class VCMeetingShareEndedEvent(NoticeEvent):
|
||||||
|
__event__ = "vc.meeting.share_ended_v1"
|
||||||
|
event: VCMeetingShareEndedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class AttendanceUserFlowCreatedEventDetail(BaseModel):
|
||||||
|
bssid: str
|
||||||
|
check_time: str
|
||||||
|
comment: str
|
||||||
|
employee_id: str
|
||||||
|
employee_no: str
|
||||||
|
is_field: bool
|
||||||
|
is_wifi: bool
|
||||||
|
latitude: float
|
||||||
|
location_name: str
|
||||||
|
longitude: float
|
||||||
|
photo_urls: Optional[List[str]]
|
||||||
|
record_id: str
|
||||||
|
ssid: str
|
||||||
|
type: int
|
||||||
|
|
||||||
|
|
||||||
|
class AttendanceUserFlowCreatedEvent(NoticeEvent):
|
||||||
|
__event__ = "attendance.user_flow.created_v1"
|
||||||
|
event: AttendanceUserFlowCreatedEventDetail
|
||||||
|
|
||||||
|
|
||||||
|
class AttendanceUserTaskStatusDiff(BaseModel):
|
||||||
|
before_status: str
|
||||||
|
before_supplement: str
|
||||||
|
current_status: str
|
||||||
|
current_supplement: str
|
||||||
|
index: int
|
||||||
|
work_type: str
|
||||||
|
|
||||||
|
|
||||||
|
class AttendanceUserTaskUpdatedEventDetail(BaseModel):
|
||||||
|
date: int
|
||||||
|
employee_id: str
|
||||||
|
employee_no: str
|
||||||
|
group_id: str
|
||||||
|
shift_id: str
|
||||||
|
status_changes: List[AttendanceUserTaskStatusDiff]
|
||||||
|
task_id: str
|
||||||
|
time_zone: str
|
||||||
|
|
||||||
|
|
||||||
|
class AttendanceUserTaskUpdatedEvent(NoticeEvent):
|
||||||
|
__event__ = "attendance.user_task.updated_v1"
|
||||||
|
event: AttendanceUserTaskUpdatedEventDetail
|
||||||
|
|
||||||
|
|
||||||
_t = StringTrie(separator=".")
|
_t = StringTrie(separator=".")
|
||||||
|
|
||||||
# define `model` first to avoid globals changing while `for`
|
# define `model` first to avoid globals changing while `for`
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
from nonebot.adapters.feishu.event import MessageEvent
|
|
||||||
from nonebot.rule import to_me
|
|
||||||
from nonebot.plugin import on_command
|
from nonebot.plugin import on_command
|
||||||
from nonebot.adapters.feishu import Bot as FeishuBot, MessageSegment, MessageEvent
|
from nonebot.typing import T_State
|
||||||
|
from nonebot.adapters.feishu import Bot as FeishuBot, MessageEvent
|
||||||
|
|
||||||
helper = on_command("say")
|
helper = on_command("say")
|
||||||
|
|
||||||
|
|
||||||
@helper.handle()
|
@helper.handle()
|
||||||
async def feishu_helper(bot: FeishuBot, event: MessageEvent):
|
async def feishu_helper(bot: FeishuBot, event: MessageEvent, state: T_State):
|
||||||
message = event.get_message()
|
message = event.get_message()
|
||||||
await helper.finish(message, at_sender=True)
|
await helper.finish(message, at_sender=True)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user