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 }; /// /// 设置 Schedule API 的调用地址。 /// /// or public void SetBaseURL(string url) { BASE_URL = url; } /// /// 创建定时任务。 /// /// /// 自己构造的请求 json 字符串。 /// /// public async Task 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); } /// /// /// public async Task 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); } /// /// 创建单次定时任务。 /// /// 表示 schedule 任务的名字,由 schedule-api 在用户成功创建 schedule 任务后返回,不得超过 255 字节,由汉字、字母、数字、下划线组成。 /// 推送对象 /// 触发器 public HttpResponse CreateSingleScheduleTask(string name, PushPayload pushPayload, string triggeringTime) { Task task = Task.Run(() => CreateSingleScheduleTaskAsync(name, pushPayload, triggeringTime)); task.Wait(); return task.Result; } /// /// /// public async Task 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); } /// /// 创建会在一段时间内重复执行的定期任务。 /// /// /// 表示 schedule 任务的名字,由 schedule-api 在用户成功创建 schedule 任务后返回,不得超过 255 字节,由汉字、字母、数字、下划线组成。 /// 推送对象 /// 触发器 public HttpResponse CreatePeriodicalScheduleTask(string name, PushPayload pushPayload, Trigger trigger) { Task task = Task.Run(() => CreatePeriodicalScheduleTaskAsync(name, pushPayload, trigger)); task.Wait(); return task.Result; } /// /// /// public async Task 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); } /// /// 获取有效的定时任务列表。 /// /// /// 返回当前请求页的详细的 schedule-task 列表,如未指定 page 则 page 为 1。 /// 排序规则:创建时间,由 schedule-service 完成。 /// 如果请求页数大于总页数,则 page 为请求值,schedules 为空。 /// 每页最多返回 50 个 task,如请求页实际的 task 的个数小于 50,则返回实际数量的 task。 /// public HttpResponse GetValidScheduleTasks(int page = 1) { Task task = Task.Run(() => GetValidScheduleTasksAsync(page)); task.Wait(); return task.Result; } /// /// /// public async Task 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); } /// /// 获取指定的定时任务。 /// /// 定时任务 ID。在创建定时任务时会返回。 public HttpResponse GetScheduleTask(string scheduleId) { Task task = Task.Run(() => GetScheduleTaskAsync(scheduleId)); task.Wait(); return task.Result; } /// /// /// public async Task 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); } /// /// 获取定时任务对应的所有 msg_id。 /// /// 定时任务 ID。在创建定时任务时会返回。 public HttpResponse GetScheduleTaskMsgId(string scheduleId) { Task task = Task.Run(() => GetScheduleTaskMsgIdAsync(scheduleId)); task.Wait(); return task.Result; } public async Task 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); } /// /// /// public async Task 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); } /// /// 更新单次定时任务。 /// /// 任务 ID /// 任务名称,为 null 表示不更新。 /// 是否可用,为 null 表示不更新。 /// 触发时间,类似 "2017-08-03 12:00:00",为 null 表示不更新。 /// 推送内容,为 null 表示不更新。 public HttpResponse UpdateSingleScheduleTask(string scheduleId, string name, bool? enabled, string triggeringTime, PushPayload pushPayload) { Task task = Task.Run(() => UpdateSingleScheduleTaskAsync(scheduleId, name, enabled, triggeringTime, pushPayload)); task.Wait(); return task.Result; } /// /// /// public async Task 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); } /// /// 更新会重复执行的定时任务。 /// /// /// 任务 ID /// 任务名称,为 null 表示不更新。 /// 是否可用,为 null 表示不更新。 /// 触发器对象,为 null 表示不更新。 /// 推送内容,为 null 表示不更新。 public HttpResponse UpdatePeriodicalScheduleTask(string scheduleId, string name, bool? enabled, Trigger trigger, PushPayload pushPayload) { Task task = Task.Run(() => UpdatePeriodicalScheduleTaskAsync(scheduleId, name, enabled, trigger, pushPayload)); task.Wait(); return task.Result; } /// /// /// public async Task 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); } /// /// 删除指定的定时任务。 /// /// /// 已创建的 schedule 任务的 id。如果 scheduleId 不合法,即不是有效的 uuid,则返回 404。 public HttpResponse DeleteScheduleTask(string scheduleId) { Task task = Task.Run(() => DeleteScheduleTaskAsync(scheduleId)); task.Wait(); return task.Result; } } }