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, }; }
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); }
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); }
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); }
/// <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); }
/// <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); }
/// <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); }
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 ); }
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); }); }
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); }
/// <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; }
/// <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); }
/// <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; }
/// <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); }
/// <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; }