Properly set the channel topic

This commit is contained in:
Alexandre Oliveira 2015-04-06 19:10:06 -03:00
parent c0e33b0b42
commit 281f86774a
8 changed files with 80 additions and 2 deletions

View File

@ -39,6 +39,7 @@
<ItemGroup>
<Compile Include="ChannelCollection.cs" />
<Compile Include="ClientSettings.cs" />
<Compile Include="Events\ChannelTopicEventArgs.cs" />
<Compile Include="Events\ChannelEventArgs.cs" />
<Compile Include="Events\ChannelUserEventArgs.cs" />
<Compile Include="Events\IrcNoticeEventArgs.cs" />

View File

@ -0,0 +1,16 @@
using System;
namespace ChatSharp.Events
{
public class ChannelTopicEventArgs : EventArgs
{
public IrcChannel Channel { get; set; }
public string Topic { get; set; }
public ChannelTopicEventArgs(IrcChannel channel, string topic)
{
Channel = channel;
Topic = topic;
}
}
}

View File

@ -25,6 +25,31 @@ namespace ChatSharp.Handlers
}
if (channel != null)
client.OnUserJoinedChannel(new ChannelUserEventArgs(channel, new IrcUser(message.Prefix)));
}
public static void HandleGetTopic(IrcClient client, IrcMessage message)
{
IrcChannel channel = null;
string topic;
if (client.Channels.Contains(message.Parameters[1]))
{
channel = client.Channels[message.Parameters[1]];
topic = message.Parameters[2];
channel.Topic = topic;
}
else
{
channel = new IrcChannel(client, message.Parameters[1]);
topic = message.Parameters[2];
}
client.OnChannelTopicReceived(new ChannelTopicEventArgs(channel, topic));
}
public static void HandleGetEmptyTopic(IrcClient client, IrcMessage message)
{
var channel = client.Channels[message.Parameters[1]];
var topic = message.Parameters[2];
client.OnChannelTopicReceived(new ChannelTopicEventArgs(channel, topic));
}
public static void HandlePart(IrcClient client, IrcMessage message)

View File

@ -27,7 +27,9 @@ namespace ChatSharp.Handlers
// Channel handlers
client.SetHandler("JOIN", ChannelHandlers.HandleJoin);
client.SetHandler("PART", ChannelHandlers.HandlePart);
client.SetHandler("PART", ChannelHandlers.HandlePart);
client.SetHandler("332", ChannelHandlers.HandleGetTopic);
client.SetHandler("331", ChannelHandlers.HandleGetEmptyTopic);
client.SetHandler("353", ChannelHandlers.HandleUserListPart);
client.SetHandler("366", ChannelHandlers.HandleUserListEnd);
client.SetHandler("KICK", ChannelHandlers.HandleKick);

View File

@ -15,7 +15,6 @@ namespace ChatSharp
}
set
{
Client.SetTopic(Name, value);
_Topic = value;
}
}
@ -67,5 +66,11 @@ namespace ChatSharp
{
Client.ChangeMode(Name, change);
}
public void SetTopic(string topic)
{
Client.SetTopic(Name, topic);
Topic = topic;
}
}
}

View File

@ -59,6 +59,11 @@ namespace ChatSharp
SendRawMessage("TOPIC {0} :{1}", channel, topic);
}
public void GetTopic(string channel)
{
SendRawMessage("TOPIC {0}", channel);
}
public void KickUser(string channel, string user)
{
SendRawMessage("KICK {0} {1} :{1}", channel, user);

View File

@ -349,6 +349,11 @@ namespace ChatSharp
protected internal virtual void OnChannelListRecieved(ChannelEventArgs e)
{
if (ChannelListRecieved != null) ChannelListRecieved(this, e);
}
public event EventHandler<ChannelTopicEventArgs> ChannelTopicReceived;
protected internal virtual void OnChannelTopicReceived(ChannelTopicEventArgs e)
{
if (ChannelTopicReceived != null) ChannelTopicReceived(this, e);
}
public event EventHandler<EventArgs> ConnectionComplete;
protected internal virtual void OnConnectionComplete(EventArgs e)

View File

@ -31,10 +31,29 @@ namespace TestChatSharp
var parts = e.PrivateMessage.Message.Split(' ');
client.ChangeMode(parts[1], parts[2]);
}
else if (e.PrivateMessage.Message.StartsWith(".topic "))
{
string messageArgs = e.PrivateMessage.Message.Substring(7);
if (messageArgs.Contains(" "))
{
string channel = messageArgs.Substring(0, messageArgs.IndexOf(" "));
string topic = messageArgs.Substring(messageArgs.IndexOf(" ") + 1);
client.Channels[channel].SetTopic(topic);
}
else
{
string channel = messageArgs.Substring(messageArgs.IndexOf("#"));
client.GetTopic(channel);
}
}
};
client.ChannelMessageRecieved += (s, e) =>
{
Console.WriteLine("<{0}> {1}", e.PrivateMessage.User.Nick, e.PrivateMessage.Message);
};
client.ChannelTopicReceived += (s, e) =>
{
Console.WriteLine("Received topic for channel {0}: {1}", e.Channel.Name, e.Topic);
};
client.ConnectAsync();
while (true) ;