/// <summary> /// A simple utility method that will assert that this result is successful and that /// there are no warning messages. This throws an exception if either of those /// asserts are false. /// </summary> public fsResult AssertSuccessWithoutWarnings() { if (Failed || RawMessages.Any()) { throw AsException; } return(this); }
private async Task Discord_MessageReceived(SocketMessage newMessage) { using (var releaser = await _MessageUpdateLock.LockAsync()) { if (newMessage.Channel.Id == TextChannel.Id) { RawMessages.Add(newMessage); await Task.Delay(50); } } }
private async Task SocketClient_MessageDeleted(Cacheable <IMessage, ulong> deletedMessage, ISocketMessageChannel channel) { using (var releaser = await _MessageUpdateLock.LockAsync()) { var messageId = deletedMessage.Id; if (channel.Id == TextChannel.Id) { var target = RawMessages.FirstOrDefault(x => x.Id == messageId); if (target != null) { RawMessages.Remove(target); } await Task.Delay(50); } } }
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); }
public IRCClientConnection(String address, ushort port, SynchronizationContext context, Client client) : base(address, port) { _context = context; _client = client; _networks = new SynchronizedKeyedCollection <String, INetwork>(_context); _channels = new SynchronizedKeyedCollection <String, IChannel>(_context); _users = new SynchronizedKeyedCollection <String, IUser>(_context); _me = GetUser(_initialNickname) as User; _messageSender = new MessageSender(this); _messageReceiver = new MessageReceiver(this); _disposables.Add(RawMessages .Select(r => _messageReceiver.Receive(r)) .Subscribe(_internalReceivedMessages) ); _disposables.Add(_internalReceivedMessages.Subscribe(_receivedMessages)); _disposables.Add(_receivedMessages.Subscribe(_messages)); _disposables.Add(_sentMessages.Subscribe(_messages)); _disposables.Add(_sentMessages .Where(m => m.Type == SendType.Privmsg || m.Type == SendType.Notice) .Subscribe(m => HandleMessage(m)) ); _disposables.Add(_internalReceivedMessages .Where(m => m.Type == ReceiveType.Ping) .Subscribe(HandlePing) ); _disposables.Add(_internalReceivedMessages .Where(m => m.Type == ReceiveType.Join) .Subscribe(HandleJoin) ); _disposables.Add(_internalReceivedMessages .Where(m => m.Type == ReceiveType.Part) .Subscribe(HandlePart) ); _disposables.Add(_internalReceivedMessages .Where(m => m.Type == ReceiveType.Kick) .Subscribe(HandleKick) ); _disposables.Add(_internalReceivedMessages .Where(m => m.Type == ReceiveType.Quit) .Subscribe(HandleQuit) ); _disposables.Add(_internalReceivedMessages .Where(m => m.Type == ReceiveType.NickChange) .Subscribe(HandleNickChange) ); _disposables.Add(_internalReceivedMessages .Where(m => m.Type == ReceiveType.TopicChange) .Subscribe(HandleTopicChange) ); _disposables.Add(_internalReceivedMessages .Where(m => m.Type == ReceiveType.ChannelModeChange) .Subscribe(HandleChannelModeChange) ); _disposables.Add(_internalReceivedMessages .Where(m => m.Type == ReceiveType.UserModeChange) .Subscribe(HandleUserModeChange) ); _disposables.Add(_internalReceivedMessages .Where(m => m.ReplyType == ReplyType.Welcome) .Subscribe(HandleWelcome) ); _disposables.Add(_internalReceivedMessages .Where(m => m.ReplyType == ReplyType.ChannelModeIs) .Subscribe(HandleChannelModeIsReply) ); _disposables.Add(_internalReceivedMessages .Where(m => m.ReplyType == ReplyType.CreatedAt) .Subscribe(HandleCreatedAtReply) ); _disposables.Add(_internalReceivedMessages .Where(m => m.ReplyType == ReplyType.Topic) .Subscribe(HandleTopicReply) ); _disposables.Add(_internalReceivedMessages .Where(m => m.ReplyType == ReplyType.TopicSetBy) .Subscribe(HandleTopicSetByReply) ); _disposables.Add(_internalReceivedMessages .Where(m => m.ReplyType == ReplyType.NamesReply) .Subscribe(HandleNamesReply) ); _disposables.Add(_internalReceivedMessages .Where(m => m.ReplyType == ReplyType.WhoReply) .Subscribe(HandleWhoReply) ); _disposables.Add(_internalReceivedMessages .Where(m => m.ReplyType == ReplyType.Away) .Subscribe(HandleAwayReply) ); _disposables.Add(_internalReceivedMessages .Where(m => m.ReplyType == ReplyType.UnAway) .Subscribe(HandleUnAwayReply) ); }