mirror of
https://github.com/irssi/irssi.git
synced 2026-08-08 19:30:15 +02:00
5.9 KiB
5.9 KiB
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
arglistpsuł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:
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
// W fe-expandos.c
static char *current_nick = NULL;
static char *current_mode = NULL;
static gboolean nick_context_valid = FALSE;
2. EXPANDO FUNKCJA
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
// 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
// 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
// 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
# 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:
- Nie modyfikuje argumentów -
$0,$1,$2pozostają bez zmian - Expandos mają kontekst - aktualizowane przez sygnały przed formatowaniem
- Jeden parametr w theme - prosty
$nickalignedzamiast skomplikowanych kombinacji - Wzorowane na nm2.pl - sprawdzone rozwiązanie używane przez tysiące użytkowników
- Kompatybilne - domyślnie wyłączone, nie wpływa na resztę
- Konfigurowalny - szerokość, włączanie/wyłączanie
- Obsługuje przycinanie - długie nicki z wskaźnikiem
+
✅ FLOW DZIAŁANIA:
- Sygnał wiadomości → aktualizuje
current_nick,current_mode - Formatowanie → wywołuje expando
$nickaligned - Expando → oblicza padding, zwraca gotowy string
- Theme → wyświetla
<padding+mode+nick>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!