Ejemplo n.º 1
0
        public void Initialieze()
        {
            var proxy = this.Proxy ?? (this.Proxy = new KanColleProxy());
            var basic = proxy.api_get_member_basic.TryParse<kcsapi_basic>().FirstAsync().ToTask();
            var kdock = proxy.api_get_member_kdock.TryParse<kcsapi_kdock[]>().FirstAsync().ToTask();
            var sitem = proxy.api_get_member_slot_item.TryParse<kcsapi_slotitem[]>().FirstAsync().ToTask();

            this.Updater = new Updater();
            this.Translations = new Translations();

            proxy.api_start2.FirstAsync().Subscribe(async session =>
            {
                var timeout = Task.Delay(TimeSpan.FromSeconds(20));
                var canInitialize = await Task.WhenAny(new Task[] { basic, kdock, sitem }.WhenAll(), timeout) != timeout;

                // タイムアウト仕掛けてるのは、今後のアップデートで basic, kdock, slot_item のいずれかが来なくなったときに
                // 起動できなくなる (IsStarted を true にできなくなる) のを防ぐため
                // -----
                // ま、そんな規模の変更があったらそもそもまともに動作せんだろうがな ☝(◞‸◟)☝ 野良ツールはつらいよ

                SvData<kcsapi_start2> svd;
                if (!SvData.TryParse(session, out svd)) return;

                this.Master = new Master(svd.Data);
                if (this.Homeport == null) this.Homeport = new Homeport(proxy);

                if (canInitialize)
                {
                    this.Homeport.UpdateAdmiral((await basic).Data);
                    this.Homeport.Itemyard.Update((await sitem).Data);
                    this.Homeport.Dockyard.Update((await kdock).Data);
                }

                this.IsStarted = true;
            });
        }