예제 #1
0
파일: fsResult.cs 프로젝트: schirrel/Grange
 /// <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);
 }
예제 #2
0
        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);
                }
            }
        }
예제 #3
0
        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);
                }
            }
        }
예제 #4
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);
        }
        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)
                             );
        }