Esempio n. 1
0
 /// <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));
     }
 }
Esempio n. 2
0
        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);
                }
            }
        }