From b15cf87b3c4fe8465f5e3da576b339330cc5daa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Tue, 17 Feb 2026 18:08:42 +0100 Subject: [PATCH] Added FromNumber and ToNumber --- CHANGELOG.md | 4 +++ .../EventArgs/CallMonitorEventArgs.cs | 36 +++++++++++++++++-- .../Utils/ReconnectTcpClient.cs | 2 +- .../CallMonitorEventArgsTest.cs | 17 +++++++++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0e66c9..70354d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- `FromNumber` and `ToNumber` properties to `CallMonitorEventArgs` to use when available + ### Changed - Removed support for .NET 6.0 (EOL: 2024-11-12) diff --git a/src/FritzCallMonitor/EventArgs/CallMonitorEventArgs.cs b/src/FritzCallMonitor/EventArgs/CallMonitorEventArgs.cs index 946db57..c1f685a 100644 --- a/src/FritzCallMonitor/EventArgs/CallMonitorEventArgs.cs +++ b/src/FritzCallMonitor/EventArgs/CallMonitorEventArgs.cs @@ -29,15 +29,47 @@ namespace AMWD.Net.Api.Fritz.CallMonitor public int? LinePort { get; private set; } /// - /// Gets the external number displayed in the FRITZ!Box. + /// Gets the external phone number displayed in the FRITZ!Box. /// public string? ExternalNumber { get; private set; } /// - /// Gets the internal number registered in the FRITZ!Box. + /// Gets the internal phone number (part) registered in the FRITZ!Box. /// public string? InternalNumber { get; private set; } + /// + /// Gets the phone number from which the call was initiated. + /// + public string? FromNumber + { + get + { + return Event switch + { + EventType.Ring => ExternalNumber, + EventType.Call => InternalNumber, + _ => null + }; + } + } + + /// + /// Gets the phone number to which the call was directed. + /// + public string? ToNumber + { + get + { + return Event switch + { + EventType.Ring => InternalNumber, + EventType.Call => ExternalNumber, + _ => null + }; + } + } + /// /// Gets the duration of the call (only on event). /// diff --git a/src/FritzCallMonitor/Utils/ReconnectTcpClient.cs b/src/FritzCallMonitor/Utils/ReconnectTcpClient.cs index beb6ef2..0a69de6 100644 --- a/src/FritzCallMonitor/Utils/ReconnectTcpClient.cs +++ b/src/FritzCallMonitor/Utils/ReconnectTcpClient.cs @@ -158,7 +158,7 @@ namespace AMWD.Net.Api.Fritz.CallMonitor.Utils if (delay > 60 * 1000) delay = 60 * 1000; - Logger?.LogWarning(ex, $"Failed to connect to {_host}:{_port}. Retrying in {delay}ms..."); + Logger?.LogWarning(ex, "Failed to connect to {Hostname}:{RemotePort}. Retrying in {DelayMS}ms...", _host, _port, delay); try { await Task.Delay(delay, cancellationToken).ConfigureAwait(false); diff --git a/test/FritzCallMonitor.Tests/CallMonitorEventArgsTest.cs b/test/FritzCallMonitor.Tests/CallMonitorEventArgsTest.cs index fb65929..484b098 100644 --- a/test/FritzCallMonitor.Tests/CallMonitorEventArgsTest.cs +++ b/test/FritzCallMonitor.Tests/CallMonitorEventArgsTest.cs @@ -32,6 +32,8 @@ namespace FritzCallMonitor.Tests Assert.IsNull(result.LinePort); Assert.AreEqual("012345678901", result.ExternalNumber); Assert.AreEqual("9876543", result.InternalNumber); + Assert.AreEqual(result.ExternalNumber, result.FromNumber); + Assert.AreEqual(result.InternalNumber, result.ToNumber); Assert.IsNull(result.Duration); } @@ -48,6 +50,8 @@ namespace FritzCallMonitor.Tests Assert.AreEqual(3, result.LinePort); Assert.AreEqual("012345678901", result.ExternalNumber); Assert.IsNull(result.InternalNumber); + Assert.IsNull(result.FromNumber); + Assert.IsNull(result.ToNumber); Assert.IsNull(result.Duration); } @@ -64,6 +68,8 @@ namespace FritzCallMonitor.Tests Assert.IsNull(result.LinePort); Assert.IsNull(result.ExternalNumber); Assert.IsNull(result.InternalNumber); + Assert.IsNull(result.FromNumber); + Assert.IsNull(result.ToNumber); Assert.AreEqual(TimeSpan.FromSeconds(42), result.Duration); } @@ -80,6 +86,8 @@ namespace FritzCallMonitor.Tests Assert.AreEqual(7, result.LinePort); Assert.AreEqual("012345678901", result.ExternalNumber); Assert.AreEqual("9876543", result.InternalNumber); + Assert.AreEqual(result.InternalNumber, result.FromNumber); + Assert.AreEqual(result.ExternalNumber, result.ToNumber); Assert.IsNull(result.Duration); } @@ -114,6 +122,9 @@ namespace FritzCallMonitor.Tests var result = CallMonitorEventArgs.Parse(line); Assert.IsNotNull(result); Assert.IsNull(result.LinePort); + Assert.AreEqual("012345678901", result.ExternalNumber); + Assert.IsNull(result.FromNumber); + Assert.IsNull(result.ToNumber); } [TestMethod] @@ -123,6 +134,10 @@ namespace FritzCallMonitor.Tests var result = CallMonitorEventArgs.Parse(line); Assert.IsNotNull(result); Assert.IsNull(result.LinePort); + Assert.AreEqual("012345678901", result.ExternalNumber); + Assert.AreEqual("9876543", result.InternalNumber); + Assert.AreEqual(result.InternalNumber, result.FromNumber); + Assert.AreEqual(result.ExternalNumber, result.ToNumber); } [TestMethod] @@ -150,6 +165,8 @@ namespace FritzCallMonitor.Tests Assert.IsNotNull(result); Assert.AreEqual("012345678901", result.ExternalNumber); Assert.AreEqual("9876543", result.InternalNumber); + Assert.AreEqual(result.ExternalNumber, result.FromNumber); + Assert.AreEqual(result.InternalNumber, result.ToNumber); } } }