private void CreateEventFromJson(string content)
{
TwitterStreamEvent eventData = null;
try
{
eventData = TwitterStreamEvent.ParseJson(content);
}
catch(SerializationException ex)
{
MyCommon.TraceOut(ex, "Event Serialize Exception!" + Environment.NewLine + content);
}
catch(Exception ex)
{
MyCommon.TraceOut(ex, "Event Exception!" + Environment.NewLine + content);
}
var evt = new FormattedEvent();
evt.CreatedAt = MyCommon.DateTimeParse(eventData.CreatedAt);
evt.Event = eventData.Event;
evt.Username = eventData.Source.ScreenName;
evt.IsMe = evt.Username.ToLowerInvariant().Equals(this.Username.ToLowerInvariant());
MyCommon.EVENTTYPE eventType;
eventTable.TryGetValue(eventData.Event, out eventType);
evt.Eventtype = eventType;
TwitterStreamEvent<TwitterStatusCompat> tweetEvent;
TwitterStatus tweet;
switch (eventData.Event)
{
case "access_revoked":
case "access_unrevoked":
case "user_delete":
case "user_suspend":
return;
case "follow":
if (eventData.Target.ScreenName.ToLowerInvariant().Equals(_uname))
{
if (!this.followerId.Contains(eventData.Source.Id)) this.followerId.Add(eventData.Source.Id);
}
else
{
return; //Block後のUndoをすると、SourceとTargetが逆転したfollowイベントが帰ってくるため。
}
evt.Target = "";
break;
case "unfollow":
evt.Target = "@" + eventData.Target.ScreenName;
break;
case "favorited_retweet":
case "retweeted_retweet":
return;
case "favorite":
case "unfavorite":
tweetEvent = TwitterStreamEvent<TwitterStatusCompat>.ParseJson(content);
tweet = tweetEvent.TargetObject.Normalize();
evt.Target = "@" + tweet.User.ScreenName + ":" + WebUtility.HtmlDecode(tweet.FullText);
evt.Id = tweet.Id;
if (SettingCommon.Instance.IsRemoveSameEvent)
{
if (this.StoredEvent.Any(ev => ev.Username == evt.Username && ev.Eventtype == evt.Eventtype && ev.Target == evt.Target))
return;
}
var tabinfo = TabInformations.GetInstance();
PostClass post;
var statusId = tweet.Id;
if (!tabinfo.Posts.TryGetValue(statusId, out post))
break;
if (eventData.Event == "favorite")
{
var favTab = tabinfo.GetTabByType(MyCommon.TabUsageType.Favorites);
favTab.AddPostQueue(post);
if (tweetEvent.Source.Id == this.UserId)
{
post.IsFav = true;
}
else if (tweetEvent.Target.Id == this.UserId)
{
post.FavoritedCount++;
if (SettingCommon.Instance.FavEventUnread)
tabinfo.SetReadAllTab(post.StatusId, read: false);
}
}
else // unfavorite
{
if (tweetEvent.Source.Id == this.UserId)
{
post.IsFav = false;
}
else if (tweetEvent.Target.Id == this.UserId)
{
post.FavoritedCount = Math.Max(0, post.FavoritedCount - 1);
}
}
break;
case "quoted_tweet":
if (evt.IsMe) return;
tweetEvent = TwitterStreamEvent<TwitterStatusCompat>.ParseJson(content);
tweet = tweetEvent.TargetObject.Normalize();
evt.Target = "@" + tweet.User.ScreenName + ":" + WebUtility.HtmlDecode(tweet.FullText);
evt.Id = tweet.Id;
if (SettingCommon.Instance.IsRemoveSameEvent)
{
if (this.StoredEvent.Any(ev => ev.Username == evt.Username && ev.Eventtype == evt.Eventtype && ev.Target == evt.Target))
return;
}
break;
case "list_member_added":
case "list_member_removed":
case "list_created":
case "list_destroyed":
case "list_updated":
case "list_user_subscribed":
case "list_user_unsubscribed":
var listEvent = TwitterStreamEvent<TwitterList>.ParseJson(content);
evt.Target = listEvent.TargetObject.FullName;
break;
case "block":
if (!TabInformations.GetInstance().BlockIds.Contains(eventData.Target.Id)) TabInformations.GetInstance().BlockIds.Add(eventData.Target.Id);
evt.Target = "";
break;
case "unblock":
if (TabInformations.GetInstance().BlockIds.Contains(eventData.Target.Id)) TabInformations.GetInstance().BlockIds.Remove(eventData.Target.Id);
evt.Target = "";
break;
case "user_update":
evt.Target = "";
break;
// Mute / Unmute
case "mute":
evt.Target = "@" + eventData.Target.ScreenName;
if (!TabInformations.GetInstance().MuteUserIds.Contains(eventData.Target.Id))
{
TabInformations.GetInstance().MuteUserIds.Add(eventData.Target.Id);
}
break;
case "unmute":
evt.Target = "@" + eventData.Target.ScreenName;
if (TabInformations.GetInstance().MuteUserIds.Contains(eventData.Target.Id))
{
TabInformations.GetInstance().MuteUserIds.Remove(eventData.Target.Id);
}
break;
default:
MyCommon.TraceOut("Unknown Event:" + evt.Event + Environment.NewLine + content);
break;
}
this.StoredEvent.Insert(0, evt);
this.UserStreamEventReceived?.Invoke(this, new UserStreamEventReceivedEventArgs(evt));
}