# Adding Umami Tracking Client Nuget Package

<!--category-- ASP.NET, Umami, Nuget -->
<datetime class="hidden">2024-08-28T02:00</datetime>

# Introduzione

Ora ho il cliente Umami; Dovrei l'impacchettare e renderlo disponibile come package Nuget. È un processo abbastanza semplice, ma ci sono alcune cose di cui essere consapevoli.

[TOC]

# Creare il Nuget Package

## La versione

Ho deciso di copiare. [Khalid](https://khalidabuhakmeh.com/) e usare l'excellente package minver alla versione del mio package Nuget. Questo è un semplice package che usa la targhetta della versione git per determinare il numero di versione.

Per usarlo ho semplicemente aggiunto il seguente: `Umami.Net.csproj` file:

```xml
    <PropertyGroup>
    <MinVerTagPrefix>v</MinVerTagPrefix>
</PropertyGroup>
```

In questo modo posso etichettare la mia versione con un `v` e il pacchetto sarà corretto.

```bash
 git tag v0.0.8       
 git push origin v0.0.8

```

Metterò questo tag, allora ho una configurazione di GitHub Action per aspettare quel tag e costruire il package Nuget.

## Costruire il Nuget Package

Ho un'azione GitHub che costruisce il pacco Nuget e lo spinge al riposito del pacco Git Hub. Questo è un semplice processo che usa `dotnet pack` il comando per costruire il paquet e poi il `dotnet nuget push` il comando per spingerlo al riposito nuget.

```yaml
name: Publish Umami.NET
on:
  push:
    tags:
      - 'v*.*.*'  # This triggers the action for any tag that matches the pattern v1.0.0, v2.1.3, etc.

jobs:
  publish:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Setup .NET
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: '8.x' # Specify the .NET version you need

    - name: Restore dependencies
      run: dotnet restore ./Umami.Net/Umami.Net.csproj

    - name: Build project
      run: dotnet build --configuration Release ./Umami.Net/Umami.Net.csproj --no-restore

    - name: Pack project
      run: dotnet pack --configuration Release ./Umami.Net/Umami.Net.csproj --no-build --output ./nupkg

    - name: Publish to NuGet
      run: dotnet nuget push ./nupkg/*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.UMAMI_NUGET_API_KEY }}
      env:
        NUGET_API_KEY: ${{ secrets.UMAMI_NUGET_API_KEY }}
```

### Adding Readme and Icon

Questo è abbastanza semplice, aggiungo un `README.md` file alla radice del progetto e a `icon.png` file alla radice del progetto. `README.md` il file viene usato come descrizione del package e della `icon.png` il file è usato come icono del package.

```xml
    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <LangVersion>12</LangVersion>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>

        <IsPackable>true</IsPackable>
        <PackageId>Umami.Net</PackageId>
        <Authors>Scott Galloway</Authors>
        <PackageIcon>icon.png</PackageIcon>
        <RepositoryUrl>https://github.com/scottgal/mostlylucidweb/tree/main/Umami.Net</RepositoryUrl>
        <PackageLicenseExpression>MIT</PackageLicenseExpression>
        <PackageTags>web</PackageTags>
        <PackageReadmeFile>README.md</PackageReadmeFile>
        <Description>
           Adds a simple Umami endpoint to your ASP.NET Core application.
        </Description>
    </PropertyGroup>
```

Nel mio file README.md ho un link al riposito GitHub e una descrizione del package.

Riprodotto sotto:

# Umami.Net

Questo è un .NET Core client per l'API di tracciamento Umami.
È basato sul cliente Umami Node, ,. [Qui.](https://github.com/umami-software/node).

Potete vedere come creare Umami come contenitore di docker. [Qui.](https://www.mostlylucid.net/blog/usingumamiforlocalanalytics).
Potete leggere più dettagli sulla creazione di ' sul mio blog. [Qui.](https://www.mostlylucid.net/blog/addingumamitrackingclientfollowup).

Per usare questo cliente servono le following appsettings.json configuration:

```json
{
  "Analytics":{
    "UmamiPath" : "https://umamilocal.mostlylucid.net",
    "WebsiteId" : "32c2aa31-b1ac-44c0-b8f3-ff1f50403bee"
  },
}
```

Dove? `UmamiPath` è il percorso verso l'instance Umami e `WebsiteId` è l'ID del sito web che volete tracciare.

Per usare il cliente dovete aggiungere le following cose. `Program.cs`:

```csharp
using Umami.Net;

services.SetupUmamiClient(builder.Configuration);
```

Questo aggiungerà il cliente Umami alla raccolta dei servizi.

Si può usare il cliente in due modi:

1. Si inietta. `UmamiClient` All'interno della vostra classe e chiamate il `Track` metodo:

```csharp
 // Inject UmamiClient umamiClient
 await umamiClient.Track("Search", new UmamiEventData(){{"query", encodedQuery}});
```

2. Utilizzate la `UmamiBackgroundSender` per tracciare gli eventi nello sfondo ( questo usa un `IHostedService` per mandare eventi in fondo):

```csharp
 // Inject UmamiBackgroundSender umamiBackgroundSender
await umamiBackgroundSender.Track("Search", new UmamiEventData(){{"query", encodedQuery}});
```

Il cliente spedirà l'evento all'API Umami e sarà archiviato.

L'informazione figura nella parte dispositiva. `UmamiEventData` è un vocabolario di coppie di valori chiave che verranno inviate all'API Umami come dati dell'evento.

Ci sono inoltre più metodi di basso livello che possono essere usati per inviare eventi all'API Umami.

In entrambi i casi. `UmamiClient` e `UmamiBackgroundSender` Potete chiamare il seguente metodo.

```csharp


 Send(UmamiPayload? payload = null, UmamiEventData? eventData = null,
        string eventType = "event")
```

Se non passate in una `UmamiPayload` object, il cliente ne creerà uno per voi usando la `WebsiteId` dagli appsettings.json.

```csharp
    public  UmamiPayload GetPayload(string? url = null, UmamiEventData? data = null)
    {
        var httpContext = httpContextAccessor.HttpContext;
        var request = httpContext?.Request;

        var payload = new UmamiPayload
        {
            Website = settings.WebsiteId,
            Data = data,
            Url = url ?? httpContext?.Request?.Path.Value,
            IpAddress = httpContext?.Connection?.RemoteIpAddress?.ToString(),
            UserAgent = request?.Headers["User-Agent"].FirstOrDefault(),
            Referrer = request?.Headers["Referer"].FirstOrDefault(),
           Hostname = request?.Host.Host,
        };
        
        return payload;
    }

```

Potete vedere che questo si occupa di `UmamiPayload` L'oggetto con il `WebsiteId` dagli appsettings.json, `Url`, `IpAddress`, `UserAgent`, `Referrer` e `Hostname` da una parte, e dall'altra. `HttpContext`.

NOTA: EventType può essere solo M SK1event" o "identifyMSC4 secondo l'API di UmamiMNK5

# Conclusione

Perciò's è che ora potete installare Umami.Net da Nuget e usarlo nella vostra ASP .NET Core applicationM SK3 Spero di trovarlo utileMSC4 IMST5Continuerò a tweaking e ad aggiungere test nei futuri post.