public static bool CanResist(this Entity entityTheStatIsBeingAppliedTo, StatusSource source, int powerOfStatOfApplier) { if (entityTheStatIsBeingAppliedTo.TryGetStats(out var stats)) { var resistance = stats.GetLazy(source.Index); if (resistance.amount >= powerOfStatOfApplier) { return(true); } } return(false); }
public void UpdateProgress() { if (State != JobState.Started) { return; } //Todo, Error handling var statusUrl = string.Format("http://localhost:{0}/requests/status.xml", AllocatedPort); StatusSource.Url = statusUrl; string xml = string.Empty; try { xml = StatusSource.GetXml(); } catch (WebException ex) { logger.Warn(ex, string.Format("Could not connect to vlc http service to get position, Looking in {0}", statusUrl)); return; } StatusParser.Xml = xml; StatusParser.Parse(); PercentComplete = StatusParser.Position; var startTimeUtc = Instance.StartTime.ToUniversalTime(); var now = TimeSouce.getDateTime.ToUniversalTime(); var elapsed = now - startTimeUtc; var percentPerSecond = PercentComplete / elapsed.TotalSeconds; if (Math.Abs(percentPerSecond) < 0.001) { EstimatedTimeToCompletion = new TimeSpan(0, 0, 0); } else { var secondsToCompletion = (1 - PercentComplete) / percentPerSecond; EstimatedTimeToCompletion = TimeSpan.FromSeconds(secondsToCompletion); } }
/// <summary> /// json データを解析し Status オブジェクトを生成するコア メソッド。 /// このメソッドの呼び出す前に、スレッドを書き込みモードでロックしてください。 /// </summary> /// <remarks> /// このメソッド内での一切のロック操作 (またはロック操作を行うメソッドの呼び出し) を禁止します。 /// </remarks> /// <returns></returns> private Status ParseCore(StatusId id, dynamic djson, StatusSource source, ICollection<Action> after) { #region DEBUG build only #if DEBUG after.Add(() => JsonMonitor.Statuses.Data.Add(djson.ToString())); #endif #endregion var result = new Status { Id = id, Text = (string)djson.text, Truncated = djson.truncated, CreatedAt = Helper.ToDateTime(djson.created_at), User = client.Users.Parse(djson.user), }; #region source try { result.Source = Source.Parse(djson.source); } catch (JsonParseException ex) { after.Add(() => this.client.ReportException("ツイートの投稿に使用された source 情報を解析できませんでした。", ex)); result.Source = Source.Default; } #endregion #region entities if (djson.IsDefined("entities")) { try { result.Entities = Entities.ParseCore(djson.entities); } catch (JsonParseException ex) { after.Add(() => this.client.ReportException("ツイートに含まれる entities を解析できませんでした。", ex)); result.Entities = Entities.Default; } } else { result.Entities = Entities.Default; } #endregion #region retweeted_status if (djson.IsDefined("retweeted_status")) { var rtid = (StatusId)ParseId(djson.retweeted_status); var rtstatus = this.statuses.ContainsKey(rtid) ? this.statuses[rtid] : (Status)this.ParseCore(rtid, djson.retweeted_status, source, after); rtstatus.RetweetUsers.Add(result.User); result.RetweetedStatus = rtstatus; } #endregion #region reply result.InReplyToStatusId = null; if (djson.IsDefined("in_reply_to_status_id_str") && djson.in_reply_to_status_id_str != null) { var repId = StatusId.Parse(djson.in_reply_to_status_id_str); if (repId != 0) { result.InReplyToStatusId = repId; if (this.statuses.ContainsKey(repId)) { this.statuses[repId].ReplyFrom.Add(result); } } } #endregion this.statuses.Add(result.Id, result); this.Count++; after.Add(() => this.statusSeq.OnNext(new StatusStoreItem { Status = result, Source = source })); return result; }
/// <summary> /// json 形式の文字列から Status オブジェクトを追加します。 /// </summary> /// <exception cref="JsonParseException">Status への変換に失敗した場合。</exception> internal Status Add(dynamic djson, StatusSource source) { var after = new List<Action>(); // ロック区間外で実行したいものたち Status result; var id = (StatusId)ParseId(djson); #region Test code #if DEBUG if (id.ToString() != djson.id_str) { DebugMonitor.WriteLine("### Parsed status_id is aberrant value! ({0} -> {1})", id, djson.id_str); } #endif #endregion try { this.lockslim.EnterUpgradeableReadLock(); // アップグレード可能モードでロック // 読み取りモードでステータスが存在しているかチェック var contains = this.statuses.ContainsKey(id); if (contains) { // 既に取得済みのステータスの場合は、読み取りモードのままそのステータスを返す result = this.statuses[id]; } else { // 未取得のステータスの場合、ロックを書き込みモードにアップグレード try { this.lockslim.EnterWriteLock(); result = this.ParseCore(id, djson, source, after); } catch (Exception ex) { throw new JsonParseException(djson.ToString(), typeof(Status), ex); } finally { if (this.lockslim.IsWriteLockHeld) this.lockslim.ExitWriteLock(); } } } finally { if (this.lockslim.IsUpgradeableReadLockHeld) this.lockslim.ExitUpgradeableReadLock(); } after.ForEach(a => a()); return result; }
/// <summary> /// json 形式の文字列から Status オブジェクトを追加することを試みます。 /// </summary> /// <param name="json">追加するステータスの json 形式の文字列。</param> /// <param name="status">変換に成功した場合、変換された Status オブジェクトが格納されます。変換に失敗した場合は null が格納されます。</param> /// <param name="source">ステータスの取得先を示す識別子。</param> /// <returns>変換に成功した場合は true、それ以外の場合は false。</returns> internal bool TryAdd(dynamic json, StatusSource source, out Status status) { try { status = this.Add(json, source); } catch (TwitterException ex) { status = null; ex.Write(); } return status != null; }
private void Add(Status status, StatusSource source) { // フィルター処理 if (this.Predicate(status)) { this.Statuses.Add(status); if (!status.User.IsSelf && !source.HasFlag(StatusSource.Update) && !source.HasFlag(StatusSource.Startup)) { this.UnreadCount++; } } }
public static bool CanNotResist(this Entity entityTheStatIsBeingAppliedTo, StatusSource source, int powerOfStatOfApplier) { return(!CanResist(entityTheStatIsBeingAppliedTo, source, powerOfStatOfApplier)); }