Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }