Add main IRC logic
This commit is contained in:
155
OpenRA.Irc/Line.cs
Normal file
155
OpenRA.Irc/Line.cs
Normal file
@@ -0,0 +1,155 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System.Linq;
|
||||
|
||||
namespace OpenRA.Irc
|
||||
{
|
||||
public class Line
|
||||
{
|
||||
public readonly IrcClient Client;
|
||||
public readonly string RawString;
|
||||
public readonly string[] RawStringParts;
|
||||
public readonly User Prefix;
|
||||
public readonly string Command;
|
||||
public string Target { get; protected set; }
|
||||
public string Message { get; protected set; }
|
||||
|
||||
public Line(Line line)
|
||||
{
|
||||
Client = line.Client;
|
||||
RawString = line.RawString;
|
||||
RawStringParts = line.RawStringParts;
|
||||
Prefix = line.Prefix;
|
||||
Command = line.Command;
|
||||
Target = line.Target;
|
||||
Message = line.Message;
|
||||
}
|
||||
|
||||
public Line(IrcClient client, string line)
|
||||
{
|
||||
RawString = line;
|
||||
RawStringParts = line.Split(' ');
|
||||
Client = client;
|
||||
|
||||
if (line[0] == ':')
|
||||
{
|
||||
line = line.Substring(1);
|
||||
var prefixDelim = line.Split(new[] { ' ' }, 2);
|
||||
Prefix = new User(prefixDelim[0]);
|
||||
|
||||
if (prefixDelim.Length > 1)
|
||||
{
|
||||
var messageDelim = prefixDelim[1].Split(new[] { ':' }, 2);
|
||||
|
||||
var args = messageDelim[0].Trim().Split(' ');
|
||||
|
||||
Command = args[0];
|
||||
if (args.Length > 1)
|
||||
Target = args[1];
|
||||
|
||||
if (messageDelim.Length > 1)
|
||||
Message = messageDelim[1];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var messageDelim = line.Split(new[] { ':' }, 2);
|
||||
|
||||
var args = messageDelim[0].Trim().Split(' ');
|
||||
|
||||
Command = args[0];
|
||||
if (args.Length > 1)
|
||||
Target = args[1];
|
||||
|
||||
if (messageDelim.Length > 1)
|
||||
Message = messageDelim[1];
|
||||
}
|
||||
}
|
||||
|
||||
public virtual Channel GetChannel()
|
||||
{
|
||||
return Client.GetChannel(Target);
|
||||
}
|
||||
|
||||
public string this[int index]
|
||||
{
|
||||
get { return RawStringParts[index]; }
|
||||
}
|
||||
|
||||
public bool PrefixIsSelf()
|
||||
{
|
||||
return Client.LocalUser != null && Prefix.Nickname.EqualsIC(Client.LocalUser.Nickname);
|
||||
}
|
||||
|
||||
public bool TargetIsSelf()
|
||||
{
|
||||
return Target != null && Target.EqualsIC(Client.LocalUser.Nickname);
|
||||
}
|
||||
}
|
||||
|
||||
public class NicknameSetLine : Line
|
||||
{
|
||||
public readonly string NewNickname;
|
||||
|
||||
public NicknameSetLine(Line line)
|
||||
: base(line)
|
||||
{
|
||||
NewNickname = Message;
|
||||
}
|
||||
}
|
||||
|
||||
public class NumericLine : Line
|
||||
{
|
||||
public readonly NumericCommand Numeric;
|
||||
public readonly string AltTarget;
|
||||
|
||||
public override Channel GetChannel()
|
||||
{
|
||||
if (IrcUtils.IsChannel(AltTarget))
|
||||
return Client.GetChannel(AltTarget);
|
||||
return Client.GetChannel(Target);
|
||||
}
|
||||
|
||||
public NumericLine(Line line, int numeric)
|
||||
: base(line)
|
||||
{
|
||||
if (!IrcUtils.IsChannel(Target))
|
||||
{
|
||||
var numericParts = line.RawStringParts.Skip(1).TakeWhile(p => !p.StartsWith(":"));
|
||||
AltTarget = numericParts.LastOrDefault(IrcUtils.IsChannel);
|
||||
if (AltTarget == null)
|
||||
AltTarget = numericParts.LastOrDefault();
|
||||
}
|
||||
Numeric = (NumericCommand)numeric;
|
||||
}
|
||||
}
|
||||
|
||||
public class JoinLine : Line // for compatibility with certain IRCds
|
||||
{
|
||||
public JoinLine(Line line)
|
||||
: base(line)
|
||||
{
|
||||
if (Message != null) // don't overwrite the target if it was already set properly by the IRCd
|
||||
Target = Message;
|
||||
}
|
||||
}
|
||||
|
||||
public class KickLine : Line
|
||||
{
|
||||
public readonly string KickeeNickname;
|
||||
|
||||
public KickLine(Line line)
|
||||
: base(line)
|
||||
{
|
||||
KickeeNickname = this[3];
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user