private void CreateDirectMessagesFromJson(TwitterDirectMessage[] item, MyCommon.WORKERTYPE gType, bool read)
{
foreach (var message in item)
{
var post = new PostClass();
try
{
post.StatusId = message.Id;
if (gType != MyCommon.WORKERTYPE.UserStream)
{
if (gType == MyCommon.WORKERTYPE.DirectMessegeRcv)
{
if (minDirectmessage > post.StatusId) minDirectmessage = post.StatusId;
}
else
{
if (minDirectmessageSent > post.StatusId) minDirectmessageSent = post.StatusId;
}
}
//二重取得回避
lock (LockObj)
{
if (TabInformations.GetInstance().GetTabByType(MyCommon.TabUsageType.DirectMessage).Contains(post.StatusId)) continue;
}
//sender_id
//recipient_id
post.CreatedAt = MyCommon.DateTimeParse(message.CreatedAt);
//本文
var textFromApi = message.Text;
//HTMLに整形
post.Text = CreateHtmlAnchor(textFromApi, post.ReplyToList, message.Entities, post.Media);
post.TextFromApi = this.ReplaceTextFromApi(textFromApi, message.Entities);
post.TextFromApi = WebUtility.HtmlDecode(post.TextFromApi);
post.TextFromApi = post.TextFromApi.Replace("<3", "\u2661");
post.AccessibleText = this.CreateAccessibleText(textFromApi, message.Entities, quoteStatus: null);
post.AccessibleText = WebUtility.HtmlDecode(post.AccessibleText);
post.AccessibleText = post.AccessibleText.Replace("<3", "\u2661");
post.IsFav = false;
post.QuoteStatusIds = GetQuoteTweetStatusIds(message.Entities).Distinct().ToArray();
post.ExpandedUrls = message.Entities.OfType<TwitterEntityUrl>()
.Select(x => new PostClass.ExpandedUrlInfo(x.Url, x.ExpandedUrl))
.ToArray();
//以下、ユーザー情報
TwitterUser user;
if (gType == MyCommon.WORKERTYPE.UserStream)
{
if (this.Api.CurrentUserId == message.Recipient.Id)
{
user = message.Sender;
post.IsMe = false;
post.IsOwl = true;
}
else
{
user = message.Recipient;
post.IsMe = true;
post.IsOwl = false;
}
}
else
{
if (gType == MyCommon.WORKERTYPE.DirectMessegeRcv)
{
user = message.Sender;
post.IsMe = false;
post.IsOwl = true;
}
else
{
user = message.Recipient;
post.IsMe = true;
post.IsOwl = false;
}
}
post.UserId = user.Id;
post.ScreenName = user.ScreenName;
post.Nickname = user.Name.Trim();
post.ImageUrl = user.ProfileImageUrlHttps;
post.IsProtect = user.Protected;
// メモリ使用量削減 (同一のテキストであれば同一の string インスタンスを参照させる)
if (post.Text == post.TextFromApi)
post.Text = post.TextFromApi;
if (post.AccessibleText == post.TextFromApi)
post.AccessibleText = post.TextFromApi;
// 他の発言と重複しやすい (共通化できる) 文字列は string.Intern を通す
post.ScreenName = string.Intern(post.ScreenName);
post.Nickname = string.Intern(post.Nickname);
post.ImageUrl = string.Intern(post.ImageUrl);
}
catch(Exception ex)
{
MyCommon.TraceOut(ex, MethodBase.GetCurrentMethod().Name);
MessageBox.Show("Parse Error(CreateDirectMessagesFromJson)");
continue;
}
post.IsRead = read;
if (post.IsMe && !read && _readOwnPost) post.IsRead = true;
post.IsReply = false;
post.IsExcludeReply = false;
post.IsDm = true;
var dmTab = TabInformations.GetInstance().GetTabByType(MyCommon.TabUsageType.DirectMessage);
dmTab.AddPostQueue(post);
}
}