From b8f495d3623d5bbbf6e222d28bf5c0d90dd2bffe Mon Sep 17 00:00:00 2001 From: Ayush7614 Date: Mon, 10 Aug 2026 17:01:48 +0530 Subject: [PATCH] Route mention autocomplete through shared SafeRegex pattern. Add MessageFormattingEngine.Patterns.mentionAutocomplete and use it from AutocompleteService so mention matching compiles through the same fail-closed helper as message formatting. --- bitchat/Services/AutocompleteService.swift | 6 ++---- bitchat/Services/MessageFormattingEngine.swift | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/bitchat/Services/AutocompleteService.swift b/bitchat/Services/AutocompleteService.swift index b6483c8d..3e739e74 100644 --- a/bitchat/Services/AutocompleteService.swift +++ b/bitchat/Services/AutocompleteService.swift @@ -10,9 +10,7 @@ import Foundation /// Manages autocomplete functionality for chat final class AutocompleteService { - /// Compiled via `SafeRegex` so a bad pattern logs and disables matching - /// instead of silently returning nil forever (`try?` did the latter). - private let mentionRegex = SafeRegex.compile("@([\\p{L}0-9_]*)$") + private typealias Patterns = MessageFormattingEngine.Patterns /// Get autocomplete suggestions for current text func getSuggestions(for text: String, peers: [String], cursorPosition: Int) -> (suggestions: [String], range: NSRange?) { @@ -45,7 +43,7 @@ final class AutocompleteService { private func getMentionSuggestions(_ text: String, peers: [String]) -> ([String], NSRange)? { let nsText = text as NSString - let matches = mentionRegex.matches( + let matches = Patterns.mentionAutocomplete.matches( in: text, options: [], range: NSRange(location: 0, length: nsText.length) diff --git a/bitchat/Services/MessageFormattingEngine.swift b/bitchat/Services/MessageFormattingEngine.swift index 88a32e3c..1578f16b 100644 --- a/bitchat/Services/MessageFormattingEngine.swift +++ b/bitchat/Services/MessageFormattingEngine.swift @@ -43,6 +43,9 @@ final class MessageFormattingEngine { static let mention = SafeRegex.compile("@([\\p{L}0-9_]+(?:#[a-fA-F0-9]{4})?)") + /// Trailing partial `@nickname` at the composer cursor — autocomplete only. + static let mentionAutocomplete = SafeRegex.compile("@([\\p{L}0-9_]*)$") + static let cashu = SafeRegex.compile("\\bcashu[AB][A-Za-z0-9._-]{40,}\\b") static let bolt11 = SafeRegex.compile("(?i)\\bln(bc|tb|bcrt)[0-9][a-z0-9]{50,}\\b")