feat: add group chat support

Set signal_group_id in config to send to a group instead of a DM.
Group ID takes priority over signal_recipient when both are set.
This commit is contained in:
2026-03-10 23:55:19 +00:00
parent 4d7d86aa5e
commit fb0252fb7c
3 changed files with 19 additions and 8 deletions

View File

@@ -10,5 +10,8 @@ signal_url = "http://127.0.0.1:8080"
# signal-cli account (phone number registered with signal-cli) # signal-cli account (phone number registered with signal-cli)
signal_account = "+1234567890" signal_account = "+1234567890"
# Signal recipient UUID or phone number to send notifications to # Signal recipient UUID for DM notifications
signal_recipient = "" signal_recipient = ""
# OR: Signal group ID for group notifications (overrides signal_recipient)
# signal_group_id = ""

View File

@@ -12,8 +12,10 @@ type Config struct {
SignalURL string SignalURL string
// SignalAccount is the signal-cli account (phone number or UUID). // SignalAccount is the signal-cli account (phone number or UUID).
SignalAccount string SignalAccount string
// SignalRecipient is the default Signal recipient for notifications. // SignalRecipient is the default Signal recipient UUID for DM notifications.
SignalRecipient string SignalRecipient string
// SignalGroupID is the Signal group ID for group notifications (overrides SignalRecipient).
SignalGroupID string
} }
func loadConfig() Config { func loadConfig() Config {
@@ -31,5 +33,6 @@ func loadConfig() Config {
SignalURL: jety.GetString("signal_url"), SignalURL: jety.GetString("signal_url"),
SignalAccount: jety.GetString("signal_account"), SignalAccount: jety.GetString("signal_account"),
SignalRecipient: jety.GetString("signal_recipient"), SignalRecipient: jety.GetString("signal_recipient"),
SignalGroupID: jety.GetString("signal_group_id"),
} }
} }

17
main.go
View File

@@ -19,8 +19,8 @@ func main() {
if cfg.SignalAccount == "" { if cfg.SignalAccount == "" {
log.Fatal("signal_account is required (set GH2SIG_SIGNAL_ACCOUNT or config.toml)") log.Fatal("signal_account is required (set GH2SIG_SIGNAL_ACCOUNT or config.toml)")
} }
if cfg.SignalRecipient == "" { if cfg.SignalRecipient == "" && cfg.SignalGroupID == "" {
log.Fatal("signal_recipient is required (set GH2SIG_SIGNAL_RECIPIENT or config.toml)") log.Fatal("signal_recipient or signal_group_id is required")
} }
signal := signalcli.NewClient(cfg.SignalURL, cfg.SignalAccount) signal := signalcli.NewClient(cfg.SignalURL, cfg.SignalAccount)
@@ -29,6 +29,7 @@ func main() {
notifier := &notifier{ notifier := &notifier{
signal: signal, signal: signal,
recipient: cfg.SignalRecipient, recipient: cfg.SignalRecipient,
groupID: cfg.SignalGroupID,
} }
// Register event handlers. // Register event handlers.
@@ -73,16 +74,20 @@ func main() {
type notifier struct { type notifier struct {
signal *signalcli.Client signal *signalcli.Client
recipient string recipient string
groupID string
} }
func (n *notifier) send(ctx context.Context, msg string) { func (n *notifier) send(ctx context.Context, msg string) {
if msg == "" { if msg == "" {
return return
} }
_, err := n.signal.Send(ctx, signalcli.SendParams{ params := signalcli.SendParams{Message: msg}
Recipient: n.recipient, if n.groupID != "" {
Message: msg, params.GroupID = n.groupID
}) } else {
params.Recipient = n.recipient
}
_, err := n.signal.Send(ctx, params)
if err != nil { if err != nil {
log.Printf("signal send error: %v", err) log.Printf("signal send error: %v", err)
} }