Example #1
0
 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);
 }
Example #2
0
        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);
            }
        }
Example #3
0
		/// <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;
		}
Example #4
0
		/// <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;
		}
Example #5
0
		/// <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;
		}
Example #6
0
		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++;
				}
			}
		}
Example #7
0
 public static bool CanNotResist(this Entity entityTheStatIsBeingAppliedTo, StatusSource source, int powerOfStatOfApplier)
 {
     return(!CanResist(entityTheStatIsBeingAppliedTo, source, powerOfStatOfApplier));
 }