diff --git a/client.go b/client.go index f03abb7..7931540 100644 --- a/client.go +++ b/client.go @@ -17,8 +17,9 @@ type Client struct { conn net.Conn currentChannel string - currentChannels []string channelMembers map[string][]string + currentChannels []string + chatHistory map[string]string ignored map[string]bool handlers map[string]func(Message) @@ -30,6 +31,7 @@ func NewClient(nick, user, server string, port int, ui UI) *Client { client := &Client{nick: nick, user: user, server: server, port: port, ui: ui} client.ignored = map[string]bool{} client.channelMembers = map[string][]string{} + client.chatHistory = map[string]string{} client.handlers = map[string]func(Message){ "NOTICE": client.handleNotice, "PING": client.handlePing, @@ -81,6 +83,14 @@ func (client *Client) print(format string, args ...any) { fmt.Fprintf(client.ui.Chat, format, args...) } +func (client *Client) printChannel(channel string, format string, args ...any) { + text := fmt.Sprintf(format, args...) + client.chatHistory[channel] += text + if channel == client.currentChannel { + client.print(format, args) + } +} + func (client *Client) readLoop() { scanner := bufio.NewScanner(client.conn) diff --git a/main.go b/main.go index 08c11a8..dc2f058 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "log" "net" @@ -15,6 +16,26 @@ func main() { ui := initUI() client := NewClient(config.Nick, config.User, config.Server, config.Port, ui) + client.ui.Channels.SetSelectedFunc(func(index int, mainText string, secondaryText string, shortcut rune) { + client.currentChannel = mainText + client.ui.Chat.SetTitle(mainText) + client.refreshNames() + client.ui.Chat.Clear() + fmt.Fprintf(client.ui.Chat, client.chatHistory[mainText]) + client.ui.App.SetFocus(client.ui.Input) + }) + + client.ui.App.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + if event.Key() == tcell.KeyTab { + if client.ui.App.GetFocus() == client.ui.Input { + client.ui.App.SetFocus(client.ui.Channels) + } else { + client.ui.App.SetFocus(client.ui.Input) + } + return nil + } + return event + }) client.ui.Input.SetDoneFunc(func(key tcell.Key) { if key != tcell.KeyEnter { return diff --git a/server_handlers.go b/server_handlers.go index 3e11ab3..f4666f6 100644 --- a/server_handlers.go +++ b/server_handlers.go @@ -71,11 +71,12 @@ func (client *Client) handlePrivmsg(msg Message) { } nick := msg.Nick() + channel := msg.parameters[0] text := msg.parameters[1] if strings.HasPrefix(text, "\x01ACTION ") && strings.HasSuffix(text, "\x01") { - client.print("* %s %s\n", nick, text[8:len(text)-1]) + client.printChannel(channel, "* %s %s\n", nick, text[8:len(text)-1]) } else { - client.print("<%s> %s\n", nick, text) + client.printChannel(channel, "<%s> %s\n", nick, text) } } @@ -92,7 +93,7 @@ func (client *Client) handleJoin(msg Message) { client.ui.Channels.AddItem(channel, "", 0, nil) client.channelMembers[channel] = nil } else { - client.print("%s joined %s\n", nick, channel) + client.printChannel(channel, "%s joined %s\n", nick, channel) client.channelMembers[channel] = append(client.channelMembers[channel], nick) } client.refreshNames() @@ -116,7 +117,7 @@ func (client *Client) handlePart(msg Message) { client.ui.Channels.RemoveItem(indices[0]) } } else { - client.print("%s left %s\n", nick, channel) + client.printChannel(channel, "%s left %s\n", nick, channel) client.channelMembers[channel] = slices.DeleteFunc(client.channelMembers[channel], func(s string) bool { return s == nick }) @@ -134,15 +135,15 @@ func (client *Client) handleQuit(msg Message) { if nick == client.nick { client.print("you quit\n") } else { - client.print("%s quit\n", nick) + client.printChannel(client.currentChannel, "%s quit\n", nick) } } else { text := msg.parameters[0] quitReason := strings.TrimPrefix(text, "Quit: ") if nick == client.nick { - client.print("you quit: %s\n", quitReason) + client.printChannel(client.currentChannel, "you quit: %s\n", quitReason) } else { - client.print("%s quit: %s\n", nick, quitReason) + client.printChannel(client.currentChannel, "%s quit: %s\n", nick, quitReason) for channel := range client.channelMembers { client.channelMembers[channel] = slices.DeleteFunc(client.channelMembers[channel], func(s string) bool { return s == nick @@ -161,6 +162,6 @@ func (client *Client) handleNick(msg Message) { } else { oldNick := msg.Nick() newNick := msg.parameters[0] - client.print("%s is now known as %s\n", oldNick, newNick) + client.printChannel(client.currentChannel, "%s is now known as %s\n", oldNick, newNick) } }