irssi/msg_flow.md

3.8 KiB

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.