Move channel users into a shared user pool
This makes it so that there are never two user objects for any given user on the network.
This commit is contained in:
parent
bf74106ed8
commit
40389177f1
|
@ -1,42 +1,30 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual Studio 2010
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestChatSharp", "TestChatSharp\TestChatSharp.csproj", "{BCCCE45F-32D5-4A04-B526-7D5A5673895F}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChatSharp", "ChatSharp\ChatSharp.csproj", "{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|Mixed Platforms = Debug|Mixed Platforms
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|Mixed Platforms = Release|Mixed Platforms
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{BCCCE45F-32D5-4A04-B526-7D5A5673895F}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||
{BCCCE45F-32D5-4A04-B526-7D5A5673895F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||
{BCCCE45F-32D5-4A04-B526-7D5A5673895F}.Debug|Mixed Platforms.Build.0 = Debug|x86
|
||||
{BCCCE45F-32D5-4A04-B526-7D5A5673895F}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{BCCCE45F-32D5-4A04-B526-7D5A5673895F}.Debug|x86.Build.0 = Debug|x86
|
||||
{BCCCE45F-32D5-4A04-B526-7D5A5673895F}.Release|Any CPU.ActiveCfg = Release|x86
|
||||
{BCCCE45F-32D5-4A04-B526-7D5A5673895F}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||
{BCCCE45F-32D5-4A04-B526-7D5A5673895F}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{BCCCE45F-32D5-4A04-B526-7D5A5673895F}.Release|x86.ActiveCfg = Release|x86
|
||||
{BCCCE45F-32D5-4A04-B526-7D5A5673895F}.Release|x86.Build.0 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual Studio 2010
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChatSharp", "ChatSharp\ChatSharp.csproj", "{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|Mixed Platforms = Debug|Mixed Platforms
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|Mixed Platforms = Release|Mixed Platforms
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
|
@ -7,9 +7,13 @@ namespace ChatSharp
|
|||
{
|
||||
public class ChannelCollection : IEnumerable<IrcChannel>
|
||||
{
|
||||
internal ChannelCollection(IrcClient client)
|
||||
internal ChannelCollection()
|
||||
{
|
||||
Channels = new List<IrcChannel>();
|
||||
}
|
||||
|
||||
internal ChannelCollection(IrcClient client) : this()
|
||||
{
|
||||
Client = client;
|
||||
}
|
||||
|
||||
|
@ -30,7 +34,10 @@ namespace ChatSharp
|
|||
|
||||
public void Join(string name)
|
||||
{
|
||||
Client.JoinChannel(name);
|
||||
if (Client != null)
|
||||
Client.JoinChannel(name);
|
||||
else
|
||||
throw new InvalidOperationException("Cannot make other users join channels.");
|
||||
}
|
||||
|
||||
public bool Contains(string name)
|
||||
|
@ -57,6 +64,15 @@ namespace ChatSharp
|
|||
}
|
||||
}
|
||||
|
||||
internal IrcChannel GetOrAdd(string name)
|
||||
{
|
||||
if (this.Contains(name))
|
||||
return this[name];
|
||||
var channel = new IrcChannel(Client, name);
|
||||
this.Add(channel);
|
||||
return channel;
|
||||
}
|
||||
|
||||
public IEnumerator<IrcChannel> GetEnumerator()
|
||||
{
|
||||
return Channels.GetEnumerator();
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
<RootNamespace>ChatSharp</RootNamespace>
|
||||
<AssemblyName>ChatSharp</AssemblyName>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
|
@ -69,10 +71,12 @@
|
|||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="RequestManager.cs" />
|
||||
<Compile Include="ServerInfo.cs" />
|
||||
<Compile Include="UserCollection.cs" />
|
||||
<Compile Include="WhoIs.cs" />
|
||||
<Compile Include="Events\KickEventArgs.cs" />
|
||||
<Compile Include="Events\NickChangedEventArgs.cs" />
|
||||
<Compile Include="UserPool.cs" />
|
||||
<Compile Include="UserPoolView.cs" />
|
||||
<Compile Include="Events\UserEventArgs.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
|
|
|
@ -6,11 +6,13 @@ namespace ChatSharp.Events
|
|||
{
|
||||
public IrcChannel Channel { get; set; }
|
||||
public string Topic { get; set; }
|
||||
public string OldTopic { get; set; }
|
||||
|
||||
public ChannelTopicEventArgs(IrcChannel channel, string topic)
|
||||
public ChannelTopicEventArgs(IrcChannel channel, string oldTopic, string topic)
|
||||
{
|
||||
Channel = channel;
|
||||
Topic = topic;
|
||||
OldTopic = oldTopic;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
using System;
|
||||
|
||||
namespace ChatSharp.Events
|
||||
{
|
||||
public class UserEventArgs : EventArgs
|
||||
{
|
||||
public IrcUser User { get; set; }
|
||||
|
||||
public UserEventArgs(IrcUser user)
|
||||
{
|
||||
User = user;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -10,86 +10,65 @@ namespace ChatSharp.Handlers
|
|||
{
|
||||
public static void HandleJoin(IrcClient client, IrcMessage message)
|
||||
{
|
||||
IrcChannel channel = null;
|
||||
if (client.User.Nick == new IrcUser(message.Prefix).Nick)
|
||||
{
|
||||
// We've joined this channel
|
||||
channel = new IrcChannel(client, message.Parameters[0]);
|
||||
client.Channels.Add(channel);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Someone has joined a channel we're already in
|
||||
channel = client.Channels[message.Parameters[0]];
|
||||
channel.Users.Add(new IrcUser(message.Prefix));
|
||||
}
|
||||
var channel = client.Channels.GetOrAdd(message.Parameters[0]);
|
||||
var user = client.Users.GetOrAdd(message.Prefix);
|
||||
user.Channels.Add(channel);
|
||||
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));
|
||||
var channel = client.Channels.GetOrAdd(message.Parameters[1]);
|
||||
var old = channel._Topic;
|
||||
channel._Topic = message.Parameters[2];
|
||||
client.OnChannelTopicReceived(new ChannelTopicEventArgs(channel, old, 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));
|
||||
var channel = client.Channels.GetOrAdd(message.Parameters[1]);
|
||||
var old = channel._Topic;
|
||||
channel._Topic = message.Parameters[2];
|
||||
client.OnChannelTopicReceived(new ChannelTopicEventArgs(channel, old, channel._Topic));
|
||||
}
|
||||
|
||||
public static void HandlePart(IrcClient client, IrcMessage message)
|
||||
{
|
||||
if (!client.Channels.Contains(message.Parameters[0]))
|
||||
return; // we already parted the channel, ignore
|
||||
return; // we aren't in this channel, ignore
|
||||
|
||||
if (client.User.Match(message.Prefix)) // We've parted this channel
|
||||
client.Channels.Remove(client.Channels[message.Parameters[0]]);
|
||||
else // Someone has parted a channel we're already in
|
||||
{
|
||||
var user = new IrcUser(message.Prefix).Nick;
|
||||
var channel = client.Channels[message.Parameters[0]];
|
||||
if (channel.Users.Contains(user))
|
||||
channel.Users.Remove(user);
|
||||
foreach (var mode in channel.UsersByMode)
|
||||
{
|
||||
if (mode.Value.Contains(user))
|
||||
mode.Value.Remove(user);
|
||||
}
|
||||
client.OnUserPartedChannel(new ChannelUserEventArgs(client.Channels[message.Parameters[0]], new IrcUser(message.Prefix)));
|
||||
}
|
||||
var user = client.Users.Get(message.Prefix);
|
||||
var channel = client.Channels[message.Parameters[0]];
|
||||
|
||||
if (user.Channels.Contains(channel))
|
||||
user.Channels.Remove(channel);
|
||||
client.OnUserPartedChannel(new ChannelUserEventArgs(client.Channels[message.Parameters[0]],
|
||||
new IrcUser(message.Prefix)));
|
||||
}
|
||||
|
||||
public static void HandleUserListPart(IrcClient client, IrcMessage message)
|
||||
{
|
||||
var channel = client.Channels[message.Parameters[2]];
|
||||
var users = message.Parameters[3].Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
|
||||
foreach (var user in users)
|
||||
var users = message.Parameters[3].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
foreach (var nick in users)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(user)) continue;
|
||||
var mode = client.ServerInfo.GetModeForPrefix(user[0]);
|
||||
if (string.IsNullOrWhiteSpace(nick))
|
||||
continue;
|
||||
var mode = client.ServerInfo.GetModeForPrefix(nick[0]);
|
||||
if (mode == null)
|
||||
channel.Users.Add(new IrcUser(user));
|
||||
{
|
||||
var user = client.Users.GetOrAdd(nick);
|
||||
user.Channels.Add(channel);
|
||||
}
|
||||
else
|
||||
{
|
||||
channel.Users.Add(new IrcUser(user.Substring(1)));
|
||||
if (!channel.UsersByMode.ContainsKey(mode.Value))
|
||||
var user = client.Users.GetOrAdd(nick.Substring(1));
|
||||
user.Channels.Add(channel);
|
||||
// TODO: User modes
|
||||
/*if (!channel.UsersByMode.ContainsKey(mode.Value))
|
||||
channel.UsersByMode.Add(mode.Value, new UserCollection());
|
||||
channel.UsersByMode[mode.Value].Add(new IrcUser(user.Substring(1)));
|
||||
channel.UsersByMode[mode.Value].Add(new IrcUser(nick.Substring(1)));*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -102,9 +81,9 @@ namespace ChatSharp.Handlers
|
|||
{
|
||||
try
|
||||
{
|
||||
client.GetMode(channel.Name, c => Console.WriteLine(c.Mode));
|
||||
client.GetMode(channel.Name, c => { /* no-op */ });
|
||||
}
|
||||
catch { }
|
||||
catch { /* who cares */ }
|
||||
}
|
||||
if (client.Settings.WhoIsOnJoin)
|
||||
{
|
||||
|
@ -134,12 +113,8 @@ namespace ChatSharp.Handlers
|
|||
client.Channels.Remove(client.Channels[message.Parameters[0]]);
|
||||
else
|
||||
{
|
||||
if (channel.Users.Contains(message.Parameters[1]))
|
||||
channel.Users.Remove(message.Parameters[1]);
|
||||
foreach (var mode in channel.UsersByMode.Where(mode => mode.Value.Contains(message.Parameters[1])))
|
||||
{
|
||||
mode.Value.Remove(message.Parameters[1]);
|
||||
}
|
||||
if (kicked.Channels.Contains(channel))
|
||||
kicked.Channels.Remove(channel);
|
||||
}
|
||||
client.OnUserKicked(new KickEventArgs(channel, new IrcUser(message.Prefix),
|
||||
kicked, message.Parameters[2]));
|
||||
|
|
|
@ -62,29 +62,13 @@ namespace ChatSharp.Handlers
|
|||
|
||||
public static void HandleNick(IrcClient client, IrcMessage message)
|
||||
{
|
||||
var ircUser = new IrcUser(message.Prefix);
|
||||
|
||||
var oldNick = ircUser.Nick;
|
||||
var users = client
|
||||
.Channels
|
||||
.SelectMany(c => c.Users.Where(u => u.Nick.Equals(ircUser.Nick, StringComparison.OrdinalIgnoreCase)));
|
||||
|
||||
foreach (var user in users)
|
||||
{
|
||||
if (user != null)
|
||||
{
|
||||
user.Nick = message.Parameters[0];
|
||||
}
|
||||
}
|
||||
|
||||
if (client.User.Nick.Equals(ircUser.Nick, System.StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
client.User.Nick = message.Parameters[0];
|
||||
}
|
||||
var user = client.Users.Get(message.Prefix);
|
||||
var oldNick = user.Nick;
|
||||
user.Nick = message.Parameters[0];
|
||||
|
||||
client.OnNickChanged(new NickChangedEventArgs
|
||||
{
|
||||
User = ircUser,
|
||||
User = user,
|
||||
OldNick = oldNick,
|
||||
NewNick = message.Parameters[0]
|
||||
});
|
||||
|
@ -95,25 +79,8 @@ namespace ChatSharp.Handlers
|
|||
var user = new IrcUser(message.Prefix);
|
||||
if (client.User.Nick != user.Nick)
|
||||
{
|
||||
var channels = client
|
||||
.Channels
|
||||
.Where(c => c.Users.Any(u => u.Nick.Equals(user.Nick)));
|
||||
var users = channels
|
||||
.SelectMany(c=> c.UsersByMode)
|
||||
.Where(m => m.Value.Contains(user.Nick))
|
||||
.Select(c => c.Value);
|
||||
|
||||
foreach (var userCollection in users)
|
||||
{
|
||||
userCollection.Remove(user.Nick);
|
||||
}
|
||||
|
||||
foreach (var channel in channels)
|
||||
{
|
||||
channel.Users.Remove(user.Nick);
|
||||
}
|
||||
|
||||
|
||||
client.Users.Remove(user);
|
||||
client.OnUserQuit(new UserEventArgs(user));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -209,6 +176,7 @@ namespace ChatSharp.Handlers
|
|||
}
|
||||
else if (client.ServerInfo.SupportedChannelModes.ChannelUserModes.Contains(c))
|
||||
{
|
||||
/*
|
||||
if (!channel.UsersByMode.ContainsKey(c)) channel.UsersByMode.Add(c, new UserCollection());
|
||||
var user = new IrcUser(message.Parameters[i]);
|
||||
if (add)
|
||||
|
@ -221,6 +189,7 @@ namespace ChatSharp.Handlers
|
|||
if (channel.UsersByMode[c].Contains(user.Nick))
|
||||
channel.UsersByMode[c].Remove(user);
|
||||
}
|
||||
*/
|
||||
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
|
||||
(add ? "+" : "-") + c.ToString() + " " + message.Parameters[i++]));
|
||||
}
|
||||
|
|
|
@ -14,6 +14,14 @@ namespace ChatSharp.Handlers
|
|||
whois.User.User = message.Parameters[2];
|
||||
whois.User.Hostname = message.Parameters[3];
|
||||
whois.User.RealName = message.Parameters[5];
|
||||
if (client.Users.Contains(whois.User.Nick))
|
||||
{
|
||||
var user = client.Users[whois.User.Nick];
|
||||
user.User = whois.User.User;
|
||||
user.Hostname = whois.User.Hostname;
|
||||
user.RealName = whois.User.RealName;
|
||||
whois.User = user;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -55,9 +63,12 @@ namespace ChatSharp.Handlers
|
|||
public static void HandleWhoIsEnd(IrcClient client, IrcMessage message)
|
||||
{
|
||||
var request = client.RequestManager.DequeueOperation("WHOIS " + message.Parameters[1]);
|
||||
var whois = (WhoIs)request.State;
|
||||
if (!client.Users.Contains(whois.User.Nick))
|
||||
client.Users.Add(whois.User);
|
||||
if (request.Callback != null)
|
||||
request.Callback(request);
|
||||
client.OnWhoIsReceived(new Events.WhoIsReceivedEventArgs((WhoIs) request.State));
|
||||
client.OnWhoIsReceived(new Events.WhoIsReceivedEventArgs(whois));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace ChatSharp
|
||||
{
|
||||
|
@ -15,21 +16,20 @@ namespace ChatSharp
|
|||
}
|
||||
set
|
||||
{
|
||||
Client.SetTopic(Name, value);
|
||||
_Topic = value;
|
||||
}
|
||||
}
|
||||
|
||||
public string Name { get; internal set; }
|
||||
public string Mode { get; internal set; }
|
||||
public UserCollection Users { get; set; }
|
||||
public Dictionary<char, UserCollection> UsersByMode { get; set; }
|
||||
public UserPoolView Users { get; private set; }
|
||||
|
||||
internal IrcChannel(IrcClient client, string name)
|
||||
{
|
||||
Client = client;
|
||||
Users = new UserCollection();
|
||||
UsersByMode = new Dictionary<char, UserCollection>();
|
||||
Name = name;
|
||||
Users = new UserPoolView(client.Users.Where(u => u.Channels.Contains(this)));
|
||||
}
|
||||
|
||||
public void Invite(string nick)
|
||||
|
@ -54,7 +54,7 @@ namespace ChatSharp
|
|||
|
||||
public void Part(string reason)
|
||||
{
|
||||
Client.PartChannel(Name);
|
||||
Client.PartChannel(Name); // TODO
|
||||
}
|
||||
|
||||
public void SendMessage(string message)
|
||||
|
@ -66,11 +66,5 @@ namespace ChatSharp
|
|||
{
|
||||
Client.ChangeMode(Name, change);
|
||||
}
|
||||
|
||||
public void SetTopic(string topic)
|
||||
{
|
||||
Client.SetTopic(Name, topic);
|
||||
Topic = topic;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,6 +74,7 @@ namespace ChatSharp
|
|||
public RequestManager RequestManager { get; set; }
|
||||
public ServerInfo ServerInfo { get; set; }
|
||||
public string PrivmsgPrefix { get; set; }
|
||||
public UserPool Users { get; set; }
|
||||
|
||||
public IrcClient(string serverAddress, IrcUser user, bool useSSL = false)
|
||||
{
|
||||
|
@ -91,6 +92,8 @@ namespace ChatSharp
|
|||
UseSSL = useSSL;
|
||||
WriteQueue = new ConcurrentQueue<string>();
|
||||
PrivmsgPrefix = "";
|
||||
Users = new UserPool();
|
||||
Users.Add(User); // Add self to user pool
|
||||
}
|
||||
|
||||
public void ConnectAsync()
|
||||
|
@ -370,17 +373,20 @@ namespace ChatSharp
|
|||
{
|
||||
if (UserKicked != null) UserKicked(this, e);
|
||||
}
|
||||
|
||||
public event EventHandler<WhoIsReceivedEventArgs> WhoIsReceived;
|
||||
protected internal virtual void OnWhoIsReceived(WhoIsReceivedEventArgs e)
|
||||
{
|
||||
if (WhoIsReceived != null) WhoIsReceived(this, e);
|
||||
}
|
||||
|
||||
public event EventHandler<NickChangedEventArgs> NickChanged;
|
||||
protected internal virtual void OnNickChanged(NickChangedEventArgs e)
|
||||
{
|
||||
if (NickChanged != null) NickChanged(this, e);
|
||||
}
|
||||
public event EventHandler<UserEventArgs> UserQuit;
|
||||
protected internal virtual void OnUserQuit(UserEventArgs e)
|
||||
{
|
||||
if (UserQuit != null) UserQuit(this, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,9 +7,10 @@ namespace ChatSharp
|
|||
{
|
||||
internal IrcUser()
|
||||
{
|
||||
Channels = new ChannelCollection();
|
||||
}
|
||||
|
||||
public IrcUser(string host)
|
||||
public IrcUser(string host) : this()
|
||||
{
|
||||
if (!host.Contains("@") && !host.Contains("!"))
|
||||
Nick = host;
|
||||
|
@ -29,7 +30,7 @@ namespace ChatSharp
|
|||
}
|
||||
}
|
||||
|
||||
public IrcUser(string nick, string user)
|
||||
public IrcUser(string nick, string user) : this()
|
||||
{
|
||||
Nick = nick;
|
||||
User = user;
|
||||
|
@ -53,6 +54,7 @@ namespace ChatSharp
|
|||
public string Mode { get; internal set; }
|
||||
public string RealName { get; internal set; }
|
||||
public string Hostname { get; internal set; }
|
||||
public ChannelCollection Channels { get; set; }
|
||||
|
||||
public string Hostmask
|
||||
{
|
||||
|
@ -126,4 +128,10 @@ namespace ChatSharp
|
|||
return Hostmask;
|
||||
}
|
||||
}
|
||||
|
||||
internal class UserChannel
|
||||
{
|
||||
public string Modes { get; set; }
|
||||
public IrcChannel Channel { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,17 +1,28 @@
|
|||
using System.Collections;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace ChatSharp
|
||||
{
|
||||
public class UserCollection : IEnumerable<IrcUser>
|
||||
public class UserPool : IEnumerable<IrcUser>
|
||||
{
|
||||
internal UserCollection()
|
||||
private List<IrcUser> Users { get; set; }
|
||||
|
||||
internal UserPool()
|
||||
{
|
||||
Users = new List<IrcUser>();
|
||||
}
|
||||
|
||||
private List<IrcUser> Users { get; set; }
|
||||
|
||||
public IrcUser this[string nick]
|
||||
{
|
||||
get
|
||||
{
|
||||
var user = Users.FirstOrDefault(u => u.Nick == nick);
|
||||
if (user == null)
|
||||
throw new KeyNotFoundException();
|
||||
return user;
|
||||
}
|
||||
}
|
||||
|
||||
internal void Add(IrcUser user)
|
||||
{
|
||||
|
@ -46,23 +57,21 @@ namespace ChatSharp
|
|||
return Users.Any(u => u.Hostmask == user.Hostmask);
|
||||
}
|
||||
|
||||
public IrcUser this[int index]
|
||||
internal IrcUser GetOrAdd(string prefix)
|
||||
{
|
||||
get
|
||||
{
|
||||
return Users[index];
|
||||
}
|
||||
var user = new IrcUser(prefix);
|
||||
if (Contains(user.Nick))
|
||||
return this[user.Nick];
|
||||
Add(user);
|
||||
return user;
|
||||
}
|
||||
|
||||
public IrcUser this[string nick]
|
||||
internal IrcUser Get(string prefix)
|
||||
{
|
||||
get
|
||||
{
|
||||
var user = Users.FirstOrDefault(u => u.Nick == nick);
|
||||
if (user == null)
|
||||
throw new KeyNotFoundException();
|
||||
return user;
|
||||
}
|
||||
var user = new IrcUser(prefix);
|
||||
if (Contains(user.Nick))
|
||||
return this[user.Nick];
|
||||
throw new KeyNotFoundException();
|
||||
}
|
||||
|
||||
public IEnumerator<IrcUser> GetEnumerator()
|
||||
|
@ -70,9 +79,9 @@ namespace ChatSharp
|
|||
return Users.GetEnumerator();
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
||||
{
|
||||
return GetEnumerator();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace ChatSharp
|
||||
{
|
||||
public class UserPoolView
|
||||
{
|
||||
private UserPool Pool { get; set; }
|
||||
private IEnumerable<IrcUser> Users { get; set; }
|
||||
|
||||
internal UserPoolView(IEnumerable<IrcUser> users)
|
||||
{
|
||||
Users = users;
|
||||
}
|
||||
|
||||
public IrcUser this[string nick]
|
||||
{
|
||||
get
|
||||
{
|
||||
var user = Users.FirstOrDefault(u => u.Nick == nick);
|
||||
if (user == null)
|
||||
throw new KeyNotFoundException();
|
||||
return user;
|
||||
}
|
||||
}
|
||||
|
||||
internal IrcUser this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
return Users.ToList()[index];
|
||||
}
|
||||
}
|
||||
|
||||
public bool ContainsMask(string mask)
|
||||
{
|
||||
return Users.Any(u => u.Match(mask));
|
||||
}
|
||||
|
||||
public bool Contains(string nick)
|
||||
{
|
||||
return Users.Any(u => u.Nick == nick);
|
||||
}
|
||||
|
||||
public bool Contains(IrcUser user)
|
||||
{
|
||||
return Users.Any(u => u.Hostmask == user.Hostmask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
|
||||
</startup>
|
||||
</configuration>
|
|
@ -1,62 +0,0 @@
|
|||
using ChatSharp;
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace TestChatSharp
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
var client = new IrcClient("irc.freenode.net", new IrcUser("ChatSharp", "ChatSharp"));
|
||||
client.NetworkError += (s, e) => Console.WriteLine("Error: " + e.SocketError);
|
||||
client.RawMessageRecieved += (s, e) => Console.WriteLine("<< {0}", e.Message);
|
||||
client.RawMessageSent += (s, e) => Console.WriteLine(">> {0}", e.Message);
|
||||
client.UserMessageRecieved += (s, e) =>
|
||||
{
|
||||
if (e.PrivateMessage.Message.StartsWith(".join "))
|
||||
client.Channels.Join(e.PrivateMessage.Message.Substring(6));
|
||||
else if (e.PrivateMessage.Message.StartsWith(".list "))
|
||||
{
|
||||
var channel = client.Channels[e.PrivateMessage.Message.Substring(6)];
|
||||
var list = channel.Users.Select(u => u.Nick).Aggregate((a, b) => a + "," + b);
|
||||
client.SendMessage(list, e.PrivateMessage.User.Nick);
|
||||
}
|
||||
else if (e.PrivateMessage.Message.StartsWith(".whois "))
|
||||
client.WhoIs(e.PrivateMessage.Message.Substring(7), null);
|
||||
else if (e.PrivateMessage.Message.StartsWith(".raw "))
|
||||
client.SendRawMessage(e.PrivateMessage.Message.Substring(5));
|
||||
else if (e.PrivateMessage.Message.StartsWith(".mode "))
|
||||
{
|
||||
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) ;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TestChatSharp")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TestChatSharp")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("4c6f3fb9-9e7b-4d83-bdc4-b810be5aa63f")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -1,67 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{BCCCE45F-32D5-4A04-B526-7D5A5673895F}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>TestChatSharp</RootNamespace>
|
||||
<AssemblyName>TestChatSharp</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\ChatSharp\ChatSharp.csproj">
|
||||
<Project>{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}</Project>
|
||||
<Name>ChatSharp</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
Loading…
Reference in New Issue