diff --git a/shortcuts/vc/vc_meeting_events.go b/shortcuts/vc/vc_meeting_events.go index e4f20f746..e840670f8 100644 --- a/shortcuts/vc/vc_meeting_events.go +++ b/shortcuts/vc/vc_meeting_events.go @@ -365,10 +365,10 @@ func meetingEventsIdentityFromParticipant(participant map[string]interface{}, se } } if identity.ParticipantType == "" { - identity.ParticipantType = "human" + identity.ParticipantType = "unknown" } if identity.Role == "" { - identity.Role = "participant" + identity.Role = "unknown" } identity.Label = identityLabel(identity) return identity @@ -407,8 +407,32 @@ func meetingEventsParticipantTypeFromUserType(raw string) string { switch raw { case "1", "user", "human": return "human" - case "2", "10", "bot", "app": + case "2", "room": + return "room" + case "3", "doc_user": + return "doc_user" + case "4", "neo_user": + return "neo_user" + case "5", "neo_guest_user": + return "neo_guest_user" + case "6", "pstn": + return "pstn" + case "7", "sip": + return "sip" + case "8", "share_box_user": + return "share_box_user" + case "9", "open_platform_app": + return "app" + case "10", "bot", "app": return "bot" + case "100", "auto_detect": + return "auto_detect" + case "101", "room_detect": + return "room_detect" + case "102", "sid_detect": + return "human" + case "103", "webinar_attendee": + return "webinar_attendee" case "": return "" default: @@ -441,12 +465,14 @@ func meetingEventsRoleFromEventUserRole(raw string) string { return "participant" case "2", "host": return "host" + case "3", "co_host", "cohost": + return "co_host" case "4", "bot", "app": return "bot" case "", "0": return "" default: - return raw + return "unknown" } } @@ -1139,12 +1165,14 @@ func needsColon(description string) bool { func leaveAction(item map[string]interface{}) string { switch int(common.GetFloat(item, "leave_reason")) { + case leaveReasonUserLeft: + return "离开了会议" case leaveReasonMeetingEnded: return "因会议结束离开了会议" case leaveReasonKicked: return "被移出了会议" default: - return "离开了会议" + return "因未知原因离开了会议" } } diff --git a/shortcuts/vc/vc_meeting_events_test.go b/shortcuts/vc/vc_meeting_events_test.go index 533cd1f35..cc79beb61 100644 --- a/shortcuts/vc/vc_meeting_events_test.go +++ b/shortcuts/vc/vc_meeting_events_test.go @@ -1327,9 +1327,11 @@ func TestLeaveAction(t *testing.T) { item map[string]interface{} want string }{ + {name: "user left", item: map[string]interface{}{"leave_reason": leaveReasonUserLeft}, want: "离开了会议"}, {name: "meeting ended", item: map[string]interface{}{"leave_reason": leaveReasonMeetingEnded}, want: "因会议结束离开了会议"}, {name: "kicked", item: map[string]interface{}{"leave_reason": leaveReasonKicked}, want: "被移出了会议"}, - {name: "default", item: map[string]interface{}{"leave_reason": leaveReasonUserLeft}, want: "离开了会议"}, + {name: "unknown", item: map[string]interface{}{"leave_reason": 0}, want: "因未知原因离开了会议"}, + {name: "future", item: map[string]interface{}{"leave_reason": 99}, want: "因未知原因离开了会议"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -1340,6 +1342,27 @@ func TestLeaveAction(t *testing.T) { } } +func TestMeetingEventsEndSignalOnlyAcceptsMeetingEndedReason(t *testing.T) { + for _, tt := range []struct { + name string + leaveReason int + wantEnded bool + }{ + {name: "unknown", leaveReason: 0, wantEnded: false}, + {name: "user left", leaveReason: leaveReasonUserLeft, wantEnded: false}, + {name: "meeting ended", leaveReason: leaveReasonMeetingEnded, wantEnded: true}, + {name: "kicked", leaveReason: leaveReasonKicked, wantEnded: false}, + {name: "future", leaveReason: 99, wantEnded: false}, + } { + t.Run(tt.name, func(t *testing.T) { + got := meetingEventsEndSignalFromEvents([]interface{}{participantLeftEventWithReason(tt.leaveReason)}) + if got.Ended != tt.wantEnded { + t.Fatalf("meetingEventsEndSignalFromEvents().Ended = %t, want %t", got.Ended, tt.wantEnded) + } + }) + } +} + func TestMeetingEventUserWithID(t *testing.T) { tests := []struct { name string @@ -1387,6 +1410,27 @@ func TestMeetingEventsIdentityFromParticipant_UserRoleParticipant(t *testing.T) } } +func TestMeetingEventsIdentityFromParticipant_CoHostAndUnknownRole(t *testing.T) { + tests := []struct { + name string + role interface{} + want string + }{ + {name: "co host", role: 3, want: "co_host"}, + {name: "future", role: 99, want: "unknown"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := meetingEventsIdentityFromParticipant(map[string]interface{}{ + "id": "u1", "user_name": "Alice", "user_type": 1, "user_role": tt.role, + }, meetingEventsIdentity{}) + if got.Role != tt.want { + t.Fatalf("identity = %#v, want role=%q", got, tt.want) + } + }) + } +} + func TestMeetingEventsIdentityFromParticipant_UserTypeApp(t *testing.T) { got := meetingEventsIdentityFromParticipant(map[string]interface{}{ "id": "ou_app", @@ -1400,6 +1444,40 @@ func TestMeetingEventsIdentityFromParticipant_UserTypeApp(t *testing.T) { } } +func TestMeetingEventsIdentityFromParticipant_KnownUserTypes(t *testing.T) { + tests := []struct { + name string + userType int + want string + }{ + {name: "human", userType: 1, want: "human"}, + {name: "room", userType: 2, want: "room"}, + {name: "doc user", userType: 3, want: "doc_user"}, + {name: "neo user", userType: 4, want: "neo_user"}, + {name: "neo guest", userType: 5, want: "neo_guest_user"}, + {name: "pstn", userType: 6, want: "pstn"}, + {name: "sip", userType: 7, want: "sip"}, + {name: "share box", userType: 8, want: "share_box_user"}, + {name: "open platform app", userType: 9, want: "app"}, + {name: "meeting bot", userType: 10, want: "bot"}, + {name: "auto detect", userType: 100, want: "auto_detect"}, + {name: "room detect", userType: 101, want: "room_detect"}, + {name: "sid detect", userType: 102, want: "human"}, + {name: "webinar attendee", userType: 103, want: "webinar_attendee"}, + {name: "future", userType: 999, want: "unknown"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := meetingEventsIdentityFromParticipant(map[string]interface{}{ + "id": "u1", "user_name": "Alice", "user_type": tt.userType, "user_role": 1, + }, meetingEventsIdentity{}) + if got.ParticipantType != tt.want { + t.Fatalf("identity = %#v, want participant_type=%q", got, tt.want) + } + }) + } +} + func TestMeetingEventsIdentityFromParticipant_UnknownUserType(t *testing.T) { got := meetingEventsIdentityFromParticipant(map[string]interface{}{ "id": "u_unknown", @@ -1420,7 +1498,7 @@ func TestMeetingEventsIdentityFromParticipant_IgnoresGenericTypeField(t *testing "type": "bot", }, meetingEventsIdentity{}) - if got.ParticipantType != "human" { + if got.ParticipantType != "unknown" { t.Fatalf("identity = %#v, generic type field should not drive participant_type", got) } }