improve IRC channel continuity and formatting

This commit is contained in:
Andy Dixon
2026-08-13 17:35:32 +01:00
parent 696661bfa9
commit 49064a845c
11 changed files with 601 additions and 42 deletions
+43 -1
View File
@@ -1466,6 +1466,15 @@ func (m *Manager) connectIRC(sess *Session, getSecret func(prompt string) (strin
nickServPass = password
}
autoJoinRooms := append([]string{}, ircConf.AutoJoinRooms...)
if m.store != nil && profile.ID != "" {
lastRooms, err := m.store.GetIRCLastRooms(profile.ID)
if err != nil {
return fmt.Errorf("loading remembered IRC rooms: %w", err)
}
autoJoinRooms = mergeIRCRooms(autoJoinRooms, lastRooms)
}
cfg := ircclient.Config{
Server: profile.Host,
Port: profile.Port,
@@ -1474,7 +1483,7 @@ func (m *Manager) connectIRC(sess *Session, getSecret func(prompt string) (strin
RealName: ircConf.RealName,
UseTLS: ircConf.UseTLS,
ServerPass: serverPass,
AutoJoinRooms: append([]string{}, ircConf.AutoJoinRooms...),
AutoJoinRooms: autoJoinRooms,
NickServIdentify: ircConf.NickServIdentify,
NickServAccount: ircConf.NickServAccount,
NickServPassword: nickServPass,
@@ -1490,6 +1499,19 @@ func (m *Manager) connectIRC(sess *Session, getSecret func(prompt string) (strin
SSHAgentAuth: ircConf.SSHAgentAuth,
SSHHostKeyCallback: m.hostKeyCallback(sess.Info.ID, models.HostKeyAsk),
}
if m.store != nil && profile.ID != "" {
profileID := profile.ID
cfg.OnRoomsChanged = func(rooms []string) {
if err := m.store.SaveIRCLastRooms(profileID, rooms); err != nil {
m.emitIRCEvent(sess.Info.ID, ircclient.Event{
Type: "system",
Target: ircclient.ServerTarget,
Text: "Could not remember open IRC rooms: " + err.Error(),
Timestamp: time.Now().UnixMilli(),
})
}
}
}
if cfg.User == "" {
cfg.User = ircConf.Nick
@@ -1554,6 +1576,26 @@ func (m *Manager) connectIRC(sess *Session, getSecret func(prompt string) (strin
return nil
}
func mergeIRCRooms(groups ...[]string) []string {
var rooms []string
seen := make(map[string]struct{})
for _, group := range groups {
for _, room := range group {
room = strings.TrimSpace(room)
if room == "" {
continue
}
key := strings.ToLower(room)
if _, exists := seen[key]; exists {
continue
}
seen[key] = struct{}{}
rooms = append(rooms, room)
}
}
return rooms
}
func (m *Manager) emitIRCEvent(sessionID string, event ircclient.Event) {
m.emitEvent("session:irc:event", map[string]interface{}{
"sessionID": sessionID,
+10
View File
@@ -102,6 +102,16 @@ func TestCreateTabName(t *testing.T) {
}
}
func TestMergeIRCRoomsPreservesConfiguredAndRememberedOrder(t *testing.T) {
got := mergeIRCRooms(
[]string{" #configured ", "#Shared"},
[]string{"#shared", "#last-session", "", "#CONFIGURED"},
)
if joined := strings.Join(got, ","); joined != "#configured,#Shared,#last-session" {
t.Fatalf("mergeIRCRooms() = %q, want configured rooms followed by new remembered rooms", joined)
}
}
// ---------------------------------------------------------------------------
// RenameSession on non-existent session
// ---------------------------------------------------------------------------