Example #1
0
        private void RefreshStreamingOperation()
        {
            bool modify = false;
            // 削除されたクレデンシャル
            var olds = streamingMap.Keys.Except(from a in AccountModel.GetAccountElements() select a.CredentialInfo.UserScreenName).ToArray();
            Parallel.ForEach(olds,
                (oc) =>
                {
                    modify = true;
                    InformServer.Report("@" + oc + ": 切断します。");
                    if (streamingMap.ContainsKey(oc))
                    {
                        var rmstrm = streamingMap[oc];
                        streamingMap.Remove(oc);
                        rmstrm.End();
                    }
                });

            // 接続情報が更新されたクレデンシャル
            Parallel.ForEach(
                streamingMap.Keys,
                (oc) =>
                {
                    var am = AccountModel.GetAccountElement(oc);
                    if (am == null) return;
                    var cm = am.CredentialInfo.ConnectionMode;
                    bool recon = false;
                    // 接続方法が更新されていないか確認
                    switch (streamingMap[oc].ConnectionState)
                    {
                        case ConnectionState.Disconnected:
                            recon = cm != Data.AccountCredentialInfo.TwitterConnectionMode.None;
                            break;
                        case ConnectionState.RESTFallbacked:
                        case ConnectionState.RESTConnected:
                        case ConnectionState.RESTTrying:
                            recon = cm != Data.AccountCredentialInfo.TwitterConnectionMode.RestApi;
                            break;
                        case ConnectionState.UserStreamsConnected:
                        case ConnectionState.UserStreamsTrying:
                            recon = cm != Data.AccountCredentialInfo.TwitterConnectionMode.UserStreams;
                            break;
                    }
                    if (!recon)
                    {
                        // ストリーミングクエリ情報が更新されていないか確認
                        recon = streamingMap[oc].BelongingQuery.Except(am.CredentialInfo.BelongingStreamingQuery).Count() > 0 ||
                            am.CredentialInfo.BelongingStreamingQuery.Except(streamingMap[oc].BelongingQuery).Count() > 0;
                    }
                    if (recon)
                    {
                        InformServer.Report("@" + oc + ": 再接続します...");
                        streamingMap[oc].Reconnect();
                        modify = true;
                    }
                });

            // 新しく追加されたクレデンシャル
            var news = (from a in AccountModel.GetAccountElements() select a.CredentialInfo.UserScreenName).Except(streamingMap.Keys).ToArray();
            Parallel.ForEach(
                news,
                (nc) =>
                {
                    modify = true;
                    var am = AccountModel.GetAccountElement(nc);
                    if (am == null) return;
                    var ri = new ReceiveInterface(am);
                    streamingMap.Add(nc, ri);
                    RegisteredReceiveInterface(ri);
                    Parallel.Invoke(() =>
                    {
                        InformServer.Report("@" + nc + ": ユーザー情報を受信しています...");
                        am.RefreshUserInfoAll();
                    },
                    () =>
                    {
                        ri.Begin();
                        InformServer.Report("@" + nc + ": 接続を開始しました。");
                    });
                });
            if (modify)
                InformServer.Report("接続を更新しました。");
        }
Example #2
0
 /// <summary>
 /// Balthazar の初期化コード
 /// </summary>
 private void Initialize()
 {
     var queries = queryMap.Keys.ToArray();
     queryMap.Clear();
     InformServer.Report("アカウントの情報を読み込んでいます...");
     foreach (var ae in AccountModel.GetAccountElements())
     {
         var ri = new ReceiveInterface(ae);
         var remain = ri.TryAddQuery(queries).ToArray();
         foreach (var q in queries.Except(remain))
         {
             System.Diagnostics.Debug.WriteLine("Query " + q + " is accepted in " + ri.UseAccount.CredentialInfo.UserScreenName);
             queryMap.Add(q, ri);
             queryReferenceCount.Add(q, 1);
         }
         queries = remain;
         streamingMap.Add(ae.CredentialInfo.UserScreenName, ri);
         RegisteredReceiveInterface(ri);
     }
     Parallel.ForEach(
         streamingMap,
         (spair) =>
         {
             Parallel.Invoke(() =>
             {
                 InformServer.Report("@" + spair.Key + ": ユーザー情報を受信しています...");
                 spair.Value.UseAccount.RefreshUserInfoAll();
             },
             () =>
             {
                 spair.Value.Begin();
                 InformServer.Report("@" + spair.Key + ": 接続を開始しました。");
             });
         });
 }