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("接続を更新しました。"); }
/// <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 + ": 接続を開始しました。"); }); }); }