Documentation
¶
Index ¶
- Constants
- Variables
- type AuthRequiredMsg
- type BatchActionDoneMsg
- type BatchDeleteRequestMsg
- type Bridge
- func (b *Bridge) API() *tg.Client
- func (b *Bridge) CheckPassword(ctx context.Context, password string) error
- func (b *Bridge) Client() *telegram.Client
- func (b *Bridge) DeleteMessage(ctx context.Context, chat model.Chat, msgID int) error
- func (b *Bridge) DeleteMessages(ctx context.Context, chat model.Chat, msgIDs []int) error
- func (b *Bridge) EditMessage(ctx context.Context, chat model.Chat, msgID int, text string) error
- func (b *Bridge) ForwardMessage(ctx context.Context, target, source model.Chat, msgIDs []int) error
- func (b *Bridge) IsAuthorized(ctx context.Context) (bool, error)
- func (b *Bridge) LoadDialogs(ctx context.Context) ([]model.Chat, error)
- func (b *Bridge) LoadFolders(ctx context.Context) ([]model.ChatFolder, error)
- func (b *Bridge) LoadMessages(ctx context.Context, chat model.Chat) ([]model.Message, error)
- func (b *Bridge) LoadMessagesAround(ctx context.Context, chat model.Chat, centerMsgID int) ([]model.Message, error)
- func (b *Bridge) LoadPinnedMessage(ctx context.Context, chat model.Chat) (*model.Message, error)
- func (b *Bridge) Logout(ctx context.Context) error
- func (b *Bridge) SearchGlobal(ctx context.Context, query string, limit int, queryID uint64) (model.SearchResult, error)
- func (b *Bridge) SendCode(ctx context.Context, phone string) (SendCodeResult, error)
- func (b *Bridge) SendMessage(ctx context.Context, chat model.Chat, text string, replyToID int) error
- func (b *Bridge) SignIn(ctx context.Context, phone, code, codeHash string) error
- func (b *Bridge) Start()
- func (b *Bridge) Stop()
- type BridgeCallbacks
- type CodeSentErrMsg
- type CodeSentMsg
- type Config
- type ConnectedMsg
- type DeleteRequestMsg
- type DialogsErrMsg
- type DialogsLoadedMsg
- type DisconnectedMsg
- type EditRequestMsg
- type FoldersErrMsg
- type FoldersLoadedMsg
- type ForwardPickerReadyMsg
- type ForwardRequestMsg
- type ForwardResultMsg
- type ForwardSubmitMsg
- type MessageSentErrMsg
- type MessageSentMsg
- type MessagesErrMsg
- type MessagesLoadedMsg
- type NewMessageMsg
- type OpenLinkMsg
- type OverlayCloseMsg
- type PasswordErrMsg
- type PasswordOkMsg
- type PasswordRequiredMsg
- type PinnedMsgLoadedMsg
- type ReactionsUpdatedMsg
- type ReconnectingMsg
- type SelectClearMsg
- type SelectToggleMsg
- type SendCodeResult
- type SendRequestMsg
- type SignInErrMsg
- type SignInOkMsg
- type UpdateUserTypingMsg
Constants ¶
const MaxSearchQueryRunes = 256
MaxSearchQueryRunes è il cap server-side per query.searchGlobal. Allineato al CharLimit del textinput UI (256). Difensivo contro caller che bypassano l'UI (test, future CLI). Vedi ADR-013.
Variables ¶
var ErrQueryTooLong = errors.New("search query exceeds max rune length")
ErrQueryTooLong restituito da SearchGlobal se la query supera MaxSearchQueryRunes.
Functions ¶
This section is empty.
Types ¶
type AuthRequiredMsg ¶
type AuthRequiredMsg struct{}
AuthRequiredMsg indica che serve autenticazione.
type BatchActionDoneMsg ¶
type BatchActionDoneMsg struct{}
BatchActionDoneMsg è emesso dopo un'azione batch completata con successo (ForwardResultMsg{ok} o DeleteResultMsg{ok} in multiselect). Svuota S e riporta in BrowsingMessages.
type BatchDeleteRequestMsg ¶
type BatchDeleteRequestMsg struct {
Chat model.Chat
MsgIDs []int
Messages []model.Message // snapshot immutabile al momento dell'apertura
}
BatchDeleteRequestMsg è emesso quando D viene premuto in MultiSelect oppure su un singolo messaggio (fallback su cursore). Sostituisce il vecchio per-message DeleteRequestMsg nel batch path.
type Bridge ¶
type Bridge struct {
BridgeCallbacks
// contains filtered or unexported fields
}
Bridge è il wrapper attorno al client gotd/td. Gestisce connessione, session e comunicazione con il TUI via callback. I campi callback sono raggruppati in BridgeCallbacks (bridge_callbacks.go).
func (*Bridge) CheckPassword ¶
CheckPassword invia la password 2FA.
func (*Bridge) DeleteMessage ¶
DeleteMessage cancella un messaggio. Usa l'API channel per i canali, MessagesDeleteMessages con revoke=true per chat/gruppi.
func (*Bridge) DeleteMessages ¶
DeleteMessages cancella un insieme di messaggi identificati da msgIDs. Usa ChannelsDeleteMessages per i canali, MessagesDeleteMessages con revoke=true per le chat/gruppi (BATCH_ATOMICITY: una sola RPC).
func (*Bridge) EditMessage ¶
EditMessage modifica il testo di un messaggio già inviato.
func (*Bridge) ForwardMessage ¶
ForwardMessage inoltra uno o più messaggi (identificati da msgIDs) dalla chat source alla chat target tramite MessagesForwardMessages. RandomID richiede un int64 per ogni messaggio: generati via crypto/rand.
func (*Bridge) IsAuthorized ¶
IsAuthorized controlla se il client è attualmente autenticato.
func (*Bridge) LoadDialogs ¶
LoadDialogs carica la lista delle chat dall'API Telegram, ordinate.
func (*Bridge) LoadFolders ¶
LoadFolders fetches Telegram DialogFilter list via messages.getDialogFilters. Returns an empty slice (not an error) if the account has no custom folders.
func (*Bridge) LoadMessages ¶
LoadMessages carica la history di una chat (ultimi 50 messaggi).
func (*Bridge) LoadMessagesAround ¶
func (b *Bridge) LoadMessagesAround(ctx context.Context, chat model.Chat, centerMsgID int) ([]model.Message, error)
LoadMessagesAround loads messages centered around a given message ID. Used for jump-to-result from global search: returns ~25 messages before and ~25 after the target so the message lands roughly in the middle of the viewport. MTProto: getHistory with OffsetID=centerMsgID, AddOffset=-25, Limit=50. If centerMsgID <= 0 falls back to LoadMessages behavior.
func (*Bridge) LoadPinnedMessage ¶
LoadPinnedMessage recupera il messaggio pinnato di una chat. Strategia (ADR-021 §A1):
- Chiama MessagesGetFullChat o ChannelsGetFullChannel per ottenere pinnedMsgID.
- Se pinnedMsgID == 0 → restituisce nil, nil (nessun pin).
- Chiama MessagesGetMessages con pinnedMsgID → converte in model.Message.
b.api è il *tg.Client raw (NON middleware-wrapped): non include flood-wait auto-retry. Il client gotd base in NewBridge usa telegram.NewClient senza contrib/middleware → le chiamate API qui possono ricevere FLOOD_WAIT e restituiranno errore al caller (loadPinnedMessageCmd logga via PinnedMsgLoadedMsg.Err). Se flood-wait auto-retry è necessario, wrappare b.api con gotd/contrib middleware.
Usato da loadPinnedMessageCmd in conversation_pinned.go (Step 33).
func (*Bridge) Logout ¶
Logout invoca AuthLogOut RPC server-side e rimuove il session file locale. Errori RPC non bloccano la rimozione del file (best-effort).
func (*Bridge) SearchGlobal ¶
func (b *Bridge) SearchGlobal(ctx context.Context, query string, limit int, queryID uint64) (model.SearchResult, error)
SearchGlobal esegue messages.searchGlobal e restituisce i risultati. queryID è un token opaque propagato nel SearchResult per consentire al chiamante di scartare risultati stale (ADR-013: latestQueryID policy). Una query vuota restituisce immediatamente SearchResult{} senza RPC. Errori RPC propagati as-is (no retry interno; floodwait middleware è out-of-scope per Step 26 — vedi backlog).
func (*Bridge) SendMessage ¶
func (b *Bridge) SendMessage(ctx context.Context, chat model.Chat, text string, replyToID int) error
SendMessage invia un messaggio di testo a una chat. replyToID != 0 imposta la reply al messaggio indicato.
type BridgeCallbacks ¶
type BridgeCallbacks struct {
// OnConnected è chiamato quando il client è autenticato e connesso.
OnConnected func()
// OnDisconnected è chiamato alla perdita di connessione non richiesta.
OnDisconnected func(error)
// OnReconnecting è chiamato a ogni tentativo di riconnessione automatica.
OnReconnecting func()
// OnAuthRequired è chiamato se la sessione non è valida o assente.
OnAuthRequired func()
// OnNewMessage è chiamato alla ricezione di un nuovo messaggio real-time.
OnNewMessage func(msg model.Message, chatID model.ChatID)
// OnUserTyping è chiamato quando un peer scrive in una chat privata (1:1).
// peer.PeerType è sempre PeerUser; userID == peer.ID.
// Il TUI applica ADR-010 (timestamp + re-arm tea.Tick) per il TTL 5s.
OnUserTyping func(peer model.ChatID, userID int64)
// OnReactionsUpdated è chiamato quando il server emette UpdateMessageReactions.
// reactions è uno snapshot completo già ordinato (Count desc, Emoji asc).
// Il TUI sostituisce m.Reactions interamente (replace semantics — ADR-012 A1).
OnReactionsUpdated func(chatID model.ChatID, msgID int, reactions []model.Reaction)
}
BridgeCallbacks raccoglie i callback con cui il Bridge notifica il TUI. Sono campi pubblici impostati dal chiamante prima di Bridge.Start(). Tutti i callback vengono invocati dalla goroutine Telegram — il TUI li riceve attraverso program.Send() e risponde nell'Update() single-threaded.
type CodeSentErrMsg ¶
type CodeSentErrMsg struct{ Err error }
CodeSentErrMsg indica errore nell'invio del codice.
type CodeSentMsg ¶
CodeSentMsg indica che il codice è stato inviato con successo.
type Config ¶
Config contiene le credenziali Telegram API.
func LoadConfig ¶
func LoadConfig() Config
LoadConfig carica le credenziali: env var hanno priorità, altrimenti embedded.
type ConnectedMsg ¶
type ConnectedMsg struct{}
ConnectedMsg indica che il client è connesso e autenticato.
type DeleteRequestMsg ¶
DeleteRequestMsg indica che l'utente vuole cancellare un messaggio.
type DialogsErrMsg ¶
type DialogsErrMsg struct{ Err error }
DialogsErrMsg indica errore nel caricamento dei dialogs.
type DialogsLoadedMsg ¶
DialogsLoadedMsg contiene la lista delle chat caricate.
type DisconnectedMsg ¶
type DisconnectedMsg struct{ Err error }
DisconnectedMsg indica che la connessione è stata persa.
type EditRequestMsg ¶
EditRequestMsg indica che l'utente vuole modificare un messaggio.
type FoldersErrMsg ¶
type FoldersErrMsg struct{ Err error }
FoldersErrMsg reports a failure to fetch dialog filters.
type FoldersLoadedMsg ¶
type FoldersLoadedMsg struct {
Folders []model.ChatFolder
}
FoldersLoadedMsg carries the server-side DialogFilter list (Step 29, ADR-016 §D1).
type ForwardPickerReadyMsg ¶
ForwardPickerReadyMsg consegna lo snapshot dei dialogs al picker overlay.
type ForwardRequestMsg ¶
ForwardRequestMsg è emesso dalla UI quando l'utente preme 'f' su un messaggio. Messages è una slice per riuso in Step 22 (multi-forward); Step 21 invia sempre 1 elemento.
type ForwardResultMsg ¶
ForwardResultMsg riporta l'esito dell'RPC di forward.
type ForwardSubmitMsg ¶
ForwardSubmitMsg è emesso dal picker quando l'utente preme Enter sulla chat target.
type MessageSentErrMsg ¶
type MessageSentErrMsg struct{ Err error }
MessageSentErrMsg indica errore nell'invio del messaggio.
type MessageSentMsg ¶
type MessageSentMsg struct{}
MessageSentMsg indica che il messaggio è stato inviato con successo.
type MessagesErrMsg ¶
type MessagesErrMsg struct{ Err error }
MessagesErrMsg indica errore nel caricamento dei messaggi.
type MessagesLoadedMsg ¶
MessagesLoadedMsg contiene i messaggi caricati da una chat.
type NewMessageMsg ¶
NewMessageMsg indica che è arrivato un nuovo messaggio real-time.
type OpenLinkMsg ¶
type OpenLinkMsg struct {
URL string
}
OpenLinkMsg chiede al TUI di aprire un URL nel browser di sistema (Step 33, ADR-021 §DB3). Invariante LINK_OPEN_HTTP_ONLY: URL deve iniziare con http:// o https://. Emesso da conversation quando l'utente preme il chord `gx` su un msg con link.
type OverlayCloseMsg ¶
type OverlayCloseMsg struct{}
OverlayCloseMsg chiude qualsiasi overlay attivo (picker Esc, confirm dismiss, ecc).
type PasswordErrMsg ¶
type PasswordErrMsg struct{ Err error }
PasswordErrMsg indica password 2FA sbagliata.
type PasswordRequiredMsg ¶
type PasswordRequiredMsg struct{}
PasswordRequiredMsg indica che serve la password 2FA.
type PinnedMsgLoadedMsg ¶
type PinnedMsgLoadedMsg struct {
ChatID model.ChatID
Msg *model.Message // nil se nessun pin o errore
Err error
}
PinnedMsgLoadedMsg è il risultato del loadPinnedMessageCmd (Step 33, ADR-021 §A1). Invariante PINNED_STALE_DROP: il consumer dropa il msg se ChatID != activeChatID.
type ReactionsUpdatedMsg ¶
ReactionsUpdatedMsg è inviato al TUI quando il server emette un UpdateMessageReactions per un messaggio esistente (Step 25). Reactions è uno snapshot completo già ordinato (Count desc, Emoji asc) dal convert layer — il TUI sostituisce m.Reactions interamente (replace, non merge). Viewport-scoped cache (ADR-012 §6): il TUI scarta questo msg se ChatID != chat attiva; la prossima apertura ricaricherà la history fresca.
type ReconnectingMsg ¶
type ReconnectingMsg struct{}
ReconnectingMsg indica tentativo di reconnessione.
type SelectClearMsg ¶
type SelectClearMsg struct{}
SelectClearMsg è emesso quando l'utente preme Esc in MultiSelect. Svuota S e ritorna a BrowsingMessages.
type SelectToggleMsg ¶
type SelectToggleMsg struct {
MsgID int
}
SelectToggleMsg è emesso quando l'utente preme Space su un messaggio. Toggling il MessageID nel set di selezione S. Se S passa da ∅ a ≠∅ → enter MultiSelect; se da ≠∅ a ∅ → exit.
type SendCodeResult ¶
SendCodeResult contiene i dati restituiti da Telegram dopo l'invio del codice.
type SendRequestMsg ¶
SendRequestMsg indica che l'utente vuole inviare un messaggio.
type SignInErrMsg ¶
type SignInErrMsg struct{ Err error }
SignInErrMsg indica errore nel login (codice sbagliato, ecc).
type UpdateUserTypingMsg ¶
type UpdateUserTypingMsg struct {
// Peer è il ChatID della chat privata (PeerType=PeerUser, ID=UserID).
Peer model.ChatID
// UserID è l'ID dell'utente che sta scrivendo (= Peer.ID per chat 1:1).
UserID int64
}
UpdateUserTypingMsg è inviato al TUI quando un peer sta scrivendo in una chat privata (1:1). Corrisponde all'MTProto updateUserTyping. Il TUI aggiorna typing[Peer].lastTypingAt e schedula un tea.Tick(5s) per il cleanup TTL (ADR-010: timestamp-based + re-arm).
Source Files
¶
- auth.go
- bridge_callbacks.go
- client.go
- config.go
- convert.go
- delete.go
- delete_batch.go
- dialogs.go
- edit.go
- events.go
- events_forward.go
- events_multiselect.go
- events_step33.go
- folders.go
- forward.go
- index.go
- logout.go
- messages.go
- messages_convert.go
- messages_names.go
- monitor.go
- peers.go
- pinned.go
- search.go
- search_resolve.go
- send.go
- updates.go