public static ActivityCreationData Create(Account account, IEnumerable<ActivityId> ancestorIds, String name, Object value)
 {
     return new ActivityCreationData()
     {
         Account = account,
         AncestorIds = ancestorIds ?? Enumerable.Empty<ActivityId>(),
         Name = name,
         Value = value,
     };
 }
Example #2
0
 private Tuple<Mark, Boolean> _NewMark(
     Account account,
     String name,
     Activity markingActivity
 )
 {
     Boolean created;
     return new Tuple<Mark, Boolean>(base.NewMark(account, name, markingActivity, out created), created);
 }
Example #3
0
 private Tuple<Annotation, Boolean> _NewAnnotation(
     Account account,
     String name,
     String value
 )
 {
     Boolean created;
     return new Tuple<Annotation, Boolean>(base.NewAnnotation(account, name, value, out created), created);
 }
Example #4
0
 private Tuple<Activity, Boolean> _NewActivity(
     Account account,
     DateTime timestamp,
     String category,
     String subId,
     String userAgent,
     String value,
     Byte[] data
 )
 {
     Boolean created;
     return new Tuple<Activity, Boolean>(base.NewActivity(account, timestamp, category, subId, userAgent, value, data, out created), created);
 }
Example #5
0
 /// <summary>
 /// 新しいリレーションを生成します。
 /// </summary>
 /// <param name="account">リレーションが関連付けられるアカウント。</param>
 /// <param name="name">リレーションの意味。</param>
 /// <param name="relatingAccount">リレーションが関連付けられる先のアカウント。</param>
 /// <param name="created">リレーションが新規に生成された場合は <c>true</c>。それ以外の場合、つまり既存のリレーションが取得された場合は <c>false</c> が返されます。このパラメータは初期化せずに渡されます。</param>
 /// <returns>生成されたリレーション。</returns>
 public override Relation NewRelation(
     Account account,
     String name,
     Account relatingAccount,
     out Boolean created
 )
 {
     Tuple<Relation, Boolean> result = this.NewRelationHook.Execute(account, name, relatingAccount);
     created = result.Item2;
     if (created)
     {
         this._objectCreated.OnNext(result.Item1);
     }
     return result.Item1;
 }
 private static Activity UpdateActivity(
     Account account,
     DateTime timestamp,
     String category,
     String value
 )
 {
     return UpdateActivity(account, timestamp, category, null, null, value, null);
 }
Example #7
0
 /// <summary>
 /// 新しいリレーションを生成します。
 /// </summary>
 /// <param name="account">リレーションが関連付けられるアカウント。</param>
 /// <param name="name">リレーションの意味。</param>
 /// <param name="relatingAccount">リレーションが関連付けられる先のアカウント。</param>
 /// <param name="created">リレーションが新規に生成された場合は <c>true</c>。それ以外の場合、つまり既存のリレーションが取得された場合は <c>false</c> が返されます。このパラメータは初期化せずに渡されます。</param>
 /// <returns>生成されたリレーション。</returns>
 public override Relation NewRelation(Account account, String name, Account relatingAccount, out Boolean created)
 {
     return this.Target.NewRelation(account, name, relatingAccount, out created);
 }
Example #8
0
 /// <summary>
 /// 新しいアノテーションを生成します。
 /// </summary>
 /// <param name="account">アノテーションが関連付けられるアカウント。</param>
 /// <param name="name">アノテーションの意味。</param>
 /// <param name="value">アノテーションの値。</param>
 /// <param name="created">アノテーションが新規に生成された場合は <c>true</c>。それ以外の場合、つまり既存のアノテーションが取得された場合は <c>false</c> が返されます。このパラメータは初期化せずに渡されます。</param>
 /// <returns>生成されたアノテーション。</returns>
 public override Annotation NewAnnotation(Account account, String name, String value, out Boolean created)
 {
     return this.Target.NewAnnotation(account, name, value, out created);
 }
Example #9
0
 private XElement OutputStatus(Activity activity, Account subject, Boolean includesUser)
 {
     return new XElement("status",
         new XElement("created_at", activity.Timestamp
             .ToString("ddd MMM dd HH:mm:ss +0000 yyyy", CultureInfo.InvariantCulture)
         ),
         new XElement("id", activity.SubId),
         new XElement("text", activity.Value),
         new XElement("source", "<a href=\"zapped\"> rel=\"nofollow\">" + activity.UserAgent + "</a>"),
         new XElement("truncated", "false"),
         activity.ReferrersOf("Mention")
         // TODO: First?
             .FirstOrDefault()
             .Do(m => Make.Array(
                 new XElement("in_reply_to_status_id", m.Null(_ => _.SubId)),
                 new XElement("in_reply_to_user_id", m.Null(_ => _.Account["Id"].Value)),
                 new XElement("in_reply_to_screen_name", m.Null(_ => _.Account["ScreenName"].Value))
             )),
         new XElement("favorited", activity.IsMarked("Favorite", subject).ToString().ToLower()),
         includesUser ? Make.Array(this.OutputUser(activity.Account, subject, false)) : null
     );
 }
Example #10
0
 private XElement OutputUser(Account account, Account subject, Boolean includesStatus)
 {
     return new XElement("user",
         new XAttribute("metatweet-account-id", account.AccountId),
         new XElement("id", account["Id"].Value),
         new XElement("name", account["Name"].TryGetValue()),
         new XElement("screen_name", account["ScreenName"].TryGetValue()),
         new XElement("location", account["Location"].TryGetValue()),
         new XElement("profile_image_url", account["ProfileImage"].TryGetValue()),
         new XElement("url", account["Uri"].TryGetValue()),
         new XElement("followers_count", account["FollowersCount"].TryGetValue()),
         new XElement("friends_count", account["FollowingCount"].TryGetValue()),
         new XElement("created_at", account["CreatedAt"].Null(a => DateTime.Parse(a.Value)
             .ToString("ddd MMM dd HH:mm:ss +0000 yyyy", CultureInfo.InvariantCulture)
         )),
         new XElement("favourites_count", account["FavoritesCount"].TryGetValue()),
         new XElement("statuses_count", account["StatusesCount"].TryGetValue()),
         new XElement("following", account.IsRelated("Follow", subject)),
         includesStatus && account["Post"] != null ? Make.Array(this.OutputStatus(account["Post"], subject, false)) : null
     );
 }
 private static Activity UpdateActivity(Account account, String name, Object value, DateTime timestamp)
 {
     return value != null
         ? account.Act(name, value, timestamp)
         : null;
 }
        private void Read()
        {
            this._self = this.Session.Query(StorageObjectDynamicQuery.Activity(new ActivityTuple()
            {
                Name = "ScreenName",
                Value = JObject.Parse(
                    this.Open(
                        new MessageReceivingEndpoint("https://api.twitter.com/1/account/verify_credentials.json", HttpDeliveryMethods.GetRequest)
                    ).GetResponseReader().Dispose(sr => sr.ReadToEnd())
                ).Value<String>("screen_name"),
            }))
                .ToArray()
                .Single()
                .Account;
            Make.Repeat(this._reader)
                .Select(r => r.ReadLine())
                .Catch(Enumerable.Empty<String>())
                .Where(s => !String.IsNullOrWhiteSpace(s))
                .Select(JObject.Parse)
                .ForEach(j =>
                {
#if DEBUG
                    if (this.Options.Contains("debug-dump"))
                    {
                        this.Host.Directories.LogDirectory
                            .CreateSubdirectory(this + "_dump")
                            .File(DateTime.UtcNow.ToString("yyyyMMdd-HHmmssfff") + ".json")
                            .WriteAllText(j.ToString());
                    }
#endif
                    try
                    {
                        if (j["in_reply_to_user_id"] != null)
                        {
                            AnalyzeStatus(j);
                        }
                        else if (j["event"] != null)
                        {
                            switch (j["event"].Value<String>())
                            {
                                case "favorite":
                                    AnalyzeFavorite(j);
                                    break;
                                case "retweet":
                                    AnalyzeRetweet(j);
                                    break;
                                case "follow":
                                    AnalyzeFollow(j);
                                    break;
                            }
                        }
                        else if (j["friends"] != null)
                        {
                            AsyncAnalyzeFollowing(j);
                        }
                        if (this.Session.AddingObjects.Count >= this.UpdateThreshold)
                        {
                            this.Session.Update();
                            if (!this.Session.AddingObjects.Any())
                            {
                                this.Session.Dispose();
                                this.Session = this.Storage.OpenSession();
                                // Migrate the context of self account to new one
                                this._self = this.Session.Load(this._self.Id);
                            }
                        }
                    }
                    catch (ThreadAbortException)
                    {
                    }
                    catch (Exception ex)
                    {
                        this.Log.Error(
                            "Exception was thrown in process to read this JSON object (note this does not means following JSON is invalid data)." +
                            Environment.NewLine +
                            j.ToString(),
                            ex
                        );
                    }
                });
            Thread.Sleep(Timeout.Infinite);
        }
 private void Read()
 {
     this._storage.Execute(_ =>
     {
         this._self = this._storage.GetActivities(
             default(String),
             null,
             "ScreenName",
             null,
             null,
             this.Credential.UserName,
             null
         )
             .Single()
             .Account;
         Make.Repeat(this._reader)
             .Select(r => r.ReadLine())
             .Where(s => !String.IsNullOrWhiteSpace(s))
             .Select(JObject.Parse)
             .ForEach(j =>
             {
                 if (j["in_reply_to_user_id"] != null)
                 {
                     AnalyzeStatus(j, this._storage);
                 }
                 else if (j["event"] != null)
                 {
                     switch (j["event"].Value<String>())
                     {
                         case "favorite":
                             AnalyzeFavorite(j, this._storage);
                             break;
                         case "retweet":
                             AnalyzeRetweet(j, this._storage);
                             break;
                         case "follow":
                             AnalyzeFollow(j, this._storage);
                             break;
                     }
                     this._storage.TryUpdate();
                 }
                 else if (j["friends"] != null)
                 {
                     AsyncAnalyzeFollowing(j, this._storage);
                 }
             });
         Thread.Sleep(Timeout.Infinite);
     });
 }
Example #14
0
 private Tuple<Relation, Boolean> _NewRelation(
     Account account,
     String name,
     Account relatingAccount
 )
 {
     Boolean created;
     return new Tuple<Relation, Boolean>(base.NewRelation(account, name, relatingAccount, out created), created);
 }
Example #15
0
 /// <summary>
 /// 新しいアクティビティを生成します。
 /// </summary>
 /// <param name="account">アクティビティを行うアカウント。</param>
 /// <param name="timestamp">アクティビティのタイムスタンプ。</param>
 /// <param name="category">アクティビティのカテゴリ。</param>
 /// <param name="subId">アクティビティのサブ ID。</param>
 /// <param name="userAgent">アクティビティのユーザ エージェント。</param>
 /// <param name="value">アクティビティの値。</param>
 /// <param name="data">アクティビティのデータ。</param>
 /// <param name="created">アクティビティが新規に生成された場合は <c>true</c>。それ以外の場合、つまり既存のアクティビティがそのまま、あるいは変更されて取得された場合は <c>false</c> が返されます。このパラメータは初期化せずに渡されます。</param>
 /// <returns>生成されたアクティビティ。</returns>
 /// <remarks>
 /// <para>同一の <paramref name="account"/>、<paramref name="category"/> および <paramref name="subId"/> を持つアクティビティが既に存在し、その中で <paramref name="timestamp"/> が最も近い (隣接する) アクティビティにおいて、その値が <paramref name="value"/> および <paramref name="data"/> と一致した場合、そのアクティビティが取得されます。取得されたアクティビティの <see cref="Activity.Timestamp"/> が <paramref name="timestamp"/> より新しい場合、<paramref name="timestamp"/> に書き換えられます。</para>
 /// <para>ここで、値が異なった場合に新しくアクティビティが作られるのは <paramref name="value"/> および <paramref name="data"/> であり (変更が累積される)、<paramref name="userAgent"/> 値が既存のアクティビティの <see cref="Activity.UserAgent"/> 値と異なっていてもそのまま上書きされます。</para>
 /// </remarks>
 public override Activity NewActivity(
     Account account,
     DateTime timestamp,
     String category,
     String subId,
     String userAgent,
     String value,
     Byte[] data,
     out Boolean created
 )
 {
     Tuple<Activity, Boolean> result = this.NewActivityHook.Execute(account, timestamp, category, subId, userAgent, value, data);
     created = result.Item2;
     if (created)
     {
         this._objectCreated.OnNext(result.Item1);
     }
     return result.Item1;
 }
Example #16
0
 /// <summary>
 /// 新しいアクティビティを生成します。
 /// </summary>
 /// <param name="account">アクティビティを行うアカウント。</param>
 /// <param name="timestamp">アクティビティのタイムスタンプ。</param>
 /// <param name="category">アクティビティのカテゴリ。</param>
 /// <param name="subId">アクティビティのサブ ID。</param>
 /// <param name="userAgent">アクティビティのユーザ エージェント。</param>
 /// <param name="value">アクティビティの値。</param>
 /// <param name="data">アクティビティのデータ。</param>
 /// <param name="created">アクティビティが新規に生成された場合は <c>true</c>。それ以外の場合、つまり既存のアクティビティがそのまま、あるいは変更されて取得された場合は <c>false</c> が返されます。このパラメータは初期化せずに渡されます。</param>
 /// <returns>生成されたアクティビティ。</returns>
 /// <remarks>
 /// <para>同一の <paramref name="account"/>、<paramref name="category"/> および <paramref name="subId"/> を持つアクティビティが既に存在し、その中で <paramref name="timestamp"/> が最も近い (隣接する) アクティビティにおいて、その値が <paramref name="value"/> および <paramref name="data"/> と一致した場合、そのアクティビティが取得されます。取得されたアクティビティの <see cref="Activity.Timestamp"/> が <paramref name="timestamp"/> より新しい場合、<paramref name="timestamp"/> に書き換えられます。</para>
 /// <para>ここで、値が異なった場合に新しくアクティビティが作られるのは <paramref name="value"/> および <paramref name="data"/> であり (変更が累積される)、<paramref name="userAgent"/> 値が既存のアクティビティの <see cref="Activity.UserAgent"/> 値と異なっていてもそのまま上書きされます。</para>
 /// </remarks>
 public override Activity NewActivity(Account account, DateTime timestamp, String category, String subId, String userAgent, String value, Byte[] data, out Boolean created)
 {
     return this.Target.NewActivity(account, timestamp, category, subId, userAgent, value, data, out created);
 }
Example #17
0
 /// <summary>
 /// 新しいアノテーションを生成します。
 /// </summary>
 /// <param name="account">アノテーションが関連付けられるアカウント。</param>
 /// <param name="name">アノテーションの意味。</param>
 /// <param name="value">アノテーションの値。</param>
 /// <param name="created">アノテーションが新規に生成された場合は <c>true</c>。それ以外の場合、つまり既存のアノテーションが取得された場合は <c>false</c> が返されます。このパラメータは初期化せずに渡されます。</param>
 /// <returns>生成されたアノテーション。</returns>
 public override Annotation NewAnnotation(
     Account account,
     String name,
     String value,
     out Boolean created
 )
 {
     Tuple<Annotation, Boolean> result = this.NewAnnotationHook.Execute(account, name, value);
     created = result.Item2;
     if (created)
     {
         this._objectCreated.OnNext(result.Item1);
     }
     return result.Item1;
 }
Example #18
0
 /// <summary>
 /// 新しいマークを生成します。
 /// </summary>
 /// <param name="account">マークが関連付けられるアカウント。</param>
 /// <param name="name">マークの意味。</param>
 /// <param name="markingActivity">マークが関連付けられる先のアクティビティ。</param>
 /// <param name="created">マークが新規に生成された場合は <c>true</c>。それ以外の場合、つまり既存のマークが取得された場合は <c>false</c> が返されます。このパラメータは初期化せずに渡されます。</param>
 /// <returns>生成されたマーク。</returns>
 public override Mark NewMark(Account account, String name, Activity markingActivity, out Boolean created)
 {
     return this.Target.NewMark(account, name, markingActivity, out created);
 }
Example #19
0
 /// <summary>
 /// 新しいマークを生成します。
 /// </summary>
 /// <param name="account">マークが関連付けられるアカウント。</param>
 /// <param name="name">マークの意味。</param>
 /// <param name="markingActivity">マークが関連付けられる先のアカウント。</param>
 /// <param name="created">マークが新規に生成された場合は <c>true</c>。それ以外の場合、つまり既存のマークが取得された場合は <c>false</c> が返されます。このパラメータは初期化せずに渡されます。</param>
 /// <returns>生成されたマーク。</returns>
 public override Mark NewMark(
     Account account,
     String name,
     Activity markingActivity,
     out Boolean created
 )
 {
     Tuple<Mark, Boolean> result = this.NewMarkHook.Execute(account, name, markingActivity);
     created = result.Item2;
     if (created)
     {
         this._objectCreated.OnNext(result.Item1);
     }
     return result.Item1;
 }
 public Account GetAccount(StorageSession context)
 {
     return this._account != null && this._account.Context == context
         ? this._account
         : this._account = context.Load(this._accountId);
 }
 private static Activity UpdateActivity(
     Account account,
     DateTime timestamp,
     String category,
     String subId,
     String userAgent,
     String value,
     Byte[] data
 )
 {
     Activity activity = account[category, timestamp];
     if (activity == null)
     {
         return account.Act(timestamp, category, subId, userAgent, value, data);
     }
     if (activity.UserAgent != userAgent)
     {
         activity.UserAgent = userAgent;
     }
     if (activity.Value != value)
     {
         activity.Value = value;
     }
     if (activity.Data != data)
     {
         activity.Data = data;
     }
     return activity;
 }