csharp-sdk-upm/Storage/Storage/Public/LCStatus.cs

222 lines
7.8 KiB
C#

using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using LeanCloud.Common;
using LeanCloud.Storage.Internal.Codec;
using LeanCloud.Storage.Internal.Object;
using LC.Newtonsoft.Json;
namespace LeanCloud.Storage {
/// <summary>
/// LCStatus is a local representation of a status in LeanCloud.
/// </summary>
public class LCStatus : LCObject {
public const string CLASS_NAME = "_Status";
/// Public, shown on followees' timeline.
public const string InboxTypeDefault = "default";
/// Private.
public const string InboxTypePrivate = "private";
/// Keys
public const string SourceKey = "source";
public const string InboxTypeKey = "inboxType";
public const string OwnerKey = "owner";
public const string MessageIdKey = "messageId";
/// <summary>
/// The id of this status.
/// </summary>
public int MessageId {
get; internal set;
}
/// <summary>
/// The inboxType of this status.
/// </summary>
public string InboxType {
get; internal set;
}
private LCQuery query;
/// <summary>
/// The data of this status.
/// </summary>
public Dictionary<string, object> Data {
get; set;
}
/// <summary>
/// Constructs a LCStatus.
/// </summary>
public LCStatus() : base(CLASS_NAME) {
InboxType = InboxTypeDefault;
Data = new Dictionary<string, object>();
}
/// <summary>
/// Sends the status to the followers of this user.
/// </summary>
/// <param name="status"></param>
/// <returns></returns>
public static async Task<LCStatus> SendToFollowers(LCStatus status) {
if (status == null) {
throw new ArgumentNullException(nameof(status));
}
LCUser user = await LCUser.GetCurrent();
if (user == null) {
throw new ArgumentNullException("current user");
}
status.Data[SourceKey] = user;
LCQuery<LCObject> query = new LCQuery<LCObject>("_Follower")
.WhereEqualTo("user", user)
.Select("follower");
status.query = query;
status.InboxType = InboxTypeDefault;
return await status.Send();
}
/// <summary>
/// Sends the status to the user with targetId privatedly.
/// </summary>
/// <param name="status"></param>
/// <param name="targetId"></param>
/// <returns></returns>
public static async Task<LCStatus> SendPrivately(LCStatus status, string targetId) {
if (status == null) {
throw new ArgumentNullException(nameof(status));
}
if (string.IsNullOrEmpty(targetId)) {
throw new ArgumentNullException(nameof(targetId));
}
LCUser user = await LCUser.GetCurrent();
if (user == null) {
throw new ArgumentNullException("current user");
}
status.Data[SourceKey] = user;
LCQuery<LCObject> query = new LCQuery<LCObject>("_User")
.WhereEqualTo("objectId", targetId);
status.query = query;
status.InboxType = InboxTypePrivate;
return await status.Send();
}
/// <summary>
/// Send this status.
/// </summary>
/// <returns></returns>
public async Task<LCStatus> Send() {
LCUser user = await LCUser.GetCurrent();
if (user == null) {
throw new ArgumentNullException("current user");
}
Dictionary<string, object> formData = new Dictionary<string, object> {
{ InboxTypeKey, InboxType }
};
if (Data != null) {
formData["data"] = LCEncoder.Encode(Data);
}
if (query != null) {
Dictionary<string, object> queryData = new Dictionary<string, object> {
{ "className", query.ClassName }
};
Dictionary<string, object> ps = query.BuildParams();
if (ps.TryGetValue("where", out object whereObj) &&
whereObj is string where) {
queryData["where"] = JsonConvert.DeserializeObject(where);
}
if (ps.TryGetValue("keys", out object keys)) {
queryData["keys"] = keys;
}
formData["query"] = queryData;
}
Dictionary<string, object> response = await LCCore.HttpClient.Post<Dictionary<string, object>>("statuses",
data: formData);
LCObjectData objectData = LCObjectData.Decode(response);
Merge(objectData);
return this;
}
/// <summary>
/// Deletes this status.
/// </summary>
/// <returns></returns>
public new async Task Delete() {
LCUser user = await LCUser.GetCurrent();
if (user == null) {
throw new ArgumentNullException("current user");
}
LCUser source = (Data[SourceKey] ?? this[SourceKey]) as LCUser;
if (source != null && source.ObjectId == user.ObjectId) {
await LCCore.HttpClient.Delete($"statuses/{ObjectId}");
} else {
Dictionary<string, object> data = new Dictionary<string, object> {
{ OwnerKey, JsonConvert.SerializeObject(LCEncoder.Encode(user)) },
{ InboxTypeKey, InboxType },
{ MessageIdKey, MessageId }
};
await LCCore.HttpClient.Delete("subscribe/statuses/inbox", queryParams: data);
}
}
/// <summary>
/// Gets the count of the status with inboxType.
/// </summary>
/// <param name="inboxType"></param>
/// <returns></returns>
public static async Task<LCStatusCount> GetCount(string inboxType) {
LCUser user = await LCUser.GetCurrent();
if (user == null) {
throw new ArgumentNullException("current user");
}
Dictionary<string, object> queryParams = new Dictionary<string, object> {
{ OwnerKey, JsonConvert.SerializeObject(LCEncoder.Encode(user)) }
};
if (!string.IsNullOrEmpty(inboxType)) {
queryParams[InboxTypeKey] = inboxType;
}
Dictionary<string, object> response = await LCCore.HttpClient.Get<Dictionary<string, object>>("subscribe/statuses/count",
queryParams: queryParams);
LCStatusCount statusCount = new LCStatusCount {
Total = (int)response["total"],
Unread = (int)response["unread"]
};
return statusCount;
}
/// <summary>
/// Resets the count of the status to be zero.
/// </summary>
/// <param name="inboxType"></param>
/// <returns></returns>
public static async Task ResetUnreadCount(string inboxType = null) {
LCUser user = await LCUser.GetCurrent();
if (user == null) {
throw new ArgumentNullException("current user");
}
Dictionary<string, object> queryParams = new Dictionary<string, object> {
{ OwnerKey, JsonConvert.SerializeObject(LCEncoder.Encode(user)) }
};
if (!string.IsNullOrEmpty(inboxType)) {
queryParams[InboxTypeKey] = inboxType;
}
await LCCore.HttpClient.Post<Dictionary<string, object>>("subscribe/statuses/resetUnreadCount",
queryParams:queryParams);
}
}
}