/// <summary> /// リプライを実施し、リプライIDを記録する。 /// </summary> /// <param name="replyStack">リプライのスタック</param> /// <param name="filepath">リプライIDを記録するファイルパス</param> /// <remarks> /// <para>リプライを実施する。</para> /// <para>同じリプライに反応しないようにリプライIDを記録する。</para> /// </remarks> private void ReplyPostExecute(Stack <ReplyTweetData> replyStack, string filepath) { // まとめてリプライする。 while (replyStack.Count > 0) { ReplyTweetData replyTweet = replyStack.Pop(); ReplyPost(replyTweet.ReplyMessage, replyTweet.ReplyId); } // 最後のリプライを記録する。 using (StreamWriter writer = new StreamWriter(filepath, false)) { writer.WriteLine(lastReplyId); } }
/// <summary> /// 特定のリプライに対して返信する。 /// </summary> /// <exception cref="InvalidOperationException">辞書ファイルに重複トリガーが設定されていた場合</exception> /// <exception cref="TwitterException">トークンが存在しない場合</exception> public void ReplyPost() { Dictionary <string, string> replyTriggerDic = new Dictionary <string, string>(); Stack <ReplyTweetData> replyStack = new Stack <ReplyTweetData>(); try { // 辞書ファイルからリプライトリガーメッセージとリプライメッセージを取り出す。 ReplyTableData xmlData = new ReplyTableData(); XmlReader.XmlReader.GetInstance.Read(replyDicFile, ref xmlData); foreach (ReplyMessageData message in xmlData.ReplyMessageDataList) { replyTriggerDic.Add(message.ReplyTrigger, message.ReplyMessage); } } catch { throw new InvalidOperationException("リプライ辞書ファイルに重複トリガーが設定されています。"); } // ファイルの存在チェック if (!File.Exists(replySettingFile)) { using (StreamWriter writer = new StreamWriter(File.Create(replySettingFile))) { writer.WriteLine("0"); } } // 最後のリプライIDを取得 using (StreamReader reader = new StreamReader(replySettingFile)) { if (!Int64.TryParse(reader.ReadLine(), out lastReplyId)) { throw new InvalidOperationException("設定ファイル:" + replySettingFile + "が不正です。"); } } // メンションを取得 foreach (Status status in token.Statuses.MentionsTimeline(count => 50, trim_user => false)) { // リプライ済みのツイートは読み飛ばす。 if (status.Id <= lastReplyId) { continue; } // メンションの宛先部分を削除して比較 string compStr = status.Text.Substring(status.Text.IndexOf(" ") + 1); if (replyTriggerDic.ContainsKey(compStr)) { // リプライデータを生成 // (古いツイートから取得できない為、一時的にスタックにためる。) ReplyTweetData replyTweet = new ReplyTweetData(); replyTweet.ReplyMessage = "@" + status.User.ScreenName + " " + replyTriggerDic[compStr]; replyTweet.ReplyId = status.Id; replyStack.Push(replyTweet); } } // リプライを実施し、リプライIDを記録する。 ReplyPostExecute(replyStack, replySettingFile); }
/// <summary> /// 特定のツイートに対してリプライする。 /// </summary> /// /// <exception cref="InvalidOperationException">辞書ファイルに重複トリガーが設定されていた場合</exception> /// <exception cref="TwitterException">トークンが存在しない場合</exception> public void TLReplyPost() { Dictionary <string, string> tlReplyTriggerDic = new Dictionary <string, string>(); Stack <ReplyTweetData> tlReplyStack = new Stack <ReplyTweetData>(); try { // 辞書ファイルからTLリプライトリガーメッセージとTLリプライメッセージを取り出す。 ReplyTableData xmlData = new ReplyTableData(); XmlReader.XmlReader.GetInstance.Read(replyDicFile, ref xmlData); foreach (TLReplyMessageData message in xmlData.TLReplyMessageDataList) { tlReplyTriggerDic.Add(message.TLReplyTrigger, message.TLReplyMessage); } } catch { throw new InvalidOperationException("リプライ辞書ファイルに重複トリガーが設定されています。"); } // ファイルの存在チェック if (!File.Exists(tlReplySettingFile)) { using (StreamWriter writer = new StreamWriter(File.Create(tlReplySettingFile))) { writer.WriteLine("0"); } } // 最後のリプライIDを取得 using (StreamReader reader = new StreamReader(tlReplySettingFile)) { if (!Int64.TryParse(reader.ReadLine(), out lastReplyId)) { throw new InvalidOperationException("設定ファイル:" + replySettingFile + "が不正です。"); } } List <string> triggerArray = tlReplyTriggerDic.Keys.ToList(); List <string> messageArray = tlReplyTriggerDic.Values.ToList(); // タイムラインを取得 foreach (Status status in token.Statuses.HomeTimeline(count => 100, exclude_replies => true)) { // リプライ済みのツイートは読み飛ばす。 if (status.Id <= lastReplyId) { continue; } int index = 0; foreach (string trigger in triggerArray) { // トリガーにマッチするデータがあるか検索 if (Regex.Match(@status.Text, @trigger, RegexOptions.None).Success) { // リプライデータを生成 // (古いツイートから取得できない為、一時的にスタックにためる。) ReplyTweetData replyTweet = new ReplyTweetData(); replyTweet.ReplyMessage = "@" + status.User.ScreenName + " " + messageArray[index]; replyTweet.ReplyId = status.Id; tlReplyStack.Push(replyTweet); break; } index++; } } // リプライを実施し、リプライIDを記録する。 ReplyPostExecute(tlReplyStack, tlReplySettingFile); }