diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs index 2cd94b6c..76bbcbe3 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs @@ -496,6 +496,88 @@ namespace SKIT.FlurlHttpClient.Wechat.Work } #endregion + #region MRA + /// + /// 异步调用 [POST] /cgi-bin/meeting/mra/query_status 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/98786 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinMeetingMRAQueryStatusAsync(this WechatWorkClient client, Models.CgibinMeetingMRAQueryStatusRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "cgi-bin", "meeting", "mra", "query_status") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/meeting/mra/set_default_layout 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/98787 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinMeetingMRASetDefaultLayoutAsync(this WechatWorkClient client, Models.CgibinMeetingMRASetDefaultLayoutRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "cgi-bin", "meeting", "mra", "set_default_layout") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/meeting/mra/set_raise_hand 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/98788 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinMeetingMRASetRaiseHandAsync(this WechatWorkClient client, Models.CgibinMeetingMRASetRaiseHandRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "cgi-bin", "meeting", "mra", "set_raise_hand") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/meeting/mra/hangup 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/98789 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinMeetingMRAHangupAsync(this WechatWorkClient client, Models.CgibinMeetingMRAHangupRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "cgi-bin", "meeting", "mra", "hangup") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #endregion + #region Phone /// /// 异步调用 [POST] /cgi-bin/meeting/phone/callout 接口。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.cs new file mode 100644 index 00000000..5d08188b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.cs @@ -0,0 +1,35 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/mra/hangup 接口的请求。 + /// + public class CgibinMeetingMRAHangupRequest : WechatWorkRequest + { + public static class Types + { + public class MRA + { + /// + /// 获取或设置会议的成员临时 ID。 + /// + [Newtonsoft.Json.JsonProperty("tmp_openid")] + [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")] + public string TempOpenId { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置会议 ID。 + /// + [Newtonsoft.Json.JsonProperty("meetingid")] + [System.Text.Json.Serialization.JsonPropertyName("meetingid")] + public string MeetingId { get; set; } = string.Empty; + + /// + /// 获取或设置会议连接器信息。 + /// + [Newtonsoft.Json.JsonProperty("mra")] + [System.Text.Json.Serialization.JsonPropertyName("mra")] + public Types.MRA MRA { get; set; } = new Types.MRA(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupResponse.cs new file mode 100644 index 00000000..534fbee4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/mra/hangup 接口的响应。 + /// + public class CgibinMeetingMRAHangupResponse : WechatWorkResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.cs new file mode 100644 index 00000000..ef62a660 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/mra/query_status 接口的请求。 + /// + public class CgibinMeetingMRAQueryStatusRequest : WechatWorkRequest + { + /// + /// 获取或设置会议 ID。 + /// + [Newtonsoft.Json.JsonProperty("meetingid")] + [System.Text.Json.Serialization.JsonPropertyName("meetingid")] + public string MeetingId { get; set; } = string.Empty; + + /// + /// 获取或设置会议的成员临时 ID。 + /// + [Newtonsoft.Json.JsonProperty("tmp_openid")] + [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")] + public string TempOpenId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.cs new file mode 100644 index 00000000..350ab2a3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.cs @@ -0,0 +1,85 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/mra/query_status 接口的响应。 + /// + public class CgibinMeetingMRAQueryStatusResponse : WechatWorkResponse + { + /// + /// 获取或设置会议的成员临时 ID。 + /// + [Newtonsoft.Json.JsonProperty("tmp_openid")] + [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")] + public string TempOpenId { get; set; } = default!; + + /// + /// 获取或设置终端设备类型。 + /// + [Newtonsoft.Json.JsonProperty("instance_id")] + [System.Text.Json.Serialization.JsonPropertyName("instance_id")] + public int InstanceId { get; set; } + + /// + /// 获取或设置成员角色。 + /// + [Newtonsoft.Json.JsonProperty("user_role")] + [System.Text.Json.Serialization.JsonPropertyName("user_role")] + public int UserRole { get; set; } + + /// + /// 获取或设置网络研讨会成员角色。 + /// + [Newtonsoft.Json.JsonProperty("webinar_member_role")] + [System.Text.Json.Serialization.JsonPropertyName("webinar_member_role")] + public int? WebinarMemberRole { get; set; } + + /// + /// 获取或设置 IP 地址。 + /// + [Newtonsoft.Json.JsonProperty("ip")] + [System.Text.Json.Serialization.JsonPropertyName("ip")] + public string? IpAddress { get; set; } + + /// + /// 获取或设置显示名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string? DisplayName { get; set; } + + /// + /// 获取或设置是否开启麦克风。 + /// + [Newtonsoft.Json.JsonProperty("audio_state")] + [System.Text.Json.Serialization.JsonPropertyName("audio_state")] + public bool IsAudioOpen { get; set; } + + /// + /// 获取或设置是否开启摄像头。 + /// + [Newtonsoft.Json.JsonProperty("video_state")] + [System.Text.Json.Serialization.JsonPropertyName("video_state")] + public bool IsVideoOpen { get; set; } + + /// + /// 获取或设置是否屏幕共享。 + /// + [Newtonsoft.Json.JsonProperty("screen_shared_state")] + [System.Text.Json.Serialization.JsonPropertyName("screen_shared_state")] + public bool IsScreenShared { get; set; } + + /// + /// 获取或设置默认分屏设置。 + /// + [Newtonsoft.Json.JsonProperty("default_layout")] + [System.Text.Json.Serialization.JsonPropertyName("default_layout")] + public int DefaultLayout { get; set; } + + /// + /// 获取或设置是否举手。 + /// + [Newtonsoft.Json.JsonProperty("raise_hands_state")] + [System.Text.Json.Serialization.JsonPropertyName("raise_hands_state")] + public bool IsRaiseHand { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.cs new file mode 100644 index 00000000..18e26df1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.cs @@ -0,0 +1,49 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/mra/set_default_layout 接口的请求。 + /// + public class CgibinMeetingMRASetDefaultLayoutRequest : WechatWorkRequest + { + public static class Types + { + public class MRA + { + /// + /// 获取或设置会议的成员临时 ID。 + /// + [Newtonsoft.Json.JsonProperty("tmp_openid")] + [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")] + public string TempOpenId { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置会议 ID。 + /// + [Newtonsoft.Json.JsonProperty("meetingid")] + [System.Text.Json.Serialization.JsonPropertyName("meetingid")] + public string MeetingId { get; set; } = string.Empty; + + /// + /// 获取或设置默认分屏设置。 + /// + [Newtonsoft.Json.JsonProperty("default_layout")] + [System.Text.Json.Serialization.JsonPropertyName("default_layout")] + public int DefaultLayout { get; set; } + + /// + /// 获取或设置默认非视频与会者在分屏中显示方式。 + /// + [Newtonsoft.Json.JsonProperty("default_novideo_user")] + [System.Text.Json.Serialization.JsonPropertyName("default_novideo_user")] + public int DefaultNoVideoUser { get; set; } + + /// + /// 获取或设置会议连接器信息。 + /// + [Newtonsoft.Json.JsonProperty("mra")] + [System.Text.Json.Serialization.JsonPropertyName("mra")] + public Types.MRA MRA { get; set; } = new Types.MRA(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutResponse.cs new file mode 100644 index 00000000..d59a8080 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/mra/set_default_layout 接口的响应。 + /// + public class CgibinMeetingMRASetDefaultLayoutResponse : WechatWorkResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.cs new file mode 100644 index 00000000..aa955fa6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.cs @@ -0,0 +1,42 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/mra/set_raise_hand 接口的请求。 + /// + public class CgibinMeetingMRASetRaiseHandRequest : WechatWorkRequest + { + public static class Types + { + public class MRA + { + /// + /// 获取或设置会议的成员临时 ID。 + /// + [Newtonsoft.Json.JsonProperty("tmp_openid")] + [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")] + public string TempOpenId { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置会议 ID。 + /// + [Newtonsoft.Json.JsonProperty("meetingid")] + [System.Text.Json.Serialization.JsonPropertyName("meetingid")] + public string MeetingId { get; set; } = string.Empty; + + /// + /// 获取或设置是否举手。 + /// + [Newtonsoft.Json.JsonProperty("raise_hand")] + [System.Text.Json.Serialization.JsonPropertyName("raise_hand")] + public bool IsRaiseHand { get; set; } + + /// + /// 获取或设置会议连接器信息。 + /// + [Newtonsoft.Json.JsonProperty("mra")] + [System.Text.Json.Serialization.JsonPropertyName("mra")] + public Types.MRA MRA { get; set; } = new Types.MRA(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandResponse.cs new file mode 100644 index 00000000..7cf60714 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/mra/set_raise_hand 接口的响应。 + /// + public class CgibinMeetingMRASetRaiseHandResponse : WechatWorkResponse + { + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.json new file mode 100644 index 00000000..d0bfbfc9 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.json @@ -0,0 +1,6 @@ +{ + "meetingid": "MEETINGID", + "mra": { + "tmp_openid": "TMP_OPENID" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.json new file mode 100644 index 00000000..e6a4788d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.json @@ -0,0 +1,4 @@ +{ + "meetingid": "MEETINGID", + "tmp_openid": "TMP_OPENID" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.json new file mode 100644 index 00000000..c3d519fd --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.json @@ -0,0 +1,15 @@ +{ + "errcode": 0, + "errmsg": "ok", + "tmp_openid": "TMP_OPENID", + "instance_id": 9, + "user_role": 0, + "webinar_member_role": 0, + "ip": "192.168.2.2", + "name": "user2", + "audio_state": true, + "video_state": false, + "screen_shared_state": false, + "default_layout": 1, + "raise_hands_state": false +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.json new file mode 100644 index 00000000..034e250d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.json @@ -0,0 +1,8 @@ +{ + "meetingid": "MEETINGID", + "default_layout": 2, + "default_novideo_user": 1, + "mra": { + "tmp_openid": "TMP_OPENID" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.json new file mode 100644 index 00000000..69a55ff7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.json @@ -0,0 +1,7 @@ +{ + "meetingid": "MEETINGID", + "raise_hand": true, + "mra": { + "tmp_openid": "TMP_OPENID" + } +}