[2025-08-24 15:27:35] Inicjalizacja pracy z augment code po oczyszczeniu repo

This commit is contained in:
kofany 2025-08-24 15:27:35 +02:00
commit 4f8ef0ccb7
6 changed files with 860 additions and 27 deletions

View file

@ -0,0 +1,191 @@
---
type: "always_apply"
---
# irssip - Informacje Krytyczne dla Rozwoju I Implementacji
## Zasady Separacji od Systemowego irssi
Nie używamy nazwy binarnej `irssi` ani standardowych folderów, w których instaluje się oryginalne irssi. Nie używamy również `~/.irssi` jako katalogu domowego. Wszystko po to, by rozwój nie kolidował z systemowym irssi i jego bibliotekami (używamy nowszej wersji niż pakiet zainstalowany).
### Konwencje Nazewnictwa
Plik binarny oraz podstawowa nazwa dla używanych katalogów to **irssip** (od irssi panels):
- Plik binarny: `irssip`
- Katalog instalacji: `/opt/irssip`
- Katalog domowy: `~/.irssip`
### Konfiguracja Środowiska Deweloperskiego
Dla przyspieszenia i ułatwienia testów na żywo, pliki config i default.theme w rzeczywistości znajdują się w naszym workspace:
```bash
ls -la /Users/kfn/.irssip/config
lrwxr-xr-x 1 kfn staff 27 Aug 23 22:13 /Users/kfn/.irssip/config -> /Users/kfn/irssi/config_dev
ls -la /Users/kfn/.irssip/default.theme
lrwxr-xr-x 1 kfn staff 37 Aug 23 02:59 /Users/kfn/.irssip/default.theme -> /Users/kfn/irssi/themes/default.theme
```
## Filozofia Rozwoju
### Zasady KISS (Keep It Simple Stupid)
- Wszelkie wprowadzane zmiany/funkcje mają oddawać ducha prostoty
- Implementacje nie mogą zmieniać działania istniejących mechanizmów
- Zachowanie wstecznej kompatybilności jest priorytetem
- Nowe funkcje powinny być opcjonalne - możliwe do wyłączenia w ustawieniach lub nieaktywne do czasu wywołania
### Proces Deweloperski
1. **Checkpointy**: Przed wprowadzaniem większych zmian zawsze robimy commit roboczy
2. **Testowanie**: Tylko ja testuję wprowadzone zmiany. Ty możesz testować Build lokalnie bez instalacji
3. **Budowanie**: Proces budowania do testów:
```bash
sudo rm -rf /opt/irssip && rm -rf $(pwd)/Build && \
meson setup $(pwd)/Build -Dprefix=/opt/irssip -Dwith-perl=yes -Dwith-proxy=yes && \
ninja -C Build && sudo ninja -C Build install
```
### Pliki Konfiguracyjne
W przypadku zmian wymagających modyfikacji plików config lub theme, edytujemy:
- `/Users/kfn/irssi/config_dev`
- `/Users/kfn/irssi/themes/default.theme`
## Aktualne Zmiany względem Standardowego irssi
### 1. Natywna Obsługa Paneli Bocznych
- **Panel lewy**: Lista okien/kanałów/query z sortowaniem i obsługą myszy
- **Panel prawy**: Lista nicków (nicklist)
- **Cel**: Efekt podobny do WeeChat - łatwe przemieszczanie się po kanałach i query
- **Funkcjonalność**: Klik na element przenosi do okna lub otwiera nowe query
### 2. Modyfikacja Wyświetlania WHOIS
Wyświetlanie outputu komendy whois w aktualnie aktywnym oknie zamiast w oknie status czy sieci
## Aktualny Projekt: Wyrównanie Nicków w Oknie Czatu
### Cel Implementacji
Stała szerokość pola z nickiem osoby piszącej na kanale z wyrównaniem do prawej, aby uzyskać efekt jednej kolumny dla wszystkich wiadomości bez konieczności używania zewnętrznych skryptów jak nm2.
### Oczekiwany Efekt Wizualny
```
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 +iBot │ YouTube Tytuł: LIVE Gemini
22:14:22 LinkShor> │ Skrócony link dla yooz: https://tinyurl.com/yrqbfxeb
```
Alternatywny przykład z nawiasami kątowymi i skróceniem długiego nicka dodatkowy > informuje że to nie pełny nick:
```
21:36:06> < @kofany> bittersweets outstript
21:36:16> < @kofany> sarcomas oven's pebble's
21:37:46> <+testNick>> truncation's debarked Allie
21:37:56> <+testNick>> griming surtax's intermediary's
```
### Wymagania Techniczne
- Implementacja **musi** wspierać aktualne formatowanie linii w theme
- Zachowanie kompatybilności z istniejącymi motywami
- Możliwość konfiguracji szerokości pola wyświetlania nicka z formatowamiem.
- Obsługa długich nicków z obcinaniem i wskaźnikiem
## Dotychczasowe Próby Implementacji
[Tu następuje szczegółowa dokumentacja techniczna z poprzedniego dokumentu]
## Standardowe Formatowanie Wiadomości irssi
```
# Oryginalny format (bez wyrównania):
msgnick = "%K<%n$0$1-%K>%n %|";
ownmsgnick = "{msgnick $0 $1-}%g";
# Parametry: $0=tryb(mode) (@,+), $1=nick, wynik: <@nick> wiadomość
```
## Zmodyfikowane Pliki
### 1. `/src/core/special-vars.h`
- Dodano flagę `#define ALIGN_COMBINE_MODE 0x10`
- Rozszerzono system wyrównywania o obsługę kombinacji tryb+nick
### 2. `/src/core/special-vars.c`
- Zmodyfikowano `get_alignment_args()` aby parsować flagę '&': `*flags |= ALIGN_COMBINE_MODE`
- Zaimplementowano logikę kombinacji w `parse_special()`:
- Pobiera tryb z `arglist[2]` i nick z `arglist[0]`
- Oblicza dostępną przestrzeń: `total_width - mode_len - 2` (dla nawiasów)
- Wyrównuje do prawej z wypełnieniem: `" @nick"`
- Obcina długie nicki: `"@bardzodlu+"`
- Zwraca połączony string do przetworzenia przez motyw
### 3. `/themes/default.theme`
- Zaktualizowano komendy formatowania używając składni `$[~&12]0`:
```
own_msg = "{ownmsgnick $[~&12]0}$1";
pubmsg = "{pubmsgnick $[~&12]0}$1";
```
- Dodano obszerną dokumentację i komentarze dotyczące dostosowania kolorów
## Próby Implementacji
### Próba 1: Natywny Mechanizm $[]
Początkowo próbowano użyć standardowego wyrównania irssi: `$[-12]0` i `$[-12]1`
**Problem**: Natywne wyrównanie oddzielało tryb od nicka podczas wyrównywania:
```
Wynik: <@ kofany> # Tryb z lewej, nick wyrównany do prawej osobno
Wymagane: < @kofany> # Wszystko razem, wyrównane do prawej
```
### Próba 2: Rozszerzenie ALIGN_COMBINE_MODE
Rozszerzono `parse_special()` aby łączyć tryb+nick przed zastosowaniem wyrównania używając flagi `&`.
**Osiągnięcie**: Pomyślnie utworzono wyrównane do prawej połączone tryb+nick z odpowiednim wypełnieniem i obcięciem.
**Obecna Ściana**: Ograniczenie interpretacji kolorów w systemie motywów.
### Co Mamy Teraz przykład:
```themes
ownmsgnick = "{msgnick %B$0%N%g$1-%N}%g";
```
Z ALIGN_COMBINE_MODE, `$0` staje się połączonym stringiem `"@kofany"`, więc:
- `%B$0%N` koloruje całe `"@kofany"` na niebiesko
- `%g$1-%N` jest ignorowane (puste po połączeniu)
- **Wynik**: `< @kofany>` gdzie zarówno @ jak i nick są niebieskie
### Czego Potrzebujemy:
```
Oczekiwane: < @kofany> gdzie @ jest niebieski (%B) a nick jest zielony (%g)
```
### Główny Problem:
Po połączeniu tryb+nick w kodzie C, motyw otrzymuje jeden parametr zawierający `"@kofany"` jako pojedynczy string. Abstrakcje motywu nie mogą zastosować osobnych kolorów do części połączonego stringa - mogą tylko kolorować cały parametr.
## Wyzwanie Techniczne
Fundamentalny konflikt:
1. **Wymóg wyrównania w obecnej implementacji**: Tryb i nick muszą być połączone przed wyrównaniem aby osiągnąć `< @nick>` a nie `<@ nick>`
2. **Wymóg kolorów**: Tryb i nick potrzebują osobnego formatowania kolorów z abstrakcji motywu
3. **Obecne ograniczenie**: Po połączeniu w C, motyw widzi pojedynczy string i nie może zastosować osobnych kolorów
## AKTUALNE USTALENIA (2025-01-24)
### Analiza Flow Wiadomości
Przeprowadzono szczegółową analizę flow wiadomości w Irssi od otrzymania z serwera do wyświetlenia (dokumentacja w `msg_flow.md`). Zidentyfikowano fundamentalny problem z podejściem expandos.
### Problem z Expandos
Expandos nie mają dostępu do `arglist` z formatowania - są wywoływane globalnie bez kontekstu lokalnego formatowania. To powoduje, że zwracają puste stringi zamiast rzeczywistych wartości mode i nick.
### Rekomendowane Rozwiązanie
**Rozszerzenie systemu wyrównania w `parse_special`** zamiast expandos:
1. **Nowa składnia**: `$[~&nick_column]0` - wyrównanie z flagą nick_column
2. **Zachowuje osobne parametry** - mode ($0) i nick ($1) pozostają oddzielne dla kolorowania
3. **Zgodne z roadmapą Irssi** - "variable/dynamic expandos with arguments"
4. **Eleganckie kodowo** - rozszerza istniejący system zamiast go obchodzić
### Wymagania Implementacji
- Rozszerzyć `get_alignment_args()` o flagę `&nick_column`
- Dodać `ALIGN_NICK_COLUMN` do special-vars.h
- Implementować logikę kombinowania mode+nick przed wyrównaniem
- Zachować osobne parametry po wyrównaniu dla theme
- Ustawienia: `nick_column_enabled` i `nick_column_width`

5
.gitignore vendored
View file

@ -91,3 +91,8 @@ setup.cfg
*.egg-info
src/.DS_Store
.DS_Store
Build/
.cache
.cache/
build
build/

348
config_dev Normal file
View file

@ -0,0 +1,348 @@
servers = (
{ address = "irc.dal.net"; chatnet = "DALnet"; port = "6667"; },
{
address = "ssl.efnet.org";
chatnet = "EFNet";
port = "9999";
use_tls = "yes";
tls_verify = "no";
},
{
address = "irc.esper.net";
chatnet = "EsperNet";
port = "6697";
use_tls = "yes";
tls_verify = "yes";
},
{
address = "irc.libera.chat";
chatnet = "liberachat";
port = "6697";
use_tls = "yes";
tls_verify = "yes";
},
{
address = "irc.gamesurge.net";
chatnet = "GameSurge";
port = "6667";
},
{
address = "ssl.ircnet.ovh";
chatnet = "IRCnet";
port = "6697";
use_tls = "yes";
tls_verify = "yes";
},
{ address = "open.ircnet.net"; chatnet = "IRCnet"; port = "6667"; },
{
address = "irc.ircsource.net";
chatnet = "IRCSource";
port = "6667";
},
{ address = "irc.netfuze.net"; chatnet = "NetFuze"; port = "6667"; },
{
address = "irc.oftc.net";
chatnet = "OFTC";
port = "6697";
use_tls = "yes";
tls_verify = "yes";
},
{
address = "irc.quakenet.org";
chatnet = "QuakeNet";
port = "6667";
},
{
address = "irc.rizon.net";
chatnet = "Rizon";
port = "6697";
use_tls = "yes";
tls_verify = "yes";
},
{ address = "silc.silcnet.org"; chatnet = "SILC"; port = "706"; },
{
address = "irc.undernet.org";
chatnet = "Undernet";
port = "6667";
}
);
chatnets = {
DALnet = {
type = "IRC";
max_kicks = "4";
max_msgs = "20";
max_whois = "30";
};
EFNet = {
type = "IRC";
max_kicks = "1";
max_msgs = "4";
max_whois = "1";
};
EsperNet = {
type = "IRC";
max_kicks = "1";
max_msgs = "4";
max_whois = "1";
};
liberachat = {
type = "IRC";
max_kicks = "1";
max_msgs = "4";
max_whois = "1";
};
GameSurge = {
type = "IRC";
max_kicks = "1";
max_msgs = "1";
max_whois = "1";
};
IRCnet = {
type = "IRC";
max_kicks = "1";
max_msgs = "1";
max_whois = "1";
};
IRCSource = {
type = "IRC";
max_kicks = "1";
max_msgs = "4";
max_whois = "1";
};
NetFuze = {
type = "IRC";
max_kicks = "1";
max_msgs = "1";
max_whois = "1";
};
OFTC = { type = "IRC"; max_kicks = "1"; max_msgs = "1"; max_whois = "1"; };
QuakeNet = {
type = "IRC";
max_kicks = "1";
max_msgs = "1";
max_whois = "1";
};
Rizon = {
type = "IRC";
max_kicks = "1";
max_msgs = "1";
max_whois = "1";
};
SILC = { type = "SILC"; };
Undernet = {
type = "IRC";
max_kicks = "1";
max_msgs = "1";
max_whois = "1";
};
};
channels = (
{ name = "#lobby"; chatnet = "EsperNet"; autojoin = "No"; },
{ name = "#libera"; chatnet = "liberachat"; autojoin = "No"; },
{ name = "#irssi"; chatnet = "liberachat"; autojoin = "No"; },
{ name = "#gamesurge"; chatnet = "GameSurge"; autojoin = "No"; },
{ name = "#irssi"; chatnet = "IRCNet"; autojoin = "No"; },
{ name = "#ircsource"; chatnet = "IRCSource"; autojoin = "No"; },
{ name = "#netfuze"; chatnet = "NetFuze"; autojoin = "No"; },
{ name = "#oftc"; chatnet = "OFTC"; autojoin = "No"; },
{ name = "silc"; chatnet = "SILC"; autojoin = "No"; }
);
aliases = {
ATAG = "WINDOW SERVER";
ADDALLCHANS = "SCRIPT EXEC foreach my \\$channel (Irssi::channels()) { Irssi::command(\"CHANNEL ADD -auto \\$channel->{visible_name} \\$channel->{server}->{tag} \\$channel->{key}\")\\;}";
B = "BAN";
BACK = "AWAY";
BANS = "BAN";
BYE = "QUIT";
C = "CLEAR";
CALC = "EXEC - if command -v bc >/dev/null 2>&1\\; then printf '%s=' '$*'\\; echo '$*' | bc -l\\; else echo bc was not found\\; fi";
CHAT = "DCC CHAT";
CS = "QUOTE CS";
DATE = "TIME";
DEHIGHLIGHT = "DEHILIGHT";
DESCRIBE = "ACTION";
DHL = "DEHILIGHT";
EXEMPTLIST = "MODE $C +e";
EXIT = "QUIT";
GOTO = "SCROLLBACK GOTO";
HIGHLIGHT = "HILIGHT";
HL = "HILIGHT";
HOST = "USERHOST";
INVITELIST = "MODE $C +I";
J = "JOIN";
K = "KICK";
KB = "KICKBAN";
KN = "KNOCKOUT";
LAST = "LASTLOG";
LEAVE = "PART";
M = "MSG";
MS = "QUOTE MS";
MUB = "UNBAN *";
N = "NAMES";
NMSG = "^MSG";
NS = "QUOTE NS";
OS = "QUOTE OS";
P = "PART";
Q = "QUERY";
RESET = "SET -default";
RUN = "SCRIPT LOAD";
SAY = "MSG *";
SB = "SCROLLBACK";
SBAR = "STATUSBAR";
SHELP = "QUOTE HELP";
SIGNOFF = "QUIT";
SV = "MSG * Irssi $J ($V) - https://irssi.org";
T = "TOPIC";
UB = "UNBAN";
UMODE = "MODE $N";
UNSET = "SET -clear";
W = "WHO";
WC = "WINDOW CLOSE";
WG = "WINDOW GOTO";
WJOIN = "JOIN -window";
WI = "WHOIS";
WII = "WHOIS $0 $0";
WL = "WINDOW LIST";
WN = "WINDOW NEW HIDDEN";
WQUERY = "QUERY -window";
WW = "WHOWAS";
};
statusbar = {
items = {
barstart = "{sbstart}";
barend = "{sbend}";
topicbarstart = "{topicsbstart}";
topicbarend = "{topicsbend}";
time = "{sb %B$Z%n%W❱ %G⚡%n Connected: %G%W$tag%n %W>%B>%C> %WNexus %G<%B<%W<%W}";
user = "{sb %WU%wser ⇋ %B$cumode%w$N%W : ➜ %WS%wtatus {sbmode (%C+$usermode%n)}}";
window = "%W ➜ %n{sbmode %WC%whannel (%C+$M%n%W) %B ➜ %WW%window: %G$winref }{sbaway $A}%W %n";
window_empty = "{sb $winref{sbservertag $tag}}";
prompt = "%B⚡%N %k%B$itemname%k%N%C:%N ";
prompt_empty = "%k%B$winname%k%N ";
topic = "%WTopic%C:%W $topic";
topic_empty = " Irssi v$J - https://irssi.org";
lag = "{sb ⇉ %WL%wagging ⇋ %W: %R$0- }";
act = "{sb %WActive Windows%C: $0-}";
more = "%C-- %Wmore %C--";
};
default = {
window = {
type = "window";
placement = "bottom";
position = "0";
visible = "active";
items = {
barstart = { priority = "100"; };
time = { priority = "10"; };
more = { priority = "-1"; alignment = "right"; };
barend = { priority = "100"; alignment = "right"; };
};
disabled = "yes";
};
prompt = {
type = "root";
placement = "bottom";
position = "100";
visible = "active";
items = {
prompt = { priority = "-1"; };
prompt_empty = { priority = "-1"; };
input = { priority = "10"; };
};
};
topic = {
type = "root";
placement = "top";
position = "1";
visible = "always";
items = {
topicbarstart = { priority = "100"; };
topic = { };
topic_empty = { };
topicbarend = { priority = "100"; alignment = "right"; };
};
};
info1 = {
items = { user = { }; window = { }; };
position = "10";
placement = "bottom";
};
info2 = {
items = { time = { }; more = { }; act = { }; lag = { }; };
position = "0";
};
add = { disabled = "yes"; };
window1 = { disabled = "yes"; };
};
};
settings = {
core = {
nick = "irssip_user";
hostname = "0.0.0.0";
timestamp_format = "%H:%M:%S";
override_coredump_limit = "no";
resolve_prefer_ipv6 = "no";
server_reconnect_time = "300";
recode_out_default_charset = "utf8";
recode_autodetect_utf8 = "yes";
recode_fallback = "ISO-8859-2";
recode_transliterate = "yes";
recode = "yes";
real_name = "Irssip User";
user_name = "irssip";
};
"irc/core" = {
lag_check_time = "5s";
ctcp_version_reply = "";
skip_motd = "no";
lag_max_before_disconnect = "300";
cmds_max_at_once = "10";
};
"fe-common/core" = {
activity_hide_level = "KICK MODE TOPIC NICK QUIT CLIENTNOTICE CLIENTCRAP SNOTICE JOIN PART CRAP";
timestamps = "yes";
timestamp_level = "ALL";
hilight_color = "%M";
autolog = "yes";
autolog_path = "~/.irssip/logs/$tag/$0.log";
term_charset = "UTF-8";
use_status_window = "no";
hilight_nick_matches = "yes";
hilight_nick_matches_everywhere = "yes";
window_auto_change = "yes";
print_active_channel = "yes";
theme = "default.theme";
};
"fe-text" = {
lag_min_show = "1s";
scrollback_lines = "2000";
paste_verify_line_count = "2";
term_force_colors = "no";
colors = "yes";
actlist_sort = "refnum";
colors_ansi_24bit = "yes";
};
lookandfeel = {
sidepanel_left = "yes";
sidepanel_right = "yes";
sidepanel_left_width = "20";
sidepanel_right_width = "16";
sidepanel_debug = "no";
sidepanel_right_auto_hide = "yes";
};
"fe-common/irc" = { print_whois_rpl_in_active_window = "yes"; };
};
hilights = ( { text = ""; nick = "yes"; word = "yes"; } );
logs = { };
ignores = ( );
# Set default window name to Notices
windows = { 1 = { name = "Notices"; }; };

86
msg_flow.md Normal file
View file

@ -0,0 +1,86 @@
## ANALIZA KROK PO KROKU - FLOW WIADOMOŚCI W IRSSI
### 1. WIADOMOŚCI PRZYCHODZĄCE (od serwera do wyświetlenia)
#### Krok 1: Odbieranie z serwera
**Funkcja**: `irc_parse_incoming()` w `src/irc/core/irc.c:543`
- Czyta dane z socketu przez `net_sendbuffer_receive_line()`
- Emituje sygnał `"server incoming"` z surową linią
#### Krok 2: Parsowanie IRC
**Funkcja**: `irc_parse_incoming_line()` w `src/irc/core/irc.c:528`
- Parsuje prefix (nick, address, tags) przez `irc_parse_prefix()`
- Emituje sygnał `"server event tags"` z parsowanymi danymi
#### Krok 3: Rozpoznanie typu wiadomości
**Funkcja**: `irc_server_event()` w `src/irc/core/irc.c:370`
- Parsuje komendę IRC (PRIVMSG, JOIN, etc.)
- Emituje odpowiedni sygnał np. `"event privmsg"`
#### Krok 4: Konwersja na sygnały wiadomości
**Funkcja**: `event_privmsg()` w `src/fe-common/irc/fe-events.c:42`
- Dekoduje wiadomość przez `recode_in()`
- Rozróżnia kanał vs prywatna
- Emituje `"message public"` lub `"message private"`
#### Krok 5: Obsługa sygnału wiadomości
**Funkcja**: `sig_message_public()` w `src/fe-common/core/fe-messages.c:168`
- Znajduje kanał i nick record
- Pobiera nickmode przez `channel_get_nickmode()`
- Sprawdza highlight przez `hilight_match()`
- **WYWOŁUJE**: `printformat_module("fe-common/core", server, target, level, TXT_PUBMSG, nick, address, msg, nickmode)`
### 2. FORMATOWANIE I THEME
#### Krok 6: printformat_module
**Funkcja**: `printformat_module()` w `src/fe-common/core/printtext.c:101`
- Tworzy `TEXT_DEST_REC` przez `format_create_dest()`
- Wywołuje `printformat_module_dest_args()`
#### Krok 7: Emisja sygnału formatowania
**Funkcja**: `printformat_module_dest_charargs()` w `src/fe-common/core/printtext.c:64`
- Pobiera theme przez `window_get_theme()`
- **EMITUJE**: `signal_emit_id(signal_print_format, 5, theme, module, dest, formatnum, arglist)`
#### Krok 8: Obsługa sygnału formatowania
**Funkcja**: `sig_print_format()` w `src/fe-common/core/printtext.c:459`
- **WYWOŁUJE**: `format_get_text_theme_charargs(theme, module, dest, formatnum, arglist)`
#### Krok 9: Pobieranie tekstu z theme
**Funkcja**: `format_get_text_theme_charargs()` w `src/fe-common/core/formats.c:831`
- Znajduje moduł theme w `theme->modules`
- Pobiera expanded format: `text = module_theme->expanded_formats[formatnum]`
- **WYWOŁUJE**: `format_get_text_args(dest, text, args)`
#### Krok 10: Parsowanie expandos i zmiennych
**Funkcja**: `format_get_text_args()` w `src/fe-common/core/formats.c:737`
- Iteruje przez tekst formatujący
- Gdy napotka `$`, wywołuje `parse_special()`
#### Krok 11: Parsowanie expandos
**Funkcja**: `parse_special()` w `src/core/special-vars.c:425`
- Parsuje składnię `$[alignment]variable`
- **WYWOŁUJE**: `get_special_value()``get_variable()``get_long_variable_value()`
#### Krok 12: Wykonanie expando
**Funkcja**: `get_long_variable_value()` w `src/core/special-vars.c:95`
- **WYWOŁUJE**: `func = expando_find_long(key)`
- **WYWOŁUJE**: `return func(server, item, free_ret)` ← **TU SĄ NASZE EXPANDOS!**
### 3. WIADOMOŚCI WYCHODZĄCE (nasze wiadomości)
#### Krok 1: Input od użytkownika
**Funkcja**: Obsługa klawiatury w `src/fe-text/gui-readline.c`
- Przechwytuje Enter, wywołuje `signal_emit("send command", ...)`
#### Krok 2: Parsowanie komendy
**Funkcja**: `cmd_msg()` lub podobne w `src/irc/core/irc-commands.c`
- Wysyła PRIVMSG do serwera
- Emituje `"message own_public"` lub `"message own_private"`
#### Krok 3: Formatowanie własnej wiadomości
**Funkcja**: `sig_message_own_public()` w `src/fe-common/core/fe-messages.c:281`
- Pobiera nickmode przez `channel_get_nickmode(channel, server->nick)`
- **WYWOŁUJE**: `printformat_module("fe-common/core", server, target, level, TXT_OWN_MSG, server->nick, target, msg, nickmode)`
**Dalej flow jest identyczny jak dla wiadomości przychodzących od kroku 6.**

186
summary.md Normal file
View file

@ -0,0 +1,186 @@
# irssip - Informacje Krytyczne dla Rozwoju I Implementacji
## Zasady Separacji od Systemowego irssi
Nie używamy nazwy binarnej `irssi` ani standardowych folderów, w których instaluje się oryginalne irssi. Nie używamy również `~/.irssi` jako katalogu domowego. Wszystko po to, by rozwój nie kolidował z systemowym irssi i jego bibliotekami (używamy nowszej wersji niż pakiet zainstalowany).
### Konwencje Nazewnictwa
Plik binarny oraz podstawowa nazwa dla używanych katalogów to **irssip** (od irssi panels):
- Plik binarny: `irssip`
- Katalog instalacji: `/opt/irssip`
- Katalog domowy: `~/.irssip`
### Konfiguracja Środowiska Deweloperskiego
Dla przyspieszenia i ułatwienia testów na żywo, pliki config i default.theme w rzeczywistości znajdują się w naszym workspace:
```bash
ls -la /Users/kfn/.irssip/config
lrwxr-xr-x 1 kfn staff 27 Aug 23 22:13 /Users/kfn/.irssip/config -> /Users/kfn/irssi/config_dev
ls -la /Users/kfn/.irssip/default.theme
lrwxr-xr-x 1 kfn staff 37 Aug 23 02:59 /Users/kfn/.irssip/default.theme -> /Users/kfn/irssi/themes/default.theme
```
## Filozofia Rozwoju
### Zasady KISS (Keep It Simple Stupid)
- Wszelkie wprowadzane zmiany/funkcje mają oddawać ducha prostoty
- Implementacje nie mogą zmieniać działania istniejących mechanizmów
- Zachowanie wstecznej kompatybilności jest priorytetem
- Nowe funkcje powinny być opcjonalne - możliwe do wyłączenia w ustawieniach lub nieaktywne do czasu wywołania
### Proces Deweloperski
1. **Checkpointy**: Przed wprowadzaniem większych zmian zawsze robimy commit roboczy
2. **Testowanie**: Tylko ja testuję wprowadzone zmiany. Ty możesz testować Build lokalnie bez instalacji
3. **Budowanie**: Proces budowania do testów:
```bash
sudo rm -rf /opt/irssip && rm -rf $(pwd)/Build && \
meson setup $(pwd)/Build -Dprefix=/opt/irssip -Dwith-perl=yes -Dwith-proxy=yes && \
ninja -C Build && sudo ninja -C Build install
```
### Pliki Konfiguracyjne
W przypadku zmian wymagających modyfikacji plików config lub theme, edytujemy:
- `/Users/kfn/irssi/config_dev`
- `/Users/kfn/irssi/themes/default.theme`
## Aktualne Zmiany względem Standardowego irssi
### 1. Natywna Obsługa Paneli Bocznych
- **Panel lewy**: Lista okien/kanałów/query z sortowaniem i obsługą myszy
- **Panel prawy**: Lista nicków (nicklist)
- **Cel**: Efekt podobny do WeeChat - łatwe przemieszczanie się po kanałach i query
- **Funkcjonalność**: Klik na element przenosi do okna lub otwiera nowe query
### 2. Modyfikacja Wyświetlania WHOIS
Wyświetlanie outputu komendy whois w aktualnie aktywnym oknie zamiast w oknie status czy sieci
## Aktualny Projekt: Wyrównanie Nicków w Oknie Czatu
### Cel Implementacji
Stała szerokość pola z nickiem osoby piszącej na kanale z wyrównaniem do prawej, aby uzyskać efekt jednej kolumny dla wszystkich wiadomości bez konieczności używania zewnętrznych skryptów jak nm2.
### Oczekiwany Efekt Wizualny
```
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 +iBot │ YouTube Tytuł: LIVE Gemini
22:14:22 LinkShor> │ Skrócony link dla yooz: https://tinyurl.com/yrqbfxeb
```
Alternatywny przykład z nawiasami kątowymi i skróceniem długiego nicka dodatkowy > informuje że to nie pełny nick:
```
21:36:06> < @kofany> bittersweets outstript
21:36:16> < @kofany> sarcomas oven's pebble's
21:37:46> <+testNick>> truncation's debarked Allie
21:37:56> <+testNick>> griming surtax's intermediary's
```
### Wymagania Techniczne
- Implementacja **musi** wspierać aktualne formatowanie linii w theme
- Zachowanie kompatybilności z istniejącymi motywami
- Możliwość konfiguracji szerokości pola wyświetlania nicka z formatowamiem.
- Obsługa długich nicków z obcinaniem i wskaźnikiem
## Dotychczasowe Próby Implementacji
[Tu następuje szczegółowa dokumentacja techniczna z poprzedniego dokumentu]
## Standardowe Formatowanie Wiadomości irssi
```
# Oryginalny format (bez wyrównania):
msgnick = "%K<%n$0$1-%K>%n %|";
ownmsgnick = "{msgnick $0 $1-}%g";
# Parametry: $0=tryb(mode) (@,+), $1=nick, wynik: <@nick> wiadomość
```
## Zmodyfikowane Pliki
### 1. `/src/core/special-vars.h`
- Dodano flagę `#define ALIGN_COMBINE_MODE 0x10`
- Rozszerzono system wyrównywania o obsługę kombinacji tryb+nick
### 2. `/src/core/special-vars.c`
- Zmodyfikowano `get_alignment_args()` aby parsować flagę '&': `*flags |= ALIGN_COMBINE_MODE`
- Zaimplementowano logikę kombinacji w `parse_special()`:
- Pobiera tryb z `arglist[2]` i nick z `arglist[0]`
- Oblicza dostępną przestrzeń: `total_width - mode_len - 2` (dla nawiasów)
- Wyrównuje do prawej z wypełnieniem: `" @nick"`
- Obcina długie nicki: `"@bardzodlu+"`
- Zwraca połączony string do przetworzenia przez motyw
### 3. `/themes/default.theme`
- Zaktualizowano komendy formatowania używając składni `$[~&12]0`:
```
own_msg = "{ownmsgnick $[~&12]0}$1";
pubmsg = "{pubmsgnick $[~&12]0}$1";
```
- Dodano obszerną dokumentację i komentarze dotyczące dostosowania kolorów
## Próby Implementacji
### Próba 1: Natywny Mechanizm $[]
Początkowo próbowano użyć standardowego wyrównania irssi: `$[-12]0` i `$[-12]1`
**Problem**: Natywne wyrównanie oddzielało tryb od nicka podczas wyrównywania:
```
Wynik: <@ kofany> # Tryb z lewej, nick wyrównany do prawej osobno
Wymagane: < @kofany> # Wszystko razem, wyrównane do prawej
```
### Próba 2: Rozszerzenie ALIGN_COMBINE_MODE
Rozszerzono `parse_special()` aby łączyć tryb+nick przed zastosowaniem wyrównania używając flagi `&`.
**Osiągnięcie**: Pomyślnie utworzono wyrównane do prawej połączone tryb+nick z odpowiednim wypełnieniem i obcięciem.
**Obecna Ściana**: Ograniczenie interpretacji kolorów w systemie motywów.
### Co Mamy Teraz przykład:
```themes
ownmsgnick = "{msgnick %B$0%N%g$1-%N}%g";
```
Z ALIGN_COMBINE_MODE, `$0` staje się połączonym stringiem `"@kofany"`, więc:
- `%B$0%N` koloruje całe `"@kofany"` na niebiesko
- `%g$1-%N` jest ignorowane (puste po połączeniu)
- **Wynik**: `< @kofany>` gdzie zarówno @ jak i nick są niebieskie
### Czego Potrzebujemy:
```
Oczekiwane: < @kofany> gdzie @ jest niebieski (%B) a nick jest zielony (%g)
```
### Główny Problem:
Po połączeniu tryb+nick w kodzie C, motyw otrzymuje jeden parametr zawierający `"@kofany"` jako pojedynczy string. Abstrakcje motywu nie mogą zastosować osobnych kolorów do części połączonego stringa - mogą tylko kolorować cały parametr.
## Wyzwanie Techniczne
Fundamentalny konflikt:
1. **Wymóg wyrównania w obecnej implementacji**: Tryb i nick muszą być połączone przed wyrównaniem aby osiągnąć `< @nick>` a nie `<@ nick>`
2. **Wymóg kolorów**: Tryb i nick potrzebują osobnego formatowania kolorów z abstrakcji motywu
3. **Obecne ograniczenie**: Po połączeniu w C, motyw widzi pojedynczy string i nie może zastosować osobnych kolorów
## AKTUALNE USTALENIA (2025-01-24)
### Analiza Flow Wiadomości
Przeprowadzono szczegółową analizę flow wiadomości w Irssi od otrzymania z serwera do wyświetlenia (dokumentacja w `msg_flow.md`). Zidentyfikowano fundamentalny problem z podejściem expandos.
### Problem z Expandos
Expandos nie mają dostępu do `arglist` z formatowania - są wywoływane globalnie bez kontekstu lokalnego formatowania. To powoduje, że zwracają puste stringi zamiast rzeczywistych wartości mode i nick.
### Rekomendowane Rozwiązanie
**Rozszerzenie systemu wyrównania w `parse_special`** zamiast expandos:
1. **Nowa składnia**: `$[~&nick_column]0` - wyrównanie z flagą nick_column
2. **Zachowuje osobne parametry** - mode ($0) i nick ($1) pozostają oddzielne dla kolorowania
3. **Zgodne z roadmapą Irssi** - "variable/dynamic expandos with arguments"
4. **Eleganckie kodowo** - rozszerza istniejący system zamiast go obchodzić
### Wymagania Implementacji
- Rozszerzyć `get_alignment_args()` o flagę `&nick_column`
- Dodać `ALIGN_NICK_COLUMN` do special-vars.h
- Implementować logikę kombinowania mode+nick przed wyrównaniem
- Zachować osobne parametry po wyrównaniu dla theme
- Ustawienia: `nick_column_enabled` i `nick_column_width`

View file

@ -45,7 +45,6 @@
# at start, the normal behaviour of %n would occur. If you _really_ want
# to use the terminal's default color, use %N.
#############################################################################
# default foreground color (%N) - -1 is the "default terminal color"
default_color = "-1";
@ -66,7 +65,7 @@ abstracts = {
line_start = "%N";
# timestamp styling, nothing by default
timestamp = "%b$*%C%N";
timestamp = "%b$*%C>%N";
# any kind of text that needs hilighting, default is to bold
hilight = "%Y%_$*%_%N";
@ -112,14 +111,15 @@ abstracts = {
# ban/ban exception/invite list mask is printed
ban = "%c$*%n";
##
## messages
##
# the basic styling of how to print message, $0 = nick mode, $1 = nick
msgnick = "%K<%n$0$[10]1-%K>%n %|";
msgnick = "%K<%n$0$1-%K>%n %|";
# message from you is printed. "ownnick" specifies the styling of the
# message from you is printed. "msgownnick" specifies the styling of the
# nick ($0 part in msgnick) and "ownmsgnick" specifies the styling of the
# whole line.
@ -136,15 +136,15 @@ abstracts = {
# privmsgnick = "%K{msgnick %R$*%K}%n";
# $0 = nick mode, $1 = nick
ownmsgnick = "{msgnick $0 $[10]1-}";
ownmsgnick = "{msgnick $0 $1-}";
ownnick = "%_$*%n";
# public message in channel, $0 = nick mode, $1 = nick
pubmsgnick = "{msgnick $0 $[10]1-}";
pubmsgnick = "{msgnick $0 $1-}";
pubnick = "%N$*%n";
# public message in channel meant for me, $0 = nick mode, $1 = nick
pubmsgmenick = "{msgnick $0 $[10]1-}";
pubmsgmenick = "{msgnick $0 $1-}";
menick = "%Y$*%n";
# public highlighted message in channel
@ -167,6 +167,9 @@ abstracts = {
# private message in query
privmsgnick = "{msgnick %R$*%n}";
# channel name is printed with message
msgchannel = "%K:%c$*%n";
##
## Actions (/ME stuff)
##
@ -251,20 +254,20 @@ abstracts = {
# Statusbar background and styling elements
sb_background = "%K";
# Void black background
window_border = "%B%N";
window_border = "%B|%N";
# Electric blue cyberpunk border character
sb_topic_bg = "%B%W";
# Electric blue + white for topic
sb = "%B⚡%N $0-%B ⚬%N";
sb = " %c[%n$*%c]%n";
# Electric blue lightning + bullet
sbmode = "$0-";
sbmode = "(%c+%n$*)";
# Mode display
sbservertag = ":$0 %N(%Gchange with ^X%N)";
sbservertag = ":$0 (change with ^X)";
# Server tag with green hint
sbmore = " %R❰%r❰%k❰ %Nmore %k❱%r❱%R❱ ";
sbmore = " %R<%r<%k< %Nmore %k>%r>%R> ";
# Triple-layered more indicator
sblag = "%R%N %RLAG%N %w$0-%N seconds";
# Skull + lag in crimson red
sblag = "%R!%N %RLAG%N %w$0-%N seconds";
# Exclamation + lag in crimson red
sb_default_bg = "%K";
# Default void black background
sb_info1_bg = "%B";
@ -288,10 +291,7 @@ abstracts = {
prompt = "[$*] ";
sb = " %c[%n$*%c]%n";
sbmode = "(%c+%n$*)";
sbaway = " (%GzZzZ%n)";
sbservertag = ":$0 (change with ^X)";
sbnickmode = "$0";
# activity in statusbar
@ -306,35 +306,52 @@ abstracts = {
sb_act_hilight = "%g$*";
# Sky blue highlight with color
sb_act_hilight_color = "%b$0$1-%N";
};
formats = {
"fe-text" = {
"fe-common/core" = {
own_msg = "{ownmsgnick $2 {ownnick $0}}$1";
own_msg_channel = "{ownmsgnick $3 {ownnick $0}{msgchannel $1}}$2";
own_msg_private = "{ownprivmsg msg $0}$1";
own_msg_private_query = "{ownprivmsgnick {ownprivnick $2}}$1";
pubmsg_me = "{pubmsgmenick $2 {menick $0}}$1";
pubmsg_me_channel = "{pubmsgmenick $3 {menick $0}{msgchannel $1}}$2";
pubmsg_hilight = "{pubmsghinick $0 $3 $1}$2";
pubmsg_hilight_channel = "{pubmsghinick $0 $4 $1{msgchannel $2}}$3";
pubmsg = "{pubmsgnick $2 {pubnick $0}}$1";
pubmsg_channel = "{pubmsgnick $3 {pubnick $0}{msgchannel $1}}$2";
msg_private = "{privmsg $0 $1}$2";
msg_private_query = "{privmsgnick $0}$2";
};
"fe-text" = {
# === LEFT PANEL (Window List) ===
# Server headers - electric blue with power symbol (consistent with theme primary)
sidepanel_header = "%B⚡%B$0%N";
# Server headers - electric blue with asterisk symbol (consistent with theme primary)
sidepanel_header = "%B*%B$0%N";
# Normal items - steel gray (consistent with theme secondary text)
sidepanel_item = "%W %W$0%N";
# Selected items - neon green highlight (consistent with theme highlights)
sidepanel_item_selected = "%g%k❱ %g%k$0%N";
sidepanel_item_selected = "%g%k> %g%k$0%N";
# === ACTIVITY HIERARCHY (by priority) ===
# PRIORITY 4 (Highest): NICK MENTION - magenta alert (when your nick is mentioned on channel)
sidepanel_item_nick_mention = "%M⬢ %M$0%N";
sidepanel_item_nick_mention = "%M# %M$0%N";
# PRIORITY 4 (Highest): QUERY MESSAGE - magenta alert (new messages in query/private)
sidepanel_item_query_msg = "%M %M$0%N";
sidepanel_item_query_msg = "%M+ %M$0%N";
# PRIORITY 3: CHANNEL ACTIVITY - yellow warning (messages on channel without mention)
sidepanel_item_activity = "%y %y$0%N";
sidepanel_item_activity = "%y* %y$0%N";
# PRIORITY 1 (Lowest): EVENTS - green info (join/part/quit/nick changes)
sidepanel_item_events = "%G%N %G$0%N";
sidepanel_item_events = "%Go%N %G$0%N";
# PRIORITY 2: HIGHLIGHTS - red alert (keyword highlights, fallback)
sidepanel_item_highlight = "%R %R$0%N";
sidepanel_item_highlight = "%R! %R$0%N";
# New dual-parameter formats - status and nick separated for theme flexibility
# Operators - gold status symbol with steel nick (power users)
@ -345,5 +362,5 @@ formats = {
# Normal users - subtle gray for clean appearance
sidepanel_nick_normal_status = "%k$0%N%w$1%N";
};
};
};