azure-communication-chat-java

--- Créez des applications de chat en temps réel avec le Azure Communication Services Chat Java SDK. À utiliser lors de l'implémentation de threads de chat, de messages, de participants, de confirmations de lecture, de notifications de saisie ou de fonctionnalités de chat en temps réel.

npx skills add https://github.com/microsoft/skills --skill azure-communication-chat-java

Azure Communication Chat (Java)

Créez des applications de chat en temps réel avec gestion des fils de discussion, messagerie, participants et accusés de lecture.

Installation

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-communication-chat</artifactId>
    <version>1.6.0</version>
</dependency>

Création du client

import com.azure.communication.chat.ChatClient;
import com.azure.communication.chat.ChatClientBuilder;
import com.azure.communication.chat.ChatThreadClient;
import com.azure.communication.common.CommunicationTokenCredential;

// ChatClient requiert un CommunicationTokenCredential (jeton d'accès utilisateur)
String endpoint = "https://<resource>.communication.azure.com";
String userAccessToken = "<user-access-token>";

CommunicationTokenCredential credential = new CommunicationTokenCredential(userAccessToken);

ChatClient chatClient = new ChatClientBuilder()
    .endpoint(endpoint)
    .credential(credential)
    .buildClient();

// Client asynchrone
ChatAsyncClient chatAsyncClient = new ChatClientBuilder()
    .endpoint(endpoint)
    .credential(credential)
    .buildAsyncClient();

Concepts clés

Classe Objectif
ChatClient Créer/supprimer des fils de discussion, obtenir des clients de fil
ChatThreadClient Opérations au sein d'un fil (messages, participants, accusés)
ChatParticipant Utilisateur dans un fil de discussion avec nom d'affichage
ChatMessage Contenu du message, type, informations sur l'expéditeur, horodatages
ChatMessageReadReceipt Suivi des accusés de lecture par participant

Créer un fil de discussion

import com.azure.communication.chat.models.*;
import com.azure.communication.common.CommunicationUserIdentifier;
import java.util.ArrayList;
import java.util.List;

// Définir les participants
List<ChatParticipant> participants = new ArrayList<>();

ChatParticipant participant1 = new ChatParticipant()
    .setCommunicationIdentifier(new CommunicationUserIdentifier("<user-id-1>"))
    .setDisplayName("Alice");

ChatParticipant participant2 = new ChatParticipant()
    .setCommunicationIdentifier(new CommunicationUserIdentifier("<user-id-2>"))
    .setDisplayName("Bob");

participants.add(participant1);
participants.add(participant2);

// Créer le fil
CreateChatThreadOptions options = new CreateChatThreadOptions("Project Discussion")
    .setParticipants(participants);

CreateChatThreadResult result = chatClient.createChatThread(options);
String threadId = result.getChatThread().getId();

// Obtenir le client de fil pour les opérations
ChatThreadClient threadClient = chatClient.getChatThreadClient(threadId);

Envoyer des messages

// Envoyer un message texte
SendChatMessageOptions messageOptions = new SendChatMessageOptions()
    .setContent("Hello, team!")
    .setSenderDisplayName("Alice")
    .setType(ChatMessageType.TEXT);

SendChatMessageResult sendResult = threadClient.sendMessage(messageOptions);
String messageId = sendResult.getId();

// Envoyer un message HTML
SendChatMessageOptions htmlOptions = new SendChatMessageOptions()
    .setContent("<strong>Important:</strong> Meeting at 3pm")
    .setType(ChatMessageType.HTML);

threadClient.sendMessage(htmlOptions);

Récupérer les messages

import com.azure.core.util.paging.PagedIterable;

// Lister tous les messages
PagedIterable<ChatMessage> messages = threadClient.listMessages();

for (ChatMessage message : messages) {
    System.out.println("ID: " + message.getId());
    System.out.println("Type: " + message.getType());
    System.out.println("Content: " + message.getContent().getMessage());
    System.out.println("Sender: " + message.getSenderDisplayName());
    System.out.println("Created: " + message.getCreatedOn());

    // Vérifier si modifié ou supprimé
    if (message.getEditedOn() != null) {
        System.out.println("Edited: " + message.getEditedOn());
    }
    if (message.getDeletedOn() != null) {
        System.out.println("Deleted: " + message.getDeletedOn());
    }
}

// Obtenir un message spécifique
ChatMessage message = threadClient.getMessage(messageId);

Mettre à jour et supprimer des messages

// Mettre à jour le message
UpdateChatMessageOptions updateOptions = new UpdateChatMessageOptions()
    .setContent("Updated message content");

threadClient.updateMessage(messageId, updateOptions);

// Supprimer le message
threadClient.deleteMessage(messageId);

Gérer les participants

// Lister les participants
PagedIterable<ChatParticipant> participants = threadClient.listParticipants();

for (ChatParticipant participant : participants) {
    CommunicationUserIdentifier user = 
        (CommunicationUserIdentifier) participant.getCommunicationIdentifier();
    System.out.println("User: " + user.getId());
    System.out.println("Display Name: " + participant.getDisplayName());
}

// Ajouter des participants
List<ChatParticipant> newParticipants = new ArrayList<>();
newParticipants.add(new ChatParticipant()
    .setCommunicationIdentifier(new CommunicationUserIdentifier("<new-user-id>"))
    .setDisplayName("Charlie")
    .setShareHistoryTime(OffsetDateTime.now().minusDays(7))); // Partager les 7 derniers jours

threadClient.addParticipants(newParticipants);

// Supprimer un participant
CommunicationUserIdentifier userToRemove = new CommunicationUserIdentifier("<user-id>");
threadClient.removeParticipant(userToRemove);

Accusés de lecture

// Envoyer un accusé de lecture
threadClient.sendReadReceipt(messageId);

// Obtenir les accusés de lecture
PagedIterable<ChatMessageReadReceipt> receipts = threadClient.listReadReceipts();

for (ChatMessageReadReceipt receipt : receipts) {
    System.out.println("Message ID: " + receipt.getChatMessageId());
    System.out.println("Read by: " + receipt.getSenderCommunicationIdentifier());
    System.out.println("Read at: " + receipt.getReadOn());
}

Notifications de saisie

import com.azure.communication.chat.models.TypingNotificationOptions;

// Envoyer une notification de saisie
TypingNotificationOptions typingOptions = new TypingNotificationOptions()
    .setSenderDisplayName("Alice");

threadClient.sendTypingNotificationWithResponse(typingOptions, Context.NONE);

// Notification de saisie simple
threadClient.sendTypingNotification();

Opérations sur les fils

// Obtenir les propriétés du fil
ChatThreadProperties properties = threadClient.getProperties();
System.out.println("Topic: " + properties.getTopic());
System.out.println("Created: " + properties.getCreatedOn());

// Mettre à jour le sujet
threadClient.updateTopic("New Project Discussion Topic");

// Supprimer le fil
chatClient.deleteChatThread(threadId);

Lister les fils

// Lister tous les fils de discussion pour l'utilisateur
PagedIterable<ChatThreadItem> threads = chatClient.listChatThreads();

for (ChatThreadItem thread : threads) {
    System.out.println("Thread ID: " + thread.getId());
    System.out.println("Topic: " + thread.getTopic());
    System.out.println("Last message: " + thread.getLastMessageReceivedOn());
}

Pagination

import com.azure.core.http.rest.PagedResponse;

// Parcourir les messages
int maxPageSize = 10;
ListChatMessagesOptions listOptions = new ListChatMessagesOptions()
    .setMaxPageSize(maxPageSize);

PagedIterable<ChatMessage> pagedMessages = threadClient.listMessages(listOptions);

pagedMessages.iterableByPage().forEach(page -> {
    System.out.println("Page status code: " + page.getStatusCode());
    page.getElements().forEach(msg -> 
        System.out.println("Message: " + msg.getContent().getMessage()));
});

Gestion des erreurs

import com.azure.core.exception.HttpResponseException;

try {
    threadClient.sendMessage(messageOptions);
} catch (HttpResponseException e) {
    switch (e.getResponse().getStatusCode()) {
        case 401:
            System.out.println("Unauthorized - check token");
            break;
        case 403:
            System.out.println("Forbidden - user not in thread");
            break;
        case 404:
            System.out.println("Thread not found");
            break;
        default:
            System.out.println("Error: " + e.getMessage());
    }
}

Types de messages

Type Description
TEXT Message de chat régulier
HTML Message formaté HTML
TOPIC_UPDATED Message système - sujet modifié
PARTICIPANT_ADDED Message système - participant rejointe
PARTICIPANT_REMOVED Message système - participant quitté

Variables d'environnement

AZURE_COMMUNICATION_ENDPOINT=https://<resource>.communication.azure.com
AZURE_COMMUNICATION_USER_TOKEN=<user-access-token>

Bonnes pratiques

  1. Gestion des jetons - Les jetons utilisateur expirent ; implémentez la logique d'actualisation avec CommunicationTokenRefreshOptions
  2. Pagination - Utilisez listMessages(options) avec maxPageSize pour les grands fils
  3. Partage d'historique - Définissez shareHistoryTime lors de l'ajout de participants pour contrôler la visibilité des messages
  4. Types de messages - Filtrez les messages système (PARTICIPANT_ADDED, etc.) des messages utilisateur
  5. Accusés de lecture - Envoyez les accusés de lecture uniquement lorsque les messages sont réellement visualisés par l'utilisateur

Expressions déclencheurs

  • "application de chat Java", "messagerie en temps réel Java"
  • "fil de discussion", "participants au chat", "messages de chat"
  • "accusés de lecture", "notifications de saisie"
  • "Azure Communication Services chat"