# 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 ## HISTORIA PRÓB IMPLEMENTACJI ### PRÓBA 1: Parse Special + ALIGN_COMBINE_MODE (2025-01-24) **Podejście**: Modyfikacja `parse_special()` z flagą `&` do łączenia mode+nick przed wyrównaniem. **Problem**: Ograniczenie interpretacji kolorów - po połączeniu mode+nick w jeden string, theme nie może zastosować osobnych kolorów. **Status**: ❌ Niepowodzenie ### PRÓBA 2: Expandos bez kontekstu (wcześniej) **Podejście**: Tworzenie expandos `nick_with_mode`, `nick_padding` itp. **Problem**: Expandos nie mają dostępu do `arglist` z formatowania - zwracają puste stringi. **Status**: ❌ Niepowodzenie ### PRÓBA 3: Modyfikacja format_get_text_args (2025-01-24) **Podejście**: Wstrzyknięcie dodatkowego parametru padding do `arglist` w `format_get_text_args()`. **Problem**: Błędna analiza argumentów - myślałem że `$0=nick`, ale `$0=mode`, `$1=nick`. Przesuwanie argumentów psuło mapowanie. **Status**: ❌ Niepowodzenie - fundamentalnie błędne założenia ### WNIOSKI Z NIEPOWODZEŃ: 1. **Modyfikacja argumentów formatowania jest ryzykowna** - łatwo zepsuć istniejące mapowanie 2. **Expandos bez kontekstu nie działają** - potrzebują dostępu do aktualnych danych message 3. **Analiza flow musi być dokładna** - błędne założenia prowadzą do niefunkcjonalnych rozwiązań ## AKTUALNE USTALENIA (2025-01-24) ### Rekomendowane Rozwiązanie: Expandos z kontekstem sygnałów **INSPIRACJA**: Skrypt nm2.pl pokazuje właściwe podejście - expandos + sygnały + dynamiczne przepisywanie formatów. **KLUCZOWA IDEA**: Zamiast modyfikować argumenty, stworzyć expando który zwraca gotowy string z paddingiem, mode i nickiem.