Commits
Removed the compiled binary from version control and added it to
.gitignore, which was also missing its trailing newline.
NAMES replies are now staged in Channel.pending and swapped into members
on 366, so a reply spanning several 353 lines no longer duplicates
entries. Mode prefixes are stripped on insert; an opped user was stored
as "@bob" and never matched removeMember("bob"), so ops and voiced users
accumulated in the sidebar permanently. A 366 with nothing staged leaves
the existing list alone.
JOIN, PART and PRIVMSG read their target through msg.param rather than
indexing parameters[0] directly, where a malformed line from the server
took down the whole client. PRIVMSG also recognises the &, + and !
channel prefixes instead of assuming #.
QUIT without a reason now removes the member from every channel it
appears in. Only the with-reason path did this before, so anyone who
quit silently was left behind in the member list.
JOIN registers the channel before calling switchChannel, so the history
replay and member refresh no longer run against a missing map entry.
Nick() returns the whole prefix when there is no ", which is a valid
prefix form. Locally echoed messages carry a bare nick, so they rendered
as "<> text" and self-initiated DMs opened a blank sidebar entry.
connect() matches the connection type case-insensitively, errors on an
unknown value instead of leaving a nil conn for register() to
dereference, and builds its address with net.JoinHostPort. Corrected the
invalid JSON in the README config example.
Connection type is now read from config.json rather than assuming TLS,
so plaintext servers can be reached. Validate() rejects a missing value.
Moved the incoming-message goroutine to the end of NewClient. It was
started before client.handlers and client.commands were assigned, so it
could read those maps while main was still writing them.
Routed private messages to the buffer keyed by the correspondent rather
than the raw target, so DMs no longer land in the wrong window.
Printed unhandled commands via msg.String() with the trailing CRLF
stripped, and switched the history replay to Fprint.
Removed the compiled binary from version control and added it to
.gitignore, which was also missing its trailing newline.
NAMES replies are now staged in Channel.pending and swapped into members
on 366, so a reply spanning several 353 lines no longer duplicates
entries. Mode prefixes are stripped on insert; an opped user was stored
as "@bob" and never matched removeMember("bob"), so ops and voiced users
accumulated in the sidebar permanently. A 366 with nothing staged leaves
the existing list alone.
JOIN, PART and PRIVMSG read their target through msg.param rather than
indexing parameters[0] directly, where a malformed line from the server
took down the whole client. PRIVMSG also recognises the &, + and !
channel prefixes instead of assuming #.
QUIT without a reason now removes the member from every channel it
appears in. Only the with-reason path did this before, so anyone who
quit silently was left behind in the member list.
JOIN registers the channel before calling switchChannel, so the history
replay and member refresh no longer run against a missing map entry.
Nick() returns the whole prefix when there is no ", which is a valid
prefix form. Locally echoed messages carry a bare nick, so they rendered
as "<> text" and self-initiated DMs opened a blank sidebar entry.
connect() matches the connection type case-insensitively, errors on an
unknown value instead of leaving a nil conn for register() to
dereference, and builds its address with net.JoinHostPort. Corrected the
invalid JSON in the README config example.
Connection type is now read from config.json rather than assuming TLS,
so plaintext servers can be reached. Validate() rejects a missing value.
Moved the incoming-message goroutine to the end of NewClient. It was
started before client.handlers and client.commands were assigned, so it
could read those maps while main was still writing them.
Routed private messages to the buffer keyed by the correspondent rather
than the raw target, so DMs no longer land in the wrong window.
Printed unhandled commands via msg.String() with the trailing CRLF
stripped, and switched the history replay to Fprint.