diff --git a/.augment/rules/imported/summary.md b/.augment/rules/imported/summary.md new file mode 100644 index 00000000..ffd2f769 --- /dev/null +++ b/.augment/rules/imported/summary.md @@ -0,0 +1,191 @@ +--- +type: "always_apply" +--- + +# irssip - Informacje Krytyczne dla Rozwoju I Implementacji + +## Zasady Separacji od Systemowego irssi +Nie używamy nazwy binarnej `irssi` ani standardowych folderów, w których instaluje się oryginalne irssi. Nie używamy również `~/.irssi` jako katalogu domowego. Wszystko po to, by rozwój nie kolidował z systemowym irssi i jego bibliotekami (używamy nowszej wersji niż pakiet zainstalowany). + +### Konwencje Nazewnictwa +Plik binarny oraz podstawowa nazwa dla używanych katalogów to **irssip** (od irssi panels): +- Plik binarny: `irssip` +- Katalog instalacji: `/opt/irssip` +- Katalog domowy: `~/.irssip` + +### Konfiguracja Środowiska Deweloperskiego +Dla przyspieszenia i ułatwienia testów na żywo, pliki config i default.theme w rzeczywistości znajdują się w naszym workspace: + +```bash +ls -la /Users/kfn/.irssip/config +lrwxr-xr-x 1 kfn staff 27 Aug 23 22:13 /Users/kfn/.irssip/config -> /Users/kfn/irssi/config_dev + +ls -la /Users/kfn/.irssip/default.theme +lrwxr-xr-x 1 kfn staff 37 Aug 23 02:59 /Users/kfn/.irssip/default.theme -> /Users/kfn/irssi/themes/default.theme +``` + +## Filozofia Rozwoju + +### Zasady KISS (Keep It Simple Stupid) +- Wszelkie wprowadzane zmiany/funkcje mają oddawać ducha prostoty +- Implementacje nie mogą zmieniać działania istniejących mechanizmów +- Zachowanie wstecznej kompatybilności jest priorytetem +- Nowe funkcje powinny być opcjonalne - możliwe do wyłączenia w ustawieniach lub nieaktywne do czasu wywołania + +### Proces Deweloperski +1. **Checkpointy**: Przed wprowadzaniem większych zmian zawsze robimy commit roboczy +2. **Testowanie**: Tylko ja testuję wprowadzone zmiany. Ty możesz testować Build lokalnie bez instalacji +3. **Budowanie**: Proces budowania do testów: +```bash +sudo rm -rf /opt/irssip && rm -rf $(pwd)/Build && \ +meson setup $(pwd)/Build -Dprefix=/opt/irssip -Dwith-perl=yes -Dwith-proxy=yes && \ +ninja -C Build && sudo ninja -C Build install +``` + +### Pliki Konfiguracyjne +W przypadku zmian wymagających modyfikacji plików config lub theme, edytujemy: +- `/Users/kfn/irssi/config_dev` +- `/Users/kfn/irssi/themes/default.theme` + +## Aktualne Zmiany względem Standardowego irssi + +### 1. Natywna Obsługa Paneli Bocznych +- **Panel lewy**: Lista okien/kanałów/query z sortowaniem i obsługą myszy +- **Panel prawy**: Lista nicków (nicklist) +- **Cel**: Efekt podobny do WeeChat - łatwe przemieszczanie się po kanałach i query +- **Funkcjonalność**: Klik na element przenosi do okna lub otwiera nowe query + +### 2. Modyfikacja Wyświetlania WHOIS +Wyświetlanie outputu komendy whois w aktualnie aktywnym oknie zamiast w oknie status czy sieci + +## Aktualny Projekt: Wyrównanie Nicków w Oknie Czatu + +### Cel Implementacji +Stała szerokość pola z nickiem osoby piszącej na kanale z wyrównaniem do prawej, aby uzyskać efekt jednej kolumny dla wszystkich wiadomości bez konieczności używania zewnętrznych skryptów jak nm2. + +### Oczekiwany Efekt Wizualny +``` +22:11:35 @yooz │ no działa ;] +22:12:24 @nosfar │ starsze rzeczy ;p +22:12:38 @yooz │ to zamknij oczy +22:14:22 DMZ │ ✅ Link dodany do bazy! +22:14:22 +iBot │ YouTube Tytuł: LIVE Gemini +22:14:22 LinkShor> │ Skrócony link dla yooz: https://tinyurl.com/yrqbfxeb +``` + +Alternatywny przykład z nawiasami kątowymi i skróceniem długiego nicka dodatkowy > informuje że to nie pełny nick: +``` +21:36:06> < @kofany> bittersweets outstript +21:36:16> < @kofany> sarcomas oven's pebble's +21:37:46> <+testNick>> truncation's debarked Allie +21:37:56> <+testNick>> griming surtax's intermediary's +``` + +### Wymagania Techniczne +- Implementacja **musi** wspierać aktualne formatowanie linii w theme +- Zachowanie kompatybilności z istniejącymi motywami +- Możliwość konfiguracji szerokości pola wyświetlania nicka z formatowamiem. +- Obsługa długich nicków z obcinaniem i wskaźnikiem + +## Dotychczasowe Próby Implementacji + +[Tu następuje szczegółowa dokumentacja techniczna z poprzedniego dokumentu] + +## Standardowe Formatowanie Wiadomości irssi +``` +# Oryginalny format (bez wyrównania): +msgnick = "%K<%n$0$1-%K>%n %|"; +ownmsgnick = "{msgnick $0 $1-}%g"; + +# Parametry: $0=tryb(mode) (@,+), $1=nick, wynik: <@nick> wiadomość +``` + +## Zmodyfikowane Pliki + +### 1. `/src/core/special-vars.h` +- Dodano flagę `#define ALIGN_COMBINE_MODE 0x10` +- Rozszerzono system wyrównywania o obsługę kombinacji tryb+nick + +### 2. `/src/core/special-vars.c` +- Zmodyfikowano `get_alignment_args()` aby parsować flagę '&': `*flags |= ALIGN_COMBINE_MODE` +- Zaimplementowano logikę kombinacji w `parse_special()`: + - Pobiera tryb z `arglist[2]` i nick z `arglist[0]` + - Oblicza dostępną przestrzeń: `total_width - mode_len - 2` (dla nawiasów) + - Wyrównuje do prawej z wypełnieniem: `" @nick"` + - Obcina długie nicki: `"@bardzodlu+"` + - Zwraca połączony string do przetworzenia przez motyw + +### 3. `/themes/default.theme` +- Zaktualizowano komendy formatowania używając składni `$[~&12]0`: + ``` + own_msg = "{ownmsgnick $[~&12]0}$1"; + pubmsg = "{pubmsgnick $[~&12]0}$1"; + ``` +- Dodano obszerną dokumentację i komentarze dotyczące dostosowania kolorów + +## Próby Implementacji + +### Próba 1: Natywny Mechanizm $[] +Początkowo próbowano użyć standardowego wyrównania irssi: `$[-12]0` i `$[-12]1` + +**Problem**: Natywne wyrównanie oddzielało tryb od nicka podczas wyrównywania: +``` +Wynik: <@ kofany> # Tryb z lewej, nick wyrównany do prawej osobno +Wymagane: < @kofany> # Wszystko razem, wyrównane do prawej +``` + +### Próba 2: Rozszerzenie ALIGN_COMBINE_MODE +Rozszerzono `parse_special()` aby łączyć tryb+nick przed zastosowaniem wyrównania używając flagi `&`. + +**Osiągnięcie**: Pomyślnie utworzono wyrównane do prawej połączone tryb+nick z odpowiednim wypełnieniem i obcięciem. + +**Obecna Ściana**: Ograniczenie interpretacji kolorów w systemie motywów. + + +### Co Mamy Teraz przykład: +```themes +ownmsgnick = "{msgnick %B$0%N%g$1-%N}%g"; +``` + +Z ALIGN_COMBINE_MODE, `$0` staje się połączonym stringiem `"@kofany"`, więc: +- `%B$0%N` koloruje całe `"@kofany"` na niebiesko +- `%g$1-%N` jest ignorowane (puste po połączeniu) +- **Wynik**: `< @kofany>` gdzie zarówno @ jak i nick są niebieskie + +### Czego Potrzebujemy: +``` +Oczekiwane: < @kofany> gdzie @ jest niebieski (%B) a nick jest zielony (%g) +``` + +### Główny Problem: +Po połączeniu tryb+nick w kodzie C, motyw otrzymuje jeden parametr zawierający `"@kofany"` jako pojedynczy string. Abstrakcje motywu nie mogą zastosować osobnych kolorów do części połączonego stringa - mogą tylko kolorować cały parametr. + +## Wyzwanie Techniczne +Fundamentalny konflikt: +1. **Wymóg wyrównania w obecnej implementacji**: Tryb i nick muszą być połączone przed wyrównaniem aby osiągnąć `< @nick>` a nie `<@ nick>` +2. **Wymóg kolorów**: Tryb i nick potrzebują osobnego formatowania kolorów z abstrakcji motywu +3. **Obecne ograniczenie**: Po połączeniu w C, motyw widzi pojedynczy string i nie może zastosować osobnych kolorów + +## AKTUALNE USTALENIA (2025-01-24) + +### Analiza Flow Wiadomości +Przeprowadzono szczegółową analizę flow wiadomości w Irssi od otrzymania z serwera do wyświetlenia (dokumentacja w `msg_flow.md`). Zidentyfikowano fundamentalny problem z podejściem expandos. + +### Problem z Expandos +Expandos nie mają dostępu do `arglist` z formatowania - są wywoływane globalnie bez kontekstu lokalnego formatowania. To powoduje, że zwracają puste stringi zamiast rzeczywistych wartości mode i nick. + +### Rekomendowane Rozwiązanie +**Rozszerzenie systemu wyrównania w `parse_special`** zamiast expandos: + +1. **Nowa składnia**: `$[~&nick_column]0` - wyrównanie z flagą nick_column +2. **Zachowuje osobne parametry** - mode ($0) i nick ($1) pozostają oddzielne dla kolorowania +3. **Zgodne z roadmapą Irssi** - "variable/dynamic expandos with arguments" +4. **Eleganckie kodowo** - rozszerza istniejący system zamiast go obchodzić + +### Wymagania Implementacji + +- Rozszerzyć `get_alignment_args()` o flagę `&nick_column` +- Dodać `ALIGN_NICK_COLUMN` do special-vars.h +- Implementować logikę kombinowania mode+nick przed wyrównaniem +- Zachować osobne parametry po wyrównaniu dla theme +- Ustawienia: `nick_column_enabled` i `nick_column_width` diff --git a/.gitignore b/.gitignore index 6f8a9101..0fa209f3 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,8 @@ setup.cfg *.egg-info src/.DS_Store .DS_Store +Build/ +.cache +.cache/ +build +build/ \ No newline at end of file diff --git a/config_dev b/config_dev new file mode 100644 index 00000000..1dbe0825 --- /dev/null +++ b/config_dev @@ -0,0 +1,348 @@ +servers = ( + { address = "irc.dal.net"; chatnet = "DALnet"; port = "6667"; }, + { + address = "ssl.efnet.org"; + chatnet = "EFNet"; + port = "9999"; + use_tls = "yes"; + tls_verify = "no"; + }, + { + address = "irc.esper.net"; + chatnet = "EsperNet"; + port = "6697"; + use_tls = "yes"; + tls_verify = "yes"; + }, + { + address = "irc.libera.chat"; + chatnet = "liberachat"; + port = "6697"; + use_tls = "yes"; + tls_verify = "yes"; + }, + { + address = "irc.gamesurge.net"; + chatnet = "GameSurge"; + port = "6667"; + }, + { + address = "ssl.ircnet.ovh"; + chatnet = "IRCnet"; + port = "6697"; + use_tls = "yes"; + tls_verify = "yes"; + }, + { address = "open.ircnet.net"; chatnet = "IRCnet"; port = "6667"; }, + { + address = "irc.ircsource.net"; + chatnet = "IRCSource"; + port = "6667"; + }, + { address = "irc.netfuze.net"; chatnet = "NetFuze"; port = "6667"; }, + { + address = "irc.oftc.net"; + chatnet = "OFTC"; + port = "6697"; + use_tls = "yes"; + tls_verify = "yes"; + }, + { + address = "irc.quakenet.org"; + chatnet = "QuakeNet"; + port = "6667"; + }, + { + address = "irc.rizon.net"; + chatnet = "Rizon"; + port = "6697"; + use_tls = "yes"; + tls_verify = "yes"; + }, + { address = "silc.silcnet.org"; chatnet = "SILC"; port = "706"; }, + { + address = "irc.undernet.org"; + chatnet = "Undernet"; + port = "6667"; + } +); + +chatnets = { + DALnet = { + type = "IRC"; + max_kicks = "4"; + max_msgs = "20"; + max_whois = "30"; + }; + EFNet = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "4"; + max_whois = "1"; + }; + EsperNet = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "4"; + max_whois = "1"; + }; + liberachat = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "4"; + max_whois = "1"; + }; + GameSurge = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; + IRCnet = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; + IRCSource = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "4"; + max_whois = "1"; + }; + NetFuze = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; + OFTC = { type = "IRC"; max_kicks = "1"; max_msgs = "1"; max_whois = "1"; }; + QuakeNet = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; + Rizon = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; + SILC = { type = "SILC"; }; + Undernet = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; +}; + +channels = ( + { name = "#lobby"; chatnet = "EsperNet"; autojoin = "No"; }, + { name = "#libera"; chatnet = "liberachat"; autojoin = "No"; }, + { name = "#irssi"; chatnet = "liberachat"; autojoin = "No"; }, + { name = "#gamesurge"; chatnet = "GameSurge"; autojoin = "No"; }, + { name = "#irssi"; chatnet = "IRCNet"; autojoin = "No"; }, + { name = "#ircsource"; chatnet = "IRCSource"; autojoin = "No"; }, + { name = "#netfuze"; chatnet = "NetFuze"; autojoin = "No"; }, + { name = "#oftc"; chatnet = "OFTC"; autojoin = "No"; }, + { name = "silc"; chatnet = "SILC"; autojoin = "No"; } +); + +aliases = { + ATAG = "WINDOW SERVER"; + ADDALLCHANS = "SCRIPT EXEC foreach my \\$channel (Irssi::channels()) { Irssi::command(\"CHANNEL ADD -auto \\$channel->{visible_name} \\$channel->{server}->{tag} \\$channel->{key}\")\\;}"; + B = "BAN"; + BACK = "AWAY"; + BANS = "BAN"; + BYE = "QUIT"; + C = "CLEAR"; + CALC = "EXEC - if command -v bc >/dev/null 2>&1\\; then printf '%s=' '$*'\\; echo '$*' | bc -l\\; else echo bc was not found\\; fi"; + CHAT = "DCC CHAT"; + CS = "QUOTE CS"; + DATE = "TIME"; + DEHIGHLIGHT = "DEHILIGHT"; + DESCRIBE = "ACTION"; + DHL = "DEHILIGHT"; + EXEMPTLIST = "MODE $C +e"; + EXIT = "QUIT"; + GOTO = "SCROLLBACK GOTO"; + HIGHLIGHT = "HILIGHT"; + HL = "HILIGHT"; + HOST = "USERHOST"; + INVITELIST = "MODE $C +I"; + J = "JOIN"; + K = "KICK"; + KB = "KICKBAN"; + KN = "KNOCKOUT"; + LAST = "LASTLOG"; + LEAVE = "PART"; + M = "MSG"; + MS = "QUOTE MS"; + MUB = "UNBAN *"; + N = "NAMES"; + NMSG = "^MSG"; + NS = "QUOTE NS"; + OS = "QUOTE OS"; + P = "PART"; + Q = "QUERY"; + RESET = "SET -default"; + RUN = "SCRIPT LOAD"; + SAY = "MSG *"; + SB = "SCROLLBACK"; + SBAR = "STATUSBAR"; + SHELP = "QUOTE HELP"; + SIGNOFF = "QUIT"; + SV = "MSG * Irssi $J ($V) - https://irssi.org"; + T = "TOPIC"; + UB = "UNBAN"; + UMODE = "MODE $N"; + UNSET = "SET -clear"; + W = "WHO"; + WC = "WINDOW CLOSE"; + WG = "WINDOW GOTO"; + WJOIN = "JOIN -window"; + WI = "WHOIS"; + WII = "WHOIS $0 $0"; + WL = "WINDOW LIST"; + WN = "WINDOW NEW HIDDEN"; + WQUERY = "QUERY -window"; + WW = "WHOWAS"; +}; + +statusbar = { + items = { + barstart = "{sbstart}"; + barend = "{sbend}"; + topicbarstart = "{topicsbstart}"; + topicbarend = "{topicsbend}"; + time = "{sb %B$Z%n%W❱ %G⚡%n Connected: %G%W$tag%n %W>%B>%C> %WNexus %G<%B<%W<%W}"; + user = "{sb %WU%wser ⇋ %B$cumode%w$N%W : ➜ %WS%wtatus {sbmode (%C+$usermode%n)}}"; + window = "%W ➜ %n{sbmode %WC%whannel (%C+$M%n%W) %B ➜ %WW%window: %G$winref }{sbaway $A}%W %n"; + window_empty = "{sb $winref{sbservertag $tag}}"; + prompt = "%B⚡%N %k❮%B$itemname%k❯%N%C:%N "; + prompt_empty = "%k❮%B$winname%k❯%N "; + topic = "%WTopic%C:%W $topic"; + topic_empty = " Irssi v$J - https://irssi.org"; + lag = "{sb ⇉ %WL%wagging ⇋ %W: %R$0- }"; + act = "{sb %WActive Windows%C: $0-}"; + more = "%C-- %Wmore %C--"; + }; + default = { + window = { + type = "window"; + placement = "bottom"; + position = "0"; + visible = "active"; + items = { + barstart = { priority = "100"; }; + time = { priority = "10"; }; + more = { priority = "-1"; alignment = "right"; }; + barend = { priority = "100"; alignment = "right"; }; + }; + disabled = "yes"; + }; + prompt = { + type = "root"; + placement = "bottom"; + position = "100"; + visible = "active"; + items = { + prompt = { priority = "-1"; }; + prompt_empty = { priority = "-1"; }; + input = { priority = "10"; }; + }; + }; + topic = { + type = "root"; + placement = "top"; + position = "1"; + visible = "always"; + items = { + topicbarstart = { priority = "100"; }; + topic = { }; + topic_empty = { }; + topicbarend = { priority = "100"; alignment = "right"; }; + }; + }; + info1 = { + items = { user = { }; window = { }; }; + position = "10"; + placement = "bottom"; + }; + info2 = { + items = { time = { }; more = { }; act = { }; lag = { }; }; + position = "0"; + }; + add = { disabled = "yes"; }; + window1 = { disabled = "yes"; }; + }; +}; + +settings = { + core = { + nick = "irssip_user"; + hostname = "0.0.0.0"; + timestamp_format = "%H:%M:%S"; + override_coredump_limit = "no"; + resolve_prefer_ipv6 = "no"; + server_reconnect_time = "300"; + recode_out_default_charset = "utf8"; + recode_autodetect_utf8 = "yes"; + recode_fallback = "ISO-8859-2"; + recode_transliterate = "yes"; + recode = "yes"; + real_name = "Irssip User"; + user_name = "irssip"; + }; + "irc/core" = { + lag_check_time = "5s"; + ctcp_version_reply = ""; + skip_motd = "no"; + lag_max_before_disconnect = "300"; + cmds_max_at_once = "10"; + }; + "fe-common/core" = { + activity_hide_level = "KICK MODE TOPIC NICK QUIT CLIENTNOTICE CLIENTCRAP SNOTICE JOIN PART CRAP"; + timestamps = "yes"; + timestamp_level = "ALL"; + hilight_color = "%M"; + autolog = "yes"; + autolog_path = "~/.irssip/logs/$tag/$0.log"; + term_charset = "UTF-8"; + use_status_window = "no"; + hilight_nick_matches = "yes"; + hilight_nick_matches_everywhere = "yes"; + window_auto_change = "yes"; + print_active_channel = "yes"; + theme = "default.theme"; + }; + "fe-text" = { + lag_min_show = "1s"; + scrollback_lines = "2000"; + paste_verify_line_count = "2"; + term_force_colors = "no"; + colors = "yes"; + actlist_sort = "refnum"; + colors_ansi_24bit = "yes"; + }; + lookandfeel = { + sidepanel_left = "yes"; + sidepanel_right = "yes"; + sidepanel_left_width = "20"; + sidepanel_right_width = "16"; + sidepanel_debug = "no"; + sidepanel_right_auto_hide = "yes"; + }; + "fe-common/irc" = { print_whois_rpl_in_active_window = "yes"; }; +}; + +hilights = ( { text = ""; nick = "yes"; word = "yes"; } ); + +logs = { }; + +ignores = ( ); + +# Set default window name to Notices +windows = { 1 = { name = "Notices"; }; }; diff --git a/msg_flow.md b/msg_flow.md new file mode 100644 index 00000000..9ce06609 --- /dev/null +++ b/msg_flow.md @@ -0,0 +1,86 @@ +## 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.** diff --git a/summary.md b/summary.md new file mode 100644 index 00000000..b6784980 --- /dev/null +++ b/summary.md @@ -0,0 +1,186 @@ +# irssip - Informacje Krytyczne dla Rozwoju I Implementacji + +## Zasady Separacji od Systemowego irssi +Nie używamy nazwy binarnej `irssi` ani standardowych folderów, w których instaluje się oryginalne irssi. Nie używamy również `~/.irssi` jako katalogu domowego. Wszystko po to, by rozwój nie kolidował z systemowym irssi i jego bibliotekami (używamy nowszej wersji niż pakiet zainstalowany). + +### Konwencje Nazewnictwa +Plik binarny oraz podstawowa nazwa dla używanych katalogów to **irssip** (od irssi panels): +- Plik binarny: `irssip` +- Katalog instalacji: `/opt/irssip` +- Katalog domowy: `~/.irssip` + +### Konfiguracja Środowiska Deweloperskiego +Dla przyspieszenia i ułatwienia testów na żywo, pliki config i default.theme w rzeczywistości znajdują się w naszym workspace: + +```bash +ls -la /Users/kfn/.irssip/config +lrwxr-xr-x 1 kfn staff 27 Aug 23 22:13 /Users/kfn/.irssip/config -> /Users/kfn/irssi/config_dev + +ls -la /Users/kfn/.irssip/default.theme +lrwxr-xr-x 1 kfn staff 37 Aug 23 02:59 /Users/kfn/.irssip/default.theme -> /Users/kfn/irssi/themes/default.theme +``` + +## Filozofia Rozwoju + +### Zasady KISS (Keep It Simple Stupid) +- Wszelkie wprowadzane zmiany/funkcje mają oddawać ducha prostoty +- Implementacje nie mogą zmieniać działania istniejących mechanizmów +- Zachowanie wstecznej kompatybilności jest priorytetem +- Nowe funkcje powinny być opcjonalne - możliwe do wyłączenia w ustawieniach lub nieaktywne do czasu wywołania + +### Proces Deweloperski +1. **Checkpointy**: Przed wprowadzaniem większych zmian zawsze robimy commit roboczy +2. **Testowanie**: Tylko ja testuję wprowadzone zmiany. Ty możesz testować Build lokalnie bez instalacji +3. **Budowanie**: Proces budowania do testów: +```bash +sudo rm -rf /opt/irssip && rm -rf $(pwd)/Build && \ +meson setup $(pwd)/Build -Dprefix=/opt/irssip -Dwith-perl=yes -Dwith-proxy=yes && \ +ninja -C Build && sudo ninja -C Build install +``` + +### Pliki Konfiguracyjne +W przypadku zmian wymagających modyfikacji plików config lub theme, edytujemy: +- `/Users/kfn/irssi/config_dev` +- `/Users/kfn/irssi/themes/default.theme` + +## Aktualne Zmiany względem Standardowego irssi + +### 1. Natywna Obsługa Paneli Bocznych +- **Panel lewy**: Lista okien/kanałów/query z sortowaniem i obsługą myszy +- **Panel prawy**: Lista nicków (nicklist) +- **Cel**: Efekt podobny do WeeChat - łatwe przemieszczanie się po kanałach i query +- **Funkcjonalność**: Klik na element przenosi do okna lub otwiera nowe query + +### 2. Modyfikacja Wyświetlania WHOIS +Wyświetlanie outputu komendy whois w aktualnie aktywnym oknie zamiast w oknie status czy sieci + +## Aktualny Projekt: Wyrównanie Nicków w Oknie Czatu + +### Cel Implementacji +Stała szerokość pola z nickiem osoby piszącej na kanale z wyrównaniem do prawej, aby uzyskać efekt jednej kolumny dla wszystkich wiadomości bez konieczności używania zewnętrznych skryptów jak nm2. + +### Oczekiwany Efekt Wizualny +``` +22:11:35 @yooz │ no działa ;] +22:12:24 @nosfar │ starsze rzeczy ;p +22:12:38 @yooz │ to zamknij oczy +22:14:22 DMZ │ ✅ Link dodany do bazy! +22:14:22 +iBot │ YouTube Tytuł: LIVE Gemini +22:14:22 LinkShor> │ Skrócony link dla yooz: https://tinyurl.com/yrqbfxeb +``` + +Alternatywny przykład z nawiasami kątowymi i skróceniem długiego nicka dodatkowy > informuje że to nie pełny nick: +``` +21:36:06> < @kofany> bittersweets outstript +21:36:16> < @kofany> sarcomas oven's pebble's +21:37:46> <+testNick>> truncation's debarked Allie +21:37:56> <+testNick>> griming surtax's intermediary's +``` + +### Wymagania Techniczne +- Implementacja **musi** wspierać aktualne formatowanie linii w theme +- Zachowanie kompatybilności z istniejącymi motywami +- Możliwość konfiguracji szerokości pola wyświetlania nicka z formatowamiem. +- Obsługa długich nicków z obcinaniem i wskaźnikiem + +## Dotychczasowe Próby Implementacji + +[Tu następuje szczegółowa dokumentacja techniczna z poprzedniego dokumentu] + +## Standardowe Formatowanie Wiadomości irssi +``` +# Oryginalny format (bez wyrównania): +msgnick = "%K<%n$0$1-%K>%n %|"; +ownmsgnick = "{msgnick $0 $1-}%g"; + +# Parametry: $0=tryb(mode) (@,+), $1=nick, wynik: <@nick> wiadomość +``` + +## Zmodyfikowane Pliki + +### 1. `/src/core/special-vars.h` +- Dodano flagę `#define ALIGN_COMBINE_MODE 0x10` +- Rozszerzono system wyrównywania o obsługę kombinacji tryb+nick + +### 2. `/src/core/special-vars.c` +- Zmodyfikowano `get_alignment_args()` aby parsować flagę '&': `*flags |= ALIGN_COMBINE_MODE` +- Zaimplementowano logikę kombinacji w `parse_special()`: + - Pobiera tryb z `arglist[2]` i nick z `arglist[0]` + - Oblicza dostępną przestrzeń: `total_width - mode_len - 2` (dla nawiasów) + - Wyrównuje do prawej z wypełnieniem: `" @nick"` + - Obcina długie nicki: `"@bardzodlu+"` + - Zwraca połączony string do przetworzenia przez motyw + +### 3. `/themes/default.theme` +- Zaktualizowano komendy formatowania używając składni `$[~&12]0`: + ``` + own_msg = "{ownmsgnick $[~&12]0}$1"; + pubmsg = "{pubmsgnick $[~&12]0}$1"; + ``` +- Dodano obszerną dokumentację i komentarze dotyczące dostosowania kolorów + +## Próby Implementacji + +### Próba 1: Natywny Mechanizm $[] +Początkowo próbowano użyć standardowego wyrównania irssi: `$[-12]0` i `$[-12]1` + +**Problem**: Natywne wyrównanie oddzielało tryb od nicka podczas wyrównywania: +``` +Wynik: <@ kofany> # Tryb z lewej, nick wyrównany do prawej osobno +Wymagane: < @kofany> # Wszystko razem, wyrównane do prawej +``` + +### Próba 2: Rozszerzenie ALIGN_COMBINE_MODE +Rozszerzono `parse_special()` aby łączyć tryb+nick przed zastosowaniem wyrównania używając flagi `&`. + +**Osiągnięcie**: Pomyślnie utworzono wyrównane do prawej połączone tryb+nick z odpowiednim wypełnieniem i obcięciem. + +**Obecna Ściana**: Ograniczenie interpretacji kolorów w systemie motywów. + + +### Co Mamy Teraz przykład: +```themes +ownmsgnick = "{msgnick %B$0%N%g$1-%N}%g"; +``` + +Z ALIGN_COMBINE_MODE, `$0` staje się połączonym stringiem `"@kofany"`, więc: +- `%B$0%N` koloruje całe `"@kofany"` na niebiesko +- `%g$1-%N` jest ignorowane (puste po połączeniu) +- **Wynik**: `< @kofany>` gdzie zarówno @ jak i nick są niebieskie + +### Czego Potrzebujemy: +``` +Oczekiwane: < @kofany> gdzie @ jest niebieski (%B) a nick jest zielony (%g) +``` + +### Główny Problem: +Po połączeniu tryb+nick w kodzie C, motyw otrzymuje jeden parametr zawierający `"@kofany"` jako pojedynczy string. Abstrakcje motywu nie mogą zastosować osobnych kolorów do części połączonego stringa - mogą tylko kolorować cały parametr. + +## Wyzwanie Techniczne +Fundamentalny konflikt: +1. **Wymóg wyrównania w obecnej implementacji**: Tryb i nick muszą być połączone przed wyrównaniem aby osiągnąć `< @nick>` a nie `<@ nick>` +2. **Wymóg kolorów**: Tryb i nick potrzebują osobnego formatowania kolorów z abstrakcji motywu +3. **Obecne ograniczenie**: Po połączeniu w C, motyw widzi pojedynczy string i nie może zastosować osobnych kolorów + +## AKTUALNE USTALENIA (2025-01-24) + +### Analiza Flow Wiadomości +Przeprowadzono szczegółową analizę flow wiadomości w Irssi od otrzymania z serwera do wyświetlenia (dokumentacja w `msg_flow.md`). Zidentyfikowano fundamentalny problem z podejściem expandos. + +### Problem z Expandos +Expandos nie mają dostępu do `arglist` z formatowania - są wywoływane globalnie bez kontekstu lokalnego formatowania. To powoduje, że zwracają puste stringi zamiast rzeczywistych wartości mode i nick. + +### Rekomendowane Rozwiązanie +**Rozszerzenie systemu wyrównania w `parse_special`** zamiast expandos: + +1. **Nowa składnia**: `$[~&nick_column]0` - wyrównanie z flagą nick_column +2. **Zachowuje osobne parametry** - mode ($0) i nick ($1) pozostają oddzielne dla kolorowania +3. **Zgodne z roadmapą Irssi** - "variable/dynamic expandos with arguments" +4. **Eleganckie kodowo** - rozszerza istniejący system zamiast go obchodzić + +### Wymagania Implementacji +- Rozszerzyć `get_alignment_args()` o flagę `&nick_column` +- Dodać `ALIGN_NICK_COLUMN` do special-vars.h +- Implementować logikę kombinowania mode+nick przed wyrównaniem +- Zachować osobne parametry po wyrównaniu dla theme +- Ustawienia: `nick_column_enabled` i `nick_column_width` diff --git a/themes/default.theme b/themes/default.theme index f5a79397..e240e82f 100644 --- a/themes/default.theme +++ b/themes/default.theme @@ -45,7 +45,6 @@ # at start, the normal behaviour of %n would occur. If you _really_ want # to use the terminal's default color, use %N. -############################################################################# # default foreground color (%N) - -1 is the "default terminal color" default_color = "-1"; @@ -66,7 +65,7 @@ abstracts = { line_start = "%N"; # timestamp styling, nothing by default - timestamp = "%b$*%C❱%N"; + timestamp = "%b$*%C>%N"; # any kind of text that needs hilighting, default is to bold hilight = "%Y%_$*%_%N"; @@ -112,14 +111,15 @@ abstracts = { # ban/ban exception/invite list mask is printed ban = "%c$*%n"; + ## ## messages ## # the basic styling of how to print message, $0 = nick mode, $1 = nick - msgnick = "%K<%n$0$[10]1-%K>%n %|"; + msgnick = "%K<%n$0$1-%K>%n %|"; - # message from you is printed. "ownnick" specifies the styling of the + # message from you is printed. "msgownnick" specifies the styling of the # nick ($0 part in msgnick) and "ownmsgnick" specifies the styling of the # whole line. @@ -136,15 +136,15 @@ abstracts = { # privmsgnick = "%K{msgnick %R$*%K}%n"; # $0 = nick mode, $1 = nick - ownmsgnick = "{msgnick $0 $[10]1-}"; + ownmsgnick = "{msgnick $0 $1-}"; ownnick = "%_$*%n"; # public message in channel, $0 = nick mode, $1 = nick - pubmsgnick = "{msgnick $0 $[10]1-}"; + pubmsgnick = "{msgnick $0 $1-}"; pubnick = "%N$*%n"; # public message in channel meant for me, $0 = nick mode, $1 = nick - pubmsgmenick = "{msgnick $0 $[10]1-}"; + pubmsgmenick = "{msgnick $0 $1-}"; menick = "%Y$*%n"; # public highlighted message in channel @@ -167,6 +167,9 @@ abstracts = { # private message in query privmsgnick = "{msgnick %R$*%n}"; + # channel name is printed with message + msgchannel = "%K:%c$*%n"; + ## ## Actions (/ME stuff) ## @@ -251,20 +254,20 @@ abstracts = { # Statusbar background and styling elements sb_background = "%K"; # Void black background - window_border = "%B│%N"; + window_border = "%B|%N"; # Electric blue cyberpunk border character sb_topic_bg = "%B%W"; # Electric blue + white for topic - sb = "%B⚡%N $0-%B ⚬%N"; + sb = " %c[%n$*%c]%n"; # Electric blue lightning + bullet - sbmode = "$0-"; + sbmode = "(%c+%n$*)"; # Mode display - sbservertag = ":$0 %N(%Gchange with ^X%N)"; + sbservertag = ":$0 (change with ^X)"; # Server tag with green hint - sbmore = " %R❰%r❰%k❰ %Nmore %k❱%r❱%R❱ "; + sbmore = " %R<%r<%k< %Nmore %k>%r>%R> "; # Triple-layered more indicator - sblag = "%R☠%N %RLAG%N %w$0-%N seconds"; - # Skull + lag in crimson red + sblag = "%R!%N %RLAG%N %w$0-%N seconds"; + # Exclamation + lag in crimson red sb_default_bg = "%K"; # Default void black background sb_info1_bg = "%B"; @@ -288,10 +291,7 @@ abstracts = { prompt = "[$*] "; - sb = " %c[%n$*%c]%n"; - sbmode = "(%c+%n$*)"; sbaway = " (%GzZzZ%n)"; - sbservertag = ":$0 (change with ^X)"; sbnickmode = "$0"; # activity in statusbar @@ -306,35 +306,52 @@ abstracts = { sb_act_hilight = "%g$*"; # Sky blue highlight with color sb_act_hilight_color = "%b$0$1-%N"; + }; formats = { - "fe-text" = { + "fe-common/core" = { + + own_msg = "{ownmsgnick $2 {ownnick $0}}$1"; + own_msg_channel = "{ownmsgnick $3 {ownnick $0}{msgchannel $1}}$2"; + own_msg_private = "{ownprivmsg msg $0}$1"; + own_msg_private_query = "{ownprivmsgnick {ownprivnick $2}}$1"; + pubmsg_me = "{pubmsgmenick $2 {menick $0}}$1"; + pubmsg_me_channel = "{pubmsgmenick $3 {menick $0}{msgchannel $1}}$2"; + pubmsg_hilight = "{pubmsghinick $0 $3 $1}$2"; + pubmsg_hilight_channel = "{pubmsghinick $0 $4 $1{msgchannel $2}}$3"; + pubmsg = "{pubmsgnick $2 {pubnick $0}}$1"; + pubmsg_channel = "{pubmsgnick $3 {pubnick $0}{msgchannel $1}}$2"; + msg_private = "{privmsg $0 $1}$2"; + msg_private_query = "{privmsgnick $0}$2"; + + }; + "fe-text" = { # === LEFT PANEL (Window List) === - # Server headers - electric blue with power symbol (consistent with theme primary) - sidepanel_header = "%B⚡%B$0%N"; + # Server headers - electric blue with asterisk symbol (consistent with theme primary) + sidepanel_header = "%B*%B$0%N"; # Normal items - steel gray (consistent with theme secondary text) sidepanel_item = "%W %W$0%N"; # Selected items - neon green highlight (consistent with theme highlights) - sidepanel_item_selected = "%g%k❱ %g%k$0%N"; + sidepanel_item_selected = "%g%k> %g%k$0%N"; # === ACTIVITY HIERARCHY (by priority) === # PRIORITY 4 (Highest): NICK MENTION - magenta alert (when your nick is mentioned on channel) - sidepanel_item_nick_mention = "%M⬢ %M$0%N"; + sidepanel_item_nick_mention = "%M# %M$0%N"; # PRIORITY 4 (Highest): QUERY MESSAGE - magenta alert (new messages in query/private) - sidepanel_item_query_msg = "%M◆ %M$0%N"; + sidepanel_item_query_msg = "%M+ %M$0%N"; # PRIORITY 3: CHANNEL ACTIVITY - yellow warning (messages on channel without mention) - sidepanel_item_activity = "%y● %y$0%N"; + sidepanel_item_activity = "%y* %y$0%N"; # PRIORITY 1 (Lowest): EVENTS - green info (join/part/quit/nick changes) - sidepanel_item_events = "%G○%N %G$0%N"; + sidepanel_item_events = "%Go%N %G$0%N"; # PRIORITY 2: HIGHLIGHTS - red alert (keyword highlights, fallback) - sidepanel_item_highlight = "%R☠ %R$0%N"; + sidepanel_item_highlight = "%R! %R$0%N"; # New dual-parameter formats - status and nick separated for theme flexibility # Operators - gold status symbol with steel nick (power users) @@ -345,5 +362,5 @@ formats = { # Normal users - subtle gray for clean appearance sidepanel_nick_normal_status = "%k$0%N%w$1%N"; - }; + }; };