public override async Task HandleMessageAsync()

in dotnet/space-translate/SpaceTranslate/WebHook/SpaceTranslateWebHookHandler.HandleMessage.cs [27:103]


    public override async Task HandleMessageAsync(MessagePayload payload)
    {
        using var loggerScopeForClientId = _logger.BeginScope("ClientId={ClientId}", payload.ClientId);
        
        var organization = await _db.Organizations.FirstOrDefaultAsync(it => it.ClientId == payload.ClientId);
        if (organization == null)
        {
            _logger.LogWarning("The organization does not exist. ClientId={ClientId}", payload.ClientId);
            return;
        }
        
        if (payload.Message.Body is not ChatMessageText messageText || string.IsNullOrEmpty(messageText.Text))
        {
            _logger.LogWarning("Unknown payload message body type. MessageBodyType={MessageBodyType}", payload.Message.Body?.GetType());
            return;
        }

        var messageTextBody = messageText.Text.StartsWith("translate ", StringComparison.OrdinalIgnoreCase)
            ? messageText.Text.Substring("translate ".Length)
            : messageText.Text;
        
        var organizationConnection = organization.CreateConnection();
        var organizationChatClient = new ChatClient(organizationConnection);
        
        var cacheKey = organization.Id + "__" +
                       messageTextBody.ToMd5();
    
        var cachedTranslation = await _cache.GetOrCreateAsync(cacheKey, async _ =>
        {
            if (string.IsNullOrWhiteSpace(messageTextBody)) return "(empty)";
        
            _logger.LogInformation("Requesting translation from DeepL...");
            
            var translatedText = await _translator.TranslateTextAsync(
                text: messageTextBody,
                sourceLanguageCode: null,
                targetLanguageCode: "en-US",
                options: null);
        
            _logger.LogInformation("Received translation from DeepL. DetectedSourceLanguageCode={DetectedSourceLanguageCode}", translatedText.DetectedSourceLanguageCode);
    
            return translatedText.Text;
        });
    
        if (cachedTranslation != null)
        {
            await organizationChatClient.Messages.SendMessageAsync(
                recipient: MessageRecipient.Member(ProfileIdentifier.Id(payload.UserId)),
                content: ChatMessage.Block(new List<MessageSectionElement>
                {
                    MessageSectionElement.MessageSection(new List<MessageBlockElement>
                    {
                        MessageBlockElement.MessageText($"Translation of message: "),
                        MessageBlockElement.MessageDivider(),
                        MessageBlockElement.MessageText(cachedTranslation)
                    })
                }));
        }
        else
        {
            _logger.LogWarning("Could not translate message");
            
            await organizationChatClient.Messages.SendMessageAsync(
                recipient: MessageRecipient.Member(ProfileIdentifier.Id(payload.UserId)),
                content: ChatMessage.Block(new List<MessageSectionElement>
                {
                    MessageSectionElement.MessageSection(new List<MessageBlockElement>
                    {
                        MessageBlockElement.MessageText("Could not translate message")
                    })
                }));
            
            return;
        }
        
        await base.HandleMessageAsync(payload);
    }