Files
g.hnyhua.cn/Jiguang.JPush/ScheduleClient.cs
2026-02-07 15:48:27 +08:00

359 lines
15 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Jiguang.JPush.Model;
using System.Threading.Tasks;
using System;
using Newtonsoft.Json.Linq;
using System.Net.Http;
using System.Text;
using Newtonsoft.Json;
namespace Jiguang.JPush
{
public class ScheduleClient
{
public const string BASE_URL_SCHEDULE_DEFAULT = "https://api.jpush.cn/v3/schedules";
public const string BASE_URL_SCHEDULE_BEIJING = "https://bjapi.push.jiguang.cn/v3/push/schedules";
private string BASE_URL = BASE_URL_SCHEDULE_DEFAULT;
private JsonSerializer jsonSerializer = new JsonSerializer
{
NullValueHandling = NullValueHandling.Ignore
};
/// <summary>
/// 设置 Schedule API 的调用地址。
/// </summary>
/// <param name="url"><see cref="BASE_URL_SCHEDULE_DEFAULT"/> or <see cref="BASE_URL_SCHEDULE_BEIJING"/></param>
public void SetBaseURL(string url)
{
BASE_URL = url;
}
/// <summary>
/// 创建定时任务。
/// </summary>
/// <param name="json">
/// 自己构造的请求 json 字符串。
/// <see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_push_schedule/#schedule"/>
/// </param>
public async Task<HttpResponse> CreateScheduleTaskAsync(string json)
{
if (string.IsNullOrEmpty(json))
throw new ArgumentNullException(nameof(json));
HttpContent requestContent = new StringContent(json, Encoding.UTF8);
HttpResponseMessage msg = await JPushClient.HttpClient.PostAsync(BASE_URL, requestContent).ConfigureAwait(false);
string responseContent = await msg.Content.ReadAsStringAsync().ConfigureAwait(false);
return new HttpResponse(msg.StatusCode, msg.Headers, responseContent);
}
/// <summary>
/// <see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_push_schedule/#_4"/>
/// </summary>
public async Task<HttpResponse> CreateSingleScheduleTaskAsync(string name, PushPayload pushPayload, string triggeringTime)
{
if (string.IsNullOrEmpty(name))
throw new ArgumentNullException(nameof(name));
if (pushPayload == null)
throw new ArgumentNullException(nameof(pushPayload));
if (string.IsNullOrEmpty(triggeringTime))
throw new ArgumentNullException(nameof(triggeringTime));
JObject requestJson = new JObject
{
["name"] = name,
["enabled"] = true,
["push"] = JObject.FromObject(pushPayload, jsonSerializer),
["trigger"] = new JObject
{
["single"] = new JObject
{
["time"] = triggeringTime
}
}
};
return await CreateScheduleTaskAsync(requestJson.ToString()).ConfigureAwait(false);
}
/// <summary>
/// 创建单次定时任务。
/// </summary>
/// <param name="name">表示 schedule 任务的名字,由 schedule-api 在用户成功创建 schedule 任务后返回,不得超过 255 字节,由汉字、字母、数字、下划线组成。</param>
/// <param name="pushPayload">推送对象</param>
/// <param name="trigger">触发器</param>
public HttpResponse CreateSingleScheduleTask(string name, PushPayload pushPayload, string triggeringTime)
{
Task<HttpResponse> task = Task.Run(() => CreateSingleScheduleTaskAsync(name, pushPayload, triggeringTime));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="CreatePeriodicalScheduleTask(string, PushPayload, Trigger)"/>
/// </summary>
public async Task<HttpResponse> CreatePeriodicalScheduleTaskAsync(string name, PushPayload pushPayload, Trigger trigger)
{
if (string.IsNullOrEmpty(name))
throw new ArgumentNullException(nameof(name));
if (pushPayload == null)
throw new ArgumentNullException(nameof(pushPayload));
if (trigger == null)
throw new ArgumentNullException(nameof(trigger));
JObject requestJson = new JObject
{
["name"] = name,
["enabled"] = true,
["push"] = JObject.FromObject(pushPayload, jsonSerializer),
["trigger"] = new JObject()
{
["periodical"] = JObject.FromObject(trigger)
}
};
return await CreateScheduleTaskAsync(requestJson.ToString()).ConfigureAwait(false);
}
/// <summary>
/// 创建会在一段时间内重复执行的定期任务。
/// <see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_push_schedule/#_4"/>
/// </summary>
/// <param name="name">表示 schedule 任务的名字,由 schedule-api 在用户成功创建 schedule 任务后返回,不得超过 255 字节,由汉字、字母、数字、下划线组成。</param>
/// <param name="pushPayload">推送对象</param>
/// <param name="trigger">触发器</param>
public HttpResponse CreatePeriodicalScheduleTask(string name, PushPayload pushPayload, Trigger trigger)
{
Task<HttpResponse> task = Task.Run(() => CreatePeriodicalScheduleTaskAsync(name, pushPayload, trigger));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="GetValidScheduleTasks(int)"/>
/// </summary>
public async Task<HttpResponse> GetValidScheduleTasksAsync(int page = 1)
{
if (page <= 0)
throw new ArgumentNullException(nameof(page));
var url = BASE_URL + "?page=" + page;
HttpResponseMessage msg = await JPushClient.HttpClient.GetAsync(url).ConfigureAwait(false);
string responseContent = await msg.Content.ReadAsStringAsync().ConfigureAwait(false);
return new HttpResponse(msg.StatusCode, msg.Headers, responseContent);
}
/// <summary>
/// 获取有效的定时任务列表。
/// </summary>
/// <param name="page">
/// <para>返回当前请求页的详细的 schedule-task 列表,如未指定 page 则 page 为 1。</para>
/// <para>排序规则:创建时间,由 schedule-service 完成。</para>
/// <para>如果请求页数大于总页数,则 page 为请求值schedules 为空。</para>
/// <para>每页最多返回 50 个 task如请求页实际的 task 的个数小于 50则返回实际数量的 task。</para>
/// </param>
public HttpResponse GetValidScheduleTasks(int page = 1)
{
Task<HttpResponse> task = Task.Run(() => GetValidScheduleTasksAsync(page));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="GetScheduleTask(string)"/>
/// </summary>
public async Task<HttpResponse> GetScheduleTaskAsync(string scheduleId)
{
if (string.IsNullOrEmpty(scheduleId))
throw new ArgumentNullException(nameof(scheduleId));
var url = BASE_URL + $"/{scheduleId}";
HttpResponseMessage msg = await JPushClient.HttpClient.GetAsync(url).ConfigureAwait(false);
string responseContent = await msg.Content.ReadAsStringAsync().ConfigureAwait(false);
return new HttpResponse(msg.StatusCode, msg.Headers, responseContent);
}
/// <summary>
/// 获取指定的定时任务。
/// </summary>
/// <param name="scheduleId">定时任务 ID。在创建定时任务时会返回。</param>
public HttpResponse GetScheduleTask(string scheduleId)
{
Task<HttpResponse> task = Task.Run(() => GetScheduleTaskAsync(scheduleId));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="GetScheduleTaskMsgId(string)"/>
/// </summary>
public async Task<HttpResponse> GetScheduleTaskMsgIdAsync(string scheduleId)
{
if (string.IsNullOrEmpty(scheduleId))
throw new ArgumentNullException(nameof(scheduleId));
var url = BASE_URL + $"/{scheduleId}/msg_ids";
HttpResponseMessage msg = await JPushClient.HttpClient.GetAsync(url).ConfigureAwait(false);
string responseContent = await msg.Content.ReadAsStringAsync().ConfigureAwait(false);
return new HttpResponse(msg.StatusCode, msg.Headers, responseContent);
}
/// <summary>
/// 获取定时任务对应的所有 msg_id。
/// </summary>
/// <param name="scheduleId">定时任务 ID。在创建定时任务时会返回。</param>
public HttpResponse GetScheduleTaskMsgId(string scheduleId)
{
Task<HttpResponse> task = Task.Run(() => GetScheduleTaskMsgIdAsync(scheduleId));
task.Wait();
return task.Result;
}
public async Task<HttpResponse> UpdateScheduleTaskAsync(string scheduleId, string json)
{
if (string.IsNullOrEmpty(scheduleId))
throw new ArgumentNullException(nameof(scheduleId));
if (string.IsNullOrEmpty(json))
throw new ArgumentNullException(nameof(json));
var url = BASE_URL + $"/{scheduleId}";
HttpContent requestContent = new StringContent(json, Encoding.UTF8);
HttpResponseMessage msg = await JPushClient.HttpClient.PutAsync(url, requestContent).ConfigureAwait(false);
string responseContent = await msg.Content.ReadAsStringAsync().ConfigureAwait(false);
return new HttpResponse(msg.StatusCode, msg.Headers, responseContent);
}
/// <summary>
/// <see cref="UpdateSingleScheduleTask(string, string, bool?, string, PushPayload)"/>
/// </summary>
public async Task<HttpResponse> UpdateSingleScheduleTaskAsync(string scheduleId, string name, bool? enabled,
string triggeringTime, PushPayload pushPayload)
{
if (string.IsNullOrEmpty(scheduleId))
throw new ArgumentNullException(scheduleId);
JObject json = new JObject();
if (!string.IsNullOrEmpty(name))
json["name"] = name;
if (enabled != null)
json["enabled"] = enabled;
if (triggeringTime != null)
{
json["trigger"] = new JObject
{
["single"] = new JObject
{
["time"] = triggeringTime
}
};
}
if (pushPayload != null)
{
json["push"] = JObject.FromObject(pushPayload, jsonSerializer);
}
return await UpdateScheduleTaskAsync(scheduleId, json.ToString()).ConfigureAwait(false);
}
/// <summary>
/// 更新单次定时任务。
/// </summary>
/// <param name="scheduleId">任务 ID</param>
/// <param name="name">任务名称,为 null 表示不更新。</param>
/// <param name="enabled">是否可用,为 null 表示不更新。</param>
/// <param name="triggeringTime">触发时间,类似 "2017-08-03 12:00:00",为 null 表示不更新。</param>
/// <param name="pushPayload">推送内容,为 null 表示不更新。</param>
public HttpResponse UpdateSingleScheduleTask(string scheduleId, string name, bool? enabled, string triggeringTime, PushPayload pushPayload)
{
Task<HttpResponse> task = Task.Run(() => UpdateSingleScheduleTaskAsync(scheduleId, name, enabled, triggeringTime, pushPayload));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="UpdatePeriodicalScheduleTask(string, string, bool?, Trigger, PushPayload)"/>
/// </summary>
public async Task<HttpResponse> UpdatePeriodicalScheduleTaskAsync(string scheduleId, string name, bool? enabled,
Trigger trigger, PushPayload pushPayload)
{
if (string.IsNullOrEmpty(scheduleId))
throw new ArgumentNullException(scheduleId);
JObject json = new JObject();
if (!string.IsNullOrEmpty(name))
json["name"] = name;
if (enabled != null)
json["enabled"] = enabled;
if (trigger != null)
{
json["trigger"] = new JObject
{
["periodical"] = JObject.FromObject(trigger, jsonSerializer)
};
}
if (pushPayload != null)
{
json["push"] = JObject.FromObject(pushPayload, jsonSerializer);
}
return await UpdateScheduleTaskAsync(scheduleId, json.ToString()).ConfigureAwait(false);
}
/// <summary>
/// 更新会重复执行的定时任务。
/// <see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_push_schedule/#schedule_2"/>
/// </summary>
/// <param name="scheduleId">任务 ID</param>
/// <param name="name">任务名称,为 null 表示不更新。</param>
/// <param name="enabled">是否可用,为 null 表示不更新。</param>
/// <param name="trigger">触发器对象,为 null 表示不更新。</param>
/// <param name="pushPayload">推送内容,为 null 表示不更新。</param>
public HttpResponse UpdatePeriodicalScheduleTask(string scheduleId, string name, bool? enabled, Trigger trigger, PushPayload pushPayload)
{
Task<HttpResponse> task = Task.Run(() => UpdatePeriodicalScheduleTaskAsync(scheduleId, name, enabled, trigger, pushPayload));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="DeleteScheduleTask(string)"/>
/// </summary>
public async Task<HttpResponse> DeleteScheduleTaskAsync(string scheduleId)
{
if (string.IsNullOrEmpty(scheduleId))
throw new ArgumentNullException(nameof(scheduleId));
var url = BASE_URL + $"/{scheduleId}";
HttpResponseMessage msg = await JPushClient.HttpClient.DeleteAsync(url).ConfigureAwait(false);
string responseContent = await msg.Content.ReadAsStringAsync().ConfigureAwait(false);
return new HttpResponse(msg.StatusCode, msg.Headers, responseContent);
}
/// <summary>
/// 删除指定的定时任务。
/// <see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_push_schedule/#schedule_3"/>
/// </summary>
/// <param name="scheduleId">已创建的 schedule 任务的 id。如果 scheduleId 不合法,即不是有效的 uuid则返回 404。</param>
public HttpResponse DeleteScheduleTask(string scheduleId)
{
Task<HttpResponse> task = Task.Run(() => DeleteScheduleTaskAsync(scheduleId));
task.Wait();
return task.Result;
}
}
}