/// <summary> /// User Streams接続が破棄されました /// </summary> void UserStreams_OnDisconnected(ReceiveSlave obj, bool expected) { // 予期された終了なら再接続しない if (obj != currentSlave || expected) System.Diagnostics.Debug.WriteLine("connection end.:" + obj.GetType().ToString()); if (obj != currentSlave || currentSlave == null || currentSlave.IsExpectedEnd) return; if (shutdown) return; failingCount++; State = ConnectionState.Disconnected; if (DateTime.Now.Subtract(UpTime).TotalMinutes < 1 && failingCount > Setting.Instance.KernelProperty.UserStreamsUnstableCount) { InformServer.Report("@" + UseAccount.CredentialInfo.UserScreenName + ": UserStreams接続が不安定な可能性があります。接続方法をREST APIに変更します。"); UseEnforceREST = true; UpTime = DateTime.MinValue; // アップタイムを初期化 Reconnect(true); } else { failingCount = 0; // すぐに再接続 InformServer.Report("@" + UseAccount.CredentialInfo.UserScreenName + ": UserStreams接続が切断されました。"); // スレッドが破棄されるので、別のタスクに処理を委譲 Task.Factory.StartNew(() => Reconnect(false, false)); } }
private void BeginConnect() { if (currentSlave != null) throw new InvalidOperationException("すでに接続されています。"); // 接続しない設定であれば接続しない if (UseAccount.CredentialInfo.ConnectionMode == Data.AccountCredentialInfo.TwitterConnectionMode.None) { State = ConnectionState.Disconnected; return; } System.Diagnostics.Debug.WriteLine("ネットワークを確認しています..."); do { while (!NetworkInterface.GetIsNetworkAvailable()) { // ネットワークが利用可能になるまでポーリング State = ConnectionState.WaitNetwork; Thread.Sleep(10000); } System.Diagnostics.Debug.WriteLine("Twitterへの接続を試行しています..."); State = ConnectionState.WaitTwitter; if (Executive.ExecApi(() => UseAccount.CredentialInfo.Test())) { break; } else { System.Diagnostics.Debug.WriteLine("Twitterへの接続が確認できません。30秒後再試行します..."); Thread.Sleep(1000 * 30); } } while (true); // 接続を開始しました State = ConnectionState.RESTTrying; System.Diagnostics.Debug.WriteLine("REST接続を試行中..."); ReceiveSlave restSlave = null; ReceiveSlave usSlave = null; restSlave = new ReceiveSlave(new RestBridgeStreaming(), UseAccount); try { restSlave.Begin(); currentSlave = restSlave; } catch (Exception e) { // 接続に失敗した InformServer.Report("@" + UseAccount.CredentialInfo.UserScreenName + ": REST API接続エラー: " + e.Message, InformServer.NotifyLevel.Error); restSlave.End(); restSlave = null; } System.Diagnostics.Debug.WriteLine("UserStreams接続を試行中..."); if (!UseEnforceREST && UseAccount.CredentialInfo.ConnectionMode == Data.AccountCredentialInfo.TwitterConnectionMode.UserStreams) { // User Streams で接続 State = ConnectionState.UserStreamsTrying; usSlave = new ReceiveSlave(new UserStreams(), UseAccount); try { BelongingQuery = UseAccount.CredentialInfo.BelongingStreamingQuery; usSlave.Begin(bindingQuery.Concat(BelongingQuery).Distinct().ToArray()); usSlave.OnDisconnected += new Action<ReceiveSlave, bool>(UserStreams_OnDisconnected); UpTime = DateTime.Now; System.Diagnostics.Debug.WriteLine("UserStreams接続しました."); // 接続完了 State = ConnectionState.UserStreamsConnected; currentSlave = usSlave; restSlave.End(); restSlave = null; } catch { usSlave.End(); usSlave = null; InformServer.FallbackQuery(new[] { UseAccount }, bindingQuery); if (restSlave != null) { State = ConnectionState.RESTFallbacked; currentSlave = restSlave; InformServer.Report( "@" + UseAccount.CredentialInfo.UserScreenName + ": UserStreams接続できませんでした。REST APIモードで接続します。", InformServer.NotifyLevel.Error); } else { // twitter が しんでてる State = ConnectionState.Failed; InformServer.Report("@" + UseAccount.CredentialInfo.UserScreenName + ": Twitterへ接続できませんでした。", InformServer.NotifyLevel.Error); } } } else { InformServer.FallbackQuery(new[] { UseAccount }, bindingQuery); // REST APIで接続した? if (restSlave != null) { State = ConnectionState.RESTConnected; currentSlave = restSlave; } else { // twitter が しんでてる State = ConnectionState.Failed; InformServer.Report("@" + UseAccount.CredentialInfo.UserScreenName + ": Twitterへ接続できませんでした。", InformServer.NotifyLevel.Error); } } }