private Mono<Void> sendMessage(
            @NotNull Message message,
            @NotNull Set<Long> recipientIds,
            @Nullable DeviceType senderDeviceType) {
        if (recipientIds.isEmpty()) {
            return Mono.empty();
        }
        Long senderId = message.getSenderId();
        TurmsNotification notification = ClientMessagePool.getTurmsNotificationBuilder()
                .setRequesterId(senderId)
                .setTimestamp(System.currentTimeMillis())
                .setRelayedRequest(ClientMessagePool.getTurmsRequestBuilder()
                        .setCreateMessageRequest(
                                ProtoModelConvertor.message2createMessageRequest(message)))
                .setRequestId(ADMIN_REQUEST_ID)
                .build();
        Set<UserSessionId> excludedUserSessionIds;
        if (notifyRequesterOtherOnlineSessionsOfMessageCreated && senderDeviceType != null) {
            recipientIds = CollectionUtil.add(recipientIds, senderId);
            excludedUserSessionIds = Set.of(new UserSessionId(senderId, senderDeviceType));
        } else {
            excludedUserSessionIds = Collections.emptySet();
        }
        return outboundMessageManager
                .forwardNotification(notification, recipientIds, excludedUserSessionIds)
                // TODO: Should trigger extension points
                // https://github.com/turms-im/turms/issues/1189
                .then();
    }
@param senderDeviceType can be null when it is a system message
turms-service/src/main/java/im/turms/service/domain/message/service/MessageService.java