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;
}
}
}