public async Task Listen() { while (!_cancellationToken.IsCancellationRequested) { var message = await ReceiveAsync(); OnJsonMessage?.Invoke(message); if (TryDeserialize <WebSocketResponse>(message, out var response)) { var channelDisplayName = response.GetDataOrDefault("channel_display_name"); OnWebSocketResponse?.Invoke(response); if (response.TryGetData("posted", "post", out var postJson)) { if (TryDeserialize <Posted>(postJson, out var posted)) { OnPosted?.Invoke(new PostedEvent { ChannelDisplayName = channelDisplayName, Post = posted }); } } if (response.TryGetData("hello", "server_version", out var serverVersion)) { OnHello?.Invoke(serverVersion); if (response.Broadcast != null && response.Broadcast.ContainsKey("user_id")) { OnBotUserId?.Invoke(response.Broadcast["user_id"]); } } } } }
async Task HandleHelloPayload(DiscordApiData payload, DiscordApiData data) { if (!receivedHello) { receivedHello = true; // Set heartbeat interval heartbeatInterval = data.GetInteger("heartbeat_interval").Value; log.LogVerbose($"[Hello] heartbeat_interval = {heartbeatInterval}ms"); // Begin heartbeat loop heartbeatCancellationSource = new CancellationTokenSource(); heartbeatTask = HeartbeatLoop(); // Notify so the IDENTIFY or RESUME payloads are sent await OnHello?.Invoke(); } else { log.LogWarning("Received more than one HELLO payload."); } }
// Факт прихода сотрудника. public void Come(DateTime comeTime) { OnHello?.Invoke(this, new ComeTimeEventArgs(comeTime)); }