improve IRC channel continuity and formatting
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user