mirror of
https://github.com/irssi/irssi.git
synced 2026-08-09 03:40:16 +02:00
86 lines
3.8 KiB
Markdown
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.**
|