irssi/msg_flow.md

86 lines
3.8 KiB
Markdown

## ANALIZA KROK PO KROKU - FLOW WIADOMOŚCI W IRSSI
### 1. WIADOMOŚCI PRZYCHODZĄCE (od serwera do wyświetlenia)
#### Krok 1: Odbieranie z serwera
**Funkcja**: `irc_parse_incoming()` w `src/irc/core/irc.c:543`
- Czyta dane z socketu przez `net_sendbuffer_receive_line()`
- Emituje sygnał `"server incoming"` z surową linią
#### Krok 2: Parsowanie IRC
**Funkcja**: `irc_parse_incoming_line()` w `src/irc/core/irc.c:528`
- Parsuje prefix (nick, address, tags) przez `irc_parse_prefix()`
- Emituje sygnał `"server event tags"` z parsowanymi danymi
#### Krok 3: Rozpoznanie typu wiadomości
**Funkcja**: `irc_server_event()` w `src/irc/core/irc.c:370`
- Parsuje komendę IRC (PRIVMSG, JOIN, etc.)
- Emituje odpowiedni sygnał np. `"event privmsg"`
#### Krok 4: Konwersja na sygnały wiadomości
**Funkcja**: `event_privmsg()` w `src/fe-common/irc/fe-events.c:42`
- Dekoduje wiadomość przez `recode_in()`
- Rozróżnia kanał vs prywatna
- Emituje `"message public"` lub `"message private"`
#### Krok 5: Obsługa sygnału wiadomości
**Funkcja**: `sig_message_public()` w `src/fe-common/core/fe-messages.c:168`
- Znajduje kanał i nick record
- Pobiera nickmode przez `channel_get_nickmode()`
- Sprawdza highlight przez `hilight_match()`
- **WYWOŁUJE**: `printformat_module("fe-common/core", server, target, level, TXT_PUBMSG, nick, address, msg, nickmode)`
### 2. FORMATOWANIE I THEME
#### Krok 6: printformat_module
**Funkcja**: `printformat_module()` w `src/fe-common/core/printtext.c:101`
- Tworzy `TEXT_DEST_REC` przez `format_create_dest()`
- Wywołuje `printformat_module_dest_args()`
#### Krok 7: Emisja sygnału formatowania
**Funkcja**: `printformat_module_dest_charargs()` w `src/fe-common/core/printtext.c:64`
- Pobiera theme przez `window_get_theme()`
- **EMITUJE**: `signal_emit_id(signal_print_format, 5, theme, module, dest, formatnum, arglist)`
#### Krok 8: Obsługa sygnału formatowania
**Funkcja**: `sig_print_format()` w `src/fe-common/core/printtext.c:459`
- **WYWOŁUJE**: `format_get_text_theme_charargs(theme, module, dest, formatnum, arglist)`
#### Krok 9: Pobieranie tekstu z theme
**Funkcja**: `format_get_text_theme_charargs()` w `src/fe-common/core/formats.c:831`
- Znajduje moduł theme w `theme->modules`
- Pobiera expanded format: `text = module_theme->expanded_formats[formatnum]`
- **WYWOŁUJE**: `format_get_text_args(dest, text, args)`
#### Krok 10: Parsowanie expandos i zmiennych
**Funkcja**: `format_get_text_args()` w `src/fe-common/core/formats.c:737`
- Iteruje przez tekst formatujący
- Gdy napotka `$`, wywołuje `parse_special()`
#### Krok 11: Parsowanie expandos
**Funkcja**: `parse_special()` w `src/core/special-vars.c:425`
- Parsuje składnię `$[alignment]variable`
- **WYWOŁUJE**: `get_special_value()``get_variable()``get_long_variable_value()`
#### Krok 12: Wykonanie expando
**Funkcja**: `get_long_variable_value()` w `src/core/special-vars.c:95`
- **WYWOŁUJE**: `func = expando_find_long(key)`
- **WYWOŁUJE**: `return func(server, item, free_ret)`**TU SĄ NASZE EXPANDOS!**
### 3. WIADOMOŚCI WYCHODZĄCE (nasze wiadomości)
#### Krok 1: Input od użytkownika
**Funkcja**: Obsługa klawiatury w `src/fe-text/gui-readline.c`
- Przechwytuje Enter, wywołuje `signal_emit("send command", ...)`
#### Krok 2: Parsowanie komendy
**Funkcja**: `cmd_msg()` lub podobne w `src/irc/core/irc-commands.c`
- Wysyła PRIVMSG do serwera
- Emituje `"message own_public"` lub `"message own_private"`
#### Krok 3: Formatowanie własnej wiadomości
**Funkcja**: `sig_message_own_public()` w `src/fe-common/core/fe-messages.c:281`
- Pobiera nickmode przez `channel_get_nickmode(channel, server->nick)`
- **WYWOŁUJE**: `printformat_module("fe-common/core", server, target, level, TXT_OWN_MSG, server->nick, target, msg, nickmode)`
**Dalej flow jest identyczny jak dla wiadomości przychodzących od kroku 6.**