# 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!**