Example #1
0
        public override void OnNavigatedTo(NavigatedToEventArgs e, Dictionary <string, object> viewModelState)
        {
            // ログインしていない?
            if (SocketClient == null)
            {
                IsInvalidTextChannel.Value = true;

                Debug.WriteLine("TextChannelPage にテキストチャンネルID(ulong)が正常に渡されませんでした。");

                return;
            }

            // ナビゲーションパラメータにはテキストチャンネルIDが必要
            if (e.Parameter is ulong)
            {
                var textChannelId = (ulong)e.Parameter;

                TextChannel = SocketClient.GetChannel(textChannelId) as SocketTextChannel;
            }

            // テキストチャンネルが見つからない場合は異常をページ表示に反映
            if (TextChannel == null)
            {
                IsInvalidTextChannel.Value = true;

                Debug.WriteLine("TextChannelPage にテキストチャンネルID(ulong)が正常に渡されませんでした。");

                return;
            }

            DiscordContext.CurrentTextChannel = TextChannel;

            try
            {
                NowMessageLoading.Value = true;

                Name = TextChannel.Name;
                RaisePropertyChanged(nameof(Name));

                // テキストチャンネルページを表示中だけメッセージ受信を処理する
                SocketClient.MessageReceived += Discord_MessageReceived;
                SocketClient.MessageDeleted  += SocketClient_MessageDeleted;
                SocketClient.MessageUpdated  += SocketClient_MessageUpdated;

                RawMessages.Clear();

                var task = _MessageUpdateLock.LockAsync()
                           .ContinueWith(async x =>
                {
                    using (x.Result)
                    {
                        if (RawMessages.Count > 0)
                        {
                            return;
                        }

                        if (TextChannel == null)
                        {
                            throw new Exception();
                        }

                        var rawMessages = await TextChannel.GetMessagesAsync().Flatten();

                        UIDispatcherScheduler.Default.Schedule(this, TimeSpan.Zero, (scheeduler, state) =>
                        {
                            var sorted = rawMessages.ToList();
                            sorted.Sort((a, b) => (int)(a.Timestamp - b.Timestamp).TotalSeconds);
                            foreach (var message in sorted)
                            {
                                RawMessages.Add(message);
                            }

                            return(null);
                        });

                        await Task.Delay(500);
                    }
                });

                task.Wait();
            }
            finally
            {
                NowMessageLoading.Value = false;
            }


            base.OnNavigatedTo(e, viewModelState);
        }