irssi/plan4.md

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 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:

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:

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