diff --git a/plan4.md b/plan4.md new file mode 100644 index 00000000..202c8769 --- /dev/null +++ b/plan4.md @@ -0,0 +1,202 @@ +# PLAN 4: Nick Column - Podejście Expandos z Kontekstem Sygnałów + +## ANALIZA BŁĘDÓW POPRZEDNICH PRÓB + +### PRÓBA 1-3: Fundamentalne błędy +- ❌ **Błędna analiza argumentów**: Myślałem że `$0=nick`, ale `$0=mode`, `$1=nick` +- ❌ **Modyfikacja argumentów**: Przesuwanie `arglist` psuło mapowanie +- ❌ **Expandos bez kontekstu**: Nie miały dostępu do aktualnych danych wiadomości +- ❌ **Ignorowanie nm2.pl**: Nie przeanalizowałem właściwego wzorca + +### KLUCZOWE ODKRYCIA Z TESTÓW UŻYTKOWNIKA + +**Rzeczywiste mapowanie argumentów:** +``` +$0 = mode ("@", "+", "") +$1 = nick ("kofany", "irssip_user") +$2 = address/msg (zależnie od kontekstu) +$3 = msg/channel (zależnie od kontekstu) +``` + +**Oczekiwany efekt:** +``` +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> < +verylongn+> długi nick przycięty +``` + +## ROZWIĄZANIE: INSPIRACJA Z nm2.pl + +### KLUCZOWA IDEA +**Jeden expando zwracający gotowy string z paddingiem, mode i nickiem** + +**Theme używa:** +```theme +msgnick = "%K<%n$nickaligned%K>%n %|"; +``` + +**Efekt:** +- `$nickaligned` = `" @nick"` lub `" @longnick+"` +- Stała szerokość kolumny +- Wyrównanie do prawej +- Przycinanie długich nicków + +## IMPLEMENTACJA + +### 1. GLOBALNE ZMIENNE KONTEKSTU +```c +// W fe-expandos.c +static char *current_nick = NULL; +static char *current_mode = NULL; +static gboolean nick_context_valid = FALSE; +``` + +### 2. EXPANDO FUNKCJA +```c +static char *expando_nickaligned(SERVER_REC *server, void *item, int *free_ret) { + if (!settings_get_bool("nick_column_enabled") || !nick_context_valid || !current_nick) { + return ""; + } + + int width = settings_get_int("nick_column_width"); + const char *mode = current_mode ? current_mode : ""; + int mode_len = strlen(mode); + int nick_len = strlen(current_nick); + int total_len = mode_len + nick_len; + + char *result; + if (total_len <= width) { + // Zmieści się - padding z lewej + int padding = width - total_len; + result = g_strdup_printf("%*s%s%s", padding, "", mode, current_nick); + } else { + // Przytnij nick, dodaj wskaźnik + + int available = width - mode_len - 1; // -1 dla + + if (available > 0) { + result = g_strdup_printf("%s%.*s+", mode, available, current_nick); + } else { + result = g_strdup_printf("%.*s+", width-1, mode); + } + } + + *free_ret = TRUE; + return result; +} +``` + +### 3. REJESTRACJA EXPANDO +```c +// W fe_expandos_init() +expando_create("nickaligned", expando_nickaligned, + "message public", EXPANDO_ARG_NONE, + "message own_public", EXPANDO_ARG_NONE, NULL); +``` + +### 4. SYGNAŁY DO AKTUALIZACJI KONTEKSTU +```c +// W fe-messages.c +static void update_nick_context(const char *nick, const char *mode) { + g_free(current_nick); + g_free(current_mode); + current_nick = g_strdup(nick); + current_mode = g_strdup(mode ? mode : ""); + nick_context_valid = TRUE; +} + +static void clear_nick_context(void) { + nick_context_valid = FALSE; +} + +// W sig_message_public(): +if (settings_get_bool("nick_column_enabled")) { + update_nick_context(printnick, nickmode); +} + +// W sig_message_own_public(): +if (settings_get_bool("nick_column_enabled")) { + update_nick_context(server->nick, nickmode); +} +``` + +### 5. USTAWIENIA +```c +// W fe_messages_init() +settings_add_bool("lookandfeel", "nick_column_enabled", FALSE); +settings_add_int("lookandfeel", "nick_column_width", 12); +settings_add_bool("lookandfeel", "debug_nick_column", FALSE); +``` + +### 6. THEME +```theme +# Podstawowy abstract - używa tylko $nickaligned +msgnick = "%K<%n$nickaligned%K>%n %|"; + +# Pozostałe abstracts bez zmian +ownmsgnick = "{msgnick $0 $1-}"; +pubmsgnick = "{msgnick $0 $1-}"; +``` + +## DLACZEGO TO ROZWIĄZANIE BĘDZIE DZIAŁAĆ + +### ✅ ZALETY TEGO PODEJŚCIA: + +1. **Nie modyfikuje argumentów** - `$0`, `$1`, `$2` pozostają bez zmian +2. **Expandos mają kontekst** - aktualizowane przez sygnały przed formatowaniem +3. **Jeden parametr w theme** - prosty `$nickaligned` zamiast skomplikowanych kombinacji +4. **Wzorowane na nm2.pl** - sprawdzone rozwiązanie używane przez tysiące użytkowników +5. **Kompatybilne** - domyślnie wyłączone, nie wpływa na resztę +6. **Konfigurowalny** - szerokość, włączanie/wyłączanie +7. **Obsługuje przycinanie** - długie nicki z wskaźnikiem `+` + +### ✅ FLOW DZIAŁANIA: + +1. **Sygnał wiadomości** → aktualizuje `current_nick`, `current_mode` +2. **Formatowanie** → wywołuje expando `$nickaligned` +3. **Expando** → oblicza padding, zwraca gotowy string +4. **Theme** → wyświetla `` w stałej szerokości + +### ✅ PRZYKŁAD DZIAŁANIA: + +**Ustawienia:** +``` +/SET nick_column_enabled ON +/SET nick_column_width 12 +``` + +**Wiadomości:** +- `@kofany` (7 znaków) → padding 5 → `" @kofany"` +- `irssip_user` (10 znaków) → padding 2 → `" irssip_user"` +- `@verylongnickname` (17 znaków) → przytnij → `"@verylongn+"` + +**Wynik:** +``` +22:11:35> < @kofany> test wiadomość +22:12:24> < irssip_user> odpowiedź +22:12:38> < @verylongn+> długi nick +``` + +## UZASADNIENIE DLACZEGO TYM RAZEM ZADZIAŁA + +### 1. **WŁAŚCIWA ANALIZA** +- Przeanalizowałem rzeczywiste mapowanie argumentów z testów użytkownika +- Zrozumiałem jak działa nm2.pl +- Nie modyfikuję istniejących argumentów + +### 2. **SPRAWDZONY WZORZEC** +- nm2.pl używa dokładnie tego samego podejścia +- Expandos + sygnały + kontekst globalny +- Tysiące użytkowników potwierdza że działa + +### 3. **MINIMALNA INGERENCJA** +- Tylko dodaję nowy expando +- Nie zmieniam core flow formatowania +- Theme używa jednego prostego parametru + +### 4. **TESTOWALNE** +- Można łatwo debugować wartości expandos +- Można włączać/wyłączać funkcję +- Można testować różne szerokości + +**To rozwiązanie MUSI zadziałać, bo jest wzorowane na działającym kodzie nm2.pl!**