telegram

package
v0.0.0-...-9fed632 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 10, 2026 License: MIT Imports: 17 Imported by: 0

Documentation

Index

Constants

View Source
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

View Source
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 NewBridge

func NewBridge(cfg Config) *Bridge

NewBridge crea un nuovo bridge Telegram.

func (*Bridge) API

func (b *Bridge) API() *tg.Client

API restituisce il client API raw. Nil se non connesso.

func (*Bridge) CheckPassword

func (b *Bridge) CheckPassword(ctx context.Context, password string) error

CheckPassword invia la password 2FA.

func (*Bridge) Client

func (b *Bridge) Client() *telegram.Client

Client restituisce il client telegram per operazioni auth.

func (*Bridge) DeleteMessage

func (b *Bridge) DeleteMessage(ctx context.Context, chat model.Chat, msgID int) error

DeleteMessage cancella un messaggio. Usa l'API channel per i canali, MessagesDeleteMessages con revoke=true per chat/gruppi.

func (*Bridge) DeleteMessages

func (b *Bridge) DeleteMessages(ctx context.Context, chat model.Chat, msgIDs []int) error

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

func (b *Bridge) EditMessage(ctx context.Context, chat model.Chat, msgID int, text string) error

EditMessage modifica il testo di un messaggio già inviato.

func (*Bridge) ForwardMessage

func (b *Bridge) ForwardMessage(ctx context.Context, target, source model.Chat, msgIDs []int) error

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

func (b *Bridge) IsAuthorized(ctx context.Context) (bool, error)

IsAuthorized controlla se il client è attualmente autenticato.

func (*Bridge) LoadDialogs

func (b *Bridge) LoadDialogs(ctx context.Context) ([]model.Chat, error)

LoadDialogs carica la lista delle chat dall'API Telegram, ordinate.

func (*Bridge) LoadFolders

func (b *Bridge) LoadFolders(ctx context.Context) ([]model.ChatFolder, error)

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

func (b *Bridge) LoadMessages(ctx context.Context, chat model.Chat) ([]model.Message, error)

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

func (b *Bridge) LoadPinnedMessage(ctx context.Context, chat model.Chat) (*model.Message, error)

LoadPinnedMessage recupera il messaggio pinnato di una chat. Strategia (ADR-021 §A1):

  1. Chiama MessagesGetFullChat o ChannelsGetFullChannel per ottenere pinnedMsgID.
  2. Se pinnedMsgID == 0 → restituisce nil, nil (nessun pin).
  3. 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

func (b *Bridge) Logout(ctx context.Context) error

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) SendCode

func (b *Bridge) SendCode(ctx context.Context, phone string) (SendCodeResult, error)

SendCode invia il codice di verifica al numero di telefono.

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.

func (*Bridge) SignIn

func (b *Bridge) SignIn(ctx context.Context, phone, code, codeHash string) error

SignIn tenta il login con phone + code.

func (*Bridge) Start

func (b *Bridge) Start()

Start avvia il client in background. Non bloccante.

func (*Bridge) Stop

func (b *Bridge) Stop()

Stop arresta il client.

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

type CodeSentMsg struct {
	CodeHash   string
	CodeLength int
}

CodeSentMsg indica che il codice è stato inviato con successo.

type Config

type Config struct {
	AppID   int
	AppHash string
}

Config contiene le credenziali Telegram API.

func LoadConfig

func LoadConfig() Config

LoadConfig carica le credenziali: env var hanno priorità, altrimenti embedded.

func (Config) IsValid

func (c Config) IsValid() bool

IsValid restituisce true se le credenziali sono configurate.

type ConnectedMsg

type ConnectedMsg struct{}

ConnectedMsg indica che il client è connesso e autenticato.

type DeleteRequestMsg

type DeleteRequestMsg struct {
	Chat  model.Chat
	MsgID int
}

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

type DialogsLoadedMsg struct{ Chats []model.Chat }

DialogsLoadedMsg contiene la lista delle chat caricate.

type DisconnectedMsg

type DisconnectedMsg struct{ Err error }

DisconnectedMsg indica che la connessione è stata persa.

type EditRequestMsg

type EditRequestMsg struct {
	Chat  model.Chat
	MsgID int
	Text  string
}

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

type ForwardPickerReadyMsg struct {
	Chats []model.Chat
}

ForwardPickerReadyMsg consegna lo snapshot dei dialogs al picker overlay.

type ForwardRequestMsg

type ForwardRequestMsg struct {
	Source   model.Chat
	Messages []model.Message
}

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

type ForwardResultMsg struct {
	Target model.Chat
	Err    error
}

ForwardResultMsg riporta l'esito dell'RPC di forward.

type ForwardSubmitMsg

type ForwardSubmitMsg struct {
	Target   model.Chat
	Source   model.Chat
	Messages []model.Message
}

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

type MessagesLoadedMsg struct{ Messages []model.Message }

MessagesLoadedMsg contiene i messaggi caricati da una chat.

type NewMessageMsg

type NewMessageMsg struct {
	Message model.Message
	ChatID  model.ChatID
}

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 PasswordOkMsg

type PasswordOkMsg struct{}

PasswordOkMsg indica password 2FA accettata.

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

type ReactionsUpdatedMsg struct {
	ChatID    model.ChatID
	MessageID int
	Reactions []model.Reaction
}

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

type SendCodeResult struct {
	CodeHash   string
	CodeLength int
}

SendCodeResult contiene i dati restituiti da Telegram dopo l'invio del codice.

type SendRequestMsg

type SendRequestMsg struct {
	Chat      model.Chat
	Text      string
	ReplyToID int
}

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 SignInOkMsg

type SignInOkMsg struct{}

SignInOkMsg indica login completato con successo.

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).

Directories

Path Synopsis
Package convert maps gotd/td MTProto types to domain model types.
Package convert maps gotd/td MTProto types to domain model types.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL