mirror of
https://github.com/irssi/irssi.git
synced 2026-08-08 19:30:15 +02:00
[2025-08-24 21:05:00] PLAN 4 - Nick Column expandos z kontekstem sygnałów
This commit is contained in:
parent
4032558538
commit
29af03ad78
1 changed files with 202 additions and 0 deletions
202
plan4.md
Normal file
202
plan4.md
Normal file
|
|
@ -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 `<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!**
|
||||
Loading…
Add table
Add a link
Reference in a new issue