Files
wehub-resource-sync bf9395e022
CI / license-header (push) Has been skipped
CI / e2e-dry-run (push) Has been skipped
CI / fast-gate (push) Failing after 0s
Test PR Label Logic / test-pr-labels (push) Failing after 1s
Skill Format Check / check-format (push) Failing after 2s
CI / security (push) Failing after 5s
CI / unit-test (push) Has been skipped
CI / lint (push) Has been skipped
CI / script-test (push) Has been skipped
CI / deterministic-gate (push) Has been skipped
CI / coverage (push) Has been skipped
CI / results (push) Has been cancelled
CI / deadcode (push) Has been cancelled
CI / e2e-live (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:22:54 +08:00

185 lines
5.9 KiB
Go

// Copyright (c) 2026 Lark Technologies Pte. Ltd.
// SPDX-License-Identifier: MIT
package im
import (
"reflect"
"github.com/larksuite/cli/internal/event/schemas"
larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1"
)
// nativeIMKey curates metadata for a Native IM event; fieldOverrides paths are JSON Pointer anchored at the V2-wrapped schema (start with /event/...).
type nativeIMKey struct {
key string
title string
description string
scopes []string
bodyType reflect.Type
fieldOverrides map[string]schemas.FieldMeta
}
// userIDOv returns open_id/union_id/user_id overrides for a UserID object at prefix.
func userIDOv(prefix string) map[string]schemas.FieldMeta {
return map[string]schemas.FieldMeta{
prefix + "/open_id": {Kind: "open_id"},
prefix + "/union_id": {Kind: "union_id"},
prefix + "/user_id": {Kind: "user_id"},
}
}
// mergeOv merges FieldMeta maps left-to-right (later wins).
func mergeOv(ms ...map[string]schemas.FieldMeta) map[string]schemas.FieldMeta {
out := map[string]schemas.FieldMeta{}
for _, m := range ms {
for k, v := range m {
out[k] = v
}
}
return out
}
var nativeIMKeys = []nativeIMKey{
{
key: "im.message.message_read_v1",
title: "Message read",
description: "Triggered after a user reads a P2P message sent by the bot",
scopes: []string{"im:message:readonly", "im:message"},
bodyType: reflect.TypeOf(larkim.P2MessageReadV1Data{}),
fieldOverrides: mergeOv(
userIDOv("/event/reader/reader_id"),
map[string]schemas.FieldMeta{
"/event/reader/read_time": {Kind: "timestamp_ms"},
"/event/message_id_list/*": {Kind: "message_id"},
},
),
},
{
key: "im.message.reaction.created_v1",
title: "Reaction added",
description: "Triggered when a reaction is added to a message",
scopes: []string{"im:message:readonly", "im:message.reactions:read"},
bodyType: reflect.TypeOf(larkim.P2MessageReactionCreatedV1Data{}),
fieldOverrides: mergeOv(
userIDOv("/event/user_id"),
map[string]schemas.FieldMeta{
"/event/message_id": {Kind: "message_id"},
"/event/action_time": {Kind: "timestamp_ms"},
},
),
},
{
key: "im.message.reaction.deleted_v1",
title: "Reaction removed",
description: "Triggered when a reaction is removed from a message",
scopes: []string{"im:message:readonly", "im:message.reactions:read"},
bodyType: reflect.TypeOf(larkim.P2MessageReactionDeletedV1Data{}),
fieldOverrides: mergeOv(
userIDOv("/event/user_id"),
map[string]schemas.FieldMeta{
"/event/message_id": {Kind: "message_id"},
"/event/action_time": {Kind: "timestamp_ms"},
},
),
},
{
key: "im.chat.member.bot.added_v1",
title: "Bot added to chat",
description: "Triggered when the bot is added to a chat",
scopes: []string{"im:chat.members:bot_access"},
bodyType: reflect.TypeOf(larkim.P2ChatMemberBotAddedV1Data{}),
fieldOverrides: mergeOv(
userIDOv("/event/operator_id"),
map[string]schemas.FieldMeta{
"/event/chat_id": {Kind: "chat_id"},
},
),
},
{
key: "im.chat.member.bot.deleted_v1",
title: "Bot removed from chat",
description: "Triggered after the bot is removed from a chat",
scopes: []string{"im:chat.members:bot_access"},
bodyType: reflect.TypeOf(larkim.P2ChatMemberBotDeletedV1Data{}),
fieldOverrides: mergeOv(
userIDOv("/event/operator_id"),
map[string]schemas.FieldMeta{
"/event/chat_id": {Kind: "chat_id"},
},
),
},
{
key: "im.chat.member.user.added_v1",
title: "User added to chat",
description: "Triggered when a new user joins a chat (including topic chats)",
scopes: []string{"im:chat.members:read"},
bodyType: reflect.TypeOf(larkim.P2ChatMemberUserAddedV1Data{}),
fieldOverrides: mergeOv(
userIDOv("/event/operator_id"),
userIDOv("/event/users/*/user_id"),
map[string]schemas.FieldMeta{
"/event/chat_id": {Kind: "chat_id"},
},
),
},
{
key: "im.chat.member.user.withdrawn_v1",
title: "User invite withdrawn",
description: "Triggered after a pending user invite is withdrawn",
scopes: []string{"im:chat.members:read"},
bodyType: reflect.TypeOf(larkim.P2ChatMemberUserWithdrawnV1Data{}),
fieldOverrides: mergeOv(
userIDOv("/event/operator_id"),
userIDOv("/event/users/*/user_id"),
map[string]schemas.FieldMeta{
"/event/chat_id": {Kind: "chat_id"},
},
),
},
{
key: "im.chat.member.user.deleted_v1",
title: "User left chat",
description: "Triggered when a user leaves or is removed from a chat",
scopes: []string{"im:chat.members:read"},
bodyType: reflect.TypeOf(larkim.P2ChatMemberUserDeletedV1Data{}),
fieldOverrides: mergeOv(
userIDOv("/event/operator_id"),
userIDOv("/event/users/*/user_id"),
map[string]schemas.FieldMeta{
"/event/chat_id": {Kind: "chat_id"},
},
),
},
{
key: "im.chat.updated_v1",
title: "Chat updated",
description: "Triggered after chat settings (owner, avatar, name, permissions, etc.) are updated",
scopes: []string{"im:chat:read"},
bodyType: reflect.TypeOf(larkim.P2ChatUpdatedV1Data{}),
fieldOverrides: mergeOv(
userIDOv("/event/operator_id"),
userIDOv("/event/before_change/owner_id"),
userIDOv("/event/after_change/owner_id"),
userIDOv("/event/moderator_list/added_member_list/*/user_id"),
userIDOv("/event/moderator_list/removed_member_list/*/user_id"),
map[string]schemas.FieldMeta{
"/event/chat_id": {Kind: "chat_id"},
},
),
},
{
key: "im.chat.disbanded_v1",
title: "Chat disbanded",
description: "Triggered after a chat is disbanded",
scopes: []string{"im:chat:read"},
bodyType: reflect.TypeOf(larkim.P2ChatDisbandedV1Data{}),
fieldOverrides: mergeOv(
userIDOv("/event/operator_id"),
map[string]schemas.FieldMeta{
"/event/chat_id": {Kind: "chat_id"},
},
),
},
}