There’s always a JOIN back to acknowledge the JOIN “request” from the client, if it succeeded (in TMI’s case, if the channel exists).
NICK justinfan1
:tmi.twitch.tv 001 justinfan1 :Welcome, GLHF!
:tmi.twitch.tv 002 justinfan1 :Your host is tmi.twitch.tv
:tmi.twitch.tv 003 justinfan1 :This server is rather new
:tmi.twitch.tv 004 justinfan1 :-
:tmi.twitch.tv 375 justinfan1 :-
:tmi.twitch.tv 372 justinfan1 :You are in a maze of twisty passages, all alike.
:tmi.twitch.tv 376 justinfan1 :>
JOIN #kearney401
:justinfan1!justinfan1@justinfan1.tmi.twitch.tv JOIN #kearney401
:justinfan1.tmi.twitch.tv 353 justinfan1 = #kearney401 :justinfan1
:justinfan1.tmi.twitch.tv 366 justinfan1 #kearney401 :End of /NAMES list
QUIT
Is what wireshark shows inline with your application’s output or my snippet above, @Ciaran_Kearney ?