# .NET Examples

> Runnable per-modality examples in the SDK split repo.

Examples in the
[dotnet-sdk repo](https://github.com/clutchcall/dotnet-sdk/tree/main/examples).

## Voice — outbound originate

```csharp
var v    = new Voice(BASE_URL, apiKey: KEY, orgId: ORG);
var call = await v.Calls.OriginateAsync(new Voice.OriginateArgs {
    To       = "+15551234567",
    From     = "+15558675309",
    TrunkId  = "trunk_main",
    Agent    = "healthcare-assistant",
});
Console.WriteLine($"call sid: {call.Sid}");
```

## Streams — record-to-disk viewer

```csharp
await using var out_ = File.Create("recording.mp4");
await using var viewer = await Streams.BroadcastViewer.OpenAsync(signedUrl,
    new Streams.ViewerOpts {
        OnChunk = (init, chunk) => out_.Write(chunk),
    });
```

## Robotics — telemetry publisher

```csharp
var r    = new Robotics(HOST, token, "tb-7");
var qos  = new Robotics.QoSProfile {
    Reliability = Robotics.Reliability.Reliable,
    Depth       = 10,
};
await using var pub = await r.PublishTelemetryAsync("odom",
    "nav_msgs/msg/Odometry", qos);

while (true) {
    pub.Write(SerializeOdom());
    await Task.Delay(100);
}
```

## Games — Unity-friendly authoritative server

```csharp
var g     = new Games(HOST, token, "duel-42", playerId: null);
var state = await g.PublishStateAsync(new Games.StateOpts { TickHz = 30 });

g.SubscribeInputs((pid, p) => world.Apply(pid, p));

var timer = new PeriodicTimer(TimeSpan.FromMilliseconds(33));
while (await timer.WaitForNextTickAsync()) state.Write(world.Snapshot());
```

For Unity games, prefer the [`com.clutchcall.transport`](/modalities/netcode/details)
UPM package which exposes UTP's `INetworkInterface` over the same wire.

## Data — MQTT-style subscribe

```csharp
var d = new Data(HOST, token, "ingest");
await using var sub = await d.SubscribeAsync("sensors/+/temperature", msg =>
    Console.WriteLine($"{msg.Topic} ← {msg.FromClientId} = " +
                      $"{Encoding.UTF8.GetString(msg.Payload)}"));
```
