Adressdaten aus dem Swyx-Client; core-Modul und Firefox-Plugin ausgelagert

SwyxTray liest jetzt die Telefonbuecher (global und persoenlich) des
SwyxIt!-Clients in einen Adress-Cache, bietet Kontaktsuche ueber
FulltextSearchInContactsEx und Nummernaufloesung ueber DispResolveNumber;
alles ueber den WebSocket-Zugang abrufbar.

Das Spring-Boot-Modul core/ und das SwyxFFPlugin werden als eigene
Projekte gepflegt und aus diesem Repository entfernt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-24 15:10:13 +02:00
co-authored by Claude Fable 5
parent cd355c4e21
commit fcd0d62d78
48 changed files with 427 additions and 17014 deletions
+33 -3
View File
@@ -29,9 +29,12 @@ internal sealed class ClientCommand
public string? Cmd { get; set; }
/// <summary>Nur bei <c>call</c>.</summary>
/// <summary>Bei <c>call</c> und <c>resolve</c>.</summary>
public string? Number { get; set; }
/// <summary>Nur bei <c>contacts</c>: der Suchbegriff (Name oder Nummer).</summary>
public string? Query { get; set; }
/// <summary>1-basierte Leitung; fehlt sie, waehlt die App selbst.</summary>
public int? Line { get; set; }
@@ -71,15 +74,42 @@ internal sealed record HelloMessage(string App, string Version, int Protocol, in
public string Type => "hello";
}
/// <summary>Ein Adressdatensatz in der Antwort auf <c>contacts</c> und in
/// der <c>addresses</c>-Nachricht.</summary>
internal sealed record ContactMessage(string Name, string Number, string Description)
{
public static ContactMessage From(SwyxContact contact)
=> new(contact.Name, contact.Number, contact.Description);
}
/// <summary>
/// Die zwischengespeicherten Adressdaten aus dem Swyx-Client (globales und
/// persoenliches Telefonbuch). Wird nach dem <c>snapshot</c> beim Verbinden,
/// auf <c>status</c> und nach jedem Neueinlesen mit Aenderung gesendet — die
/// Seite muss die Daten also nie selbst anfordern.
/// </summary>
internal sealed record AddressesMessage(IReadOnlyList<ContactMessage> Addresses)
{
public string Type => "addresses";
public static AddressesMessage From(IEnumerable<SwyxContact> addresses)
=> new(addresses.Select(ContactMessage.From).ToList());
}
/// <summary>
/// Antwort auf genau ein Kommando. <c>Focused</c> wird nur bei <c>focus</c>
/// gesetzt: <c>true</c> = Fenster in den Vordergrund geholt, <c>false</c> =
/// stattdessen den Browser mit der URL gestartet. <c>Tabs</c> steht nur in
/// der Antwort auf <c>tabs</c>, <c>TabId</c> nur in der auf <c>opentab</c>.
/// der Antwort auf <c>tabs</c>, <c>TabId</c> nur in der auf <c>opentab</c>,
/// <c>Contacts</c> nur in der auf <c>contacts</c>, <c>Name</c> nur in der
/// auf <c>resolve</c> (leer, wenn der Client die Nummer nicht kennt),
/// <c>Addresses</c> nur in der auf <c>addresses</c> (der komplette Cache).
/// </summary>
internal sealed record ResultMessage(
int? Id, bool Ok, string? Error = null, int? Line = null, bool? Focused = null,
int? TabId = null, IReadOnlyList<TabInfo>? Tabs = null)
int? TabId = null, IReadOnlyList<TabInfo>? Tabs = null,
IReadOnlyList<ContactMessage>? Contacts = null, string? Name = null,
IReadOnlyList<ContactMessage>? Addresses = null)
{
public string Type => "result";
}