// TODO: IRC library needs... some improvements. public async void OnIrcEventAsync(MessageData data, IrcClient client) { var responses = new List <string>(); var settings = new Settings(); if (data.Verb == ReplyCode.RPL_ENDOFMOTD || data.Verb == ReplyCode.RPL_NOMOTD) // motd end or motd missing { foreach (string channel in this.Config.Irc.Servers.Where(s => s.Host == client.Id).First().Channels) { serverData[client.Host].Channels[channel.ToLowerInvariant()] = new ChannelData(); client.Command("JOIN", channel, string.Empty); } } if (data.Verb == "PRIVMSG") { string query = string.Empty; var props = new Dictionary <string, string> { { "server", client.Host.ToLowerInvariant() }, { "channel", data.Target.ToLowerInvariant() }, }; this.TrackEvent("messageReceived", props); // TODO: put this in config // twitch parses "." prefix as internal commands; so we have to remap it :( if (client.Host == "irc.chat.twitch.tv") { settings.Prefix = "^"; } var messageData = BotMessageData.Create(data, client, settings); await this.PreProcessMessage(messageData, settings); responses.AddRange((await this.ProcessMessageAsync(messageData, settings)).Responses); foreach (string response in responses) { client.Command("PRIVMSG", data.Target, response); this.TrackEvent("messageSent", props); } } // TODO: This stuff should be handled by the IRC library... else if (data.Verb == "353") { var namesMatch = namesRegex.Match(data.Text); var channel = namesMatch.Groups[1].ToString().ToLowerInvariant(); var userList = namesMatch.Groups[2].ToString(); var users = userList.Split(new[] { ' ' }); if (!serverData[client.Host].Channels.ContainsKey(channel)) { this.serverData[client.Host].Channels[channel] = new ChannelData(); } this.serverData[client.Host].Channels[channel].Users = new HashSet <string>(users); } }