private void OnJoin(ChannelBase channel, UserBase user) { channel.BroadcastInclusive(CMD, user, channel.Name); user.Names(channel); if (channel.Properties.ContainsKey("Topic")) { // Note: Shouldn't send RPL_NOTOPIC under any circumstances at this point. user.SendNumeric(Numerics.RPL_TOPIC, channel.Name, ":" + (string)channel.Properties["Topic"]); } if (channel.Users.Count < 2) { return; } string prefix = channel.GetPrefix(user); if (!string.IsNullOrEmpty(prefix)) { StringBuilder modes = new StringBuilder(prefix.Length + 1).Append('+'); StringBuilder args = new StringBuilder(prefix.Length * (user.Mask.Nickname.Length + 1)); foreach (char c in prefix) { char m; switch (c) { case '$': m = 'X'; break; case '~': m = 'O'; break; case '&': m = 'a'; break; case '@': m = 'o'; break; case '%': m = 'h'; break; case '+': m = 'v'; break; case '!': m = 'x'; break; default: continue; } modes.Append(m); args.Append(' ').Append(user.Mask.Nickname); } channel.BroadcastInclusive("MODE", null, channel.Name, modes.ToString() + args.ToString()); } }