2013年9月6日金曜日

自作Twitterクライアント作成の記録(10)リプライ(返信)とエラーとFlowLayoutPanel

さて、自己満足の塊のこの記事も10回目ですよ。早いものですね・・・
さて今回はリプライの実装とそれに伴っておきたエラーのお話とFlowLayoutPanelというコントロールについてのお話。

少し長いかもですよ。

さて、まずはFlowLayoutPanelのお話からでも始めましょうかね。

まず、このコントロールは今までツイートを表示する領域に使っていたPanelコントロールにとある機能を足したもの、とでも思ってください。
なのでフォームに配置すると一見ただのパネルにしか見えません。
じゃあ何が違うのか、これ実は

「配置したコントロールおよびフォームを自動で等間隔に並べる」

という機能を持っています。
これによって、コードで配置したコントロールorフォームを簡単に等間隔に並べることができます。
・・・・便利だねー(´・ω・`)(←必死にPanelコントロールのままで並べ替えのコード書こうとしてた自分)
とま、便利なコントロールなので何かと役に立ちそうですね。

さて、本題のリプライの実装について。
前回のリツイート等の機能実装と同じくStatusIDを使用します。
そして使うコードはこれ
TwitterCtx.UpdateStatus
あれ?これ見たことあるぞという人、よく覚えてますね。
そうこれ、ツイートしたときにも使いましたね。これを、リプライに使っていきます。
まあ、とりあえずソースを見てもらいますか。

Form2

//返信ボタンが押されたら
        private void button1_Click(object sender, EventArgs e)
        {
            Form3 form3 = new Form3();
            form3.TweetID = tweetID;
            form3.TBox = "@" + userID + " ";
            form3.ShowDialog();
        }

まあ、例のごとく”また”フォームを作ります。(作りすぎだね)
見た目はこんな感じに


このコードでこのフォームを呼び出し、IDを渡してあげます。

Form3

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LinqToTwitter;

namespace じみったー
{
    public partial class Form3 : Form
    {
        string tweetID;
        TwitterContext F3TwitterCtx;
        PinAuthorizer Auth;
        public string accessToken = "";
        public string accessSecret = "";
        public string consumerKey = "自分で取得したものを入れる";
        public string consumerSecret = "上と同じく取得したものを入れる";
        //返信に使うIDの受け取り
        public string TweetID
        {
            set { tweetID = value; }
            get { return tweetID; }
        }
        //IDの自動入力
        public string TBox
        {
            set { textBox1.Text = value; }
            get { return textBox1.Text; }
        }
        public Form3()
        {
            InitializeComponent();
            LoadInit();
            if (accessToken != "") //アクセストークンが指定されてるか
            {
                Auth = new PinAuthorizer();
                Auth.Credentials = new InMemoryCredentials
                {
                    ConsumerKey = this.consumerKey,
                    ConsumerSecret = this.consumerSecret
                };
                Auth.OAuthTwitter.OAuthToken = this.accessToken;
                Auth.OAuthTwitter.OAuthTokenSecret = this.accessSecret;
                F3TwitterCtx = new TwitterContext(Auth);
            }
        }
        //返信処理
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                var tweet = F3TwitterCtx.UpdateStatus(textBox1.Text, tweetID);
            }
            catch (Exception ex) //例外設定
            {
                MessageBox.Show(ex.Message, "じみったー", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
           
        }

        //文字数のカウント
        private void tweetLavelChange()
        {
            int count, tweet = 140;
            count = textBox1.Text.Length - textBox1.GetLineFromCharIndex(textBox1.Text.Length); //ボックス内の文字数を取得
            tweet -= count; //残り入力可数の計算
            label1.Text = "残り" + tweet + "文字"; //ラベルの変更
        }

        // 設定値を読み込み
        private void LoadInit()
        {
            this.accessToken = Properties.Settings.Default.accessToken;
            this.accessSecret = Properties.Settings.Default.accessSecret;
        }
        //テキストボックスでキーが押されたか
        private void F3_TextBox_KeyUp(object sender, KeyEventArgs e)
        {
            tweetLavelChange();
        }
        //テキストボックスの文字が変更されたか
        private void F3_TextBox1_TC(object sender, EventArgs e)
        {
            tweetLavelChange();
        }
    }
}

さて、初登場のForm3はソースを丸ごと貼り付け。

var tweet = F3TwitterCtx.UpdateStatus(textBox1.Text, tweetID);

この行のかっこの部分がツイート処理と違うところで引数が二つになってます。(オーバーロードというやつかな)
これにより、リプライが可能になります。
さて、ここまで順調にいったのは良いもの、ここで問題発生。このコードを実行したらこのようなエラーを吐いてきました。

必要なパラメータが不足してる

何で?あっているはずなのに、というわけで調べてみると
少し前に更新したLinqToTwitterのバグだとのこと。このときには修正版が出ていたため再びDLしにいき、バグのある古いものと入れ替えると普通に動いてくれました。
おお、良かったよかった。これでリプライの実装はおしまい。

それと今回この機能を作ってるときにこんな面白い?現象が発生しました。


これリプライのテスト時のツイートなんですけど、つまり何が言いたいのかというと
「実はリプライを送るには@IDなんで必要なかった」
ただし、相手にわかるようにリプライをしようとするのであれば@IDは必須です。
少しこういうので遊んでみるのもいいかもね。(凍結とかされそうで怖いから自分はしないけど)

さて、これでこのクライアントも大体のことはできるようになってきました。
でも、まだ実装する機能の目標は果たせてないんですよね。
・DMの送受信を可能にする。
・リツイート、お気に入りの削除を可能にする。
・フォロー、フォロワーの取得、追加。
・画像つきツイートを可能にする。
・ストリーミングに対応させる。
まだこれらが実装できてません。

いったいいつ完成するのやらこのクライアント。

0 件のコメント:

コメントを投稿