/// <summary> /// Initializes a new instance of the <see cref="libirc.ProcessorIRC"/> class. /// </summary> /// <param name="_network">Network we parse this raw IRC data on</param> /// <param name="_text">Raw text data as received from ircd</param> /// <param name="_pong">_pong.</param> /// <param name="_date">Date of this message, if you specify 0 the current time will be used</param> /// <param name="updated">If true this text will be considered as newly obtained information</param> public ProcessorIRC(Network _network, string _text, ref DateTime _pong, long _date = 0, bool isBacklog = false) { _Network = _network; _Protocol = _network._Protocol; ServerLineRawText = _text; Date = _date; pong = _pong; IsBacklog = isBacklog; }
private bool IdleTime(Network.IncomingDataEventArgs info) { Network.NetworkWHOISEventArgs ev = new Network.NetworkWHOISEventArgs(this.ServerLineRawText, this.Date); ev.Source = info.Source; ev.Parameters = info.Parameters; ev.ParameterLine = info.ParameterLine; ev.WhoisType = Network.NetworkWHOISEventArgs.Mode.Uptime; _Network.__evt_WHOIS(ev); return true; }
private bool ChannelBans(Network.IncomingDataEventArgs info) { if (info.Parameters.Count > 4) { Channel channel = _Network.GetChannel(info.Parameters[1]); if (channel != null) { if (!channel.ContainsBan(info.Parameters[2])) channel.InsertBan(info.Parameters[2], info.Parameters[3], info.Parameters[4]); if (channel.IsParsingBanData) return true; } return IsBacklog; } return false; }
private bool ChannelInfo(Network.IncomingDataEventArgs info) { if (info.Parameters.Count > 2) { Channel channel = _Network.GetChannel(info.Parameters[1]); Network.NetworkChannelDataEventArgs args = new Network.NetworkChannelDataEventArgs(this.ServerLineRawText, this.Date); args.Command = info.Command; args.Message = info.Message; args.Parameters = info.Parameters; args.Channel = channel; args.ChannelName = info.Parameters[1]; if (channel != null) { channel.ChannelMode.ChangeMode(info.Parameters[2]); _Network.__evt_ChannelInfo(args); return true; } _Network.__evt_ChannelInfo(args); } return IsBacklog; }
private bool ChannelBans2(Network.IncomingDataEventArgs info) { if (info.Parameters.Count == 0) return false; Network.NetworkChannelEventArgs ev = new Network.NetworkChannelEventArgs(this.ServerLineRawText, this.Date); ev.ChannelName = info.Parameters[1]; ev.ParameterLine = info.ParameterLine; ev.Parameters = info.Parameters; ev.Channel = _Network.GetChannel(ev.Parameters[1]); if (ev.Channel.Bans == null) ev.Channel.Bans = new List<ChannelBan>(); _Network.__evt_ChannelFinishBan(ev); if (ev.Channel != null) { if (ev.Channel.IsParsingBanData) { ev.Channel.IsParsingBanData = false; return true; } } return IsBacklog; }
private bool WhoisText(Network.IncomingDataEventArgs info) { Network.NetworkWHOISEventArgs ev = new Network.NetworkWHOISEventArgs(this.ServerLineRawText, this.Date); ev.WhoisType = Network.NetworkWHOISEventArgs.Mode.Info; ev.Parameters = info.Parameters; ev.Message = info.Message; ev.ParameterLine = info.ParameterLine; _Network.__evt_WHOIS(ev); return true; }
private bool TopicInfo(Network.IncomingDataEventArgs info) { if (info.Parameters.Count < 4) return false; Network.NetworkTOPICEventArgs ev = new Network.NetworkTOPICEventArgs(this.ServerLineRawText, this.Date); ev.Source = info.Source; ev.Parameters = info.Parameters; ev.ParameterLine = info.ParameterLine; ev.ChannelName = info.Parameters[1]; string user = info.Parameters[2]; string time = info.Parameters[3]; double dt; if (!double.TryParse(time, out dt)) dt = 0; ev.TopicDate = dt; ev.Source = user; ev.Channel = _Network.GetChannel(info.Parameters[1]); _Network.__evt_TopicInfo(ev); if (ev.Channel != null) { ev.Channel.TopicDate = (int)dt; ev.Channel.TopicUser = user; } return true; }
private bool ProcessNick(Network.IncomingDataEventArgs info) { string _new = info.Message; Network.NetworkNICKEventArgs ev = new Network.NetworkNICKEventArgs(this.ServerLineRawText, this.Date); ev.Source = info.Source; ev.OldNick = ev.SourceInfo.Nick; if (string.IsNullOrEmpty(info.Message) && !string.IsNullOrEmpty(info.ParameterLine)) { // server is f****d _new = info.ParameterLine; // server is totally borked if (_new.Contains(" ")) { _new = _new.Substring(0, _new.IndexOf(" ", StringComparison.Ordinal)); } } ev.NewNick = _new; _Network.__evt_NICK(ev); lock (_Network.Channels) { foreach (Channel channel in _Network.Channels.Values) { if (channel.ChannelWork) { User user = channel.UserFromName(ev.SourceInfo.Nick); if (user != null && !IsBacklog) user.Nick = _new; } } } return true; }
private bool ParseInfo(Network.IncomingDataEventArgs info) { if (info.Parameters.Count < 3) { return false; } // :irc-2t.tm-irc.org 353 petr = #support :petr user1227554 &OperBot Revi if (IsBacklog) { return true; } Network.ChannelUserListEventArgs ev = new Network.ChannelUserListEventArgs(ServerLineRawText, this.Date); ev.Parameters = info.Parameters; ev.ParameterLine = info.ParameterLine; ev.UserNicknames.AddRange(info.Message.Split(' ')); ev.ChannelName = info.Parameters[2]; Channel channel = _Network.GetChannel(info.Parameters[2]); if (channel != null) { ev.Channel = channel; foreach (string nick in ev.UserNicknames) { if (String.IsNullOrEmpty(nick)) { continue; } User user = channel.UserFromName(nick); if (user == null) { user = new User(nick, _Network); channel.InsertUser(user); } else { char UserMode_ = '\0'; if (nick.Length > 0) { foreach (char mode in _Network.UChars) { if (nick[0] == mode) { UserMode_ = nick[0]; // there is no need to check for other modes break; } } user.SymbolMode(UserMode_); } } ev.Users.Add(user); } _Network.__evt_ChannelUserList(ev); return true; } _Network.__evt_ChannelUserList(ev); return IsBacklog; }
private bool Join(Network.IncomingDataEventArgs info) { string channel_name = info.ParameterLine.Trim(); if (string.IsNullOrEmpty(channel_name)) { channel_name = info.Message; } Channel channel = _Network.GetChannel(channel_name); Network.NetworkChannelEventArgs ed = new Network.NetworkChannelEventArgs(ServerLineRawText, this.Date); ed.ChannelName = channel_name; ed.Source = info.Source; ed.Channel = channel; ed.ParameterLine = info.ParameterLine; if (channel != null) { if (!IsBacklog) channel.InsertUser(new User(ed.SourceInfo, _Network)); _Network.__evt_JOIN(ed); return true; } _Network.__evt_JOIN(ed); return IsBacklog; }
/// <summary> /// Creates a new user /// </summary> /// <param name="user">user!ident@hostname</param> /// <param name="network">Network this class belongs to</param> public User(string source, Network network) { UserInfo info = new UserInfo(source); MakeUser(info.Nick, info.Host, network, info.Ident); }
public NetworkGenericDataEventArgs(Network.IncomingDataEventArgs info) : base(info.ServerLine, info.Date) { this.Command = info.Command; this.Message = info.Message; this.ParameterLine = info.ParameterLine; this.Parameters = info.Parameters; this.Source = info.Source; }
public virtual void HandleUnknownData(Network.UnknownDataEventArgs args) { if (this.UnknownDataRetrievedEvent != null) { this.UnknownDataRetrievedEvent(this, args); } }
/// <summary> /// Changes the content based on buffer /// </summary> /// <param name="data"></param> /// <param name="network"></param> public void RewriteBuffer(string data, Network network) { lock (Mode) { buffer = data; Mode.Clear(); List<string> line = new List<string>(); line.AddRange(data.Split('\n')); rMode.Clear(); channelModes = ""; string positive = "+"; string negative = "-"; foreach (string xx in line) { bool rm = false; int CurrentParam = 1; List<string> parts = new List<string>(); parts.AddRange(xx.Split(' ')); if (parts.Count > 0) { if (parts[0].Contains("-") || parts[0].Contains("+")) { foreach (char CurrentMode in parts[0]) { switch (CurrentMode) { case '+': rm = false; continue; case '-': rm = true; continue; } // user mode, has a parameter if (network.CUModes.Contains(CurrentMode) || network.PModes.Contains(CurrentMode)) { if (parts.Count < CurrentParam + 1) { return; } SimpleMode mode = new SimpleMode(CurrentMode, parts[CurrentParam]); if (rm) { rMode.Add(mode); } else { Mode.Add(mode); } CurrentParam++; continue; } // channel special mode with parameter if (network.SModes.Contains(CurrentMode) || network.XModes.Contains(CurrentMode)) { if (parts.Count < CurrentParam + 1) { return; } SimpleMode mode = new SimpleMode(CurrentMode, parts[CurrentParam]); if (rm) { rMode.Add(mode); positive = positive.Replace(CurrentMode.ToString(), ""); negative += CurrentMode.ToString(); } else { Mode.Add(mode); negative = negative.Replace(CurrentMode.ToString(), ""); positive += CurrentMode.ToString(); } CurrentParam++; continue; } // channel mode if (network.CModes.Contains(CurrentMode)) { SimpleMode mode = new SimpleMode(CurrentMode, null); if (rm) { rMode.Add(mode); positive = positive.Replace(CurrentMode.ToString(), ""); negative += CurrentMode.ToString(); } else { Mode.Add(mode); negative = negative.Replace(CurrentMode.ToString(), ""); positive += CurrentMode.ToString(); } continue; } } } } } if (positive.Length > 1) { channelModes += positive; } if (negative.Length > 1) { channelModes += negative; } } }
/// <summary> /// Retrieve information about the server /// </summary> /// <param name="command">Command</param> /// <param name="parameters">Parameters</param> /// <param name="value">Text</param> /// <returns></returns> private bool Info(Network.IncomingDataEventArgs info) { Network.NetworkGenericDataEventArgs args004 = new Network.NetworkGenericDataEventArgs(info); _Network.__evt_INFO(args004); if (info.ParameterLine.Contains("PREFIX=(")) { string cmodes = info.ParameterLine.Substring(info.ParameterLine.IndexOf("PREFIX=(", StringComparison.Ordinal) + 8); cmodes = cmodes.Substring(0, cmodes.IndexOf(")", StringComparison.Ordinal)); lock (_Network.CUModes) { _Network.CUModes.Clear(); _Network.CUModes.AddRange(cmodes.ToCharArray()); } cmodes = info.ParameterLine.Substring(info.ParameterLine.IndexOf("PREFIX=(", StringComparison.Ordinal) + 8); cmodes = cmodes.Substring(cmodes.IndexOf(")", StringComparison.Ordinal) + 1, _Network.CUModes.Count); _Network.UChars.Clear(); _Network.UChars.AddRange(cmodes.ToCharArray()); } if (info.ParameterLine.Contains("CHANMODES=")) { string xmodes = info.ParameterLine.Substring(info.ParameterLine.IndexOf("CHANMODES=", StringComparison.Ordinal) + 11); xmodes = xmodes.Substring(0, xmodes.IndexOf(" ", StringComparison.Ordinal)); string[] _mode = xmodes.Split(','); _Network.ParsedInfo = true; if (_mode.Length == 4) { _Network.PModes.Clear(); _Network.CModes.Clear(); _Network.XModes.Clear(); _Network.SModes.Clear(); _Network.PModes.AddRange(_mode[0].ToCharArray()); _Network.XModes.AddRange(_mode[1].ToCharArray()); _Network.SModes.AddRange(_mode[2].ToCharArray()); _Network.CModes.AddRange(_mode[3].ToCharArray()); } } return true; }
/// <summary> /// This needs to be there for serialization to work /// </summary> public NetworkMode() { // place holder :) network = null; }
private bool FinishChan(Network.IncomingDataEventArgs info) { if (info.Parameters.Count == 0) return false; Network.NetworkChannelDataEventArgs ev = new Network.NetworkChannelDataEventArgs(this.ServerLineRawText, this.Date); ev.ChannelName = info.Parameters[1]; ev.ParameterLine = info.ParameterLine; ev.Parameters = info.Parameters; ev.Channel = _Network.GetChannel(info.Parameters[1]); if (ev.Channel != null) ev.Channel.IsParsingWhoData = false; _Network.__evt_FinishChannelParseUser(ev); return true; }
public User(UserInfo info, Network network) { MakeUser(info.Nick, info.Host, network, info.Ident); }
private bool Kick(Network.IncomingDataEventArgs info) { // [email protected] KICK #support HelpBot :Removed from the channel Network.NetworkKickEventArgs ev = new Network.NetworkKickEventArgs(this.ServerLineRawText, this.Date); ev.Source = info.Source; ev.Parameters = info.Parameters; ev.ChannelName = info.Parameters[0]; ev.Message = info.Message; ev.Target = info.Parameters[1]; ev.ParameterLine = info.ParameterLine; ev.Channel = _Network.GetChannel(info.Parameters[0]); if (ev.Channel != null) { if (!IsBacklog) { User user = ev.Channel.UserFromName(info.Parameters[1]); if (user != null) { ev.Channel.RemoveUser(user); if (user.IsPidgeon) ev.Channel.ChannelWork = false; } } _Network.__evt_KICK(ev); return true; } _Network.__evt_KICK(ev); return IsBacklog; }
/// <summary> /// Creates a new user /// </summary> /// <param name="nick"></param> /// <param name="host"></param> /// <param name="network"></param> /// <param name="ident"></param> public User(string nick, string host, string ident, Network network) { if (network == null) { throw new Exception("Network can't be null in here"); } MakeUser(nick, host, network, ident); }
private bool ParseUser(Network.IncomingDataEventArgs info) { // :hub.tm-irc.org 352 petr #support pidgeon D3EE8257.8361F8AE.37E3A027.IP hub.tm-irc.org petr H :0 My name is hidden, dude if (info.Parameters.Count <= 6) { return false; } Network.NetworkParseUserEventArgs ev = new Network.NetworkParseUserEventArgs(ServerLineRawText, this.Date); ev.Parameters = info.Parameters; ev.ChannelName = info.Parameters[1]; ev.Channel = _Network.GetChannel(info.Parameters[1]); string server = info.Parameters[4]; ev.User = new UserInfo(); ev.User.Ident = info.Parameters[2]; ev.User.Host = info.Parameters[3]; ev.User.Nick = info.Parameters[5]; string realname = info.Message; if (realname != null & realname.Length > 2) { realname = realname.Substring(2); } else if (realname == "0 ") { realname = ""; } char mode = '\0'; ev.IsAway = false; if (info.Parameters[6].Length > 0) { // if user is away we flag him if (info.Parameters[6].StartsWith("G", StringComparison.Ordinal)) { ev.IsAway = true; } mode = info.Parameters[6][info.Parameters[6].Length - 1]; if (!_Network.UChars.Contains(mode)) { mode = '\0'; } ev.StringMode = mode.ToString(); } ev.RealName = realname; _Network.__evt_ParseUser(ev); if (ev.Channel != null) { if (!IsBacklog) { if (!ev.Channel.ContainsUser(ev.User.Nick)) { User _user = null; if (mode != '\0') { _user = new User(mode.ToString() + ev.User.Nick, ev.User.Host, ev.User.Ident, _Network); } else { _user = new User(ev.User, _Network); } _user.LastAwayCheck = DateTime.Now; _user.RealName = realname; if (ev.IsAway) { _user.AwayTime = DateTime.Now; } _user.Away = ev.IsAway; ev.Channel.InsertUser(_user); return ev.Channel.IsParsingWhoData; } User user = ev.Channel.UserFromName(ev.User.Nick); if (user != null) { user.Ident = ev.User.Ident; user.Host = ev.User.Host; user.Server = server; user.RealName = realname; user.LastAwayCheck = DateTime.Now; if (!user.Away && ev.IsAway) { user.AwayTime = DateTime.Now; } user.Away = ev.IsAway; } } if (ev.Channel.IsParsingWhoData) { return true; } } return IsBacklog; }
/// <summary> /// Creates a new user /// </summary> /// <param name="nick">Nick</param> /// <param name="host">Host</param> /// <param name="network">Network</param> /// <param name="ident">Ident</param> /// <param name="server">Server</param> /// <param name="channel">Channel</param> public User(string nick, string host, string ident, Network network, Channel channel) { this.Channel = channel; MakeUser(nick, host, network, ident); }
private bool Part(Network.IncomingDataEventArgs info) { string chan = info.ParameterLine.Trim(); Channel channel = _Network.GetChannel(chan); Network.NetworkChannelDataEventArgs ev = new Network.NetworkChannelDataEventArgs(this.ServerLineRawText, this.Date); ev.ChannelName = chan; ev.Channel = channel; ev.Source = info.Source; ev.Message = info.Message; ev.ParameterLine = info.ParameterLine; _Network.__evt_PART(ev); if (channel != null) { if (!IsBacklog) channel.RemoveUser(ev.SourceInfo.Nick); return true; } return IsBacklog; }
/// <summary> /// Destroy /// </summary> public virtual void Destroy() { if (IsDestroyed) { return; } Channel = null; _Network = null; destroyed = true; }
private bool Topic(Network.IncomingDataEventArgs info) { Network.NetworkTOPICEventArgs ev = new Network.NetworkTOPICEventArgs(this.ServerLineRawText, this.Date); ev.Source = info.Source; ev.ParameterLine = info.ParameterLine; ev.Parameters = info.Parameters; ev.ChannelName = info.ParameterLine.Trim(); ev.Channel = _Network.GetChannel(ev.ChannelName); ev.Topic = info.Message; double time = Defs.ConvertDateToUnix(DateTime.Now); ev.TopicDate = time; _Network.__evt_TOPIC(ev); if (ev.Channel != null) { ev.Channel.Topic = info.Message; if (!IsBacklog) { ev.Channel.TopicDate = (int)time; ev.Channel.TopicUser = info.Source; } return true; } return IsBacklog; }
protected virtual void MakeUser(string nick, string host, Network network, string ident) { _Network = network; if (!string.IsNullOrEmpty(nick)) { char prefix = nick[0]; if (network.UChars.Contains(prefix)) { SymbolMode(prefix); nick = nick.Substring(1); } } this.nick = nick; this.Ident = ident; this.Host = host; this.Server = network.ServerName; }
/// <summary> /// Constructor (normal) /// </summary> public Channel(Network network) { _Network = network; ChannelWork = true; ChannelMode = new NetworkMode(NetworkMode.ModeType.Channel, _Network); Topic = ""; TopicUser = ""; }
/// <summary> /// Creates a new instance /// </summary> /// <param name="MT"></param> /// <param name="_Network"></param> public NetworkMode(ModeType MT, Network _Network) { _ModeType = MT; network = _Network; }
private bool ChannelTopic(Network.IncomingDataEventArgs info) { if (info.Parameters.Count < 2) { return false; } Network.NetworkTOPICEventArgs ev = new Network.NetworkTOPICEventArgs(this.ServerLineRawText, this.Date); ev.Parameters = info.Parameters; ev.Topic = info.Message; ev.ChannelName = info.Parameters[1]; string topic = info.Message; Channel channel = _Network.GetChannel(info.Parameters[1]); ev.Channel = channel; _Network.__evt_TopicData(ev); if (channel != null) channel.Topic = topic; return true; }
/// <summary> /// Parsing the line of whois text /// </summary> /// <param name="source"></param> /// <param name="parameters"></param> /// <param name="value"></param> /// <returns></returns> private bool WhoisSv(Network.IncomingDataEventArgs info) { if (info.ParameterLine.Contains(" ")) { string name = info.ParameterLine.Substring(info.ParameterLine.IndexOf(" ", StringComparison.Ordinal) + 1); if (!name.Contains(" ")) { _Protocol.DebugLog("Invalid whois record " + info.ParameterLine); return false; } Network.NetworkWHOISEventArgs ev = new Network.NetworkWHOISEventArgs(this.ServerLineRawText, this.Date); ev.ParameterLine = info.ParameterLine; ev.Parameters = info.Parameters; ev.Message = info.Message; ev.WhoisType = Network.NetworkWHOISEventArgs.Mode.Server; ev.WhoisLine = name.Substring(name.IndexOf(" ", StringComparison.Ordinal) + 1); ev.Source = name.Substring(0, name.IndexOf(" ", StringComparison.Ordinal)); _Network.__evt_WHOIS(ev); return true; } return false; }