Clean up branch for pull request

This commit is contained in:
kofany 2025-08-27 15:00:41 +02:00
commit c3e321d6b5
8 changed files with 32 additions and 919 deletions

View file

@ -1,197 +0,0 @@
---
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
## HISTORIA PRÓB IMPLEMENTACJI
### PRÓBA 1: Parse Special + ALIGN_COMBINE_MODE (2025-01-24)
**Podejście**: Modyfikacja `parse_special()` z flagą `&` do łączenia mode+nick przed wyrównaniem.
**Problem**: Ograniczenie interpretacji kolorów - po połączeniu mode+nick w jeden string, theme nie może zastosować osobnych kolorów.
**Status**: ❌ Niepowodzenie
### PRÓBA 2: Expandos bez kontekstu (wcześniej)
**Podejście**: Tworzenie expandos `nick_with_mode`, `nick_padding` itp.
**Problem**: Expandos nie mają dostępu do `arglist` z formatowania - zwracają puste stringi.
**Status**: ❌ Niepowodzenie
### PRÓBA 3: Modyfikacja format_get_text_args (2025-01-24)
**Podejście**: Wstrzyknięcie dodatkowego parametru padding do `arglist` w `format_get_text_args()`.
**Problem**: Błędna analiza argumentów - myślałem że `$0=nick`, ale `$0=mode`, `$1=nick`. Przesuwanie argumentów psuło mapowanie.
**Status**: ❌ Niepowodzenie - fundamentalnie błędne założenia
### WNIOSKI Z NIEPOWODZEŃ:
1. **Modyfikacja argumentów formatowania jest ryzykowna** - łatwo zepsuć istniejące mapowanie
2. **Expandos bez kontekstu nie działają** - potrzebują dostępu do aktualnych danych message
3. **Analiza flow musi być dokładna** - błędne założenia prowadzą do niefunkcjonalnych rozwiązań
## AKTUALNE USTALENIA (2025-01-24)
### Rekomendowane Rozwiązanie: Expandos z kontekstem sygnałów
**INSPIRACJA**: Skrypt nm2.pl pokazuje właściwe podejście - expandos + sygnały + dynamiczne przepisywanie formatów.
**KLUCZOWA IDEA**:
Zamiast modyfikować argumenty, stworzyć expando który zwraca gotowy string z paddingiem, mode i nickiem.

View file

@ -1,3 +0,0 @@
# Don't index SpecStory auto-save files, but allow explicit context inclusion via @ references
.specstory/**

View file

@ -1,4 +0,0 @@
# SpecStory project identity file
/.project.json
# SpecStory explanation file
/.what-is-this.md

12
.vscode/settings.json vendored
View file

@ -1,12 +0,0 @@
{
"editor.codeLensFontFamily": "FiraCode Nerd Font Mono",
"editor.inlayHints.fontFamily": "FiraCode Nerd Font Mono",
"editor.inlineSuggest.fontFamily": "FiraCode Nerd Font Mono",
"debug.console.fontFamily": "FiraCode Nerd Font Mono",
"scm.inputFontFamily": "FiraCode Nerd Font Mono",
"terminal.integrated.fontFamily": "FiraCode Nerd Font Mono",
"notebook.markup.fontFamily": "FiraCode Nerd Font Mono",
"notebook.output.fontFamily": "FiraCode Nerd Font Mono",
"chat.editor.fontFamily": "FiraCode Nerd Font Mono",
"terminal.integrated.fontLigatures.enabled": true
}

32
GEMINI.md Normal file
View file

@ -0,0 +1,32 @@
## Project Overview
Irssi is a modular chat client written in C. It is primarily an IRC client, but also supports other protocols like ICB, SILC, XMPP, PSYC, and Quassel through third-party modules. It has a text-based user interface and is highly extensible with Perl scripts.
The project uses the Meson build system. The main dependencies are GLib, OpenSSL, and Perl.
## Building and Running
To build and run the project, you need to have Meson, Ninja, and the required dependencies installed.
**Building:**
```bash
meson Build
ninja -C Build
```
**Running:**
```bash
sudo ninja -C Build install
```
## Development Conventions
The project follows the GNU General Public License. The code style is not explicitly defined, but the existing code seems to follow a consistent style.
The project has a test suite in the `tests/` directory. To run the tests, you can use the following command:
```bash
ninja -C Build test
```

View file

@ -1,350 +0,0 @@
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 = "irssi_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 = "irssi User";
user_name = "irssi";
};
"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 = "~/.irssi/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";
nick_column_enabled = "yes";
nick_column_width = "10";
};
"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"; }; };

View file

@ -1,160 +0,0 @@
#!/bin/sh
# configure.sh - Inteligentny, przenośny skrypt konfiguracyjny dla irssi-dev
# --- Funkcje Pomocnicze ---
ask_yes_no() {
while true; do
printf "$1 [y/n]: "
read -r answer
case "$answer" in
[Yy]*) return 0 ;;
[Nn]*) return 1 ;;
*) printf "Proszę odpowiedzieć 'y' lub 'n'.\n" ;;
esac
done
}
cleanup_backups() {
printf "🧹 Czyszczenie plików tymczasowych (.bak)...
"
find . -name "*.bak" -type f -delete
}
# --- Krok 1: Wykrywanie OS i ustawianie domyślnych ścieżek ---
OS_TYPE=$(uname -s)
DEFAULT_SYSTEM_PREFIX="/usr/local"
DEFAULT_USER_PREFIX="$HOME/.local"
# --- Krok 2: Wykrywanie istniejącego irssi ---
printf "🔎 Sprawdzanie istniejącej instalacji irssi...\n"
EXISTING_IRSSI_BIN=$(command -v irssi)
EXISTING_IRSSI_DIR="$HOME/.irssi"
TARGET_NAME="irssi"
if [ -n "$EXISTING_IRSSI_BIN" ] || [ -d "$EXISTING_IRSSI_DIR" ]; then
printf "⚠️ Wykryto istniejącą instalację irssi!\n"
if [ -n "$EXISTING_IRSSI_BIN" ]; then
printf " - Plik binarny znaleziony w: %s\n" "$EXISTING_IRSSI_BIN"
fi
if [ -d "$EXISTING_IRSSI_DIR" ]; then
printf " - Katalog konfiguracyjny znaleziony w: %s\n" "$EXISTING_IRSSI_DIR"
fi
printf "\nMożesz zainstalować tę wersję jako główny program lub obok, pod inną nazwą.\n"
printf "1. Zastąp (zainstaluj jako 'irssi')\n"
printf "2. Zainstaluj obok (jako 'arssi')\n"
while true; do
printf "Wybierz opcję [1/2]: "
read -r choice
case "$choice" in
1)
printf "Wybrano instalację jako 'irssi'.\n"
printf "🚨 Pamiętaj, aby ręcznie odinstalować poprzednią wersję za pomocą menedżera pakietów, aby uniknąć konfliktów.\n"
if ! ask_yes_no "Kontynuować?"; then printf "Przerwano.\n"; exit 1; fi
TARGET_NAME="irssi"
break
;;
2)
printf "Wybrano instalację obok pod nazwą 'arssi'.\n"
TARGET_NAME="arssi"
break
;;
*)
printf "Nieprawidłowy wybór.\n"
;;
esac
done
fi
# --- Krok 3: Wybór typu instalacji (Systemowa vs. Użytkownika) ---
printf "\nWybierz typ instalacji:\n"
printf "1. Systemowa (dla wszystkich użytkowników, wymaga sudo, zalecane: %s)\n" "$DEFAULT_SYSTEM_PREFIX"
printf "2. Lokalna (tylko dla Ciebie, nie wymaga sudo, zalecane: %s)\n" "$DEFAULT_USER_PREFIX"
while true; do
printf "Wybierz opcję [1/2]: "
read -r choice
case "$choice" in
1)
INSTALL_PREFIX="$DEFAULT_SYSTEM_PREFIX"
SUDO_NEEDED="tak"
break
;;
2)
INSTALL_PREFIX="$DEFAULT_USER_PREFIX"
SUDO_NEEDED="nie"
break
;;
*)
printf "Nieprawidłowy wybór.\n"
;;
esac
done
# --- Krok 4: Dynamiczna zmiana nazwy (jeśli to konieczne) ---
MESON_OPTS=""
if [ "$TARGET_NAME" != "irssi" ]; then
printf "\n🔧 Konfiguruj
ę projektu do używania nazwy '%s'...
" "$TARGET_NAME"
MESON_OPTS="-Dpkgname=$TARGET_NAME"
# Zmiana nazwy binarnej w meson.build
sed -i.bak "s/executable('irssi'/executable('$TARGET_NAME'/" src/fe-text/meson.build
# Zmiana katalogu domowego w common.h
sed -i.bak "s|\"%s/.irssi\"|\"%s/.$TARGET_NAME\"|" src/common.h
# Zmiana ścieżek #include w całym kodzie
printf "Aktualizowanie ścieżek #include...
"
for ext in c h xs; do
find src tests -type f -name "*.$ext" -exec sed -i.bak "s|<irssi/|<$TARGET_NAME/|g" {} \;
done
printf "✅ Konfiguracja nazwy zakończona.\n"
fi
# --- Krok 5: Uruchomienie procesu budowania ---
BUILD_DIR="$(pwd)/Build"
printf "\n🛠 Przygotowywanie do budowania w katalogu: %s\n" "$BUILD_DIR"
printf "📦 Prefiks instalacji: %s\n" "$INSTALL_PREFIX"
if [ -d "$BUILD_DIR" ]; then
printf "Usuwanie istniejącego katalogu Build...
"
rm -rf "$BUILD_DIR"
fi
printf "\n⚙ Uruchamianie Meson...
"
if ! meson setup "$BUILD_DIR" -Dprefix="$INSTALL_PREFIX" -Dwith-perl=yes -Dwith-proxy=yes $MESON_OPTS; then
printf "❌ Błąd podczas konfiguracji Meson. Sprawdź logi powyżej.\n"
cleanup_backups
exit 1
fi
printf "\n🔨 Uruchamianie Ninja (kompilacja)...
"
if ! ninja -C "$BUILD_DIR"; then
printf "❌ Błąd podczas kompilacji. Sprawdź logi powyżej.\n"
cleanup_backups
exit 1
fi
# Czyszczenie po udanej kompilacji
cleanup_backups
printf "\n✨ Kompilacja zakończona sukcesem!\n"
printf "Aby zainstalować, uruchom następującą komendę:\n"
if [ "$SUDO_NEEDED" = "tak" ]; then
printf "sudo ninja -C %s install\n" "$BUILD_DIR"
else
printf "ninja -C %s install\n" "$BUILD_DIR"
printf "\nUpewnij się, że katalog '%s/bin' jest dodany do Twojej zmiennej środowiskowej PATH.\n" "$INSTALL_PREFIX"
fi
exit 0

View file

@ -1,193 +0,0 @@
# 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
## HISTORIA PRÓB IMPLEMENTACJI
### PRÓBA 1: Parse Special + ALIGN_COMBINE_MODE (2025-01-24)
**Podejście**: Modyfikacja `parse_special()` z flagą `&` do łączenia mode+nick przed wyrównaniem.
**Problem**: Ograniczenie interpretacji kolorów - po połączeniu mode+nick w jeden string, theme nie może zastosować osobnych kolorów.
**Status**: ❌ Niepowodzenie
### PRÓBA 2: Expandos bez kontekstu (wcześniej)
**Podejście**: Tworzenie expandos `nick_with_mode`, `nick_padding` itp.
**Problem**: Expandos nie mają dostępu do `arglist` z formatowania - zwracają puste stringi.
**Status**: ❌ Niepowodzenie
### PRÓBA 3: Modyfikacja format_get_text_args (2025-01-24)
**Podejście**: Wstrzyknięcie dodatkowego parametru padding do `arglist` w `format_get_text_args()`.
**Problem**: Błędna analiza argumentów - myślałem że `$0=nick`, ale `$0=mode`, `$1=nick`. Przesuwanie argumentów psuło mapowanie.
**Status**: ❌ Niepowodzenie - fundamentalnie błędne założenia
### WNIOSKI Z NIEPOWODZEŃ:
1. **Modyfikacja argumentów formatowania jest ryzykowna** - łatwo zepsuć istniejące mapowanie
2. **Expandos bez kontekstu nie działają** - potrzebują dostępu do aktualnych danych message
3. **Analiza flow musi być dokładna** - błędne założenia prowadzą do niefunkcjonalnych rozwiązań
## AKTUALNE USTALENIA (2025-01-24)
### Rekomendowane Rozwiązanie: Expandos z kontekstem sygnałów
**INSPIRACJA**: Skrypt nm2.pl pokazuje właściwe podejście - expandos + sygnały + dynamiczne przepisywanie formatów.
**KLUCZOWA IDEA**:
Zamiast modyfikować argumenty, stworzyć expando który zwraca gotowy string z paddingiem, mode i nickiem.