2013年9月21日土曜日

自作Twitterクライアント作成の記録(11)自動離脱ツイート機能の実装

さて、今回はありそうで無い?機能をつけてみたいと思います。
その名も「自動離脱ツイート」というものです。
この機能、意外にも見たこと無いんですよね、複数のアカウントが使えるのは良くあるのにね。


とりあえず、今回使用するコントロールの内メインになるのが、
Timerコントロール
というもの。
このコントロールは指定したms(ミリ秒)経過するとそれに応じた処理が繰り返されます。
今回はこれを利用して一定時間フォームが非アクティブになってると、定型文をツイートするようにします。
というわけで今回実装する細かい内容は
・離脱ツイートをするかしないかの設定をできるようにする(デフォはOFF)
・離脱ツイートをする間隔を1~120分で1分単位で設定できるようにする
・離脱ツイートする内容を自由に変えれるようにする
この3つにしましょう。

と、その前にソースレベルでかなりの仕様変更をしているのでかなり中身が変わってます。
具体的には、ツイートの受け渡し方を変えたとか、変数名を変えたとか。
なのでいつもの物置にソースを置いておくので、もし動かないとなればそちらを見てください。
というか、そっちをコピーしたほうが早いかも。

さて、まずはこの機能の根幹であるTimerコントロールを配置していきましょう。
ここにあるのでそのままメインフォームにドラック&ドロップしちゃいましょう。
そして次にこの機能で使う予定変数等を宣言していきます。
//タイマ用の変数等
        int TimerCount;
        public int _TimerCount
        {
            set { TimerCount = value; }
            get { return TimerCount; }
        }
        //タイマのフラグ
        bool _TimerFlg;
        public bool TimerFlg
        {
            set { _TimerFlg = value; }
            get { return _TimerFlg; }
        }
//自動離脱ツイートの文字列変数&プロパティ
        string AutoWTw;
        public string _AutoWtw
        {
            set { AutoWTw = value; }
            get { return AutoWTw; }
        }

これらで後で設定フォームから、時間設定と、この機能を使うかどうかのフラグと、自動でツイートされる文章を受け取ります。
今度はタイマーの設定とかを書いていきましょう
        //タイマのイベントハンドラ
        private void timer1_Tick(object sender, EventArgs e)
        {
            twitterCtx.UpdateStatus(AutoWTw);
        }
        //Form1が非アクティブになったときのイベントハンドラ
        private void Deactivate_Form1(object sender, EventArgs e)
        {
            if (_TimerFlg)
            {
                timer1.Interval = 1000 * (TimerCount * 60);
                timer1.Start();
            }
        }
        //Form1がアクティブになったときのイベントハンドラ
        private void Activated_Form1(object sender, EventArgs e)
        {
            timer1.Stop();
        }

上から説明していくと、これはタイマーで指定した時間を過ぎるたびに実行されるイベントハンドラです。つまり、このままだと指定した時間ごとに何回も同じ命令が繰り返されますが、まあ、そこは設定で繰り返しするしないを指定できるようにでもしましょうかね。

そして、残り二つはForm1がアクティブか、非アクティブ状態になると呼び出される命令になります。
まず、非アクティブから、この状態を放置したとみなし、この瞬間にまずこの機能が使えるかのチェックをし、使えるならタイマーの時間をセットし、スタートさせます。
そして、アクティブにすると、タイマーがストップし、また待機するという流れになってます。

しかし、この組み方だと、設定ダイアログ等を出してもForm1が非アクティブになるため、設定を開いただけなのに、自動ツイートされるなんてことも。
いつか直します。
Form1を弄るのはここまで、次は設定ができるようにしましょう。
まずはフォーム上にこんな風に部品を配置
そして配置した各コントロールのプロパティをこのように変更
TimerCountNumericUpDown
EnabledをFalseに
Maximumを120に
Minimumを1に
Valueを5に

各ラベルのプロパティ
EnabledをFalseに

textBoxのプロパティ
EnabledをFalseに
MultilineをTrueに
ScrollBarsをBothに
WordWrapをFalseに

それぞれ変更しました
そして、これが設定画面のソース短いから丸ごと丸ごと!
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;

namespace じみったー
{
    public partial class Setting : Form
    {
        Form2 _subForm;
        Form1 _mainForm;
        public Form1 mainForm
        {
            get { return _mainForm; }
            set { _mainForm = value; }
        }
        public Form2 subForm
        {
            get { return _subForm; }
            set { _subForm = value; }
        }

        public Setting(Form1 form)
        {
            InitializeComponent();
            mainForm = form;
            OptionInitializeComponent();
        }

        //設定項目を反映
        public void SetOption()
        {
            mainForm.Tcount = (int)TCountNumericUpDown1.Value;
            mainForm._TimerCount = (int)TimerCountNumericUpDown1.Value;
            mainForm._AutoWtw = textBox1.Text;
            if (checkBox1.Checked)
            {
                mainForm.TimerFlg = true;
            }
            else
            {
                mainForm.TimerFlg = false;
            }
            if (ResetOAthCheckBox.Checked)
            {
                mainForm.pinReset = "Tokenreset";
                MessageBox.Show("認証情報をリセットしました再起動します。","じみったー",MessageBoxButtons.OK,MessageBoxIcon.Information);
                Application.Restart();
            }
        }

        //設定項目の初期化
        private void OptionInitializeComponent()
        {
            TCountNumericUpDown1.Value = (decimal)mainForm.Tcount;
            TimerCountNumericUpDown1.Value = (decimal)mainForm._TimerCount;
            if (mainForm.TimerFlg)
            {
                checkBox1.Checked = true;
            }
            else
            {
                checkBox1.Checked = false;
            }
            textBox1.Text = mainForm._AutoWtw;
        }
        //離脱ツイート有効化のチェックボックス
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                TimerCountNumericUpDown1.Enabled = true;
                textBox1.Enabled = true;
                label4.Enabled = true;
                label3.Enabled = true;
            }
            else
            {
                TimerCountNumericUpDown1.Enabled = false;
                textBox1.Enabled = false;
                label4.Enabled = false;
                label3.Enabled = false;
            }
        }
    }
}

設定の癖して短ゲフンゲフン
さて、これで完成のはず。言い忘れたことはないよな俺。
さて、今回のソースは例のごとくここからダウンロードできるようにしますので、じっくり見たい方はどうぞ。コピーしたい方もどうぞ。自由に使ってくださいまし。

さて、そろそろ、RT数とふぁぼ数を取得できるようにしないとね。

0 件のコメント:

コメントを投稿