/// <summary> /// Sends the message to the associated server. /// </summary> /// <param name="sender">The source tab page.</param> /// <param name="message">The message to send.</param> public void Send(IRCTabPage sender, Message message) { message = MessageFactory.AssimilateMessage(message); if (this.Connection.IsConnected) { if ((message is PrivMsgMessage) || (message is NoticeMessage)) { IRCTabPage tabPage = null; string source = this.Connection.Nickname; if (message is PrivMsgMessage) { IRCChannel channel = this.Channels.Find(i => i.Name.Equals(message.Target, StringComparison.OrdinalIgnoreCase)); if (channel == null) { channel = this.CreateChannel(message.Target, true); } tabPage = channel.TabPage; } else { source = string.Format("to({0})", message.Target); tabPage = sender; } tabPage.AppendMessage(message.Command, source, message.Content, message.Type); } else if (message is JoinMessage) { IRCChannel channel = this.Channels.Find(i => i.Name.Equals(message.Parameters[0], StringComparison.OrdinalIgnoreCase)); if (channel == null) { channel = this.CreateChannel(message.Parameters[0], true); } else { // If we're already in the channel, just switch tabs. this.TabHost.InvokeAction(() => this.TabHost.SelectedTab = channel.TabPage); } } else if (message is NickMessage) { this.previousNickName = this.connection.Nickname; this.connection.Nickname = (message as NickMessage).NewNickname; } if (message is QuitMessage) { this.disconnecting = true; } this.Connection.Send(message.ToString()); } if (message is QuitMessage) { this.Dispose(); } }
/// <summary> /// Handles the DataReceived event of Yaircc.Net.IRC.Connection. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The event arguments.</param> private void DataReceived(object sender, DataReceivedEventArgs e) { Message message = MessageFactory.AssimilateMessage(Message.ParseMessage(e.Data)); message.AssociatedConnection = this.connection; lock (this.messageQueue) { this.messageQueue.Enqueue(message); this.queueResetEvent.Set(); } }
/// <summary> /// Process a message that contains a text based command. /// </summary> /// <param name="message">The message to process.</param> private void ProcessMessage(Message message) { message = MessageFactory.AssimilateMessage(message); string target = message.Target.Equals(this.Connection.Nickname, StringComparison.OrdinalIgnoreCase) ? message.Source : message.Target; if (message.MustBeHandledByTarget) { IRCChannel channel = this.Channels.Find(i => i.Name.Equals(target, StringComparison.OrdinalIgnoreCase)); if (channel == null) { channel = this.CreateChannel(target, false); } channel.HandleMessage(message); } else if (message.IsMultiChannelMessage) { for (int i = 0; i < this.Channels.Count; i++) { this.Channels[i].HandleMessage(message); } } else if (message.IsGlobalMessage) { this.Channels.ForEach(i => i.HandleMessage(message)); this.ServerTab.AppendMessage(message.Command, message.Source, message.Content, message.Type); } else { // If the message can be handled by both the server tab // and a channel tab, then we need to check if the currently // focused tab is a channel and if so handle it in the channel. // Otherwise we can just print it in the server tab this.TabHost.InvokeAction(() => { if (this.TabHost.SelectedTab is IRCTabPage) { IRCChannel channel = this.Channels.Find(i => i.TabPage.Equals(this.TabHost.SelectedTab)); if ((channel != null) && (!this.AwaitingModeMessage)) { channel.HandleMessage(message); } else { this.ServerTab.AppendMessage(message.Command, message.Source, message.Content, message.Type); } } }); } // If we are still awaiting the MODE message (i.e. we are awaiting confirmation we have finished connecting) // then also re-join any channels that we have in the Channels collection (i.e. reconnect to any channels) if (this.AwaitingModeMessage && message is ModeMessage) { this.AwaitingModeMessage = false; this.Send(this.ServerTab, new ModeMessage(new string[] { this.Connection.Nickname, this.Connection.Mode })); // Send the user host message so we can determine the full user host string. this.Send(this.ServerTab, new UserHostMessage(new string[] { this.connection.Nickname })); } }