Added:
trunk/Client/Objects.cs
trunk/Client/Servername.cs
Modified:
trunk/Client/Channel.cs
trunk/Client/Client.cs
trunk/Client/Client.csproj
trunk/Client/Events.cs
trunk/Client/Mode.cs
trunk/Client/ModeMap.cs
trunk/Client/Nickname.cs
trunk/Client/Properties/AssemblyInfo.cs
trunk/Frontend/ChannelTab.cs
trunk/Frontend/ChatTextBox.cs
trunk/Frontend/CommandManager.cs
trunk/Frontend/Connect.Designer.cs
trunk/Frontend/Main.Designer.cs
trunk/Frontend/Main.cs
trunk/Frontend/Main.resx
trunk/Frontend/MessageTab.cs
trunk/Frontend/Network.Designer.cs
trunk/Frontend/Network.cs
trunk/Frontend/Network.resx
trunk/Frontend/ServerTab.cs
trunk/Frontend/Strings.Designer.cs
Log:
MASSIVE changes everywhere. Most current plugins have to be rewritten, because the core framework changed again. Now, all events are objects, and have their own parameters. Most of the EventArgs classes now only contain a single object: the event that occurred. Determining join or part, mode addition or subtraction, and a few other things are now done by checking the type of the object. A UserJoin is a join, a UserPart is a part, and so on.
The ChatTextBox class is mostly feature-complete. It properly bolds, changes colors, underlines, reverses, and undoes settings. It is fairly well stress-tested, but much of the rest of the client is not. It's going to take me a lot of work to make everything thread-safe, since I still have a lot of checking to do in various places.
The client is almost in usable state! Yay!
Modified: trunk/Client/Channel.cs
==============================================================================
--- trunk/Client/Channel.cs (original)
+++ trunk/Client/Channel.cs Sun Aug 12 02:36:41 2007
@@ -1,15 +1,11 @@
using System;
using System.Collections.ObjectModel;
using System.Collections.Generic;
+using Irc.Objects;
+using Irc.Events;
namespace Irc
{
- public enum ChannelType
- {
- Public,
- Private,
- ServerOnly
- }
[CLSCompliant(true)]
public class Channel : Target
{
@@ -19,47 +15,76 @@
invitelist = new List<Nickname>(),
exceptlist = new List<Nickname>();
private ModeCollection modes = new ModeCollection();
- private string topic = String.Empty;
+ private Topic topic;
private string key = String.Empty;
private int limit = Int32.MaxValue;
- private DateTime lastSet = DateTime.MinValue;
- private Nickname topicSetter = new Nickname("*");
private Client owner = null;
public string Name {
+ internal set { name = value; }
get { return name; }
}
- public string Topic {
+ public Topic Topic {
+ internal set { topic = value; }
get { return topic; }
}
public string Key {
+ internal set { key = value; }
get { return key; }
}
public int Limit {
+ internal set { limit = value; }
get { return limit; }
}
- public DateTime TopicSetTime {
- get { return lastSet; }
- }
- public Nickname TopicSetter {
- get { return topicSetter; }
- }
public ModeCollection Mode {
get { return modes; }
}
public Collection<Nickname> Nicknames {
get { return new Collection<Nickname>(nicknames); }
+ internal set
+ {
+ lock(nicknames)
+ {
+ nicknames.Clear();
+ nicknames.AddRange(value);
+ }
+ }
}
public Collection<Nickname> BanList {
get { return new Collection<Nickname>(banlist); }
+ internal set
+ {
+ lock(banlist)
+ {
+ banlist.Clear();
+ banlist.AddRange(value);
+ }
+ }
}
public Collection<Nickname> InviteList {
get { return new Collection<Nickname>(invitelist); }
+ internal set
+ {
+ lock(invitelist)
+ {
+ invitelist.Clear();
+ invitelist.AddRange(value);
+ }
+ }
}
public Collection<Nickname> ExceptionList {
get { return new Collection<Nickname>(exceptlist); }
+ internal set
+ {
+ lock(exceptlist)
+ {
+ exceptlist.Clear();
+ exceptlist.AddRange(value);
+ }
+ }
}
public Client Owner {
+ internal set { owner = value; }
get { return owner; }
}
@@ -77,47 +102,38 @@
this.owner = owner;
this.name = name;
}
- internal void AddModeChange(Nickname sender, Mode mode, ModeOperation op)
+ internal void AddModeChange(IModeMessage message)
{
- if(op == ModeOperation.Add)
- this.modes += mode;
- else if(op == ModeOperation.Remove)
- this.modes -= mode;
- if(mode.ModeType == ModeName.Limit)
- limit = ((IntMode)mode).Parameter;
- if(mode.ModeType == ModeName.Key)
- key = ((StringMode)mode).Parameter;
+ if(message is IModeAdd)
+ this.modes += message.Mode;
+ else if(message is IModeRemove)
+ this.modes -= message.Mode;
+ if(message.Mode.ModeType == ModeName.Limit)
+ limit = ((IntMode)message.Mode).Parameter;
+ if(message.Mode.ModeType == ModeName.Key)
+ key = ((StringMode)message.Mode).Parameter;
ModeEventArgs e = new ModeEventArgs();
- e.Mode = mode;
- e.Sender = sender;
- e.Operation = op;
+ e.Mode = message;
if(ModeChange != null)
ModeChange(this, e);
}
- internal void AddJoin(Nickname sender, JoinMode mode)
+ internal void AddJoin(UserMove movement)
{
- if(JoinMode.Join == mode)
- Nicknames.Add(sender);
- else if(JoinMode.Part == mode)
- Nicknames.Remove(sender);
+ if(movement is UserJoin)
+ Nicknames.Add(movement.User);
+ else if(movement is UserPart)
+ Nicknames.Remove(movement.User);
nicknames.Sort();
JoinEventArgs e = new JoinEventArgs();
- e.Channel = this;
- e.User = sender;
- e.Mode = mode;
+ e.Movement = movement;
if(Join != null)
Join(this, e);
}
- internal void AddTopic(Nickname sender, string topic, DateTime time)
+ internal void AddTopic(Topic topic)
{
- lastSet = time;
- this.topic = topic;
- topicSetter = FindNick(sender.Name) == -1 ? null : nicknames[FindNick(sender.Name)];
+ Topic = topic;
TopicEventArgs e = new TopicEventArgs();
- e.Channel = this;
- e.NewTopic = topic;
- e.Sender = FindNick(sender.Name) == -1 ? sender : nicknames[FindNick(sender.Name)];
- e.Time = time;
+ e.Topic = topic;
if(TopicChange != null)
TopicChange(this, e);
}
@@ -135,40 +151,31 @@
NickChange(this, e);
}
}
- internal void OnPublicMessage(Nickname sender, string message)
+ internal void OnPublicMessage(PublicMessage message)
{
- ChannelMessageEventArgs e = new ChannelMessageEventArgs();
- e.Target = this;
+ MessageEventArgs e = new MessageEventArgs();
e.Message = message;
- e.Sender = FindNick(sender.Name) == -1 ? null : nicknames[FindNick(sender.Name)];
if(PublicMessage != null)
PublicMessage(this, e);
}
- internal void OnPublicNotice(Nickname sender, string message)
+ internal void OnPublicNotice(PublicNotice message)
{
- ChannelMessageEventArgs e = new ChannelMessageEventArgs();
- e.Target = this;
+ MessageEventArgs e = new MessageEventArgs();
e.Message = message;
- e.Sender = FindNick(sender.Name) == -1 ? null : nicknames[FindNick(sender.Name)];
if(PublicNotice != null)
PublicNotice(this, e);
}
- internal void OnPublicAction(Nickname sender, string message)
+ internal void OnPublicAction(PublicAction message)
{
- ChannelMessageEventArgs e = new ChannelMessageEventArgs();
- e.Target = this;
+ MessageEventArgs e = new MessageEventArgs();
e.Message = message;
- e.Sender = FindNick(sender.Name) == -1 ? null : nicknames[FindNick(sender.Name)];
if(PublicAction != null)
PublicAction(this, e);
}
- internal void OnJoinNicklist(Collection<Nickname> list)
+ internal void OnJoinNicklist(Nicklist nicklist)
{
- nicknames.AddRange(list);
NicklistEventArgs e = new NicklistEventArgs();
- e.Channel = this;
- foreach(Nickname entry in list)
- e.Nicklist.Add(entry);
+ e.Nicklist = nicklist;
if(Nicklist != null)
Nicklist(this, e);
}
@@ -178,47 +185,77 @@
}
public void Say(string message)
{
- Owner.Say(Name, message);
+ PublicMessage m = new PublicMessage();
+ m.Text = message;
+ m.Target = this;
+ Owner.Say(m);
}
public void Act(string message)
{
- Owner.Act(Name, message);
+ Message m = new Message();
+ m.Text = message;
+ m.Target = this;
+ Owner.Act(m);
}
public void Notice(string message)
{
- Owner.Notice(Name, message);
+ Message m = new Message();
+ m.Text = message;
+ m.Target = this;
+ Owner.Notice(m);
+ }
+ public void JoinThis()
+ {
+ if(Mode.Contains(ModeName.Key))
+ Owner.JoinChannel(Name, Key);
+ else
+ Owner.JoinChannel(Name);
}
public void Part()
{
- Owner.PartChannel(Name);
- }
- public void ChangeTopic(string topic)
- {
- Owner.ChangeTopic(Name, topic);
+ Owner.SendMessage(String.Format(System.Globalization.CultureInfo.CurrentCulture, Strings.PartMessage, Name));
}
public void Rejoin()
{
- string message = String.Empty;
- Owner.SendMessage(String.Format(System.Globalization.CultureInfo.CurrentCulture, Strings.PartMessage, name));
- if(HasMode(ModeName.Key)) message = Strings.JoinWithPassMessage;
- else message = Strings.JoinWithoutPassMessage;
- Owner.SendMessage(String.Format(System.Globalization.CultureInfo.CurrentCulture, message, Name, key));
- }
- public void SetMode(Mode mode)
- {
- ChangeMode(mode, ModeOperation.Add);
+ Part();
+ JoinThis();
}
- public void UnsetMode(Mode mode)
- {
- ChangeMode(mode, ModeOperation.Remove);
- }
- public void ChangeMode(Mode mode, ModeOperation op)
- {
- Owner.ChangeMode(mode, op);
- }
- public bool HasMode(ModeName mode)
+ public void ChangeTopic(string topic)
{
- return Mode.HasMode(mode);
+ Topic t = new Topic();
+ t.Text = topic;
+ t.Target = this;
+ Owner.ChangeTopic(t);
+ }
+ public void SetMode(ModeName mode, object parameter)
+ {
+ ChannelModeAdd message = new ChannelModeAdd();
+ if(parameter is String)
+ message.Mode = new StringMode(this, mode, ((string)parameter));
+ else if(parameter is Int32)
+ message.Mode = new IntMode(this, mode, ((int)parameter));
+ else if(parameter is Nickname)
+ message.Mode = new NicknameMode(this, mode, ((Nickname)parameter));
+ else if(parameter == null)
+ message.Mode = new Mode(this, mode);
+ message.Sender = Owner.Nickname;
+ message.Time = DateTime.Now;
+ Owner.ChangeMode(message);
+ }
+ public void UnsetMode(ModeName mode, object parameter)
+ {
+ ChannelModeRemove message = new ChannelModeRemove();
+ if(parameter is String)
+ message.Mode = new StringMode(this, mode, ((string)parameter));
+ else if(parameter is Int32)
+ message.Mode = new IntMode(this, mode, ((int)parameter));
+ else if(parameter is Nickname)
+ message.Mode = new NicknameMode(this, mode, ((Nickname)parameter));
+ else if(parameter == null)
+ message.Mode = new Mode(this, mode);
+ message.Sender = Owner.Nickname;
+ message.Time = DateTime.Now;
+ Owner.ChangeMode(message);
}
public override string ToString()
{
Modified: trunk/Client/Client.cs
==============================================================================
--- trunk/Client/Client.cs (original)
+++ trunk/Client/Client.cs Sun Aug 12 02:36:41 2007
@@ -9,37 +9,30 @@
using System.Collections.ObjectModel;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
+using Irc.Events;
+using Irc.Objects;
namespace Irc
{
[CLSCompliant(true)]
- public sealed class Client : IDisposable
+ public class Client : IDisposable
{
#region public attributes
- public string Server {
+ public Servername Server {
get { return server; }
- set { server = value; }
+ internal set { server = value; }
}
- public int Port {
- get { return port; }
- set { port = value; }
- }
- public string Nickname {
+ public Nickname Nickname {
get { return nickname; }
- set {
- Nickname temp = new Nickname(value, nickname.Realname, nickname.Hostmask);
- OnNickChange(nickname, temp);
- nickname = temp;
+ internal set
+ {
+ OnNickChange(nickname, value);
+ nickname = value;
}
}
- public bool Ssl {
- get { return ssl; }
- }
- public string Username {
- get { return username; }
- }
public string Password {
get { return password; }
+ internal set { password = value; }
}
public bool Debug {
get { return debug; }
@@ -48,7 +41,7 @@
public Dictionary<string,Channel> Channels {
get { return joinedChannels; }
}
- public string Motd {
+ public Motd Motd {
get { return motd; }
}
public bool Registered
@@ -75,7 +68,7 @@
public event EventHandler<MessageEventArgs> PrivateAction;
public event EventHandler<ServerEventArgs> ServerNotice;
public event EventHandler<PingEventArgs> Ping;
- public event EventHandler<DebugMessageEventArgs> DebugMessage;
+ public event EventHandler<MessageEventArgs> DebugMessage;
public event EventHandler<ConnectEventArgs> Connecting;
public event EventHandler<ConnectEventArgs> Connected;
public event EventHandler<ConnectEventArgs> Disconnecting;
@@ -84,53 +77,51 @@
public event EventHandler<CtcpEventArgs> CtcpMessage;
public event EventHandler<ServerEventArgs> ErrorMessage;
public event EventHandler<NicklistEventArgs> Nicklist;
-
- private void OnSelfJoin(Channel channel, JoinMode mode)
+ #endregion
+ #region event creators
+ protected void OnSelfJoin(UserMove movement)
{
JoinEventArgs e = new JoinEventArgs();
- e.Channel = channel;
- e.User = nickname;
- e.Mode = mode;
+ e.Movement = movement;
+ if(e.Movement.Time == DateTime.MinValue)
+ e.Movement.Time = DateTime.Now;
if(SelfJoin != null)
new Thread(delegate() { SelfJoin(this, e); }).Start();
}
- private void OnUserJoin(Channel channel, Nickname sender, JoinMode mode)
+ protected void OnUserJoin(UserMove movement)
{
JoinEventArgs e = new JoinEventArgs();
- e.Channel = channel;
- e.User = sender;
- e.Mode = mode;
+ e.Movement = movement;
+ if(e.Movement.Time == DateTime.MinValue)
+ e.Movement.Time = DateTime.Now;
if(UserJoin != null)
new Thread(delegate() { UserJoin(this, e); }).Start();
- new Thread(delegate(){channel.AddJoin(sender, mode);}).Start();
+ new Thread(delegate(){((Channel)e.Movement.Target).AddJoin(movement);}).Start();
}
- private void OnTopicChange(Channel channel, Nickname sender, string topic, DateTime time)
+ protected void OnTopicChange(Topic topic)
{
TopicEventArgs e = new TopicEventArgs();
- e.Channel = channel;
- e.Sender = sender;
- e.NewTopic = topic;
- e.Time = time;
+ e.Topic = topic;
if(TopicChange != null)
new Thread(delegate() { TopicChange(this, e); }).Start();
- new Thread(delegate(){channel.AddTopic(sender, topic, time);}).Start();
+ new Thread(delegate(){((Channel)topic.Target).AddTopic(topic);}).Start();
}
- private void OnModeChange(Nickname sender, Mode mode, ModeOperation op)
+ protected void OnModeChange(IModeMessage mode)
{
ModeEventArgs e = new ModeEventArgs();
- e.Sender = sender;
e.Mode = mode;
- e.Operation = op;
+ e.Mode.Time = DateTime.Now;
if(ModeChange != null)
new Thread(delegate() { ModeChange(this, e); }).Start();
- if(mode.Target is Channel)
- new Thread(delegate() { ((Channel)mode.Target).AddModeChange(sender, mode, op); }).Start();
+ if(mode.Mode.Target is Channel)
+ new Thread(delegate() { ((Channel)mode.Mode.Target).AddModeChange(mode); }).Start();
}
- private void OnNickChange(Nickname oldnick, Nickname newnick)
+ protected void OnNickChange(Nickname oldnick, Nickname newnick)
{
NickEventArgs e = new NickEventArgs();
e.OldNick = oldnick;
e.NewNick = newnick;
+ e.Time = DateTime.Now;
if(NickChange != null)
new Thread(delegate(){NickChange(this, e);}).Start();
foreach(KeyValuePair<string,Channel> c in Channels)
@@ -138,155 +129,158 @@
new Thread(delegate(){c.Value.ChangeNick(oldnick, newnick);}).Start();
}
}
- private void OnPublicMessage(Channel channel, Nickname sender, string message)
+ protected void OnPublicMessage(PublicMessage message)
{
- ChannelMessageEventArgs e = new ChannelMessageEventArgs();
- e.Target = channel;
- e.Sender = sender;
+ MessageEventArgs e = new MessageEventArgs();
e.Message = message;
+ if(e.Message.Time == DateTime.MinValue)
+ e.Message.Time = DateTime.Now;
if(PublicMessage != null)
new Thread(delegate(){PublicMessage(this, e);}).Start();
- new Thread(delegate(){channel.OnPublicMessage(sender, message);}).Start();
+ new Thread(delegate(){((Channel)message.Target).OnPublicMessage(message);}).Start();
}
- private void OnPublicNotice(Channel channel, Nickname sender, string message)
+ protected void OnPublicNotice(PublicNotice message)
{
- ChannelMessageEventArgs e = new ChannelMessageEventArgs();
- e.Target = channel;
- e.Sender = sender;
+ MessageEventArgs e = new MessageEventArgs();
e.Message = message;
+ if(e.Message.Time == DateTime.MinValue)
+ e.Message.Time = DateTime.Now;
if(PublicNotice != null)
new Thread(delegate(){PublicNotice(this, e);}).Start();
- new Thread(delegate(){channel.OnPublicNotice(sender, message);}).Start();
+ new Thread(delegate(){((Channel)message.Target).OnPublicNotice(message);}).Start();
}
- private void OnPublicAction(Channel channel, Nickname sender, string message)
+ protected void OnPublicAction(PublicAction message)
{
- ChannelMessageEventArgs e = new ChannelMessageEventArgs();
- e.Target = channel;
- e.Sender = sender;
+ MessageEventArgs e = new MessageEventArgs();
e.Message = message;
+ if(e.Message.Time == DateTime.MinValue)
+ e.Message.Time = DateTime.Now;
if(PublicAction != null)
new Thread(delegate(){PublicAction(this, e);}).Start();
- new Thread(delegate(){channel.OnPublicAction(sender, message);}).Start();
+ new Thread(delegate(){((Channel)message.Target).OnPublicAction(message);}).Start();
}
- private void OnPrivateMessage(Nickname sender, Nickname target, string message)
+ protected void OnPrivateMessage(PrivateMessage message)
{
- PrivateMessageEventArgs e = new PrivateMessageEventArgs();
- e.Sender = sender;
+ MessageEventArgs e = new MessageEventArgs();
e.Message = message;
- e.Target = target;
+ if(e.Message.Time == DateTime.MinValue)
+ e.Message.Time = DateTime.Now;
if(PrivateMessage != null)
new Thread(delegate(){PrivateMessage(this, e);}).Start();
}
- private void OnPrivateNotice(Nickname sender, Nickname target, string message)
+ protected void OnPrivateNotice(PrivateNotice message)
{
- PrivateMessageEventArgs e = new PrivateMessageEventArgs();
- e.Sender = sender;
+ MessageEventArgs e = new MessageEventArgs();
e.Message = message;
- e.Target = target;
+ if(e.Message.Time == DateTime.MinValue)
+ e.Message.Time = DateTime.Now;
if(PrivateNotice != null)
new Thread(delegate(){PrivateNotice(this, e);}).Start();
}
- private void OnPrivateAction(Nickname sender, Nickname target, string message)
+ protected void OnPrivateAction(PrivateAction message)
{
- PrivateMessageEventArgs e = new PrivateMessageEventArgs();
- e.Sender = sender;
+ MessageEventArgs e = new MessageEventArgs();
e.Message = message;
- e.Target = target;
+ if(e.Message.Time == DateTime.MinValue)
+ e.Message.Time = DateTime.Now;
if(PrivateAction != null)
new Thread(delegate(){PrivateAction(this, e);}).Start();
}
- private void OnServerNotice(string server, string message)
+ protected void OnServerNotice(ServerMessage message)
{
ServerEventArgs e = new ServerEventArgs();
- e.Server = server;
e.Message = message;
+ if(e.Message.Time == DateTime.MinValue)
+ e.Message.Time = DateTime.Now;
if(ServerNotice != null)
new Thread(delegate(){ServerNotice(this, e);}).Start();
}
- private void OnPing(string key)
+ protected void OnPing(string key)
{
PingEventArgs e = new PingEventArgs();
e.Key = key;
if(Ping != null)
Ping(this, e);
}
- private void OnDebugMessage(string rawMessage)
+ protected void OnDebugMessage(Message message)
{
- DebugMessageEventArgs e = new DebugMessageEventArgs();
- e.RawMessage = rawMessage;
+ MessageEventArgs e = new MessageEventArgs();
+ e.Message = message;
+ if(e.Message.Time == DateTime.MinValue)
+ e.Message.Time = DateTime.Now;
if(Debug && DebugMessage != null)
new Thread(delegate(){DebugMessage(this, e);}).Start();
}
- private void OnConnecting(string server, int port)
+ protected void OnConnecting(Servername server)
{
ConnectEventArgs e = new ConnectEventArgs();
e.Server = server;
- e.Port = port;
- e.Cancel = false;
+ e.Cancel = true;
+ e.Time = DateTime.Now;
if(Connecting != null)
Connecting(this, e);
}
- private void OnDisconnecting(string server, int port)
+ protected void OnDisconnecting(Servername server)
{
ConnectEventArgs e = new ConnectEventArgs();
e.Server = server;
- e.Port = port;
+ e.Time = DateTime.Now;
e.Cancel = false;
if(Disconnecting != null)
Disconnecting(this, e);
}
- private void OnConnected(string server, int port)
+ protected void OnConnected(Servername server)
{
ConnectEventArgs e = new ConnectEventArgs();
e.Server = server;
- e.Port = port;
+ e.Time = DateTime.Now;
e.Cancel = false;
if(Connected != null)
new Thread(delegate(){Connected(this, e);}).Start();
}
- private void OnDisconnected(string server, int port)
+ protected void OnDisconnected(Servername server)
{
ConnectEventArgs e = new ConnectEventArgs();
e.Server = server;
- e.Port = port;
+ e.Time = DateTime.Now;
e.Cancel = false;
if(Disconnected != null)
new Thread(delegate() { Disconnected(this, e); }).Start();
}
- private void OnMotdReady()
+ protected void OnMotdReady()
{
MotdEventArgs e = new MotdEventArgs();
- e.Server = Server;
e.Motd = motd;
+ e.Motd.Time = DateTime.Now;
if(MotdReady != null)
new Thread(delegate(){MotdReady(this, e);}).Start();
}
- private void OnCtcpMessage(Nickname sender, string message, string otherParams)
+ protected void OnCtcpMessage(Ctcp message)
{
CtcpEventArgs e = new CtcpEventArgs();
- e.Sender = sender;
e.Message = message;
- e.Parameters = otherParams;
+ if(e.Message.Time == DateTime.MinValue)
+ e.Message.Time = DateTime.Now;
if(CtcpMessage != null)
new Thread(delegate(){CtcpMessage(this, e);}).Start();
}
- private void OnError(string server, string message)
+ protected void OnError(ServerMessage message)
{
ServerEventArgs e = new ServerEventArgs();
- e.Server = server;
e.Message = message;
+ if(e.Message.Time == DateTime.MinValue)
+ e.Message.Time = DateTime.Now;
if(ErrorMessage != null)
new Thread(delegate() { ErrorMessage(this, e); }).Start();
}
- private void OnNicklist(Channel channel, Collection<Nickname> list)
+ protected void OnNicklist(Nicklist nicklist)
{
NicklistEventArgs e = new NicklistEventArgs();
- e.Channel = channel;
- foreach(Nickname entry in list)
- e.Nicklist.Add(entry);
+ e.Nicklist = nicklist;
+ e.Nicklist.Time = DateTime.Now;
if(Nicklist != null)
new Thread(delegate(){Nicklist(this, e);}).Start();
- new Thread(delegate(){channel.OnJoinNicklist(list);}).Start();
+ new Thread(delegate(){((Channel)nicklist.Target).OnJoinNicklist(nicklist);}).Start();
}
#endregion
#region private attributes
@@ -295,13 +289,10 @@
private StreamWriter writer;
private Thread connectorThread;
private Dictionary<string,Channel> joinedChannels = new Dictionary<string,Channel>();
- private int port;
- private string server;
+ private Servername server;
private Nickname nickname;
- private string username;
private string password;
- private string motd;
- private bool ssl;
+ private Motd motd = new Motd();
private RemoteCertificateValidationCallback Sslcertvalidator;
private bool abort;
private bool debug;
@@ -311,23 +302,15 @@
/// <summary>
/// Creates an IRC Client object
/// </summary>
- /// <param name="server">The server to connect to</param>
- /// <param name="port">The port to connect to</param>
- /// <param name="ssl">Whether or not to use SSL</param>
- /// <param name="nick">The nickname to use for connecting</param>
- /// <param name="user">The username to use for connecting</param>
- /// <param name="real">The realname to use for connecting</param>
- /// <param name="autojoinChannels">The channels to autojoin after a connection is established</param>
- public Client(string server, int port, bool ssl, string nick, string user, string real, string pass)
+ /// <param name="server">A Servername object with the server data to connect to</param>
+ /// <param name="nickname">Your nickname</param>
+ /// <param name="pass">The password to connect with</param>
+ public Client(Servername server, Nickname nickname, string pass)
{
Server = server;
- Port = port;
- this.ssl = ssl;
- nickname = new Nickname(nick);
- nickname.Realname = real;
- username = user;
- password = pass ?? String.Empty;
- OnConnecting(Server, Port);
+ this.nickname = nickname;
+ Password = pass ?? String.Empty;
+ OnConnecting(Server);
}
/// <summary>
/// Connect to an IRC server
@@ -347,190 +330,200 @@
/// <summary>
/// Disconnect with your own quit message
/// </summary>
- /// <param name="message"></param>
+ /// <param name="message">The message to quit with</param>
public void Disconnect(string message)
{
- OnDisconnecting(Server, Port);
+ OnDisconnecting(Server);
SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.QuitMessage, message));
abort = true;
if(connectorThread != null && connectorThread.IsAlive)
connectorThread.Abort();
}
/// <summary>
- ///
+ /// Send a notice to a target
/// </summary>
- /// <param name="target"></param>
- /// <param name="message"></param>
- public void Notice(string target, string message)
- {
- SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.NoticeMessage, target, message));
- if(Channels.ContainsKey(target))
- OnPublicNotice(Channels[target], nickname, message);
- else
- OnPrivateNotice(new Nickname(target), nickname, message);
+ /// <param name="message">A Message object containing the data needed to send the notice</param>
+ public void Notice(Message message)
+ {
+ if(message == null)
+ return;
+ if(message is PublicNotice || message is PrivateNotice || message is ServerNotice)
+ SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.NoticeMessage, message.Target, message.Text));
+ message.Sender = Nickname;
+ message.Time = DateTime.Now;
+ if(message is PublicNotice)
+ OnPublicNotice(((PublicNotice)message));
+ else if(message is PrivateNotice)
+ OnPrivateNotice(((PrivateNotice)message));
+ else if(message is ServerNotice)
+ OnServerNotice(((ServerMessage)message));
}
/// <summary>
- ///
+ /// Send a message to a target
/// </summary>
- /// <param name="target"></param>
- /// <param name="message"></param>
- public void Say(string target, string message)
- {
- SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.PrivateMessage, target, message));
- if(Channels.ContainsKey(target))
- OnPublicMessage(Channels[target], nickname, message);
- else
- OnPrivateMessage(new Nickname(target), nickname, message);
+ /// <param name="message">A Message object containing the data needed to send the message</param>
+ public void Say(Message message)
+ {
+ if(message == null)
+ return;
+ if(message is PublicMessage || message is PrivateMessage || message is ServerMessage)
+ SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.PrivateMessage, message.Target, message.Text));
+ message.Sender = Nickname;
+ message.Time = DateTime.Now;
+ if(message is PublicMessage)
+ OnPublicMessage((PublicMessage)message);
+ else if(message is PrivateMessage)
+ OnPrivateMessage((PrivateMessage)message);
}
/// <summary>
- ///
+ /// Sends an action to a target
/// </summary>
- /// <param name="target"></param>
- /// <param name="message"></param>
- public void Act(string target, string message)
- {
- SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.PrivateMessage, target,
- String.Format(CultureInfo.CurrentCulture, Strings.ActionMessage, message)));
- if(Channels.ContainsKey(target))
- OnPublicAction(Channels[target], nickname, message);
+ /// <param name="message">A Message object containing the data needed to send the message</param>
+ public void Act(Message message)
+ {
+ if(message == null)
+ return;
+ if(message is PublicAction || message is PrivateAction)
+ SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.PrivateMessage, message.Target,
+ String.Format(CultureInfo.CurrentCulture, Strings.ActionMessage, message.Text)));
+ message.Sender = Nickname;
+ message.Time = DateTime.Now;
+ if(message is PublicAction)
+ OnPublicAction((PublicAction)message);
else
- OnPrivateAction(new Nickname(target), nickname, message);
+ OnPrivateAction((PrivateAction)message);
}
/// <summary>
- ///
+ /// Sends a Ctcp Version message to a target
/// </summary>
- /// <param name="target"></param>
- public void Version(string target)
+ /// <param name="target">The target to send the message to</param>
+ public void Version(Target target)
{
- Ctcp(target, "version", null);
+ Ctcp message = new Ctcp();
+ message.Target = target;
+ message.Text = @"version";
+ Ctcp(message);
}
/// <summary>
- ///
+ /// Sends a Ctcp message to a target
/// </summary>
- /// <param name="target"></param>
- /// <param name="action"></param>
- /// <param name="message"></param>
- public void Ctcp(string target, string action, string message)
- {
- if(action != null)
- SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.CtcpMessage, target, action.ToUpperInvariant(), (message != null ? " "+message : "")));
- else throw new ArgumentNullException("action");
+ /// <param name="message">A Ctcp object containing the data needed to send the Ctcp</param>
+ public void Ctcp(Ctcp message)
+ {
+ if(message == null)
+ return;
+ SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.CtcpMessage,
+ message.Target, message.Text.ToUpperInvariant(),
+ (!String.IsNullOrEmpty(message.Parameters) ? " "+message.Parameters : "")));
}
/// <summary>
- ///
+ /// Sends a Ctcp Reply to a target
/// </summary>
- /// <param name="target"></param>
- /// <param name="action"></param>
- /// <param name="message"></param>
- public void CtcpReply(string target, string action, string message)
- {
- if(action != null && message != null)
- SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.NoticeMessage, target, String.Format(CultureInfo.CurrentCulture, Strings.NilEscapedMessage, action + " " + message)));
- else if(action == null)
- throw new ArgumentNullException("action");
- else if(message == null)
- throw new ArgumentNullException("message");
- else throw new ArgumentNullException("target");
+ /// <param name="message">A Ctcp object containing the data needed to send the Ctcp Reply</param>
+ public void CtcpReply(Ctcp message)
+ {
+ if(message == null)
+ return;
+ SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.NoticeMessage,
+ message.Target,
+ String.Format(CultureInfo.CurrentCulture, Strings.NilEscapedMessage,
+ message.Text + " " + message.Parameters)));
}
/// <summary>
- ///
+ /// Joins a channel
/// </summary>
- /// <param name="channel"></param>
+ /// <param name="channel">A string containing the name of the channel to join</param>
public void JoinChannel(string channel)
{
if(Channels.ContainsKey(channel))
Channels[channel].Rejoin();
else
{
- Channels[channel] = new Channel(this, channel);
- SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.JoinWithoutPassMessage, channel));
+ string message = Strings.JoinWithoutPassMessage;
+ SendMessage(String.Format(System.Globalization.CultureInfo.CurrentCulture, message, channel));
}
}
/// <summary>
- ///
+ /// Joins a passworded channel
/// </summary>
- /// <param name="channel"></param>
- /// <param name="key"></param>
+ /// <param name="channel">A string containing the name of the channel to join</param>
+ /// <param name="key">A string containing the password for the channel</param>
public void JoinChannel(string channel, string key)
{
if(Channels.ContainsKey(channel))
Channels[channel].Rejoin();
else
{
- Channels[channel] = new Channel(this, channel);
- SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.JoinWithPassMessage, channel, key));
+ string message = Strings.JoinWithPassMessage;
+ SendMessage(String.Format(System.Globalization.CultureInfo.CurrentCulture, message, channel, key));
}
}
/// <summary>
- ///
+ /// Changes your nickname
/// </summary>
- /// <param name="channel"></param>
- public void PartChannel(string channel)
+ /// <param name="newnick">A Nickname object containing the new Nickname you'd like to use</param>
+ public void ChangeNick(Nickname newnick)
{
- SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.PartMessage, channel));
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="newnick"></param>
- public void ChangeNick(string newnick)
- {
- SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.NickMessage, newnick));
+ if(newnick == null)
+ return;
+ SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.NickMessage, newnick.Name));
Nickname = newnick;
}
/// <summary>
- ///
+ /// Change the topic in a channel
/// </summary>
- /// <param name="channel"></param>
- /// <param name="topic"></param>
- public void ChangeTopic(string channel, string topic)
+ /// <param name="topic">A Topic object containing the topic data you wish to set</param>
+ public void ChangeTopic(Topic topic)
{
- SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.TopicMessage, channel, topic));
- OnTopicChange(Channels[channel], nickname, topic, DateTime.Now);
+ if(topic == null)
+ return;
+ SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.TopicMessage, topic.Target, topic.Text));
+ topic.Time = DateTime.Now;
+ topic.Sender = Nickname;
+ OnTopicChange(topic);
}
/// <summary>
- ///
+ /// Change a mode somewhere
/// </summary>
- /// <param name="target"></param>
- /// <param name="mode"></param>
- /// <param name="op"></param>
- public void ChangeMode(Mode mode, ModeOperation op)
- {
- NicknameMode nm;
- StringMode sm;
- IntMode im;
- if((nm = mode as NicknameMode) != null)
- {
+ /// <param name="message">A ModeMessaage object containing the mode change data</param>
+ public void ChangeMode(IModeMessage message)
+ {
+ string mode = (message is IModeAdd ? '+' : '-') + "" + ModeMap.Instance.ModeToCharTable[message.Mode.ModeType];
+ NicknameMode nm = message.Mode as NicknameMode;
+ StringMode sm = message.Mode as StringMode;
+ IntMode im = message.Mode as IntMode;
+ if(nm != null)
SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.ModeWithParamsMessage,
- mode.Target.ToString(), (op == ModeOperation.Add ? "+" : "-") + ModeMap.Instance.ModeToCharTable[mode.ModeType],
- nm.Parameter));
- }
- else if((sm = mode as StringMode) != null)
+ message.Mode.Target.ToString(), mode, nm.Parameter));
+ else if(sm != null)
SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.ModeWithParamsMessage,
- mode.Target.ToString(), (op == ModeOperation.Add ? "+" : "-") + ModeMap.Instance.ModeToCharTable[mode.ModeType],
- sm.Parameter));
- else if((im = mode as IntMode) != null)
+ message.Mode.Target.ToString(), mode, sm.Parameter));
+ else if(im != null)
SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.ModeWithParamsMessage,
- mode.Target.ToString(), (op == ModeOperation.Add ? "+" : "-") + ModeMap.Instance.ModeToCharTable[mode.ModeType],
- im.Parameter));
+ message.Mode.Target.ToString(), mode, im.Parameter));
else
SendMessage(String.Format(CultureInfo.CurrentCulture, Strings.ModeWithoutParamsMessage,
- mode.Target.ToString(), (op == ModeOperation.Add ? "+" : "-") + ModeMap.Instance.ModeToCharTable[mode.ModeType]));
+ message.Mode.Target.ToString(), mode));
}
/// <summary>
- ///
+ /// Send a raw message to the server
/// </summary>
- /// <param name="message"></param>
+ /// <param name="message">The raw message to send</param>
public void SendMessage(string message)
{
if(connector != null)
{
if(connector.Connected)
{
- OnDebugMessage(message);
- writer.WriteLine(message);
- writer.Flush();
- Thread.Sleep(100);
+ lock(connector)
+ {
+ Message m = new Message();
+ m.Text = message;
+ OnDebugMessage(m);
+ writer.WriteLine(message);
+ writer.Flush();
+ Thread.Sleep(100);
+ }
}
else
{
@@ -543,15 +536,15 @@
private void ConnectThread()
{
try {
- connector = new TcpClient(Server, Port);
+ connector = new TcpClient(Server.Hostmask, Server.Port);
} catch (Exception) {
- throw new System.Net.WebException(String.Format(CultureInfo.CurrentCulture, Strings.ServerFailedError, Server, Port), WebExceptionStatus.ConnectFailure);
+ throw new System.Net.WebException(String.Format(CultureInfo.CurrentCulture, Strings.ServerFailedError, Server.Hostmask, Server.Port), WebExceptionStatus.ConnectFailure);
} finally {
if(!connector.Connected)
Thread.CurrentThread.Abort();
}
Stream s = Stream.Null;
- if(Ssl) {
+ if(Server.Ssl) {
try {
SslStream temp = new SslStream(connector.GetStream(), false, (Sslcertvalidator ?? AutoCertHandler));
temp.AuthenticateAsClient(String.Empty, null, SslProtocols.Tls | SslProtocols.Ssl3, true);
@@ -570,7 +563,11 @@
try {
RegisterConnection();
} catch (SocketException e) {
- OnDebugMessage(e.ToString());
+ Message m = new Message();
+ m.Sender = Server;
+ m.Text = e.ToString();
+ m.Time = DateTime.Now;
+ OnDebugMessage(m);
throw;
} finally {
if(!connector.Connected)
@@ -587,21 +584,35 @@
ParseMessage(message, ref sharedData);
Thread.Sleep(100);
} catch (SocketException e) {
- OnDebugMessage(e.ToString());
+ Message m = new Message();
+ m.Sender = Server;
+ m.Text = e.ToString();
+ m.Time = DateTime.Now;
+ OnDebugMessage(m);
+ throw;
+ } catch (IOException e) {
+ Message m = new Message();
+ m.Sender = Server;
+ m.Text = e.ToString();
+ m.Time = DateTime.Now;
+ OnDebugMessage(m);
throw;
} finally {
if(!connector.Connected)
Thread.CurrentThread.Abort();
}
}
- OnDisconnected(Server, Port);
+ OnDisconnected(Server);
reader.Close();
s.Close();
}
private void ParseMessage(string message, ref object spareData)
{
#region parsing
- OnDebugMessage(message);
+ Message m = new Message();
+ m.Text = message;
+ m.Time = DateTime.Now;
+ OnDebugMessage(m);
Nickname nick = null;
string server = String.Empty;
string[] messageParts = message.Split(new char[]{' '}, 4);
@@ -647,12 +658,20 @@
{
if(!Channels.TryGetValue(target, out channel))
Channels[target] = channel = new Channel(this, target);
- OnSelfJoin(channel, JoinMode.Join);
+ UserJoin j = new UserJoin();
+ j.Target = channel;
+ j.Time = DateTime.Now;
+ j.User = Nickname;
+ OnSelfJoin(j);
}
else
{
Channels.TryGetValue(target, out channel);
- OnUserJoin(channel, nick, JoinMode.Join);
+ UserJoin j = new UserJoin();
+ j.Target = channel;
+ j.Time = DateTime.Now;
+ j.User = nick;
+ OnUserJoin(j);
}
}
else if(action.CompareTo("part") == 0)
@@ -663,18 +682,29 @@
Channels.TryGetValue(target, out channel);
if(channel != null)
Channels.Remove(target);
- OnSelfJoin(channel, JoinMode.Part);
+ UserPart p = new UserPart();
+ p.Target = channel;
+ p.Time = DateTime.Now;
+ p.User = Nickname;
+ OnSelfJoin(p);
}
else
{
Channels.TryGetValue(target, out channel);
- OnUserJoin(channel, nick, JoinMode.Join);
+ UserPart p = new UserPart();
+ p.Target = channel;
+ p.Time = DateTime.Now;
+ p.User = nick;
+ OnUserJoin(p);
}
}
#endregion
else
{
- OnDebugMessage("Invalid message?");
+ Message msg = new Message();
+ msg.Time = DateTime.Now;
+ msg.Text = "Invalid message?";
+ OnDebugMessage(msg);
}
}
if(messageParts.Length >= 4)
@@ -682,7 +712,11 @@
string action = messageParts[1].ToLowerInvariant();
if(messageParts[0].ToLowerInvariant().CompareTo("error") == 0)
{
- OnError(Server, String.Join(" ", messageParts, 1, messageParts.Length-1).Substring(1));
+ ServerMessage sm = new ServerMessage();
+ sm.Text = String.Join(" ", messageParts, 1, messageParts.Length-1).Substring(1);
+ sm.Time = DateTime.Now;
+ sm.Sender = Server;
+ OnError(sm);
}
else if(server.Length > 0)
{
@@ -690,13 +724,22 @@
if(action.CompareTo("privmsg") == 0 || action.CompareTo("notice") == 0)
{
string serverMessage = messageParts[3].Substring(1);
- OnServerNotice(server, serverMessage);
+ ServerMessage sm = new ServerMessage();
+ sm.Sender = new Servername(server);
+ sm.Time = DateTime.Now;
+ sm.Text = serverMessage;
+ OnServerNotice(sm);
}
#endregion
else if(action.CompareTo("001") == 0)
{
- OnServerNotice(server, "You are now connected!");
- OnConnected(Server, Port);
+ nickname = Nickname.Parse(messageParts[3].Substring(messageParts[3].LastIndexOf(' ')+1));
+ ServerMessage sm = new ServerMessage();
+ sm.Sender = new Servername(server);
+ sm.Time = DateTime.Now;
+ sm.Text = "You are now connected!";
+ OnServerNotice(sm);
+ OnConnected(Server);
}
else if(action.CompareTo("002") == 0)
{
@@ -720,7 +763,11 @@
action.CompareTo("266") == 0)
{
// TODO: These messages need more parsing. Grr.
- OnServerNotice(Server, message.Split(new char[]{' '}, 4)[3]);
+ ServerMessage sm = new ServerMessage();
+ sm.Sender = Server;
+ sm.Time = DateTime.Now;
+ sm.Text = message.Split(new char[]{' '}, 4)[3];
+ OnServerNotice(sm);
}
#endregion
else if(action.CompareTo("253") == 0)
@@ -729,11 +776,11 @@
#region motd (372/375/376)
else if(action.CompareTo("375") == 0)
{
- motd = String.Empty;
+ motd.Message = String.Empty;
}
else if(action.CompareTo("372") == 0)
{
- motd += messageParts[3].Substring(2) + "\r\n";
+ motd.Message += messageParts[3].Substring(2) + "\r\n";
}
else if(action.CompareTo("376") == 0)
{
@@ -743,21 +790,23 @@
#region on join topic data
else if(action.CompareTo("331") == 0 || action.CompareTo("332") == 0)
{
- spareData = new TopicEventArgs();
- TopicEventArgs args = spareData as TopicEventArgs;
+ spareData = new Topic();
+ Topic args = spareData as Topic;
Channel channel = null;
string chName = messageParts[3].Split(new char[]{' '}, 2)[0];
if(!Channels.TryGetValue(chName, out channel))
Channels[chName] = channel = new Channel(this, messageParts[2]);
- args.Channel = Channels[chName];
- args.NewTopic = messageParts[3].Split(new char[]{' '}, 2)[1].Substring(1);
+ args.Target = Channels[chName];
+ args.Text = messageParts[3].Split(new char[]{' '}, 2)[1].Substring(1);
}
else if(action.CompareTo("333") == 0)
{
- TopicEventArgs args = spareData as TopicEventArgs;
+ Topic args = spareData as Topic;
string[] topicParts = messageParts[3].Split(' ');
DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(Convert.ToDouble(topicParts[2], CultureInfo.CurrentCulture));
- OnTopicChange(args.Channel, new Nickname(topicParts[1]), args.NewTopic, dateTime);
+ args.Sender = new Nickname(topicParts[1]);
+ args.Time = dateTime;
+ OnTopicChange(args);
spareData = null;
}
#endregion
@@ -766,13 +815,15 @@
{
// nicklist
if(spareData == null)
- spareData = new NicklistEventArgs();
- NicklistEventArgs args = spareData as NicklistEventArgs;
+ spareData = new Nicklist();
+ Nicklist args = spareData as Nicklist;
string nicklist = messageParts[3];
string[] parts = nicklist.Split(' ');
Channel channel = null;
Channels.TryGetValue(parts[1], out channel);
- args.Channel = channel;
+ args.Target = channel;
+ List<Nickname> nicks = new List<Nickname>();
+ nicks.AddRange(args.Nicknames);
for(int i = 2; i < parts.Length; i++)
{
string name = parts[i];
@@ -782,21 +833,21 @@
name = name.Substring(1);
string temp = name.ToUpperInvariant();
List<ModeName> tmpmode = new List<ModeName>();
- while(temp[0] < 65 || temp[0] > 90)
+ while(Char.IsSymbol(temp[0]) && temp[0] != '[' && temp[0] != ']')
{
- // ordinarily we parse the mode here, but that can't happen until we figure out the modes possible from the server
tmpmode.Add(ModeMap.Instance.SymbolToModeTable[name[0]]);
name = name.Substring(1);
temp = name.ToUpperInvariant();
}
- args.Nicklist.Add(new Nickname(name, tmpmode.ToArray()));
+ nicks.Add(new Nickname(name, tmpmode.ToArray()));
}
+ args.Nicknames = new Collection<Nickname>(nicks);
}
else if(action.CompareTo("366") == 0)
{
// end of nicklist
- NicklistEventArgs args = spareData as NicklistEventArgs;
- OnNicklist(args.Channel, args.Nicklist);
+ Nicklist args = spareData as Nicklist;
+ OnNicklist(args);
spareData = null;
}
#endregion
@@ -806,14 +857,16 @@
}
else
{
- OnDebugMessage("Invalid message?");
+ Message msg = new Message();
+ msg.Text = "Invalid message?";
+ msg.Time = DateTime.Now;
+ OnDebugMessage(msg);
}
}
#region mode change
else if(action.CompareTo("mode") == 0)
{
- ModeOperation op = ModeOperation.Add;
- Mode mode = null;
+ IModeMessage mode = null;
string[] modeParts = messageParts[3].Split(' ');
string modes = modeParts[0];
if(modes.StartsWith(":"))
@@ -831,29 +884,32 @@
{
switch(c)
{
- case '+': op = ModeOperation.Add; break;
- case '-': op = ModeOperation.Remove; break;
+ case '+': mode = new ChannelModeAdd(); mode.Sender = nick; break;
+ case '-': mode = new ChannelModeRemove(); mode.Sender = nick; break;
default:
if((modes.Length - i) == parameters.Length)
{
int result;
Nickname tmpnick;
if(Int32.TryParse(parameters[(modes.Length-i-1)], out result))
- mode = new IntMode(channel, ModeMap.Instance.CharToModeTable[c], result);
- else if(Irc.Nickname.TryParse(parameters[(modes.Length-i-1)], out tmpnick))
- mode = new NicknameMode(channel, ModeMap.Instance.CharToModeTable[c], tmpnick);
+ mode.Mode = new IntMode(channel, ModeMap.Instance.CharToModeTable[c], result);
+ else if(Nickname.TryParse(parameters[(modes.Length-i-1)], out tmpnick))
+ mode.Mode = new NicknameMode(channel, ModeMap.Instance.CharToModeTable[c], tmpnick);
else
- mode = new StringMode(channel, ModeMap.Instance.CharToModeTable[c], parameters[(modes.Length-i-1)]);
-
- } else
+ mode.Mode = new StringMode(channel, ModeMap.Instance.CharToModeTable[c], parameters[(modes.Length-i-1)]);
+ OnModeChange(mode);
+ }
+ else
{
- mode = new Mode(channel, ModeMap.Instance.CharToModeTable[c]);
+ mode.Mode = new Mode(channel, ModeMap.Instance.CharToModeTable[c]);
+ OnModeChange(mode);
}
break;
}
i++;
}
- } else
+ }
+ else
{
// user mode
Nickname user = new Nickname(messageParts[2]);
@@ -862,24 +918,25 @@
{
switch(c)
{
- case '+': op = ModeOperation.Add; break;
- case '-': op = ModeOperation.Remove; break;
+ case '+': mode = new NickModeAdd(); mode.Sender = nick; break;
+ case '-': mode = new NickModeRemove(); mode.Sender = nick; break;
default:
if((modes.Length - i) == parameters.Length)
{
int result;
Nickname tmpnick;
if(Int32.TryParse(parameters[(modes.Length-i-1)], out result))
- mode = new IntMode(user, ModeMap.Instance.CharToModeTable[c], result);
- else if(global::Irc.Nickname.TryParse(parameters[(modes.Length-i-1)], out tmpnick))
- mode = new NicknameMode(user, ModeMap.Instance.CharToModeTable[c], tmpnick);
+ mode.Mode = new IntMode(user, ModeMap.Instance.CharToModeTable[c], result);
+ else if(Nickname.TryParse(parameters[(modes.Length-i-1)], out tmpnick))
+ mode.Mode = new NicknameMode(user, ModeMap.Instance.CharToModeTable[c], tmpnick);
else
- mode = new StringMode(user, ModeMap.Instance.CharToModeTable[c], parameters[(modes.Length-i-1)]);
- OnModeChange(nick, mode, op);
- } else
+ mode.Mode = new StringMode(user, ModeMap.Instance.CharToModeTable[c], parameters[(modes.Length-i-1)]);
+ OnModeChange(mode);
+ }
+ else
{
- mode = new Mode(user, ModeMap.Instance.CharToModeTable[c]);
- OnModeChange(nick, mode, op);
+ mode.Mode = new Mode(user, ModeMap.Instance.CharToModeTable[c]);
+ OnModeChange(mode);
}
break;
}
@@ -908,16 +965,32 @@
messageText = text.Substring(index, text.Length-index-1);
if(type.CompareTo("action") == 0)
{
- OnPublicAction(channel, nick, messageText);
+ PublicAction pa = new PublicAction();
+ pa.Target = channel;
+ pa.Sender = nick;
+ pa.Text = messageText;
+ pa.Time = DateTime.Now;
+ OnPublicAction(pa);
}
else
{
- OnCtcpMessage(nick, type, messageText);
+ Ctcp ctcp = new Ctcp();
+ ctcp.Time = DateTime.Now;
+ ctcp.Sender = nick;
+ ctcp.Text = type;
+ ctcp.Parameters = messageText;
+ ctcp.Target = Nickname;
+ OnCtcpMessage(ctcp);
}
}
else
{
- OnPublicMessage(channel, nick, text);
+ PublicMessage pm = new PublicMessage();
+ pm.Target = channel;
+ pm.Sender = nick;
+ pm.Time = DateTime.Now;
+ pm.Text = text;
+ OnPublicMessage(pm);
}
}
else
@@ -932,16 +1005,32 @@
messageText = text.Substring(index, text.Length-index-1);
if(type.CompareTo("action") == 0)
{
- OnPrivateAction(nickname, nick, messageText);
+ PrivateAction pa = new PrivateAction();
+ pa.Target = Nickname;
+ pa.Sender = nick;
+ pa.Time = DateTime.Now;
+ pa.Text = messageText;
+ OnPrivateAction(pa);
}
else
{
- OnCtcpMessage(nick, type, messageText);
+ Ctcp ctcp = new Ctcp();
+ ctcp.Time = DateTime.Now;
+ ctcp.Sender = nick;
+ ctcp.Text = type;
+ ctcp.Parameters = messageText;
+ ctcp.Target = Nickname;
+ OnCtcpMessage(ctcp);
}
}
else
{
- OnPrivateMessage(nickname, nick, text);
+ PrivateMessage pm = new PrivateMessage();
+ pm.Sender = nick;
+ pm.Target = Nickname;
+ pm.Text = text;
+ pm.Time = DateTime.Now;
+ OnPrivateMessage(pm);
}
}
}
@@ -964,11 +1053,22 @@
string messageText = String.Empty;
if(index != text.Length-1)
messageText = text.Substring(index, text.Length-index-1);
- OnCtcpMessage(nick, type, messageText);
+ Ctcp ctcp = new Ctcp();
+ ctcp.Target = Nickname;
+ ctcp.Sender = nick;
+ ctcp.Text = type;
+ ctcp.Parameters = messageText;
+ ctcp.Time = DateTime.Now;
+ OnCtcpMessage(ctcp);
}
else
{
- OnPublicNotice(channel, nick, text);
+ PublicNotice pn = new PublicNotice();
+ pn.Target = channel;
+ pn.Sender = nick;
+ pn.Text = text;
+ pn.Time = DateTime.Now;
+ OnPublicNotice(pn);
}
}
else
@@ -981,11 +1081,22 @@
string messageText = String.Empty;
if(index != text.Length-1)
messageText = text.Substring(index, text.Length-index-1);
- OnCtcpMessage(nick, type, messageText);
+ Ctcp ctcp = new Ctcp();
+ ctcp.Sender = nick;
+ ctcp.Target = Nickname;
+ ctcp.Text = type;
+ ctcp.Parameters = messageText;
+ ctcp.Time = DateTime.Now;
+ OnCtcpMessage(ctcp);
}
else
{
- OnPrivateNotice(nick, nickname, text);
+ PrivateNotice pn = new PrivateNotice();
+ pn.Sender = nick;
+ pn.Target = Nickname;
+ pn.Text = text;
+ pn.Time = DateTime.Now;
+ OnPrivateNotice(pn);
}
}
}
@@ -998,14 +1109,16 @@
}
else
{
- OnDebugMessage("Invalid message?");
+ Message msg = new Message();
+ msg.Text = "Invalid message?";
+ OnDebugMessage(msg);
}
}
}
private void RegisterConnection()
{
string RFC1459Pass = String.Format(CultureInfo.CurrentCulture, Strings.RFC1459PassMessage, Password);
- string RFC1459User = String.Format(CultureInfo.CurrentCulture, Strings.RFC1459UserMessage, Username, "0", "0", nickname.Realname);
+ string RFC1459User = String.Format(CultureInfo.CurrentCulture, Strings.RFC1459UserMessage, Nickname.Name, "0", "0", Nickname.Realname);
string RFC1459Nick = String.Format(CultureInfo.CurrentCulture, Strings.NickMessage, Nickname);
int authCount = 0;
@@ -1014,7 +1127,10 @@
string message = reader.ReadLine();
if(message != null)
{
- OnDebugMessage(message);
+ Message m = new Message();
+ m.Text = message;
+ m.Time = DateTime.Now;
+ OnDebugMessage(m);
string[] parts = message.Split(' ');
if(parts.Length > 2 && (parts[2].ToLowerInvariant().CompareTo("auth") == 0 || parts[1].ToLowerInvariant().CompareTo("auth") == 0))
{
@@ -1040,12 +1156,20 @@
{
return (sslPolicyErrors == SslPolicyErrors.None);
}
+ protected virtual void Dispose(bool disposing)
+ {
+ if(disposing)
+ {
+ reader.Close();
+ writer.Close();
+ connector.Close();
+ connectorThread.Abort();
+ }
+ }
public void Dispose()
{
- reader.Close();
- writer.Close();
- connector.Close();
- connectorThread.Abort();
+ Dispose(true);
+ GC.SuppressFinalize(this);
}
#endregion
}
Modified: trunk/Client/Client.csproj
==============================================================================
--- trunk/Client/Client.csproj (original)
+++ trunk/Client/Client.csproj Sun Aug 12 02:36:41 2007
@@ -60,7 +60,9 @@
<Compile Include="Mode.cs" />
<Compile Include="ModeMap.cs" />
<Compile Include="Nickname.cs" />
+ <Compile Include="Objects.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Servername.cs" />
<Compile Include="Strings.Designer.cs">
<DependentUpon>Strings.resx</DependentUpon>
<AutoGen>True</AutoGen>
Modified: trunk/Client/Events.cs
==============================================================================
--- trunk/Client/Events.cs (original)
+++ trunk/Client/Events.cs Sun Aug 12 02:36:41 2007
@@ -1,89 +1,37 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using Irc.Objects;
+using Irc.Events;
-namespace Irc
+namespace Irc.Events
{
[CLSCompliant(true)]
- public abstract class Target
- {
- public abstract override string ToString();
- }
-
- internal interface ChannelMessage
- {
- Channel Target { get; set; }
- }
- internal interface PrivateMessage
- {
- Nickname Target { get; set; }
- }
-
- [CLSCompliant(true)]
public class ModeEventArgs : EventArgs
{
- private Nickname sender;
- private Mode mode;
- private ModeOperation op;
-
- public Nickname Sender
- {
- get { return sender; }
- set { sender = value; }
- }
- public Mode Mode
+ private IModeMessage mode;
+ public IModeMessage Mode
{
get { return mode; }
- set { mode = value; }
- }
- public ModeOperation Operation {
- get { return op; }
- set { op = value; }
+ internal set { mode = value; }
}
}
[CLSCompliant(true)]
public class MessageEventArgs : EventArgs
{
- private string message;
- private Nickname sender;
-
- public Nickname Sender
- {
- get { return sender; }
- set { sender = value; }
- }
- public string Message
+ private Message message;
+ public Message Message
{
get { return message; }
- set { message = value; }
- }
- }
- [CLSCompliant(true)]
- public sealed class ChannelMessageEventArgs : MessageEventArgs, ChannelMessage
- {
- private Channel target;
- public Channel Target
- {
- get { return target; }
- set { target = value; }
- }
- }
- [CLSCompliant(true)]
- public sealed class PrivateMessageEventArgs : MessageEventArgs, PrivateMessage
- {
- private Nickname target;
- public Nickname Target
- {
- get { return target; }
- set { target = value; }
+ internal set { message = value; }
}
}
-
[CLSCompliant(true)]
public sealed class NickEventArgs : EventArgs
{
private Nickname oldNick;
private Nickname newNick;
+ private DateTime time;
public Nickname OldNick
{
@@ -95,58 +43,36 @@
get { return newNick; }
set { newNick = value; }
}
+ public DateTime Time
+ {
+ get { return time; }
+ internal set { time = value; }
+ }
}
[CLSCompliant(true)]
public sealed class ServerEventArgs : EventArgs
{
- private string server;
- private string message;
-
- public string Server
- {
- get { return server; }
- set { server = value; }
- }
- public string Message
+ private ServerMessage message;
+ public ServerMessage Message
{
get { return message; }
- set { message = value; }
+ internal set { message = value; }
}
}
[CLSCompliant(true)]
public sealed class TopicEventArgs : EventArgs
{
- private Channel channel;
- private Nickname sender;
- private DateTime time;
- private string newTopic;
-
- public Channel Channel
- {
- get { return channel; }
- set { channel = value; }
- }
- public Nickname Sender
+ private Topic topic;
+ public Topic Topic
{
- get { return sender; }
- set { sender = value; }
- }
- public DateTime Time
- {
- get { return time; }
- set { time = value; }
- }
- public string NewTopic
- {
- get { return newTopic; }
- set { newTopic = value; }
+ get { return topic; }
+ internal set { topic = value; }
}
}
[CLSCompliant(true)]
public sealed class PingEventArgs : System.ComponentModel.CancelEventArgs
{
private string key;
-
public string Key
{
get { return key; }
@@ -154,116 +80,59 @@
}
}
[CLSCompliant(true)]
- public sealed class DebugMessageEventArgs : EventArgs
- {
- private string rawMessage;
-
- public string RawMessage
- {
- get { return rawMessage; }
- set { rawMessage = value; }
- }
- }
- [CLSCompliant(true)]
public sealed class JoinEventArgs : EventArgs
{
- private Nickname user;
- private JoinMode mode;
- private Channel channel;
-
- public Nickname User
- {
- get { return user; }
- set { user = value; }
- }
- public Channel Channel
+ private UserMove movement;
+ public UserMove Movement
{
- get { return channel; }
- set { channel = value; }
- }
- public JoinMode Mode
- {
- get { return mode; }
- set { mode = value; }
+ get { return movement; }
+ internal set { movement = value; }
}
}
[CLSCompliant(true)]
public sealed class ConnectEventArgs : System.ComponentModel.CancelEventArgs
{
- private string server;
- private int port;
-
- public string Server
+ private Servername server;
+ private DateTime time;
+ public Servername Server
{
get { return server; }
- set { server = value; }
+ internal set { server = value; }
}
- public int Port
+ public DateTime Time
{
- get { return port; }
- set { port = value; }
+ get { return time; }
+ internal set { time = value; }
}
}
[CLSCompliant(true)]
public sealed class MotdEventArgs : EventArgs
{
- private string server;
- private string motd;
-
- public string Server
- {
- get { return server; }
- set { server = value; }
- }
- public string Motd
+ private Motd motd;
+ public Motd Motd
{
get { return motd; }
- set { motd = value; }
+ internal set { motd = value; }
}
}
[CLSCompliant(true)]
public sealed class CtcpEventArgs : EventArgs
{
- private Nickname sender;
- private string message;
- private string parameters;
-
- public Nickname Sender
+ private Ctcp ctcp;
+ public Ctcp Message
{
- get { return sender; }
- set { sender = value; }
- }
- public string Message
- {
- get { return message; }
- set { message = value; }
- }
- public string Parameters
- {
- get { return parameters; }
- set { parameters = value; }
+ get { return ctcp; }
+ internal set { ctcp = value; }
}
}
[CLSCompliant(true)]
public sealed class NicklistEventArgs : EventArgs
{
- private Collection<Nickname> nicklist = new Collection<Nickname>();
- private Channel channel;
-
- public Collection<Nickname> Nicklist
+ private Nicklist nicklist;
+ public Nicklist Nicklist
{
get { return nicklist; }
+ internal set { nicklist = value; }
}
- public Channel Channel
- {
- get { return channel; }
- set { channel = value; }
- }
- }
-
- public enum JoinMode
- {
- Join,
- Part
}
}
Modified: trunk/Client/Mode.cs
==============================================================================
--- trunk/Client/Mode.cs (original)
+++ trunk/Client/Mode.cs Sun Aug 12 02:36:41 2007
@@ -3,13 +3,8 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
-namespace Irc
+namespace Irc.Objects
{
- public enum ModeOperation
- {
- Add,
- Remove
- }
public enum ModeName
{
None,
@@ -52,10 +47,12 @@
return base.GetHashCode();
}
public Target Target {
+ internal set { target = value; }
get { return target; }
}
public ModeName ModeType
{
+ internal set { mode = value; }
get { return mode; }
}
}
@@ -130,6 +127,14 @@
{
private List<Mode> modes = new List<Mode>();
public Collection<Mode> ModeList {
+ internal set
+ {
+ lock(this)
+ {
+ modes.Clear();
+ modes.AddRange(value);
+ }
+ }
get { return new Collection<Mode>(modes); }
}
public ModeCollection Add(Mode mode)
@@ -160,10 +165,18 @@
return modes.ToString();
else return String.Empty;
}
+ public Mode this[int index]
+ {
+ get
+ {
+ return new Mode(modes[index].Target, modes[index].ModeType);
+ }
+ }
public static bool operator ==(ModeCollection cont1, ModeCollection cont2)
{
- if(cont1 == null || cont2 == null)
- if(cont1 == null && cont2 == null)
+ // prevent infinite recursion
+ if(((object)cont1) == null || ((object)cont2) == null)
+ if(((object)cont1) == null && ((object)cont2) == null)
return true;
else
return false;
@@ -184,7 +197,7 @@
{
return this == (ModeCollection)obj;
}
- public bool HasMode(ModeName mode)
+ public bool Contains(ModeName mode)
{
foreach(Mode m in ModeList)
if(m.ModeType == mode)
@@ -216,13 +229,13 @@
}
break;
case "S": case "s":
- if(HasMode(ModeName.None)) ret = "";
- if(HasMode(ModeName.Devoice)) ret = "-";
- if(HasMode(ModeName.Voice)) ret = "+";
- if(HasMode(ModeName.HalfOperator)) ret = "%";
- if(HasMode(ModeName.Operator)) ret = "@";
- if(HasMode(ModeName.Protected)) ret = "&";
- if(HasMode(ModeName.Owner)) ret = "~";
+ if(Contains(ModeName.None)) ret = "";
+ if(Contains(ModeName.Devoice)) ret = "-";
+ if(Contains(ModeName.Voice)) ret = "+";
+ if(Contains(ModeName.HalfOperator)) ret = "%";
+ if(Contains(ModeName.Operator)) ret = "@";
+ if(Contains(ModeName.Protected)) ret = "&";
+ if(Contains(ModeName.Owner)) ret = "~";
break;
default:
throw new ArgumentException(String.Format(formatProvider, Strings.NicknameFormatException, format), "format");
Modified: trunk/Client/ModeMap.cs
==============================================================================
--- trunk/Client/ModeMap.cs (original)
+++ trunk/Client/ModeMap.cs Sun Aug 12 02:36:41 2007
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Text;
+using Irc.Objects;
namespace Irc
{
Modified: trunk/Client/Nickname.cs
==============================================================================
--- trunk/Client/Nickname.cs (original)
+++ trunk/Client/Nickname.cs Sun Aug 12 02:36:41 2007
@@ -1,12 +1,15 @@
using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
using System.Text.RegularExpressions;
-namespace Irc
+namespace Irc.Objects
{
[CLSCompliant(true)]
public sealed class Nickname : Target, IComparable, IFormattable
{
private ModeCollection accessLevel;
+ private string username;
private string hostmask;
private string realname;
private string name;
@@ -16,39 +19,52 @@
}
public string Name
{
+ internal set { name = value; }
get { return name; }
- set { name = value; }
}
public string Realname
{
+ internal set { realname = value; }
get { return realname; }
- set { realname = value; }
}
public string Hostmask
{
+ internal set { hostmask = value; }
get { return hostmask; }
- set { hostmask = value; }
}
- public Nickname(string nick, string real, string host, params ModeName[] access)
+ public string Username
+ {
+ internal set { username = value; }
+ get { return username; }
+ }
+ public Nickname(string nick, string real, string host, string user, params ModeName[] access)
{
Name = nick;
Realname = real;
Hostmask = host;
+ Username = user;
accessLevel = new ModeCollection();
if(access != null)
foreach(ModeName m in access)
accessLevel += new Mode(this, m);
}
- public Nickname(string nick) : this(nick, "*", "*", ModeName.None) {}
- public Nickname(string nick, ModeName access) : this(nick, "*", "*", access) {}
- public Nickname(string nick, ModeName[] access) : this(nick, "*", "*", access) {}
- public Nickname(string nick, string host) : this(nick, "*", host, ModeName.None) {}
- public Nickname(string nick, string real, string host) : this(nick, real, host, ModeName.None) {}
+ public Nickname(string nick) : this(nick, "*", "*", "", ModeName.None) {}
+ public Nickname(string nick, string host) : this(nick, "*", host, "", ModeName.None) { }
+ public Nickname(string nick, string real, string host) : this(nick, real, host, "", ModeName.None) { }
+ public Nickname(string nick, string real, string host, string user) : this(nick, real, host, user, ModeName.None) { }
+
+ public Nickname(string nick, ModeName access) : this(nick, "*", "*", "", access) { }
+ public Nickname(string nick, string host, ModeName access) : this(nick, "*", host, "", access) { }
+ public Nickname(string nick, string real, string host, ModeName access) : this(nick, real, host, "", access) { }
+
+ public Nickname(string nick, ModeName[] access) : this(nick, "*", "*", "", access) { }
+ public Nickname(string nick, string host, ModeName[] access) : this(nick, "*", host, "", access) { }
+
public static Nickname Parse(string format)
{
Nickname result;
- Regex r = new Regex(@"(?<nick>[a-zA-Z0-9*]+)(!(?<real>[a-zA-Z0-9*]+)@(?<host>[a-zA-Z0-9.*]))?", RegexOptions.Compiled | RegexOptions.ExplicitCapture);
+ Regex r = new Regex(@"(?<nick>[^!]+)(!(?<real>[^@]+)@(?<host>.*))?", RegexOptions.Compiled | RegexOptions.ExplicitCapture);
Match m = r.Match(format);
if(!m.Success)
throw new FormatException();
@@ -73,6 +89,9 @@
Nickname n = obj as Nickname;
if(n != null)
{
+ // if the Name properties of each nickname match, the ignore checking entirely
+ if(n.Name.Equals(Name))
+ return 0;
string theirHostmask = n.ToString("f", System.Globalization.CultureInfo.CurrentCulture);
string ourHostmask = ToString("f", System.Globalization.CultureInfo.CurrentCulture);
for(int i = 0, j = 0; i < theirHostmask.Length && j < ourHostmask.Length; )
@@ -110,7 +129,8 @@
try
{
return CompareTo(n) == 0;
- } catch(ArgumentException)
+ }
+ catch(ArgumentException)
{
return false;
}
@@ -145,15 +165,19 @@
}
public static bool operator ==(Nickname obj1, Nickname obj2)
{
- if(obj1 != null)
+ // prevent infinite recursion
+ if(((object)obj1) == null || ((object)obj2) == null)
+ if(((object)obj1) == null && ((object)obj2) == null)
+ return true;
+ else
+ return false;
+ if(((object)obj1) != null)
return obj1.Equals(obj2);
- else return false;
+ else return ((object)obj2) == null;
}
public static bool operator !=(Nickname obj1, Nickname obj2)
{
- if(obj1 != null)
- return !obj1.Equals(obj2);
- else return false;
+ return !(obj1 == obj2);
}
public static int operator >(Nickname obj1, Nickname obj2)
{
Added: trunk/Client/Objects.cs
==============================================================================
--- (empty file)
+++ trunk/Client/Objects.cs Sun Aug 12 02:36:41 2007
@@ -0,0 +1,272 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections.ObjectModel;
+
+namespace Irc.Objects
+{
+ [CLSCompliant(true)]
+ public abstract class Target
+ {
+ public abstract override string ToString();
+ }
+ public abstract class ClientEvent
+ {
+ private DateTime time;
+ private Target target;
+ public DateTime Time
+ {
+ get { return time; }
+ set { time = value; }
+ }
+ public Target Target
+ {
+ get { return target; }
+ set { target = value; }
+ }
+ }
+ public abstract class ChannelEvent : ClientEvent
+ {
+ }
+ public abstract class UserEvent : ClientEvent
+ {
+ }
+ public abstract class ConnectionEvent : ClientEvent
+ {
+ }
+ public abstract class ServerEvent : ClientEvent
+ {
+ }
+
+ [CLSCompliant(true)]
+ public class Message : ConnectionEvent
+ {
+ private Target sender;
+ private string message;
+ public Target Sender
+ {
+ get { return sender; }
+ set { sender = value; }
+ }
+ public string Text
+ {
+ get { return message; }
+ set { message = value; }
+ }
+ }
+ [CLSCompliant(true)]
+ public class Ctcp : Message
+ {
+ private string parameters;
+ public string Parameters
+ {
+ get { return parameters; }
+ set { parameters = value; }
+ }
+ }
+ [CLSCompliant(true)]
+ public class PublicMessage : Message
+ {
+ }
+ [CLSCompliant(true)]
+ public class PrivateMessage : Message
+ {
+ }
+ [CLSCompliant(true)]
+ public class ServerMessage : Message
+ {
+ }
+ [CLSCompliant(true)]
+ public class PublicNotice : Message
+ {
+ }
+ [CLSCompliant(true)]
+ public class PrivateNotice : Message
+ {
+ }
+ [CLSCompliant(true)]
+ public class ServerNotice : Message
+ {
+ }
+ [CLSCompliant(true)]
+ public class PublicAction : Message
+ {
+ }
+ [CLSCompliant(true)]
+ public class PrivateAction : Message
+ {
+ }
+ [CLSCompliant(true)]
+ public class Nicklist : ChannelEvent
+ {
+ private List<Nickname> nicks = new List<Nickname>();
+ public Collection<Nickname> Nicknames
+ {
+ get { return new Collection<Nickname>(nicks); }
+ internal set
+ {
+ lock(this)
+ {
+ nicks.Clear();
+ nicks.AddRange(value);
+ }
+ }
+ }
+ }
+ [CLSCompliant(true)]
+ public class Motd : ServerEvent
+ {
+ private string motd;
+ public string Message
+ {
+ get { return motd; }
+ internal set { motd = value; }
+ }
+ }
+ [CLSCompliant(true)]
+ public class Topic : ChannelEvent
+ {
+ private Nickname sender;
+ private string text;
+ public Nickname Sender
+ {
+ get { return sender; }
+ set { sender = value; }
+ }
+ public string Text
+ {
+ get { return text; }
+ set { text = value; }
+ }
+ }
+ [CLSCompliant(true)]
+ public interface IModeMessage
+ {
+ Target Sender { get; set; }
+ Mode Mode { get; set; }
+ DateTime Time { get; set; }
+ }
+ [CLSCompliant(true)]
+ public interface IModeAdd : IModeMessage
+ {
+ }
+ [CLSCompliant(true)]
+ public interface IModeRemove : IModeMessage
+ {
+ }
+ [CLSCompliant(true)]
+ public class ChannelModeAdd : ChannelEvent, IModeMessage, IModeAdd
+ {
+ private Mode mode;
+ private Target sender;
+ public Mode Mode
+ {
+ get { return mode; }
+ set { mode = value; }
+ }
+ public Target Sender
+ {
+ get { return sender; }
+ set { sender = value; }
+ }
+ }
+ [CLSCompliant(true)]
+ public class NickModeAdd : UserEvent, IModeMessage, IModeAdd
+ {
+ private Mode mode;
+ private Target sender;
+ public Mode Mode
+ {
+ get { return mode; }
+ set { mode = value; }
+ }
+ public Target Sender
+ {
+ get { return sender; }
+ set { sender = value; }
+ }
+ }
+ [CLSCompliant(true)]
+ public class ServerModeAdd : ServerEvent, IModeMessage, IModeAdd
+ {
+ private Mode mode;
+ private Target sender;
+ public Mode Mode
+ {
+ get { return mode; }
+ set { mode = value; }
+ }
+ public Target Sender
+ {
+ get { return sender; }
+ set { sender = value; }
+ }
+ }
+ [CLSCompliant(true)]
+ public class ChannelModeRemove : ChannelEvent, IModeMessage, IModeRemove
+ {
+ private Mode mode;
+ private Target sender;
+ public Mode Mode
+ {
+ get { return mode; }
+ set { mode = value; }
+ }
+ public Target Sender
+ {
+ get { return sender; }
+ set { sender = value; }
+ }
+ }
+ [CLSCompliant(true)]
+ public class NickModeRemove : UserEvent, IModeMessage, IModeRemove
+ {
+ private Mode mode;
+ private Target sender;
+ public Mode Mode
+ {
+ get { return mode; }
+ set { mode = value; }
+ }
+ public Target Sender
+ {
+ get { return sender; }
+ set { sender = value; }
+ }
+ }
+ [CLSCompliant(true)]
+ public class ServerModeRemove : ServerEvent, IModeMessage, IModeRemove
+ {
+ private Mode mode;
+ private Target sender;
+ public Mode Mode
+ {
+ get { return mode; }
+ set { mode = value; }
+ }
+ public Target Sender
+ {
+ get { return sender; }
+ set { sender = value; }
+ }
+ }
+ // TODO: Rename this crappily named class
+ [CLSCompliant(true)]
+ public class UserMove : ChannelEvent
+ {
+ private Nickname user;
+ public Nickname User
+ {
+ get { return user; }
+ internal set { user = value; }
+ }
+ }
+ [CLSCompliant(true)]
+ public class UserJoin : UserMove
+ {
+ }
+ [CLSCompliant(true)]
+ public class UserPart : UserMove
+ {
+ }
+}
Modified: trunk/Client/Properties/AssemblyInfo.cs
==============================================================================
--- trunk/Client/Properties/AssemblyInfo.cs (original)
+++ trunk/Client/Properties/AssemblyInfo.cs Sun Aug 12 02:36:41 2007
@@ -35,5 +35,5 @@
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
-[assembly: AssemblyVersion("1.0.2.0")]
-[assembly: AssemblyFileVersion("1.0.2.0")]
+[assembly: AssemblyVersion("1.1.0.0")]
+[assembly: AssemblyFileVersion("1.1.0.0")]
Added: trunk/Client/Servername.cs
==============================================================================
--- (empty file)
+++ trunk/Client/Servername.cs Sun Aug 12 02:36:41 2007
@@ -0,0 +1,131 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+
+namespace Irc.Objects
+{
+ public sealed class Servername : Target, IComparable, IFormattable
+ {
+ private string network;
+ private string hostmask;
+ private int port;
+ private bool ssl;
+ private List<string> adminInfo = new List<string>();
+ private List<Mode> supportedModes = new List<Mode>();
+ private Motd motd;
+
+ public string Hostmask
+ {
+ internal set { hostmask = value; }
+ get { return hostmask; }
+ }
+ public string Network
+ {
+ internal set { network = value; }
+ get { return network; }
+ }
+ public int Port
+ {
+ internal set { port = value; }
+ get { return port; }
+ }
+ public bool Ssl
+ {
+ internal set { ssl = value; }
+ get { return ssl; }
+ }
+ public Collection<string> AdminInfo
+ {
+ internal set
+ {
+ lock(this)
+ {
+ adminInfo.Clear();
+ foreach(string s in value)
+ adminInfo.Add(s);
+ }
+ }
+ get { return new Collection<string>(adminInfo); }
+ }
+ public Collection<Mode> SupportedModes
+ {
+ internal set
+ {
+ lock(this)
+ {
+ supportedModes.Clear();
+ supportedModes.AddRange(value);
+ }
+ }
+ get { return new Collection<Mode>(supportedModes); }
+ }
+ public Motd MessageOfTheDay
+ {
+ internal set { motd = value; }
+ get { return motd; }
+ }
+ public Servername(string hostmask, int port, bool ssl)
+ {
+ this.hostmask = hostmask;
+ this.port = port;
+ this.ssl = ssl;
+ }
+ public Servername(string hostmask) : this(hostmask, 6667, false) {}
+ public Servername(string hostmask, int port) : this(hostmask, port, false) {}
+
+ public override string ToString()
+ {
+ return ToString("G", System.Globalization.CultureInfo.CurrentCulture);
+ }
+ public int CompareTo(object obj)
+ {
+ return Hostmask.CompareTo(obj);
+ }
+ public override bool Equals(object obj)
+ {
+ return CompareTo(obj) == 0;
+ }
+ public override int GetHashCode()
+ {
+ return base.GetHashCode();
+ }
+ public string ToString(string format, IFormatProvider formatProvider)
+ {
+ return Hostmask;
+ }
+ public static bool operator==(Servername obj1, Servername obj2)
+ {
+ // prevent infinite recursion
+ if(((object)obj1) == null || ((object)obj2) == null)
+ if(((object)obj1) == null && ((object)obj2) == null)
+ return true;
+ else
+ return false;
+ if(((object)obj1) != null)
+ return obj1.Equals(obj2);
+ else return ((object)obj2) == null;
+ }
+ public static bool operator!=(Servername obj1, Servername obj2)
+ {
+ return !(obj1 == obj2);
+ }
+ public static int operator>(Servername obj1, Servername obj2)
+ {
+ if(obj1 != null)
+ return obj1.CompareTo(obj2);
+ else return 1;
+ }
+ public static int operator<(Servername obj1, Servername obj2)
+ {
+ if(obj2 != null)
+ return obj2.CompareTo(obj1);
+ else return 1;
+ }
+ public static implicit operator string(Servername server)
+ {
+ if(server != null)
+ return server.ToString();
+ else return String.Empty;
+ }
+ }
+}
Modified: trunk/Frontend/ChannelTab.cs
==============================================================================
--- trunk/Frontend/ChannelTab.cs (original)
+++ trunk/Frontend/ChannelTab.cs Sun Aug 12 02:36:41 2007
@@ -6,6 +6,8 @@
using System.Text;
using System.Windows.Forms;
using Irc;
+using Irc.Events;
+using Irc.Objects;
namespace Irc.Net
{
@@ -24,54 +26,65 @@
CommandText.KeyDown += Main.ParseCommand;
Name = channel.Name;
Dock = DockStyle.Fill;
- if(channel.Topic != String.Empty)
+ if(channel.Topic != null)
{
- Topic.Text = channel.Topic;
- AddMessage(String.Format(Strings.TopicChangeText, channel.Topic, channel.TopicSetter, channel.TopicSetTime.ToString(SettingsManager.Instance["TimestampFormat"])));
+ Topic.Text = channel.Topic.Text;
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = String.Format(Strings.TopicChangeText, channel.Topic.Text, channel.Topic.Sender, channel.Topic.Time.ToString(SettingsManager.Instance["TimestampFormat"]));
+ AddMessage(m);
}
#region event handlers
channel.Join += delegate(object sender, JoinEventArgs e) {
- if(!e.User.Equals(new Nickname(((Network)FindForm()).Client.Nickname)))
- AddMessage(String.Format((e.Mode == JoinMode.Join ? Strings.ChannelJoinText : Strings.ChannelPartText), e.User, e.Channel.Name));
- if(e.Mode == JoinMode.Join)
- Nicknames.BeginInvoke((MethodInvoker)delegate {if(!Nicknames.Items.Contains(e.User))Nicknames.Items.Add(e.User);});
- else if(e.Mode == JoinMode.Part)
- Nicknames.BeginInvoke((MethodInvoker)delegate {if(Nicknames.Items.Contains(e.User))Nicknames.Items.Remove(e.User);});
+ if(FindForm() == null)
+ return;
+ if(!e.Movement.User.Equals(new Nickname(((Network)FindForm()).Client.Nickname)))
+ {
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = String.Format((e.Movement is UserJoin ? Strings.ChannelJoinText : Strings.ChannelPartText), e.Movement.User, e.Movement.Target);
+ AddMessage(m);
+ }
+ if(e.Movement is UserJoin)
+ Nicknames.BeginInvoke((MethodInvoker)delegate {if(!Nicknames.Items.Contains(e.Movement.User))Nicknames.Items.Add(e.Movement.User);});
+ else if(e.Movement is UserPart)
+ Nicknames.BeginInvoke((MethodInvoker)delegate {if(Nicknames.Items.Contains(e.Movement.User))Nicknames.Items.Remove(e.Movement.User);});
};
channel.Nicklist += delegate(object sender, NicklistEventArgs e) {
Nicknames.BeginInvoke((MethodInvoker)delegate {
- foreach(Nickname item in e.Nicklist)
+ foreach(Nickname item in e.Nicklist.Nicknames)
if(!Nicknames.Items.Contains(item))
Nicknames.Items.Add(item);
});
};
channel.PublicMessage += delegate(object sender, MessageEventArgs e) {
- AddMessage(String.Format(Strings.MessageText, e.Sender, e.Message));
+ AddMessage(e.Message);
};
channel.PublicNotice += delegate(object sender, MessageEventArgs e) {
- AddMessage(String.Format(Strings.NoticeText, e.Sender, e.Message));
+ AddMessage(e.Message);
};
channel.PublicAction += delegate(object sender, MessageEventArgs e) {
- AddMessage(String.Format(Strings.ActionText, e.Sender, e.Message));
+ AddMessage(e.Message);
};
channel.NickChange += delegate(object sender, NickEventArgs e) {
- AddMessage(String.Format(Strings.NickChangeText, e.OldNick, e.NewNick));
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = String.Format(Strings.NickChangeText, e.OldNick, e.NewNick);
+ AddMessage(m);
};
channel.TopicChange += delegate(object sender, TopicEventArgs e) {
- Topic.Invoke((MethodInvoker)delegate{Topic.Text = e.NewTopic;});
- AddMessage(String.Format(Strings.TopicChangeText, e.NewTopic, e.Sender, e.Time.ToString(SettingsManager.Instance["TimestampFormat"])));
+ Topic.Invoke((MethodInvoker)delegate{Topic.Text = e.Topic.Text;});
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = String.Format(Strings.TopicChangeText, e.Topic.Text, e.Topic.Sender, e.Topic.Time.ToString(SettingsManager.Instance["TimestampFormat"]));
+ AddMessage(m);
};
#endregion
}
- public void AddMessage(string message)
+ public void AddMessage(Irc.Objects.Message message)
{
if(ChannelText.Created)
ChannelText.Invoke((MethodInvoker)delegate{
- if(SettingsManager.Instance.UseTimestamps == true)
- ChannelText.AppendText(String.Format(Strings.TimestampText, DateTime.Now.ToString(SettingsManager.Instance["TimestampFormat"])));
- ChannelText.AppendText(message + Environment.NewLine);
+ ChannelText.AppendMessage(message);
});
+ Refocus();
}
private void ChangeTopic(object sender, KeyEventArgs e)
{
@@ -82,7 +95,8 @@
}
public void Refocus()
{
- CommandText.Focus();
+ if(CommandText.Created)
+ CommandText.BeginInvoke((MethodInvoker)delegate { CommandText.Focus(); });
}
public void PartChannel()
{
Modified: trunk/Frontend/ChatTextBox.cs
==============================================================================
--- trunk/Frontend/ChatTextBox.cs (original)
+++ trunk/Frontend/ChatTextBox.cs Sun Aug 12 02:36:41 2007
@@ -1,6 +1,10 @@
using System;
-using System.Runtime.InteropServices;
+using System.Text;
+using System.Drawing;
+using System.Text.RegularExpressions;
using System.Windows.Forms;
+using Irc.Objects;
+using Irc.Net;
namespace System.Windows.Forms
{
@@ -9,10 +13,54 @@
/// </summary>
public class ChatTextBox : RichTextBox
{
+ private bool useIrcColors = true;
+ private bool useIrcBold = true;
+ private bool useIrcReverse = true;
+ private bool useIrcUnderline = true;
+ private Irc.Objects.Message lastMessage;
+ private Color[] ColorChart = new Color[]
+ {
+ Color.White,
+ Color.Black,
+ Color.DarkBlue,
+ Color.Green,
+ Color.Red,
+ Color.Maroon,
+ Color.Purple,
+ Color.Orange,
+ Color.Yellow,
+ Color.LimeGreen,
+ Color.Aqua,
+ Color.SkyBlue,
+ Color.Blue,
+ Color.Pink,
+ Color.DarkGray,
+ Color.Gray
+ };
public ChatTextBox()
{
ReadOnly = true;
- BackColor = System.Drawing.Color.White;
+ BackColor = Color.White;
+ }
+ public bool UseIrcColors
+ {
+ get { return useIrcColors; }
+ set { useIrcColors = value; }
+ }
+ public bool UseIrcBold
+ {
+ get { return useIrcBold; }
+ set { useIrcBold = value; }
+ }
+ public bool UseIrcReverse
+ {
+ get { return useIrcReverse; }
+ set { useIrcReverse = value; }
+ }
+ public bool UseIrcUnderline
+ {
+ get { return useIrcUnderline; }
+ set { useIrcUnderline= value; }
}
// public void CreateMyBorderlessWindow()
@@ -23,47 +71,99 @@
// this.StartPosition = FormStartPosition.CenterScreen;
// this.ControlBox = false;
// }
- protected override void OnTextChanged(EventArgs e)
+ protected void SetColor(Color c)
+ {
+ SelectionColor = c;
+ }
+ protected void SetBackColor(Color c)
+ {
+ SelectionBackColor = c;
+ }
+ protected void SetFontStyle(FontStyle fs)
+ {
+ SelectionFont = new Font(Font, fs);
+ }
+
+ public new void AppendText(string message)
+ {
+ // we walk down the string, setting modes as they come, and applying styles
+ for(int i = 0; i < message.Length; i++)
+ {
+ char c = message[i];
+ switch(c)
+ {
+ case ((char)2): // bold
+ if(SelectionFont.Style == FontStyle.Bold)
+ SetFontStyle(FontStyle.Regular);
+ else
+ SetFontStyle(FontStyle.Bold);
+ break;
+ case ((char)3): // set color
+ int forecolor = 1;
+ int backcolor = 0;
+ if(Char.IsDigit(message[i+1]))
+ {
+ int offset = message.IndexOf(',', i, 5);
+ forecolor = Int32.Parse(message.Substring(i+1, Char.IsDigit(message[i+2]) ? 2 : 1));
+ if(offset != -1) // we have a back color as well
+ backcolor = Int32.Parse(message.Substring(offset+1, Char.IsDigit(message[i+5]) ? 2 : 1));
+ i += (forecolor >= 0 && forecolor < 10 ? 1 : 2);
+ i += (offset == -1 ? 0 : (backcolor >= 0 && backcolor < 10 ? 2 : 3));
+ }
+ SetColor(ColorChart[forecolor]);
+ SetBackColor(ColorChart[backcolor]);
+ break;
+ case ((char)22): // reverse
+ if(SelectionColor == BackColor)
+ {
+ SetColor(ForeColor);
+ SetBackColor(BackColor);
+ }
+ else
+ {
+ SetColor(BackColor);
+ SetBackColor(ForeColor);
+ }
+ break;
+ case ((char)15): // reset formatting
+ SetColor(ForeColor);
+ SetBackColor(BackColor);
+ SetFontStyle(FontStyle.Regular);
+ break;
+ case ((char)31): // underline
+ if(SelectionFont.Style == FontStyle.Underline)
+ SetFontStyle(FontStyle.Regular);
+ else
+ SetFontStyle(FontStyle.Underline);
+ break;
+ default:
+ base.AppendText("" + c);
+ break;
+ }
+ }
+ // reset the formatting back to the original state
+ SetFontStyle(FontStyle.Regular);
+ SetColor(ForeColor);
+ SetBackColor(BackColor);
+ }
+ public void AppendMessage(Irc.Objects.Message message)
{
- SCROLLINFO info = new SCROLLINFO();
- info.cbSize = Marshal.SizeOf(info);
- info.fMask = (int)ScrollInfoMask.SIF_RANGE;
- GetScrollInfo(Handle, (int)ScrollBarDirection.SB_VERT, ref info);
- if(info.nPos == info.nMax)
- ScrollToCaret();
- base.OnTextChanged(e);
- }
- #region imports for SCROLLINFO
- [DllImport("user32.dll")]
- [return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool GetScrollInfo(IntPtr hwnd, int fnBar, ref SCROLLINFO lpsi);
- [Serializable, StructLayout(LayoutKind.Sequential)]
- private struct SCROLLINFO
- {
- public int cbSize;
- public int fMask;
- public int nMin;
- public int nMax;
- public int nPage;
- public int nPos;
- public int nTrackPos;
- }
- private enum ScrollBarDirection
- {
- SB_HORZ = 0,
- SB_VERT = 1,
- SB_CTL = 2,
- SB_BOTH = 3
- }
- private enum ScrollInfoMask
- {
- SIF_RANGE = 0x1,
- SIF_PAGE = 0x2,
- SIF_POS = 0x4,
- SIF_DISABLENOSCROLL = 0x8,
- SIF_TRACKPOS = 0x10,
- SIF_ALL = SIF_RANGE + SIF_PAGE + SIF_POS + SIF_TRACKPOS
+ string text = String.Empty;
+ if(SettingsManager.Instance.UseTimestamps == true)
+ text += String.Format(Strings.TimestampText, message.Time.ToString(SettingsManager.Instance["TimestampFormat"]));
+ if(message.Target != null)
+ text += String.Format(
+ (message is PublicMessage || message is PrivateMessage ? Strings.MessageText :
+ (message is PublicAction || message is PrivateAction ? Strings.ActionText :
+ (message is ServerMessage || message is ServerNotice ? Strings.NoticeText :
+ Strings.ActionText))),
+ message.Sender, message.Text);
+ else // we assume we have a preformatted message it Target is null
+ text += message.Text;
+ text = text.TrimEnd(' ', '\r', '\n');
+ text += "\n";
+ AppendText(text);
+ lastMessage = message;
}
- #endregion
}
}
Modified: trunk/Frontend/CommandManager.cs
==============================================================================
--- trunk/Frontend/CommandManager.cs (original)
+++ trunk/Frontend/CommandManager.cs Sun Aug 12 02:36:41 2007
@@ -1,5 +1,6 @@
-using Irc;
using System;
+using Irc.Events;
+using Irc.Objects;
using System.Reflection;
using System.Collections.Generic;
Modified: trunk/Frontend/Connect.Designer.cs
==============================================================================
--- trunk/Frontend/Connect.Designer.cs (original)
+++ trunk/Frontend/Connect.Designer.cs Sun Aug 12 02:36:41 2007
@@ -40,6 +40,7 @@
this.password = new System.Windows.Forms.TextBox();
this.username = new System.Windows.Forms.TextBox();
this.cancelButton = new System.Windows.Forms.Button();
+ this.AutoConnect = new System.Windows.Forms.CheckBox();
label1 = new System.Windows.Forms.Label();
label2 = new System.Windows.Forms.Label();
label3 = new System.Windows.Forms.Label();
@@ -53,7 +54,7 @@
label1.Location = new System.Drawing.Point(12, 9);
label1.Name = "label1";
label1.Size = new System.Drawing.Size(91, 13);
- label1.TabIndex = 7;
+ label1.TabIndex = 12;
label1.Text = "Connection String";
//
// label2
@@ -95,10 +96,10 @@
// connectButton
//
this.connectButton.DialogResult = System.Windows.Forms.DialogResult.OK;
- this.connectButton.Location = new System.Drawing.Point(12, 207);
+ this.connectButton.Location = new System.Drawing.Point(12, 231);
this.connectButton.Name = "connectButton";
this.connectButton.Size = new System.Drawing.Size(75, 23);
- this.connectButton.TabIndex = 5;
+ this.connectButton.TabIndex = 6;
this.connectButton.Text = "Connect";
this.connectButton.UseVisualStyleBackColor = true;
//
@@ -140,21 +141,32 @@
// cancelButton
//
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.cancelButton.Location = new System.Drawing.Point(93, 207);
+ this.cancelButton.Location = new System.Drawing.Point(93, 231);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(75, 23);
- this.cancelButton.TabIndex = 6;
+ this.cancelButton.TabIndex = 7;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
//
+ // AutoConnect
+ //
+ this.AutoConnect.AutoSize = true;
+ this.AutoConnect.Location = new System.Drawing.Point(12, 208);
+ this.AutoConnect.Name = "AutoConnect";
+ this.AutoConnect.Size = new System.Drawing.Size(91, 17);
+ this.AutoConnect.TabIndex = 5;
+ this.AutoConnect.Text = "Auto Connect";
+ this.AutoConnect.UseVisualStyleBackColor = true;
+ //
// Connect
//
this.AcceptButton = this.connectButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.cancelButton;
- this.ClientSize = new System.Drawing.Size(184, 237);
+ this.ClientSize = new System.Drawing.Size(184, 266);
this.ControlBox = false;
+ this.Controls.Add(this.AutoConnect);
this.Controls.Add(this.cancelButton);
this.Controls.Add(label5);
this.Controls.Add(label4);
@@ -178,6 +190,7 @@
this.TopMost = true;
this.ResumeLayout(false);
this.PerformLayout();
+
}
#endregion
@@ -189,5 +202,6 @@
public System.Windows.Forms.TextBox realname;
public System.Windows.Forms.TextBox password;
public System.Windows.Forms.TextBox username;
+ public System.Windows.Forms.CheckBox AutoConnect;
}
}
Modified: trunk/Frontend/Main.Designer.cs
==============================================================================
--- trunk/Frontend/Main.Designer.cs (original)
+++ trunk/Frontend/Main.Designer.cs Sun Aug 12 02:36:41 2007
@@ -34,6 +34,11 @@
System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
this.connectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.connectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();
+ this.connectToCurrentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem();
+ this.disconnectFromCurrentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.disconnectFromAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -64,6 +69,7 @@
this.connectionToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.connectionToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.connectToolStripMenuItem,
+ this.toolStripMenuItem3,
this.toolStripSeparator1,
this.exitToolStripMenuItem});
this.connectionToolStripMenuItem.Name = "connectionToolStripMenuItem";
@@ -75,6 +81,40 @@
resources.ApplyResources(this.connectToolStripMenuItem, "connectToolStripMenuItem");
this.connectToolStripMenuItem.Click += new System.EventHandler(this.OpenConnection);
//
+ // toolStripMenuItem3
+ //
+ this.toolStripMenuItem3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.connectToCurrentToolStripMenuItem,
+ this.toolStripMenuItem4,
+ this.disconnectFromCurrentToolStripMenuItem,
+ this.disconnectFromAllToolStripMenuItem});
+ this.toolStripMenuItem3.Name = "toolStripMenuItem3";
+ resources.ApplyResources(this.toolStripMenuItem3, "toolStripMenuItem3");
+ //
+ // connectToCurrentToolStripMenuItem
+ //
+ this.connectToCurrentToolStripMenuItem.Name = "connectToCurrentToolStripMenuItem";
+ resources.ApplyResources(this.connectToCurrentToolStripMenuItem, "connectToCurrentToolStripMenuItem");
+ this.connectToCurrentToolStripMenuItem.Click += new System.EventHandler(this.CurrentConnectClick);
+ //
+ // toolStripMenuItem4
+ //
+ this.toolStripMenuItem4.Name = "toolStripMenuItem4";
+ resources.ApplyResources(this.toolStripMenuItem4, "toolStripMenuItem4");
+ this.toolStripMenuItem4.Click += new System.EventHandler(this.ConnectAllClick);
+ //
+ // disconnectFromCurrentToolStripMenuItem
+ //
+ this.disconnectFromCurrentToolStripMenuItem.Name = "disconnectFromCurrentToolStripMenuItem";
+ resources.ApplyResources(this.disconnectFromCurrentToolStripMenuItem, "disconnectFromCurrentToolStripMenuItem");
+ this.disconnectFromCurrentToolStripMenuItem.Click += new System.EventHandler(this.DisconnectCurrentClick);
+ //
+ // disconnectFromAllToolStripMenuItem
+ //
+ this.disconnectFromAllToolStripMenuItem.Name = "disconnectFromAllToolStripMenuItem";
+ resources.ApplyResources(this.disconnectFromAllToolStripMenuItem, "disconnectFromAllToolStripMenuItem");
+ this.disconnectFromAllToolStripMenuItem.Click += new System.EventHandler(this.DisconnectAllClick);
+ //
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
@@ -164,5 +204,10 @@
private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
private System.Windows.Forms.ContextMenuStrip trayStrip;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3;
+ private System.Windows.Forms.ToolStripMenuItem connectToCurrentToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem disconnectFromCurrentToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4;
+ private System.Windows.Forms.ToolStripMenuItem disconnectFromAllToolStripMenuItem;
}
}
Modified: trunk/Frontend/Main.cs
==============================================================================
--- trunk/Frontend/Main.cs (original)
+++ trunk/Frontend/Main.cs Sun Aug 12 02:36:41 2007
@@ -5,6 +5,8 @@
using System.Configuration;
using System.ComponentModel;
using System.Collections.Generic;
+using Irc.Objects;
+using Irc.Events;
namespace Irc.Net
{
@@ -12,10 +14,6 @@
{
public event EventHandler<NetworkEventArgs> NewConnection;
- /*
- *
- */
-
protected void OnNewConnectionEvent(Network network)
{
NetworkEventArgs e = new NetworkEventArgs();
@@ -84,15 +82,16 @@
for(int i = 0; i < parameters.Length; i++)
clientObject.JoinChannel(parameters[0]);
else if(target is Channel)
- clientObject.JoinChannel(((Channel)target).Name);
+ ((Channel)target).Rejoin();
}
internal void PartChannelCmd(Client clientObject, Target target, string[] parameters)
{
if(parameters.Length > 0)
for(int i = 0; i < parameters.Length; i++)
- clientObject.PartChannel(parameters[i]);
+ if(clientObject.Channels.ContainsKey(parameters[i]))
+ clientObject.Channels[parameters[i]].Part();
else if(target is Channel)
- clientObject.PartChannel(((Channel)target).Name);
+ ((Channel)target).Part();
}
internal void QuitCmd(Client clientObject, Target target, string[] parameters)
{
@@ -108,22 +107,30 @@
{
if(parameters.Length > 0)
{
- if(target is Nickname)
- {
- clientObject.Act(((Nickname)target), String.Join(" ", parameters));
- }
- else if(target is Channel)
- {
- clientObject.Act(((Channel)target).Name, String.Join(" ", parameters));
- }
+ Irc.Objects.Message m = null;
+ if(target is Channel)
+ m = new PublicAction();
+ else if (target is Nickname)
+ m = new PrivateAction();
+ m.Target = target;
+ m.Text = String.Join(" ", parameters);
+ clientObject.Act(m);
}
else
- ((Network)FindChildByName(clientObject.Server)).ServerWindow.AddMessage("[Error] What do you want to say?");
+ {
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = "[Error] What do you want to say?";
+ ((Network)FindChildByName(clientObject.Server)).ServerWindow.AddMessage(m);
+ }
}
internal void HopCmd(Client clientObject, Target target, string[] parameters)
{
if(target == null || target is Nickname)
- ((Network)FindChildByName(clientObject.Server)).ServerWindow.AddMessage("[Error] You can't rejoin that target!");
+ {
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = "[Error] You can't rejoin that target!";
+ ((Network)FindChildByName(clientObject.Server)).ServerWindow.AddMessage(m);
+ }
else
((Channel)target).Rejoin();
}
@@ -168,16 +175,29 @@
string[] parameters = new string[split.Length-1];
Array.Copy(split, 1, parameters, 0, split.Length-1);
if(!CommandManager.Instance.Raise(client, target, action, parameters))
- owner.ServerWindow.AddMessage("[Error] Unrecognized command \""+action+"\"");
+ {
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = "[Error] Unrecognized command \""+action+"\"";
+ owner.ServerWindow.AddMessage(m);
+ }
}
else
{
if(target is Channel)
((Channel)target).Say(command);
else if(target is Nickname)
- owner.Client.Say((Nickname)target, command);
+ {
+ PrivateMessage pm = new PrivateMessage();
+ pm.Target = (Nickname)target;
+ pm.Text = command;
+ owner.Client.Say(pm);
+ }
else
- owner.ServerWindow.AddMessage("[Error] You cannot just randomly say things to the server!");
+ {
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = "[Error] You cannot just randomly say things to the server!";
+ owner.ServerWindow.AddMessage(m);
+ }
}
cmdText.Text = String.Empty;
}
@@ -186,14 +206,18 @@
{
Connect c = new Connect();
if(c.ShowDialog() == DialogResult.OK)
- OnNewConnectionEvent(new Network(this, c.connectString.Text, c.nickname.Text, c.realname.Text, c.username.Text, c.password.Text));
+ {
+ Network n = new Network(this, c.connectString.Text, c.nickname.Text, c.realname.Text, c.username.Text, c.password.Text);
+ OnNewConnectionEvent(n);
+ if(c.AutoConnect.Checked == true)
+ n.Connect();
+ }
}
private void ExitClient(object sender, EventArgs e)
{
Application.Exit();
}
-
private void Minimize(object sender, EventArgs e)
{
if(WindowState == FormWindowState.Minimized)
@@ -251,6 +275,36 @@
trayStrip.Items.Add(new ToolStripSeparator());
trayStrip.Items.Add(show);
trayStrip.Items.Add(quit);
+ }
+
+ private void CurrentConnectClick(object sender, EventArgs e)
+ {
+ ((Network)ActiveMdiChild).Connect();
+ }
+
+ private void DisconnectCurrentClick(object sender, EventArgs e)
+ {
+ ((Network)ActiveMdiChild).Disconnect();
+ }
+
+ private void ConnectAllClick(object sender, EventArgs e)
+ {
+ foreach(Form f in MdiChildren)
+ {
+ Network n = f as Network;
+ if(n != null)
+ n.Connect();
+ }
+ }
+
+ private void DisconnectAllClick(object sender, EventArgs e)
+ {
+ foreach(Form f in MdiChildren)
+ {
+ Network n = f as Network;
+ if(n != null)
+ n.Disconnect();
+ }
}
}
public class NetworkEventArgs : EventArgs
Modified: trunk/Frontend/Main.resx
==============================================================================
--- trunk/Frontend/Main.resx (original)
+++ trunk/Frontend/Main.resx Sun Aug 12 02:36:41 2007
@@ -125,16 +125,46 @@
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="connectToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>125, 22</value>
+ <value>152, 22</value>
</data>
<data name="connectToolStripMenuItem.Text" xml:space="preserve">
<value>Connect</value>
</data>
+ <data name="connectToCurrentToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>200, 22</value>
+ </data>
+ <data name="connectToCurrentToolStripMenuItem.Text" xml:space="preserve">
+ <value>Connect to current</value>
+ </data>
+ <data name="toolStripMenuItem4.Size" type="System.Drawing.Size, System.Drawing">
+ <value>200, 22</value>
+ </data>
+ <data name="toolStripMenuItem4.Text" xml:space="preserve">
+ <value>Connect to all</value>
+ </data>
+ <data name="disconnectFromCurrentToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>200, 22</value>
+ </data>
+ <data name="disconnectFromCurrentToolStripMenuItem.Text" xml:space="preserve">
+ <value>Disconnect from current</value>
+ </data>
+ <data name="disconnectFromAllToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>200, 22</value>
+ </data>
+ <data name="disconnectFromAllToolStripMenuItem.Text" xml:space="preserve">
+ <value>Disconnect from all</value>
+ </data>
+ <data name="toolStripMenuItem3.Size" type="System.Drawing.Size, System.Drawing">
+ <value>152, 22</value>
+ </data>
+ <data name="toolStripMenuItem3.Text" xml:space="preserve">
+ <value>Connections</value>
+ </data>
<data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
- <value>122, 6</value>
+ <value>149, 6</value>
</data>
<data name="exitToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>125, 22</value>
+ <value>152, 22</value>
</data>
<data name="exitToolStripMenuItem.Text" xml:space="preserve">
<value>Exit</value>
@@ -196,7 +226,7 @@
<value>False</value>
</metadata>
<data name="toolStripMenuItem1.Size" type="System.Drawing.Size, System.Drawing">
- <value>127, 22</value>
+ <value>86, 22</value>
</data>
<data name="toolStripMenuItem1.Text" xml:space="preserve">
<value>Quit</value>
@@ -208,13 +238,13 @@
<value>183, 4</value>
</metadata>
<data name="toolStripMenuItem2.Size" type="System.Drawing.Size, System.Drawing">
- <value>127, 22</value>
+ <value>86, 22</value>
</data>
<data name="toolStripMenuItem2.Text" xml:space="preserve">
<value>Show</value>
</data>
<data name="trayStrip.Size" type="System.Drawing.Size, System.Drawing">
- <value>128, 70</value>
+ <value>87, 48</value>
</data>
<data name=">>trayStrip.Name" xml:space="preserve">
<value>trayStrip</value>
@@ -765,6 +795,36 @@
<value>connectToolStripMenuItem</value>
</data>
<data name=">>connectToolStripMenuItem.Type" xml:space="preserve">
+ <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>toolStripMenuItem3.Name" xml:space="preserve">
+ <value>toolStripMenuItem3</value>
+ </data>
+ <data name=">>toolStripMenuItem3.Type" xml:space="preserve">
+ <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>connectToCurrentToolStripMenuItem.Name" xml:space="preserve">
+ <value>connectToCurrentToolStripMenuItem</value>
+ </data>
+ <data name=">>connectToCurrentToolStripMenuItem.Type" xml:space="preserve">
+ <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>toolStripMenuItem4.Name" xml:space="preserve">
+ <value>toolStripMenuItem4</value>
+ </data>
+ <data name=">>toolStripMenuItem4.Type" xml:space="preserve">
+ <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>disconnectFromCurrentToolStripMenuItem.Name" xml:space="preserve">
+ <value>disconnectFromCurrentToolStripMenuItem</value>
+ </data>
+ <data name=">>disconnectFromCurrentToolStripMenuItem.Type" xml:space="preserve">
+ <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>disconnectFromAllToolStripMenuItem.Name" xml:space="preserve">
+ <value>disconnectFromAllToolStripMenuItem</value>
+ </data>
+ <data name=">>disconnectFromAllToolStripMenuItem.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>toolStripSeparator1.Name" xml:space="preserve">
Modified: trunk/Frontend/MessageTab.cs
==============================================================================
--- trunk/Frontend/MessageTab.cs (original)
+++ trunk/Frontend/MessageTab.cs Sun Aug 12 02:36:41 2007
@@ -5,6 +5,8 @@
using System.Data;
using System.Text;
using System.Windows.Forms;
+using Irc.Objects;
+using Irc.Events;
namespace Irc.Net
{
@@ -23,19 +25,18 @@
CommandText.Name = Name + "-" + CommandText.Name;
CommandText.KeyDown += Main.ParseCommand;
}
- public void AddMessage(string message)
+ public void AddMessage(Irc.Objects.Message message)
{
if(MessageText.Created)
MessageText.Invoke((MethodInvoker)delegate {
- if(SettingsManager.Instance.UseTimestamps == true)
- MessageText.AppendText(String.Format(Strings.TimestampText, DateTime.Now.ToString(SettingsManager.Instance["TimestampFormat"])));
- MessageText.AppendText(message + Environment.NewLine);
- TextBoxControls.ScrollToEnd(MessageText);
+ MessageText.AppendMessage(message);
});
+ Refocus();
}
public void Refocus()
{
- CommandText.Focus();
+ if(CommandText.Created)
+ CommandText.BeginInvoke((MethodInvoker)delegate { CommandText.Focus(); });
}
}
}
Modified: trunk/Frontend/Network.Designer.cs
==============================================================================
--- trunk/Frontend/Network.Designer.cs (original)
+++ trunk/Frontend/Network.Designer.cs Sun Aug 12 02:36:41 2007
@@ -28,41 +28,18 @@
/// </summary>
private void InitializeComponent()
{
- System.Windows.Forms.ToolStripContainer toolStripContainer1;
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Network));
- System.Windows.Forms.ToolStrip toolStrip1;
- System.Windows.Forms.ToolStripButton toolStripLabel1;
this.tabs = new System.Windows.Forms.DraggableTabControl();
this.serverTab = new System.Windows.Forms.TabPage();
- toolStripContainer1 = new System.Windows.Forms.ToolStripContainer();
- toolStrip1 = new System.Windows.Forms.ToolStrip();
- toolStripLabel1 = new System.Windows.Forms.ToolStripButton();
- toolStripContainer1.ContentPanel.SuspendLayout();
- toolStripContainer1.TopToolStripPanel.SuspendLayout();
- toolStripContainer1.SuspendLayout();
this.tabs.SuspendLayout();
- toolStrip1.SuspendLayout();
this.SuspendLayout();
//
- // toolStripContainer1
- //
- //
- // toolStripContainer1.ContentPanel
- //
- toolStripContainer1.ContentPanel.Controls.Add(this.tabs);
- resources.ApplyResources(toolStripContainer1.ContentPanel, "toolStripContainer1.ContentPanel");
- resources.ApplyResources(toolStripContainer1, "toolStripContainer1");
- toolStripContainer1.Name = "toolStripContainer1";
- //
- // toolStripContainer1.TopToolStripPanel
- //
- toolStripContainer1.TopToolStripPanel.Controls.Add(toolStrip1);
- //
// tabs
//
this.tabs.AllowDrop = true;
- this.tabs.TabPages.Add(this.serverTab);
+ this.tabs.Controls.Add(this.serverTab);
resources.ApplyResources(this.tabs, "tabs");
+ this.tabs.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
this.tabs.HotTrack = true;
this.tabs.Multiline = true;
this.tabs.Name = "tabs";
@@ -74,41 +51,16 @@
this.serverTab.Name = "serverTab";
this.serverTab.UseVisualStyleBackColor = true;
//
- // toolStrip1
- //
- resources.ApplyResources(toolStrip1, "toolStrip1");
- toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
- toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- toolStripLabel1});
- toolStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Flow;
- toolStrip1.Name = "toolStrip1";
- toolStrip1.Stretch = true;
- //
- // toolStripLabel1
- //
- toolStripLabel1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- toolStripLabel1.Image = global::Irc.Net.Icons.connect;
- resources.ApplyResources(toolStripLabel1, "toolStripLabel1");
- toolStripLabel1.Name = "toolStripLabel1";
- toolStripLabel1.Click += new System.EventHandler(this.ConnectClick);
- //
// Network
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.Controls.Add(toolStripContainer1);
+ this.Controls.Add(this.tabs);
this.Name = "Network";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.CloseNetwork);
- toolStripContainer1.ContentPanel.ResumeLayout(false);
- toolStripContainer1.TopToolStripPanel.ResumeLayout(false);
- toolStripContainer1.TopToolStripPanel.PerformLayout();
- toolStripContainer1.ResumeLayout(false);
- toolStripContainer1.PerformLayout();
this.tabs.ResumeLayout(false);
- toolStrip1.ResumeLayout(false);
- toolStrip1.PerformLayout();
this.ResumeLayout(false);
}
@@ -117,5 +69,6 @@
private System.Windows.Forms.DraggableTabControl tabs;
private System.Windows.Forms.TabPage serverTab;
+
}
}
Modified: trunk/Frontend/Network.cs
==============================================================================
--- trunk/Frontend/Network.cs (original)
+++ trunk/Frontend/Network.cs Sun Aug 12 02:36:41 2007
@@ -1,5 +1,7 @@
using Irc;
using System;
+using Irc.Events;
+using Irc.Objects;
using System.Data;
using System.Text;
using System.Drawing;
@@ -38,7 +40,7 @@
server = options.Groups["server"].Value;
port = options.Groups["port"].Success ? Convert.ToInt32(options.Groups["port"].Value) : 6667;
ssl = options.Groups["ssl"].Success ? true : false;
- client = new Client(server, port, ssl, nick, user, real, pass);
+ client = new Client(new Servername(server, port, ssl), new Nickname(nick, real, "*", user), pass);
client.SslCertValidation += ValidateCert;
client.Debug = SettingsManager.Instance.DebugMessages;
InitializeComponent();
@@ -55,49 +57,65 @@
e.Cancel = true;
};
#region debug message event handler
- client.DebugMessage += delegate(object sender, DebugMessageEventArgs e)
+ client.DebugMessage += delegate(object sender, MessageEventArgs e)
{
- ServerWindow.AddMessage(e.RawMessage);
+ ServerWindow.AddMessage(e.Message);
};
#endregion
#region server notice event handler
client.ServerNotice += delegate(object sender, ServerEventArgs e)
{
- ServerWindow.AddMessage(e.Server + ": " + e.Message);
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = e.Message.Sender + ": " + e.Message.Text;
+ ServerWindow.AddMessage(m);
};
client.ErrorMessage += delegate(object sender, ServerEventArgs e)
{
- ServerWindow.AddMessage("["+e.Server+"] Error: "+ e.Message);
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = "["+e.Message.Sender+"] Error: "+ e.Message.Text;
+ ServerWindow.AddMessage(m);
+ };
+ client.Connecting += delegate(object sender, ConnectEventArgs e)
+ {
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = "Connecting to " + e.Server;
+ ServerWindow.AddMessage(m);
};
#endregion
#region motd event handler
client.MotdReady += delegate(object sender, MotdEventArgs e)
{
- ServerWindow.AddMessage("MOTD for "+e.Server+":\n"+e.Motd);
+ Irc.Objects.Message m = new Irc.Objects.Message();
+ m.Text = "MOTD for "+e.Motd.Target+":\n"+e.Motd.Message;
+ ServerWindow.AddMessage(m);
};
#endregion
#region ctcp event handler
client.CtcpMessage += delegate(object sender, CtcpEventArgs e)
{
- if(e.Message == "version")
+ if(e.Message.Text == "version")
{
string version = Application.ProductVersion, version2 = System.Reflection.Assembly.GetAssembly(typeof(Client)).GetName().Version.ToString();
- client.CtcpReply(e.Sender, "version", "IRC.NET Version " + version + ", Client library version " + version2);
+ Ctcp reply = new Ctcp();
+ reply.Target = e.Message.Sender;
+ reply.Text = "version";
+ reply.Parameters = "IRC.NET Version " + version + ", Client library version " + version2;
+ client.CtcpReply(reply);
}
};
#endregion
#region join event handler
client.SelfJoin += delegate(object sender, JoinEventArgs e)
{
- if(e.Mode == JoinMode.Join)
+ if(e.Movement is UserJoin)
{
- TabPage tab = new TabPage(e.Channel.Name);
- tab.Name = e.Channel.Name;
- ChannelTab channel = new ChannelTab(e.Channel);
+ TabPage tab = new TabPage(((Channel)e.Movement.Target).Name);
+ tab.Name = ((Channel)e.Movement.Target).Name;
+ ChannelTab channel = new ChannelTab((Channel)e.Movement.Target);
tab.Controls.Add(channel);
ContextMenuStrip menu = new ContextMenuStrip();
menu.ShowImageMargin = false;
- menu.Items.Add(new ToolStripMenuItem("Close", null, new EventHandler(CloseChannel), e.Channel.Name));
+ menu.Items.Add(new ToolStripMenuItem("Close", null, new EventHandler(CloseChannel), ((Channel)e.Movement.Target).Name));
tab.ContextMenuStrip = menu;
tab.MouseClick += delegate(object s, MouseEventArgs ev) {
if(ev.Button == MouseButtons.Right)
@@ -108,25 +126,22 @@
if(SettingsManager.Instance.AutofocusChannels == true)
tabs.SelectTab(tab);
});
- } else if(e.Mode == JoinMode.Part)
- tabs.BeginInvoke((MethodInvoker)delegate { tabs.Controls.Remove(tabs.Controls.Find(e.Channel.Name, false)[0]); });
+ } else if(e.Movement is UserPart)
+ tabs.BeginInvoke((MethodInvoker)delegate { tabs.Controls.Remove(tabs.Controls.Find(((Channel)e.Movement.Target).Name, false)[0]); });
};
#endregion
#region message event handlers
client.PrivateMessage += delegate(object sender, MessageEventArgs e)
{
- PrivateMessageEventArgs ex = e as PrivateMessageEventArgs;
- AddPrivateMessage((ex.Target == client.Nickname ? ex.Sender : ex.Target), String.Format(Strings.MessageText, ex.Sender, ex.Message));
+ AddPrivateMessage((Nickname)(((Nickname)((PrivateMessage)e.Message).Target) == client.Nickname ? ((PrivateMessage)e.Message).Sender : e.Message.Target), String.Format(Strings.MessageText, e.Message.Sender, e.Message.Text));
};
client.PrivateNotice += delegate(object sender, MessageEventArgs e)
{
- PrivateMessageEventArgs ex = e as PrivateMessageEventArgs;
- AddPrivateMessage((ex.Target == client.Nickname ? ex.Sender : ex.Target), String.Format(Strings.NoticeText, ex.Sender, ex.Message));
+ AddPrivateMessage((Nickname)(((Nickname)((PrivateMessage)e.Message).Target) == client.Nickname ? ((PrivateMessage)e.Message).Sender : e.Message.Target), String.Format(Strings.NoticeText, e.Message.Sender, e.Message.Text));
};
client.PrivateAction += delegate(object sender, MessageEventArgs e)
{
- PrivateMessageEventArgs ex = e as PrivateMessageEventArgs;
- AddPrivateMessage((ex.Target == client.Nickname ? ex.Sender : ex.Target), String.Format(Strings.ActionText, ex.Sender, ex.Message));
+ AddPrivateMessage((Nickname)(((Nickname)((PrivateMessage)e.Message).Target) == client.Nickname ? ((PrivateMessage)e.Message).Sender : e.Message.Target), String.Format(Strings.ActionText, e.Message.Sender, e.Message.Text));
};
#endregion
Show();
@@ -205,7 +220,11 @@
tabs.SelectedTab = tab;
target = messageWindow;
}
- target.AddMessage(message);
+ PrivateMessage pm = new PrivateMessage();
+ pm.Sender = sender;
+ pm.Target = client.Nickname;
+ pm.Text = message;
+ target.AddMessage(pm);
});
}
private void CloseNetwork(object sender, FormClosedEventArgs e)
@@ -213,20 +232,18 @@
if(IsConnected)
client.Disconnect();
}
- private void ConnectClick(object sender, EventArgs e)
+ public void Connect()
{
- ToolStripButton button = sender as ToolStripButton;
if(!client.Registered)
{
client.Connect();
- button.Text = "Disconnect";
- button.Image = Icons.disconnect;
}
- else
+ }
+ public void Disconnect()
+ {
+ if(client.Registered)
{
client.Disconnect();
- button.Text = "Connect";
- button.Image = Icons.connect;
}
}
private void CloseChannel(object sender, EventArgs e)
Modified: trunk/Frontend/Network.resx
==============================================================================
--- trunk/Frontend/Network.resx (original)
+++ trunk/Frontend/Network.resx Sun Aug 12 02:36:41 2007
@@ -117,21 +117,6 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
- <metadata name="toolStripContainer1.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
- <value>False</value>
- </metadata>
- <data name=">>toolStripContainer1.BottomToolStripPanel.Name" xml:space="preserve">
- <value>toolStripContainer1.BottomToolStripPanel</value>
- </data>
- <data name=">>toolStripContainer1.BottomToolStripPanel.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
- <data name=">>toolStripContainer1.BottomToolStripPanel.Parent" xml:space="preserve">
- <value>toolStripContainer1</value>
- </data>
- <data name=">>toolStripContainer1.BottomToolStripPanel.ZOrder" xml:space="preserve">
- <value>4</value>
- </data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="serverTab.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value>
@@ -141,7 +126,7 @@
<value>3, 3, 3, 3</value>
</data>
<data name="serverTab.Size" type="System.Drawing.Size, System.Drawing">
- <value>514, 324</value>
+ <value>514, 347</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="serverTab.TabIndex" type="System.Int32, mscorlib">
@@ -165,142 +150,25 @@
<data name="tabs.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
+ <data name="tabs.Padding" type="System.Drawing.Point, System.Drawing">
+ <value>17, 3</value>
+ </data>
<data name="tabs.Size" type="System.Drawing.Size, System.Drawing">
- <value>522, 350</value>
+ <value>522, 373</value>
</data>
<data name="tabs.TabIndex" type="System.Int32, mscorlib">
- <value>1</value>
+ <value>2</value>
</data>
<data name=">>tabs.Name" xml:space="preserve">
<value>tabs</value>
</data>
<data name=">>tabs.Type" xml:space="preserve">
- <value>System.Windows.Forms.DraggableTabControl, IRC.NET, Version=0.3.1.0, Culture=neutral, PublicKeyToken=de6ac271e5fe86ed</value>
+ <value>System.Windows.Forms.DraggableTabControl, IRC.NET, Version=0.3.2.0, Culture=neutral, PublicKeyToken=de6ac271e5fe86ed</value>
</data>
<data name=">>tabs.Parent" xml:space="preserve">
- <value>toolStripContainer1.ContentPanel</value>
- </data>
- <data name=">>tabs.ZOrder" xml:space="preserve">
- <value>0</value>
- </data>
- <data name="toolStripContainer1.ContentPanel.Size" type="System.Drawing.Size, System.Drawing">
- <value>522, 350</value>
- </data>
- <data name=">>toolStripContainer1.ContentPanel.Name" xml:space="preserve">
- <value>toolStripContainer1.ContentPanel</value>
- </data>
- <data name=">>toolStripContainer1.ContentPanel.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripContentPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
- <data name=">>toolStripContainer1.ContentPanel.Parent" xml:space="preserve">
- <value>toolStripContainer1</value>
- </data>
- <data name=">>toolStripContainer1.ContentPanel.ZOrder" xml:space="preserve">
- <value>0</value>
- </data>
- <data name="toolStripContainer1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
- <value>Fill</value>
- </data>
- <data name=">>toolStripContainer1.LeftToolStripPanel.Name" xml:space="preserve">
- <value>toolStripContainer1.LeftToolStripPanel</value>
- </data>
- <data name=">>toolStripContainer1.LeftToolStripPanel.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
- <data name=">>toolStripContainer1.LeftToolStripPanel.Parent" xml:space="preserve">
- <value>toolStripContainer1</value>
- </data>
- <data name=">>toolStripContainer1.LeftToolStripPanel.ZOrder" xml:space="preserve">
- <value>1</value>
- </data>
- <data name="toolStripContainer1.Location" type="System.Drawing.Point, System.Drawing">
- <value>0, 0</value>
- </data>
- <data name=">>toolStripContainer1.RightToolStripPanel.Name" xml:space="preserve">
- <value>toolStripContainer1.RightToolStripPanel</value>
- </data>
- <data name=">>toolStripContainer1.RightToolStripPanel.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
- <data name=">>toolStripContainer1.RightToolStripPanel.Parent" xml:space="preserve">
- <value>toolStripContainer1</value>
- </data>
- <data name=">>toolStripContainer1.RightToolStripPanel.ZOrder" xml:space="preserve">
- <value>2</value>
- </data>
- <data name="toolStripContainer1.Size" type="System.Drawing.Size, System.Drawing">
- <value>522, 373</value>
- </data>
- <data name="toolStripContainer1.TabIndex" type="System.Int32, mscorlib">
- <value>0</value>
- </data>
- <data name="toolStripContainer1.Text" xml:space="preserve">
- <value>toolStripContainer1</value>
- </data>
- <metadata name="toolStrip1.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
- <value>False</value>
- </metadata>
- <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
- <value>0, 0</value>
- </metadata>
- <data name="toolStrip1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
- <value>None</value>
- </data>
- <metadata name="toolStripLabel1.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
- <value>False</value>
- </metadata>
- <data name="toolStripLabel1.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
- <value>Magenta</value>
- </data>
- <data name="toolStripLabel1.Size" type="System.Drawing.Size, System.Drawing">
- <value>23, 20</value>
- </data>
- <data name="toolStripLabel1.Text" xml:space="preserve">
- <value>Connect</value>
- </data>
- <data name="toolStrip1.Location" type="System.Drawing.Point, System.Drawing">
- <value>0, 0</value>
- </data>
- <data name="toolStrip1.Size" type="System.Drawing.Size, System.Drawing">
- <value>522, 23</value>
- </data>
- <data name="toolStrip1.TabIndex" type="System.Int32, mscorlib">
- <value>0</value>
- </data>
- <data name=">>toolStrip1.Name" xml:space="preserve">
- <value>toolStrip1</value>
- </data>
- <data name=">>toolStrip1.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
- <data name=">>toolStrip1.Parent" xml:space="preserve">
- <value>toolStripContainer1.TopToolStripPanel</value>
- </data>
- <data name=">>toolStrip1.ZOrder" xml:space="preserve">
- <value>0</value>
- </data>
- <data name=">>toolStripContainer1.TopToolStripPanel.Name" xml:space="preserve">
- <value>toolStripContainer1.TopToolStripPanel</value>
- </data>
- <data name=">>toolStripContainer1.TopToolStripPanel.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
- <data name=">>toolStripContainer1.TopToolStripPanel.Parent" xml:space="preserve">
- <value>toolStripContainer1</value>
- </data>
- <data name=">>toolStripContainer1.TopToolStripPanel.ZOrder" xml:space="preserve">
- <value>3</value>
- </data>
- <data name=">>toolStripContainer1.Name" xml:space="preserve">
- <value>toolStripContainer1</value>
- </data>
- <data name=">>toolStripContainer1.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
- <data name=">>toolStripContainer1.Parent" xml:space="preserve">
<value>$this</value>
</data>
- <data name=">>toolStripContainer1.ZOrder" xml:space="preserve">
+ <data name=">>tabs.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
@@ -570,12 +438,6 @@
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterParent</value>
- </data>
- <data name=">>toolStripLabel1.Name" xml:space="preserve">
- <value>toolStripLabel1</value>
- </data>
- <data name=">>toolStripLabel1.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>$this.Name" xml:space="preserve">
<value>Network</value>
Modified: trunk/Frontend/ServerTab.cs
==============================================================================
--- trunk/Frontend/ServerTab.cs (original)
+++ trunk/Frontend/ServerTab.cs Sun Aug 12 02:36:41 2007
@@ -16,21 +16,20 @@
CommandText.Name = Name + "-"+ CommandText.Name;
CommandText.KeyDown += Main.ParseCommand;
Dock = DockStyle.Fill;
- ServerText.TextChanged += delegate { TextBoxControls.ScrollToEnd(ServerText); };
Text = Name = target;
}
- public void AddMessage(string message)
+ public void AddMessage(Irc.Objects.Message message)
{
if(ServerText.Created)
ServerText.BeginInvoke((MethodInvoker)delegate {
- if(SettingsManager.Instance.UseTimestamps == true)
- ServerText.AppendText(String.Format(Strings.TimestampText, DateTime.Now.ToString(SettingsManager.Instance["TimestampFormat"])));
- ServerText.AppendText(message + Environment.NewLine);
+ ServerText.AppendMessage(message);
});
+ Refocus();
}
public void Refocus()
{
- CommandText.Focus();
+ if(CommandText.Created)
+ CommandText.BeginInvoke((MethodInvoker)delegate { CommandText.Focus(); });
}
}
}
Modified: trunk/Frontend/Strings.Designer.cs
==============================================================================
--- trunk/Frontend/Strings.Designer.cs (original)
+++ trunk/Frontend/Strings.Designer.cs Sun Aug 12 02:36:41 2007
@@ -9,121 +9,136 @@
//------------------------------------------------------------------------------
namespace Irc.Net {
- using System;
-
- /// <summary>
- /// A strongly-typed resource class, for looking up localized strings, etc.
- /// </summary>
- // This class was auto-generated by the StronglyTypedResourceBuilder
- // class via a tool like ResGen or Visual Studio.
- // To add or remove a member, edit your .ResX file then rerun ResGen
- // with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- internal class Strings {
- private static global::System.Resources.ResourceManager resourceMan;
- private static global::System.Globalization.CultureInfo resourceCulture;
- [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
- internal Strings() {
- }
- /// <summary>
- /// Returns the cached ResourceManager instance used by this class.
- /// </summary>
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Resources.ResourceManager ResourceManager {
- get {
- if (object.ReferenceEquals(resourceMan, null)) {
- global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Irc.Net.Strings", typeof(Strings).Assembly);
- resourceMan = temp;
- }
- return resourceMan;
- }
- }
- /// <summary>
- /// Overrides the current thread's CurrentUICulture property for all
- /// resource lookups using this strongly typed resource class.
- /// </summary>
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Globalization.CultureInfo Culture {
- get {
- return resourceCulture;
- }
- set {
- resourceCulture = value;
- }
- }
- /// <summary>
- /// Looks up a localized string similar to * {0} {1}.
- /// </summary>
- internal static string ActionText {
- get {
- return ResourceManager.GetString("ActionText", resourceCulture);
- }
- }
- /// <summary>
- /// Looks up a localized string similar to {0} has joined {1}.
- /// </summary>
- internal static string ChannelJoinText {
- get {
- return ResourceManager.GetString("ChannelJoinText", resourceCulture);
- }
- }
- /// <summary>
- /// Looks up a localized string similar to {0} has parted {1}.
- /// </summary>
- internal static string ChannelPartText {
- get {
- return ResourceManager.GetString("ChannelPartText", resourceCulture);
- }
- }
- /// <summary>
- /// Looks up a localized string similar to [{0}] [{1}] From {2}: {3}.
- /// </summary>
- internal static string LogMessage {
- get {
- return ResourceManager.GetString("LogMessage", resourceCulture);
- }
- }
- /// <summary>
- /// Looks up a localized string similar to <{0}> {1}.
- /// </summary>
- internal static string MessageText {
- get {
- return ResourceManager.GetString("MessageText", resourceCulture);
- }
- }
- /// <summary>
- /// Looks up a localized string similar to {0} is now known as {1}.
- /// </summary>
- internal static string NickChangeText {
- get {
- return ResourceManager.GetString("NickChangeText", resourceCulture);
- }
- }
- /// <summary>
- /// Looks up a localized string similar to -{0}- {1}.
- /// </summary>
- internal static string NoticeText {
- get {
- return ResourceManager.GetString("NoticeText", resourceCulture);
- }
- }
- /// <summary>
- /// Looks up a localized string similar to [{0}] .
- /// </summary>
- internal static string TimestampText {
- get {
- return ResourceManager.GetString("TimestampText", resourceCulture);
- }
- }
- /// <summary>
- /// Looks up a localized string similar to {1} has changed the topic to "{0}" at {2}.
- /// </summary>
- internal static string TopicChangeText {
- get {
- return ResourceManager.GetString("TopicChangeText", resourceCulture);
- }
- }
- }
+ using System;
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Strings {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Strings() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Irc.Net.Strings", typeof(Strings).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to * {0} {1}.
+ /// </summary>
+ internal static string ActionText {
+ get {
+ return ResourceManager.GetString("ActionText", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to {0} has joined {1}.
+ /// </summary>
+ internal static string ChannelJoinText {
+ get {
+ return ResourceManager.GetString("ChannelJoinText", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to {0} has parted {1}.
+ /// </summary>
+ internal static string ChannelPartText {
+ get {
+ return ResourceManager.GetString("ChannelPartText", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to [{0}] [{1}] From {2}: {3}.
+ /// </summary>
+ internal static string LogMessage {
+ get {
+ return ResourceManager.GetString("LogMessage", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to <{0}> {1}.
+ /// </summary>
+ internal static string MessageText {
+ get {
+ return ResourceManager.GetString("MessageText", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to {0} is now known as {1}.
+ /// </summary>
+ internal static string NickChangeText {
+ get {
+ return ResourceManager.GetString("NickChangeText", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to -{0}- {1}.
+ /// </summary>
+ internal static string NoticeText {
+ get {
+ return ResourceManager.GetString("NoticeText", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to [{0}] .
+ /// </summary>
+ internal static string TimestampText {
+ get {
+ return ResourceManager.GetString("TimestampText", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to {1} has changed the topic to "{0}" at {2}.
+ /// </summary>
+ internal static string TopicChangeText {
+ get {
+ return ResourceManager.GetString("TopicChangeText", resourceCulture);
+ }
+ }
+ }
}