Пример #1
0
        //-------------------------------------------------------------------------
        // コンストラクタ
        //-------------------------------------------------------------------------
        public WakuDlg(string iLv,bool iChangeProp)
        {
            mNico = Nico.Instance;
            mState = WakuResult.ERR;
            mChangeProp = iChangeProp;

            mAbort = false;
            mPostTweet = false;
            mLv = iLv;
            InitializeComponent();
            mLabel.Text = "初期化中";

            if (iChangeProp) this.Text = "前枠の続きの枠取り";
        }
Пример #2
0
        //-------------------------------------------------------------------------
        // 枠取りワーカー
        //-------------------------------------------------------------------------
        private void mWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            string lv = "";
            int try_cnt = 0;

            if (mChangeProp)
            {
                SetLabelFromThread("ログイン中", Color.Black, false);
                mNico.WakutoriMode = true;
                bool login = mNico.Login(Properties.Settings.Default.user_id,
                                           Properties.Settings.Default.password);
                if (!login)
                {
                    SetLabelFromThread("ログインできませんでした", Color.Red, false);
                    return;
                }
            }

            SetLabelFromThread("放送履歴取得中", Color.Black, false);

            if( mLv.Length <= 2)
                mLv = mNico.GetRecentLive();

            SetLabelFromThread("前枠番組情報の取得中", Color.Black, false);

               // Debug.WriteLine(mLv);

            Dictionary<string, string> arr = new Dictionary<string, string>();
            Dictionary<string, string> comu = new Dictionary<string, string>();
            Dictionary<string, string> tag = new Dictionary<string, string>();
            Dictionary<string, string> taglock = new Dictionary<string, string>();
            GET_OLD_INFO:
            if (!mNico.GetOldLive(mLv,ref arr, ref comu,ref tag,ref taglock))
            {
                if (mAbort) return;

                try_cnt++;
                if( try_cnt < 10 )
                {
                    Thread.Sleep(100);
                    goto GET_OLD_INFO;
                }

                SetLabelFromThread("ERR:前枠番組情報の取得に失敗", Color.Red, false);
                return;
            }

            if (mAbort) return;

            // タイトルの番号の自動更新
            if (Properties.Settings.Default.title_auto_inc)
            {
                arr["title"] = Utils.incTitle(arr["title"]);
            }

            // 放送情報変更
            if (mChangeProp)
            {
                ChangeProp dlg = new ChangeProp();

                dlg.Title           = arr["title"];
                dlg.Desc            = arr["description"];
                dlg.TimeShift       = (arr["timeshift_enabled"].Equals("1")) ? true : false;
                dlg.CommunityOnly   = (arr["public_status"].Equals("2")) ? true : false;
                dlg.Totumachi       = (arr["tags[2]"].Length > 0) ? true : false;
                dlg.Cruise          = (arr["tags[3]"].Length > 0) ? true : false;
                dlg.Face            = (arr["tags[1]"].Length > 0) ? true : false;
                dlg.Ad              = (arr["ad_enable"].Equals("0")) ? true : false;
                if( arr.ContainsKey("livetaglockall"))
                    dlg.LiveTagLockAll  = (arr["livetaglockall"].Length > 0) ? true : false;

                dlg.SetCommunity(comu);
                dlg.SetTag(tag, taglock);

                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    arr["title"] = dlg.Title;
                    arr["description"] = dlg.Desc;
                    arr["public_status"] = (dlg.CommunityOnly) ? "2" : "";
                    arr["timeshift_enabled"] = (dlg.TimeShift) ? "1" : "0";
                    arr["tags[1]"] = (dlg.Face) ? "顔出し" : "";
                    arr["tags[2]"] = (dlg.Totumachi) ? "凸待ち" : "";
                    arr["tags[3]"] = (dlg.Cruise) ? "クルーズ待ち" : "";
                    arr["default_community"] = dlg.Community;
                    arr["ad_enable"] = dlg.Ad ? "0" : "1";
                    if (arr.ContainsKey("livetaglockall"))
                        arr["livetaglockall"] = (dlg.LiveTagLockAll)?"ロックする":"";

                    tag = dlg.GetTag();
                    taglock = dlg.GetTaglock();
                }
                else
                {
                    try
                    {
                        this.Invoke((MethodInvoker)delegate()
                        {
                            Close();
                        });
                    }
                    catch (Exception)
                    {
                    }
                    return;
                }
            }

            // 枠取り開始
            SetLabelFromThread( "枠取り中",Color.Black,false);

            // taglockのロック内容が無いものを削除
            Dictionary<string, string> new_taglock = new Dictionary<string, string>();
            foreach (string key in taglock.Keys)
            {
                if (taglock[key].Length > 0)
                {
                    new_taglock.Add(key, taglock[key]);
                }
            }
            taglock = new_taglock;

            // タグ追加
            foreach (string key in tag.Keys)
            {
                arr.Add(key,tag[key]);
            }
            foreach (string key in taglock.Keys)
            {
                arr.Add(key,taglock[key]);
            }

            try_cnt = 0;
            bool base64_encoded = false;
            RETRY:
            if (mAbort) return;

            WakuErr err = mNico.GetWaku(ref arr, ref lv);
            if (err == WakuErr.ERR_NO_ERR)
            {
                mLv = lv;
                mState = WakuResult.NO_ERR;
                SetLabelFromThread( "枠取り完了",Color.Black,true);
            }
            else if (err == WakuErr.ERR_MAINTE)
            {
                SetLabelFromThread("メンテナンス中です", Color.Red, false);
            }
            else if (err == WakuErr.ERR_KIYAKU)
            {
                SetLabelFromThread("枠取り中(規約確認中)", Color.Black, false);
                arr["kiyaku"] = "true";
                if (!base64_encoded)
                {
                    arr["description"] = Utils.ToBase64(arr["description"]);
                    base64_encoded = true;
                }
                goto RETRY;
            }
            else if (err == WakuErr.ERR_LOGIN)
            {
                SetLabelFromThread("ログイン中", Color.Black, false);

                mNico.Login(Properties.Settings.Default.user_id,
                                           Properties.Settings.Default.password);
                goto RETRY;
            }
            else if (err == WakuErr.ERR_TAJU)
            {
                SetLabelFromThread( "枠取り中(多重投稿)",Color.Black,false);
                arr.Remove("confirm");
                goto RETRY;
            }
            else if (err == WakuErr.ERR_KONZATU)
            {
                SetLabelFromThread("枠取り中(混雑中)",Color.Black,false);
                arr.Remove("confirm");
                goto RETRY;
            }
            else if (err == WakuErr.ERR_JUNBAN_WAIT)
            {
                SetLabelFromThread("順番待ちに並びます", Color.Black, false);
                arr["is_wait"] = "wait";
                goto RETRY;
            }
            //else if (err == WakuErr.ERR_JUNBAN_ALREADY || err == WakuErr.ERR_JUNBAN)
            //{
            //    // ならんだ瞬間に、終了
            //    // コメントをリストに追加
            //    mState = WakuResult.JUNBAN;
            //    SetLabelFromThread("枠取りウインドウに移動します", Color.Blue, true);
            //}
            else if (err == WakuErr.ERR_JUNBAN)
            {
                mState = WakuResult.NO_ERR;
                SetLabelFromThread("順番待ち",Color.Black,false);
                if (lv.Length <= 2)
                    goto RETRY;
                do
                {
                    if (mAbort) return;
                    Dictionary<string,string> waitInfo = mNico.GetJunban(lv);
                    if (waitInfo.ContainsKey("stream_status") && waitInfo["stream_status"].Equals("3"))
                    {
                        SetLabelFromThread("ERR:別の放送が開始されています。", Color.Red, false);
                        break;
                    }

                    //Debug.WriteLine(lv);

                    if (!waitInfo.ContainsKey("count"))
                        continue;
                    int cnt = int.Parse(waitInfo["count"]);
                    if (cnt <= 0)
                    {
                        mLv = lv;
                        SetLabelFromThread("枠取り完了", Color.Black, true);
                        mState = WakuResult.NO_ERR;
                        break;
                    }
                    else
                    {
                        Match match = Regex.Match(waitInfo["start_time"], "日(.*?)時(.*?)分");
                        SetLabelFromThread("順番待ち: " + waitInfo["count"] + "人 (" + match.Groups[1].Value + "時" + match.Groups[2].Value+"分)", Color.Black, false);

                        // 100人以上順番待ちの時はTweet
                        if (cnt >= 102)
                        {
                            mPostTweet = true;
                        }

                        // 順番待ち100人未満に成ったらTweet
                        if (mPostTweet && cnt < 100)
                        {
                            Utils.TweetWait(cnt);
                            mPostTweet = false;
                        }
                    }
                    Thread.Sleep(1000);
                } while (true);
            }
            else if (err == WakuErr.ERR_JUNBAN_ALREADY)
            {
                SetLabelFromThread("ERR:既に順番待ちの放送があります", Color.Red, false);
            }
            else if (err == WakuErr.ERR_TAG)
            {
                SetLabelFromThread("ERR:18文字以上のタグは利用できません", Color.Red, false);
            }
            else if (err == WakuErr.ERR_ALREADY_LIVE)
            {
                if (try_cnt < 5)
                {
                    try_cnt++;
                    Thread.Sleep(1000);
                    goto RETRY;
                }
                mState = WakuResult.NO_ERR;
                mLv = "";
                SetLabelFromThread("ERR:既に放送中です。", Color.Red, true);
            }
            else if (err == WakuErr.ERR_MOJI)
            {
                SetLabelFromThread("ERR:文字数制限エラー。", Color.Red,false);
            }
            else if (err == WakuErr.ERR_UNKOWN)
            {
                if (try_cnt < 5)
                {
                    try_cnt++;
                    Thread.Sleep(250);
                    goto RETRY;
                }
                SetLabelFromThread("ERR:予期せぬエラーです。", Color.Red,false);
            }
            arr = null;
        }
Пример #3
0
        //-------------------------------------------------------------------------
        // キャンセル
        //-------------------------------------------------------------------------
        private void mCancel_Click(object sender, EventArgs e)
        {
            mAbort = true;

            mState = WakuResult.ERR;

            mWorker.CancelAsync();

            Close();
        }