Exemple #1
0
 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 nick in users)
     {
         if (string.IsNullOrWhiteSpace(nick))
             continue;
         var mode = client.ServerInfo.GetModeForPrefix(nick[0]);
         if (mode == null)
         {
             var user = client.Users.GetOrAdd(nick);
             if (!user.Channels.Contains(channel))
                 user.Channels.Add(channel);
             if (!user.ChannelModes.ContainsKey(channel))
                 user.ChannelModes.Add(channel, null);
             else
                 user.ChannelModes[channel] = null;
         }
         else
         {
             var user = client.Users.GetOrAdd(nick.Substring(1));
             if (!user.Channels.Contains(channel))
                 user.Channels.Add(channel);
             if (!user.ChannelModes.ContainsKey(channel))
                 user.ChannelModes.Add(channel, mode.Value);
             else
                 user.ChannelModes[channel] = mode.Value;
         }
     }
 }
Exemple #2
0
        // Syntax: INVITE <nick> <channel>
        public override void Run(IIrcUser client, IrcMessage message)
        {
            if (message.Params.Length != 2)
            {
                NeedMoreParamsError(client);
                return;
            }
            if (client.IrcServer.CheckNick(message.Params[0]))
            {
                NotFoundError(client, false);
                return;
            }
            if (!IRC.IsChannel(message.Params[1]) || !client.IrcServer.ChannelExists(message.Params[1]))
            {
                NotFoundError(client, true);
                return;
            }

            IrcChannel channel = client.IrcServer.GetChannel(message.Params[1]);
            IIrcUser user = client.IrcServer.Clients.Find(cli => cli.Nick == message.Params[0]);
            if (!user.ChannelModes.ContainsKey(channel))
            {
                user.ChannelModes.Add(channel, new IrcChannelUserMode());
            }
            IrcChannelUserMode mode = user.ChannelModes[channel];
            mode.IsInvited = true;
            channel.Command(client, "INVITE", user.Nick);
            client.Write(new IrcNumericResponce
            {
                NumericId = IrcNumericResponceId.RPL_INVITING,
                To = channel.Name,
                Extra = client.Nick,
                Message = "invited."
            });
        }
        public void IrcMsg_ToStringArgWithSpace()
        {
            var expected = ":prefix PRIVMSG blabla :string with a lot of spaces";
            var actual = new IrcMessage("PRIVMSG", "prefix", "blabla", "string with a lot of spaces");

            Assert.AreEqual(expected, actual.ToString());
        }
        protected internal void ProcessMessageEndOfStats(IrcMessage message)
        {
            Debug.Assert(message.Parameters[0] == localUser.NickName);

            OnServerStatsReceived(new IrcServerStatsReceivedEventArgs(listedStatsEntries));
            listedStatsEntries = new List<IrcServerStatisticalEntry>();
        }
Exemple #5
0
	public static void HandleMOTDNotFound(IrcClient client, IrcMessage message)
	{
            client.OnMOTDRecieved(new ServerMOTDEventArgs(MOTD));
            client.OnConnectionComplete(new EventArgs());

            VerifyOurIdentity(client);
	}
        public IrcMessenger()
        {
            var server = Config.Get("Irc.Server");
            var nick = Config.Get("Irc.Nick", Config.Get("Name", "gambot"));
            var user = Config.Get("Irc.User", nick);
            var password = Config.Get("Irc.Password");
            var ssl = Config.GetBool("Irc.Ssl");
            client = new IrcClient(server, new IrcUser(nick, user, password),
                                   ssl);

            client.SetHandler("372", (c, m) => { }); // Ignore MOTD

            client.PrivateMessageRecieved += (sender, args) =>
            {
                if (MessageReceived != null)
                {
                    var message = new IrcMessage(args.PrivateMessage);
                    MessageReceived(this,
                                    new MessageEventArgs
                                    {
                                        Message = message,
                                        Addressed =
                                            (!args.PrivateMessage
                                                  .IsChannelMessage ||
                                             String.Equals(message.To, nick,
                                                           StringComparison
                                                               .CurrentCultureIgnoreCase))
                                    });
                }
            };

            client.ConnectAsync();
        }
Exemple #7
0
 public override void Run(IIrcUser client, IrcMessage message)
 {
     if (message.Params.Length != 1)
     {
         SendMessage(IrcNumericResponceId.ERR_NONICKNAMEGIVEN, client, "No nickname given");
         return;
     }
     if (!IRC.CheckString(message.Params[0], IRC.NICKNAME))
     {
         SendMessage(IrcNumericResponceId.ERR_ERRONEUSNICKNAME, client, "Erroneous nickname");
         return;
     }
     if (!client.IrcServer.CheckNick(message.Params[0]))
     {
         SendMessage(IrcNumericResponceId.ERR_NICKNAMEINUSE, client, "Nickname is already in use");
         return;
     }
     string oldNick = client.Nick;
     client.Channels.ForEach(channel => channel.Nick(client, message.Params[0]));
     if (!string.IsNullOrEmpty(client.User))
     {
         Say(client, "NICK", message.Params[0]);
     }
     client.Nick = message.Params[0];
 }
Exemple #8
0
 public override void Run(IIrcUser client, IrcMessage message)
 {
     IrcChannel[] channels;
     if (message.Params.Length == 0)
     {
         channels = client.IrcServer.Channels.ToArray();
     }
     else
     {
         string[] channelList = message.Params[0].ToLower().Split(',');
         channels = client.IrcServer.Channels.Where(channel =>
             channelList.Contains(channel.Name.Replace(",", "").ToLower())
             ).ToArray();
     }
     channels.ForEach(channel =>
     {
         client.Write(new IrcNumericResponce
         {
             NumericId = IrcNumericResponceId.RPL_NAMEREPLY,
             Extra = "= " + channel.Name,
             Message = string.Join(" ",
                 channel.Users
                 .Where(user => !user.Mode.IsInvisible || channel.Users.Contains(client) || client.Mode.IsOperator)
                 .Select(user => string.Format("{0}{1}", user.ChannelModes[channel].NickPrefix, user.Nick)))
         });
     });
     client.Write(new IrcNumericResponce
     {
         NumericId = IrcNumericResponceId.RPL_ENDOFNAMES,
         Extra = client.Nick,
         Message = "End of names"
     });
 }
Exemple #9
0
 public override void Run(IIrcUser client, IrcMessage message)
 {
     if (message.Params.Length != 1)
     {
         SendMessage(IrcNumericResponceId.ERR_NEEDMOREPARAMS, client, "Not enough parameters");
         return;
     }
     if (IRC.IsChannel(message.Params[0]))
     {
         IrcChannel channel = client.IrcServer.Channels.Where(ch => ch.Name == message.Params[0]).FirstOrDefault();
         if (channel == null)
         {
             return;
         }
         channel.Users.ForEach(cli => cli.Write(new IrcNumericResponce()
         {
             NumericId = IrcNumericResponceId.RPL_WHOREPLY,
             Message = cli.UserString
         }));
         client.Write(new IrcNumericResponce()
         {
             NumericId = IrcNumericResponceId.RPL_ENDOFWHO,
             Message = "End of who"
         });
     }
 }
Exemple #10
0
 public static void HandleWhoIsEnd(IrcClient client, IrcMessage message)
 {
     var request = client.RequestManager.DequeueOperation("WHOIS " + message.Parameters[1]);
     if(request.Callback != null)
         request.Callback(request);
     client.OnWhoIsReceived(new Events.WhoIsReceivedEventArgs((WhoIs)request.State));
 }
        public void IrcMsg_ToStringNoPrefixNoArgs()
        {
            var expected = "PING";

            var actual = new IrcMessage("PING", "");
            Assert.AreEqual(expected, actual.ToString());
        }
Exemple #12
0
 public static void HandleGetEmptyTopic(IrcClient client, IrcMessage message)
 {
     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));
 }
Exemple #13
0
 public static void HandleUserListEnd(IrcClient client, IrcMessage message)
 {
     var channel = client.Channels[message.Parameters[1]];
     client.OnChannelListRecieved(new ChannelEventArgs(channel));
     if (client.Settings.ModeOnJoin)
         client.GetMode(channel.Name, c => Console.WriteLine(c.Mode));
 }
        protected internal override void ProcessMessageReplyMyInfo(IrcMessage message)
        {
            Debug.Assert(message.Parameters[0] == this.localUser.NickName);

            // Twitch doesn't seem to give us this information.
            Debug.Assert(message.Parameters[1] == "-");
            OnClientInfoReceived(new EventArgs());
        }
Exemple #15
0
 public static void HandleJoin(IrcClient client, IrcMessage message)
 {
     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)));
 }
Exemple #16
0
 public static void HandleEndOfMOTD(IrcClient client, IrcMessage message)
 {
     client.OnMOTDRecieved(new ServerMOTDEventArgs(MOTD));
     client.OnConnectionComplete(new EventArgs());
     // Verify our identity
     VerifyOurIdentity(client);
     
 }
 public static void HandleMOTD(IrcClient client, IrcMessage message)
 {
     if (message.Parameters.Length != 2)
         throw new IrcProtocolException("372 MOTD message is incorrectly formatted.");
     var part = message.Parameters[1].Substring(2);
     MOTD += part + Environment.NewLine;
     client.OnMOTDPartRecieved(new ServerMOTDEventArgs(part));
 }
        protected internal override void ProcessMessageReplyMotdStart(IrcMessage message)
        {
            Debug.Assert(message.Parameters[0] == this.localUser.NickName);

            // Looks like the motd doesn't start on the start message for twitch.
            Debug.Assert(message.Parameters[1] == "-");
            this.motdBuilder.Clear();
        }
Exemple #19
0
 public static void HandleQuietListPart(IrcClient client, IrcMessage message)
 {
     var parameterString = message.RawMessage.Substring(message.RawMessage.IndexOf(' ') + 1);
     var parameters = parameterString.Substring(parameterString.IndexOf(' ') + 1).Split(' ');
     var request = RequestOperation.PeekOperation("QLIST " + parameters[1]);
     var list = (List<Mask>)request.State;
     list.Add(new Mask(parameters[2], new IrcUser(parameters[3]), IrcClient.DateTimeFromIrcTime(int.Parse(parameters[4]))));
 }
Exemple #20
0
 public static void HandleWhoIsUser(IrcClient client, IrcMessage message)
 {
     var whois = (WhoIs)RequestOperation.PeekOperation("WHOIS " + message.Parameters[1]).State;
     whois.User.Nick = message.Parameters[1];
     whois.User.User = message.Parameters[2];
     whois.User.Hostname = message.Parameters[3];
     whois.User.RealName = message.Parameters[5];
 }
Exemple #21
0
 public override void Run(IIrcUser client, IrcMessage message)
 {
     client.Write(new IrcMessage
     {
         Command = "PONG",
         Params = message.Params
     });
 }
Exemple #22
0
 public static void HandlePart(IrcClient client, IrcMessage message)
 {
     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
         client.Channels[message.Parameters[0]].Users.Remove(new IrcUser(message.Prefix).Nick);
     client.OnUserPartedChannel(new ChannelUserEventArgs(client.Channels[message.Parameters[0]], new IrcUser(message.Prefix)));
 }
Exemple #23
0
 public static void HandleInviteListPart(IrcClient client, IrcMessage message)
 {
     var parameterString = message.RawMessage.Substring(message.RawMessage.IndexOf(' ') + 1);
     var parameters = parameterString.Substring(parameterString.IndexOf(' ') + 1).Split(' ');
     var request = client.RequestManager.PeekOperation("GETMODE I " + parameters[1]);
     var list = (MaskCollection)request.State;
     list.Add(new Mask(parameters[2], new IrcUser(parameters[3]), IrcClient.DateTimeFromIrcTime(int.Parse(parameters[4]))));
 }
Exemple #24
0
        public static void HandleMode(IrcClient client, IrcMessage message)
        {
            string target, mode = null;
            int i = 2;
            if (message.Command == "MODE")
            {
                target = message.Parameters[0];
                mode = message.Parameters[1];
            }
            else
            {
                target = message.Parameters[1];
                mode = message.Parameters[2];
                i++;
            }

            var eventArgs = new ModeChangeEventArgs(target, new IrcUser(message.Prefix), mode);
            client.OnModeChanged(eventArgs);
            // Handle change
            bool add = mode[0] == '+';
            mode = mode.Substring(1);
            if (target.StartsWith("#"))
            {
                var channel = client.Channels[target];
                foreach (char c in mode)
                {
                    // TODO: Handle other types of MODEs
                    if (channel.Mode == null)
                        channel.Mode = string.Empty;
                    if (add)
                    {
                        if (!channel.Mode.Contains(c))
                            channel.Mode += c.ToString();
                    }
                    else
                        channel.Mode = channel.Mode.Replace(c.ToString(), string.Empty);
                }
                if (message.Command == "324")
                {
                    var operation = client.RequestManager.DequeueOperation("MODE " + channel.Name);
                    operation.Callback(operation);
                }
            }
            else
            {
                // TODO: Handle user modes other than ourselves?
                foreach (char c in mode)
                {
                    if (add)
                    {
                        if (!client.User.Mode.Contains(c))
                            client.User.Mode += c;
                    }
                    else
                        client.User.Mode = client.User.Mode.Replace(c.ToString(), string.Empty);
                }
            }
        }
Exemple #25
0
 public static void HandleWhoIsChannels(IrcClient client, IrcMessage message)
 {
     var whois = (WhoIs)RequestOperation.PeekOperation("WHOIS " + message.Parameters[1]).State;
     var channels = message.Parameters[2].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
     for (int i = 0; i < channels.Length; i++)
         if (!channels[i].StartsWith("#"))
             channels[i] = channels[i].Substring(1);
     whois.Channels = whois.Channels.Concat(channels).ToArray();
 }
Exemple #26
0
 public static void HandleQuit(IrcClient client, IrcMessage message)
 {
     var user = new IrcUser(message.Prefix);
     if (client.User.Nick != user.Nick)
     {
         client.Users.Remove(user);
         client.OnUserQuit(new UserEventArgs(user));
     }
 }
Exemple #27
0
 public static void HandleErronousNick(IrcClient client, IrcMessage message)
 {
     var eventArgs = new ErronousNickEventArgs(client.User.Nick);
     if (message.Command == "433") // Nick in use
         client.OnNickInUse(eventArgs);
     // else ... TODO
     if (!eventArgs.DoNotHandle)
         client.Nick(eventArgs.NewNick);
 }
Exemple #28
0
 public static void HandleWhoIsUser(IrcClient client, IrcMessage message)
 {
     if(message.Parameters != null && message.Parameters.Length >= 6) {
         var whois = (WhoIs)client.RequestManager.PeekOperation("WHOIS " + message.Parameters[1]).State;
         whois.User.Nick = message.Parameters[1];
         whois.User.User = message.Parameters[2];
         whois.User.Hostname = message.Parameters[3];
         whois.User.RealName = message.Parameters[5];
     }
 }
Exemple #29
0
 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));
 }
        protected internal void ProcessMessageInvite(IrcMessage message)
        {
            Debug.Assert(message.Parameters[0] != null);
            var user = GetUserFromNickName(message.Parameters[0]);
            Debug.Assert(message.Parameters[1] != null);
            var channel = GetChannelFromName(message.Parameters[1]);

            Debug.Assert(message.Source is IrcUser);
            if (message.Source is IrcUser)
                user.HandleInviteReceived((IrcUser) message.Source, channel);
        }
 public static void Ping(IrcClient client, IrcMessage message)
 {
     client.SendPong(message.Content);
 }
Exemple #32
0
        public static void HandleMode(IrcClient client, IrcMessage message)
        {
            string target, mode = null;
            int    i = 2;

            if (message.Command == "MODE")
            {
                target = message.Parameters[0];
                mode   = message.Parameters[1];
            }
            else
            {
                target = message.Parameters[1];
                mode   = message.Parameters[2];
                i++;
            }
            // Handle change
            bool add = true;

            if (target.StartsWith("#"))
            {
                var channel = client.Channels[target];
                try
                {
                    foreach (char c in mode)
                    {
                        if (c == '+')
                        {
                            add = true;
                            continue;
                        }
                        if (c == '-')
                        {
                            add = false;
                            continue;
                        }
                        if (channel.Mode == null)
                        {
                            channel.Mode = string.Empty;
                        }
                        // TODO: Support the ones here that aren't done properly
                        if (client.ServerInfo.SupportedChannelModes.ParameterizedSettings.Contains(c))
                        {
                            client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
                                                                         (add ? "+" : "-") + c.ToString() + " " + message.Parameters[i++]));
                        }
                        else if (client.ServerInfo.SupportedChannelModes.ChannelLists.Contains(c))
                        {
                            client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
                                                                         (add ? "+" : "-") + c.ToString() + " " + message.Parameters[i++]));
                        }
                        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)
                            {
                                if (!channel.UsersByMode[c].Contains(user.Nick))
                                {
                                    channel.UsersByMode[c].Add(user);
                                }
                            }
                            else
                            {
                                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++]));
                        }
                        if (client.ServerInfo.SupportedChannelModes.Settings.Contains(c))
                        {
                            if (add)
                            {
                                if (!channel.Mode.Contains(c))
                                {
                                    channel.Mode += c.ToString();
                                }
                            }
                            else
                            {
                                channel.Mode = channel.Mode.Replace(c.ToString(), string.Empty);
                            }
                            client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
                                                                         (add ? "+" : "-") + c.ToString()));
                        }
                    }
                }
                catch { }
                if (message.Command == "324")
                {
                    var operation = client.RequestManager.DequeueOperation("MODE " + channel.Name);
                    operation.Callback(operation);
                }
            }
            else
            {
                // TODO: Handle user modes other than ourselves?
                foreach (char c in mode)
                {
                    if (add)
                    {
                        if (!client.User.Mode.Contains(c))
                        {
                            client.User.Mode += c;
                        }
                    }
                    else
                    {
                        client.User.Mode = client.User.Mode.Replace(c.ToString(), string.Empty);
                    }
                }
            }
        }
Exemple #33
0
        void ProcessMessage(IrcMessage message)
        {
            if (message.Command == $":{message.Source}" && message.Arguments.Length > 0)
            {
                // twitch seems to have issues building proper irc messages
                ProcessMessage(new IrcMessage(message.Arguments[0], message.Arguments.Skip(1).ToArray()));
                return;
            }

            string channelname;

            switch (message.Command)
            {
            case "CAP":
                if (message.Arguments.Length < 3)
                {
                    break;
                }

                if (message.Arguments[1] == "ACK")
                {
                    CapAcknowledged?.Invoke(message.Arguments[2]);
                }
                break;

            case "PING":
                SendMessage(new IrcMessage("PONG", message.Arguments));
                break;

            case "JOIN":
                channelname = GetChannelName(message.Arguments[0]);

                if (message.ExtractUser().ToLower() == user.ToLower())
                {
                    JoinChannel(channelname);
                }
                SendChannelMessage(channelname, message);
                break;

            case "PART":
                channelname = GetChannelName(message.Arguments[0]);
                SendChannelMessage(channelname, message);

                if (message.ExtractUser().ToLower() == user.ToLower())
                {
                    ChatChannel channel;
                    lock (channellock)
                    {
                        if (channels.TryGetValue(channelname, out channel))
                        {
                            channels.Remove(channelname);
                        }
                    }
                    if (channel != null)
                    {
                        ChannelLeft?.Invoke(channel);
                    }
                }
                break;

            case "tmi.twitch.tv RECONNECT":
            case "RECONNECT":
                Reconnect?.Invoke();
                break;

            case "001":
            case "002":
            case "003":
            case "004":
                // connection success
                break;

            case "372":
            case "375":
                // message of the day
                break;

            case "376":
                connectionwait.Set();
                // end of message of the day
                break;

            case "353":
                GetChannel(message.Arguments[2])?.OnMessage(message);
                break;

            case "366":
                GetChannel(message.Arguments[1])?.OnMessage(message);
                break;

            case "ROOMSTATE":
            case "PRIVMSG":
            case "USERNOTICE":
            case "NOTICE":
            case "USERSTATE":
                SendChannelMessage(message.Arguments[0], message);
                break;

            case "HOSTTARGET":
                if (!message.Arguments[1].StartsWith("-"))
                {
                    TrySendChannelMessage(message.Arguments[0], message);
                    TrySendChannelMessage(message.Arguments[1].Split(' ')[0], message);
                }
                break;

            case "MODE":
                // channel or user mode ... not that important for now
                break;

            default:
                Logger.Warning(this, "Unprocessed message", message.ToString());
                break;
            }
        }
 public Task WriteMessageAsync(IrcMessage message)
 {
     WrittenMessages.Add(message);
     return(Task.CompletedTask);
 }
Exemple #35
0
 public static void HandleNotice(IrcClient client, IrcMessage message)
 {
     client.OnNoticeRecieved(new IrcNoticeEventArgs(message));
 }
Exemple #36
0
        public void NewValidMessage_Command()
        {
            IrcMessage fromMessage = new IrcMessage(@":user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet");

            Assert.Equal("PRIVMSG", fromMessage.Command);
        }
 public Task HandleMessageAsync(IrcMessage message)
 {
     return(_prev.OnMessageAsync(message));
 }
Exemple #38
0
        public static void HandleWhoIsIdle(IrcClient client, IrcMessage message)
        {
            var whois = (WhoIs)client.RequestManager.GetState("WHOIS " + message.Parameters[1]);

            whois.SecondsIdle = int.Parse(message.Parameters[2]);
        }
Exemple #39
0
        public void Run(IrcMessage theMessage)
        {
            bool          recovery     = false;
            bool          source       = false;
            bool          firmware     = false;
            Box           box          = BoxDatabase.FindBoxes(theMessage.CommandLine).FirstOrDefault();
            List <string> nameSegments = new List <string>();
            string        rawName;

            if (theMessage.CommandArgs.Count > 1)
            {
                foreach (string argument in theMessage.CommandArgs)
                {
                    if (argument.Equals("all", StringComparison.OrdinalIgnoreCase) || argument.Equals("alles", StringComparison.OrdinalIgnoreCase))
                    {
                        firmware = true;
                        recovery = true;
                        source   = true;
                        break;
                    }
                    else if (argument.Equals("source", StringComparison.OrdinalIgnoreCase) || argument.Equals("sources", StringComparison.OrdinalIgnoreCase) || argument.Equals("src", StringComparison.OrdinalIgnoreCase))
                    {
                        source = true;
                    }
                    else if (argument.Equals("recovery", StringComparison.OrdinalIgnoreCase) || argument.Equals("recoveries", StringComparison.OrdinalIgnoreCase))
                    {
                        recovery = true;
                    }
                    else if (argument.Equals("firmware", StringComparison.OrdinalIgnoreCase) || argument.Equals("firmwares", StringComparison.OrdinalIgnoreCase))
                    {
                        firmware = true;
                    }
                    else
                    {
                        nameSegments.Add(argument);
                    }
                }
                rawName = nameSegments.Join(" ");
            }
            else
            {
                firmware = true;
                rawName  = theMessage.CommandLine;
            }

            FtpDirectory        Scan    = LastScan;
            FtpDirectory        match   = null;
            List <FtpDirectory> matches = null;
            bool shouldRefresh          = false;

            if (Scan != null)
            {
                matches = FindDirectory(Scan.Folders, box, rawName);
                if (matches.Count > 1)
                {
                    theMessage.Answer("Bitte genauer spezifizieren: " + OnlyReadableNames(matches.Select(x => x.Name)).Join(", "));
                    return;
                }
                match         = matches.FirstOrDefault();
                shouldRefresh = true;
            }
            if (match == null)
            {
                List <FtpDirectory> FreshScanned;
                using (FtpClient client = GetClient())
                {
                    FreshScanned = client.GetListing("/fritz.box").Where(x => x.Type == FtpFileSystemObjectType.Directory).Select(x => new FtpDirectory {
                        FullName = x.FullName
                    }).ToList();
                    matches = FindDirectory(FreshScanned, box, rawName);
                    if (matches.Count > 1)
                    {
                        theMessage.Answer("Bitte genauer spezifizieren: " + OnlyReadableNames(matches.Select(x => x.Name)).Join(", "));
                        return;
                    }
                    match = matches.FirstOrDefault();
                    if (match != null)
                    {
                        match         = RecurseFTP(client, match.FullName);
                        shouldRefresh = false;
                    }
                }
            }

            if (match == null)
            {
                theMessage.Answer("Ich habe zu deiner Suche leider kein Verzeichnis gefunden");
                return;
            }

            string output = FormatResult(match, recovery, source, firmware);

            if (!String.IsNullOrEmpty(output))
            {
                theMessage.Answer(output);
            }

            if (shouldRefresh)
            {
                using (FtpClient client = GetClient())
                {
                    match = RecurseFTP(client, match.FullName);
                    string refreshedOutput = FormatResult(match, recovery, source, firmware);
                    if (String.IsNullOrEmpty(output) && !String.IsNullOrEmpty(refreshedOutput))
                    {
                        theMessage.Answer(refreshedOutput);
                        return;
                    }
                    if (output != refreshedOutput)
                    {
                        theMessage.Answer("Wups, meine Angabe war nicht mehr Up-to-Date, hier kommen die aktuellen Ergebnisse:");
                        theMessage.Answer(refreshedOutput);
                    }
                }
            }
        }
Exemple #40
0
        public static void HandleWhoIsOperator(IrcClient client, IrcMessage message)
        {
            var whois = (WhoIs)client.RequestManager.GetState("WHOIS " + message.Parameters[1]);

            whois.IrcOp = true;
        }
Exemple #41
0
        public static void HandleWhoIsLoggedInAs(IrcClient client, IrcMessage message)
        {
            var whois = (WhoIs)client.RequestManager.GetState("WHOIS " + message.Parameters[1]);

            whois.LoggedInAs = message.Parameters[2];
        }
Exemple #42
0
        public static void HandleAccount(IrcClient client, IrcMessage message)
        {
            var user = client.Users.GetOrAdd(message.Prefix);

            user.Account = message.Parameters[0];
        }
 internal ErrorReplyEventArgs(IrcMessage message)
 {
     Message = message;
 }
Exemple #44
0
        public void NewValidMessage_Prefix()
        {
            IrcMessage fromMessage = new IrcMessage(@":user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet");

            Assert.Equal("user!~ident@host", fromMessage.Prefix);
        }
Exemple #45
0
        /// <summary>
        /// Constructor for UserState.
        /// </summary>
        /// <param name="ircMessage"></param>
        public UserState(IrcMessage ircMessage)
        {
            Channel = ircMessage.Channel;

            foreach (var tag in ircMessage.Tags.Keys)
            {
                var tagValue = ircMessage.Tags[tag];
                switch (tag)
                {
                case Tags.Badges:
                    if (tagValue.Contains('/'))
                    {
                        if (!tagValue.Contains(","))
                        {
                            Badges.Add(new KeyValuePair <string, string>(tagValue.Split('/')[0], tagValue.Split('/')[1]));
                        }
                        else
                        {
                            foreach (var badge in tagValue.Split(','))
                            {
                                Badges.Add(new KeyValuePair <string, string>(badge.Split('/')[0], badge.Split('/')[1]));
                            }
                        }
                    }
                    break;

                case Tags.Color:
                    ColorHex = tagValue;
                    break;

                case Tags.DisplayName:
                    DisplayName = tagValue;
                    break;

                case Tags.EmotesSets:
                    EmoteSet = tagValue;
                    break;

                case Tags.Mod:
                    IsModerator = Helpers.ConvertToBool(tagValue);
                    break;

                case Tags.Subscriber:
                    IsSubscriber = Helpers.ConvertToBool(tagValue);
                    break;

                case Tags.UserType:
                    switch (tagValue)
                    {
                    case "mod":
                        UserType = UserType.Moderator;
                        break;

                    case "global_mod":
                        UserType = UserType.GlobalModerator;
                        break;

                    case "admin":
                        UserType = UserType.Admin;
                        break;

                    case "staff":
                        UserType = UserType.Staff;
                        break;

                    default:
                        UserType = UserType.Viewer;
                        break;
                    }
                    break;

                default:
                    // This should never happen, unless Twitch changes their shit
                    Console.WriteLine($"Unaccounted for [UserState]: {tag}");
                    break;
                }
            }

            if (string.Equals(ircMessage.User, Channel, StringComparison.InvariantCultureIgnoreCase))
            {
                UserType = UserType.Broadcaster;
            }
        }
Exemple #46
0
 public List <string> OnChannelMessage(IrcBot ircBot, string server, string channel, IrcMessage m)
 {
     return(null);
 }
 public Task WriteMessageAsync(IrcMessage message)
 {
     return(Task.CompletedTask);
 }
Exemple #48
0
 public List <string> OnUserMessage(IrcBot ircBot, string server, IrcMessage m)
 {
     return(null);
 }
Exemple #49
0
 public void Run(IrcMessage theMessage)
 {
     theMessage.Answer("http://lmgtfy.com/?q=" + Toolbox.UrlEncode(theMessage.CommandLine));
 }
Exemple #50
0
 public override void Run(IIrcUser client, IrcMessage message)
 {
     client.Idle = DateTime.Now;
 }
Exemple #51
0
 public static void HandlePing(IrcClient client, IrcMessage message)
 {
     client.ServerNameFromPing = message.Parameters[0];
     client.SendRawMessage("PONG :{0}", message.Parameters[0]);
 }
Exemple #52
0
        public AnonGiftedSubscription Extract(IrcMessage ircMessage)
        {
            AnonGiftedSubscriptionBuilder builder = AnonGiftedSubscriptionBuilder.Create();

            foreach (var tag in ircMessage.Tags.Keys)
            {
                var tagValue = ircMessage.Tags[tag];

                switch (tag)
                {
                case Tags.Badges:
                    builder.WithBadges(Common.Helpers.ParseBadges(tagValue).ToArray());
                    break;

                case Tags.BadgeInfo:
                    builder.WithBadgeInfos(Common.Helpers.ParseBadges(tagValue).ToArray());
                    break;

                case Tags.Color:
                    builder.WithColor(tagValue);
                    break;

                case Tags.DisplayName:
                    builder.WithDisplayName(tagValue);
                    break;

                case Tags.Emotes:
                    builder.WithEmotes(tagValue);
                    break;

                case Tags.Id:
                    builder.WithId(tagValue);
                    break;

                case Tags.Login:
                    builder.WithLogin(tagValue);
                    break;

                case Tags.Mod:
                    builder.WithIsModerator(Common.Helpers.ConvertToBool(tagValue));
                    break;

                case Tags.MsgId:
                    builder.WithMessageId(tagValue);
                    break;

                case Tags.MsgParamCumulativeMonths:
                    builder.WithMsgParamCumulativeMonths(tagValue);
                    break;

                case Tags.MsgParamRecipientDisplayname:
                    builder.WithMsgParamRecipientDisplayName(tagValue);
                    break;

                case Tags.MsgParamRecipientId:
                    builder.WithMsgParamRecipientId(tagValue);
                    break;

                case Tags.MsgParamRecipientUsername:
                    builder.WithMsgParamRecipientUserName(tagValue);
                    break;

                case Tags.MsgParamSubPlanName:
                    builder.WithMsgParamSubPlanName(tagValue);
                    break;

                case Tags.MsgParamSubPlan:
                    switch (tagValue)
                    {
                    case "prime":
                        builder.WithMsgParamSubPlan(SubscriptionPlan.Prime);
                        break;

                    case "1000":
                        builder.WithMsgParamSubPlan(SubscriptionPlan.Tier1);
                        break;

                    case "2000":
                        builder.WithMsgParamSubPlan(SubscriptionPlan.Tier2);
                        break;

                    case "3000":
                        builder.WithMsgParamSubPlan(SubscriptionPlan.Tier3);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException(nameof(tagValue.ToLower));
                    }
                    break;

                case Tags.RoomId:
                    builder.WithRoomId(tagValue);
                    break;

                case Tags.Subscriber:
                    builder.WithIsSubscriber(Common.Helpers.ConvertToBool(tagValue));
                    break;

                case Tags.SystemMsg:
                    builder.WithSystemMsg(tagValue);
                    builder.WithSystemMsgParsed(tagValue.Replace("\\s", " ").Replace("\\n", ""));
                    break;

                case Tags.TmiSentTs:
                    builder.WithTmiSentTs(tagValue);
                    break;

                case Tags.Turbo:
                    builder.WithIsTurbo(Common.Helpers.ConvertToBool(tagValue));
                    break;

                case Tags.UserId:
                    builder.WithUserId(tagValue);
                    break;

                case Tags.UserType:
                    switch (tagValue)
                    {
                    case "mod":
                        builder.WithUserType(UserType.Moderator);
                        break;

                    case "global_mod":
                        builder.WithUserType(UserType.GlobalModerator);
                        break;

                    case "admin":
                        builder.WithUserType(UserType.Admin);
                        break;

                    case "staff":
                        builder.WithUserType(UserType.Staff);
                        break;

                    default:
                        builder.WithUserType(UserType.Viewer);
                        break;
                    }
                    break;
                }
            }

            return(builder.Build());
        }
Exemple #53
0
        public static void HandleISupport(IrcClient client, IrcMessage message)
        {
            if (client.ServerInfo == null)
            {
                client.ServerInfo = new ServerInfo();
            }
            foreach (var item in message.Parameters)
            {
                string key, value;
                if (!item.Contains("="))
                {
                    key   = item;
                    value = null;
                }
                else
                {
                    key   = item.Remove(item.IndexOf('='));
                    value = item.Substring(item.IndexOf('=') + 1);
                }
                // TODO: Consider doing this differently
                // TODO: Allow users to specify other things to handle
                if (value != null)
                {
                    switch (key.ToUpper())
                    {
                    case "PREFIX":
                        var modes    = value.Substring(1, value.IndexOf(')') - 1);
                        var prefixes = value.Substring(value.IndexOf(')') + 1);
                        client.ServerInfo.Prefixes = new[] { modes, prefixes };
                        break;

                    case "CHANTYPES":
                        client.ServerInfo.ChannelTypes = value.ToCharArray();
                        break;

                    case "CHANMODES":
                        var chanModeGroups = value.Split(',');
                        client.ServerInfo.SupportedChannelModes.ChannelLists                    = chanModeGroups[0];
                        client.ServerInfo.SupportedChannelModes.ParameterizedSettings           = chanModeGroups[1];
                        client.ServerInfo.SupportedChannelModes.OptionallyParameterizedSettings = chanModeGroups[2];
                        client.ServerInfo.SupportedChannelModes.Settings = chanModeGroups[3];
                        break;

                    case "MODES":
                        client.ServerInfo.MaxModesPerCommand = int.Parse(value);
                        break;

                    case "MAXCHANNELS":     // TODO: CHANLIMIT
                        client.ServerInfo.MaxChannelsPerUser = int.Parse(value);
                        break;

                    case "NICKLEN":
                        client.ServerInfo.MaxNickLength = int.Parse(value);
                        break;

                    case "MAXLIST":
                        var limits = value.Split(',');
                        client.ServerInfo.ModeListLimits = new ServerInfo.ModeListLimit[limits.Length];
                        for (int i = 0; i < limits.Length; i++)
                        {
                            var limitedModes = limits[i].Remove(limits[i].IndexOf(':'));
                            var limit        = int.Parse(limits[i].Substring(limits[i].IndexOf(':') + 1));
                            foreach (var mode in limitedModes)
                            {
                                client.ServerInfo.ModeListLimits[i] = new ServerInfo.ModeListLimit(mode, limit);
                            }
                        }
                        break;

                    case "NETWORK":
                        client.ServerInfo.NetworkName = value;
                        break;

                    case "EXCEPTS":
                        client.ServerInfo.SupportsBanExceptions = value[0];
                        break;

                    case "INVEX":
                        client.ServerInfo.SupportsInviteExceptions = value[0];
                        break;

                    case "TOPICLEN":
                        client.ServerInfo.MaxTopicLength = int.Parse(value);
                        break;

                    case "KICKLEN":
                        client.ServerInfo.MaxKickCommentLength = int.Parse(value);
                        break;

                    case "CHANNELLEN":
                        client.ServerInfo.MaxChannelNameLength = int.Parse(value);
                        break;

                    case "AWAYLEN":
                        client.ServerInfo.MaxAwayLength = int.Parse(value);
                        break;
                    }
                }
                else
                {
                    switch (key.ToUpper())
                    {
                    case "WHOX":
                        client.ServerInfo.ExtendedWho = true;
                        break;
                    }
                }
            }
            client.OnServerInfoRecieved(new SupportsEventArgs(client.ServerInfo));
        }
Exemple #54
0
        /// <summary>Subscriber object constructor.</summary>
        protected SubscriberBase(IrcMessage ircMessage)
        {
            RawIrc       = ircMessage.ToString();
            ResubMessage = ircMessage.Message;

            foreach (var tag in ircMessage.Tags.Keys)
            {
                var tagValue = ircMessage.Tags[tag];
                switch (tag)
                {
                case Tags.Badges:
                    Badges = new List <KeyValuePair <string, string> >();
                    foreach (var badgeValue in tagValue.Split(','))
                    {
                        if (badgeValue.Contains('/'))
                        {
                            Badges.Add(new KeyValuePair <string, string>(badgeValue.Split('/')[0], badgeValue.Split('/')[1]));
                        }
                    }
                    // iterate through badges for special circumstances
                    foreach (var badge in Badges)
                    {
                        if (badge.Key == "partner")
                        {
                            IsPartner = true;
                        }
                    }
                    break;

                case Tags.Color:
                    ColorHex = tagValue;
                    if (!string.IsNullOrEmpty(ColorHex))
                    {
                        Color = ColorTranslator.FromHtml(ColorHex);
                    }
                    break;

                case Tags.DisplayName:
                    DisplayName = tagValue;
                    break;

                case Tags.Emotes:
                    EmoteSet = tagValue;
                    break;

                case Tags.Id:
                    Id = tagValue;
                    break;

                case Tags.Login:
                    Login = tagValue;
                    break;

                case Tags.Mod:
                    IsModerator = ConvertToBool(tagValue);
                    break;

                case Tags.MsgParamMonths:
                    months = int.Parse(tagValue);
                    break;

                case Tags.MsgParamSubPlan:
                    switch (tagValue.ToLower())
                    {
                    case "prime":
                        SubscriptionPlan = SubscriptionPlan.Prime;
                        break;

                    case "1000":
                        SubscriptionPlan = SubscriptionPlan.Tier1;
                        break;

                    case "2000":
                        SubscriptionPlan = SubscriptionPlan.Tier2;
                        break;

                    case "3000":
                        SubscriptionPlan = SubscriptionPlan.Tier3;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException(nameof(tagValue.ToLower));
                    }
                    break;

                case Tags.MsgParamSubPlanName:
                    SubscriptionPlanName = tagValue.Replace("\\s", " ");
                    break;

                case Tags.RoomId:
                    RoomId = tagValue;
                    break;

                case Tags.Subscriber:
                    IsSubscriber = ConvertToBool(tagValue);
                    break;

                case Tags.SystemMsg:
                    SystemMessage       = tagValue;
                    SystemMessageParsed = tagValue.Replace("\\s", " ");
                    break;

                case Tags.TmiSentTs:
                    TmiSentTs = tagValue;
                    break;

                case Tags.Turbo:
                    IsTurbo = ConvertToBool(tagValue);
                    break;

                case Tags.UserId:
                    UserId = tagValue;
                    break;

                case Tags.UserType:
                    switch (tagValue)
                    {
                    case "mod":
                        UserType = UserType.Moderator;
                        break;

                    case "global_mod":
                        UserType = UserType.GlobalModerator;
                        break;

                    case "admin":
                        UserType = UserType.Admin;
                        break;

                    case "staff":
                        UserType = UserType.Staff;
                        break;

                    default:
                        UserType = UserType.Viewer;
                        break;
                    }
                    break;
                }
            }
        }
        // badges=subscriber/0;color=#0000FF;display-name=KittyJinxu;emotes=30259:0-6;id=1154b7c0-8923-464e-a66b-3ef55b1d4e50;
        // login=kittyjinxu;mod=0;msg-id=ritual;msg-param-ritual-name=new_chatter;room-id=35740817;subscriber=1;
        // system-msg=@KittyJinxu\sis\snew\shere.\sSay\shello!;tmi-sent-ts=1514387871555;turbo=0;user-id=187446639;
        // user-type= USERNOTICE #thorlar kittyjinxu > #thorlar: HeyGuys
        public RitualNewChatter(IrcMessage ircMessage)
        {
            Message = ircMessage.Message;
            foreach (var tag in ircMessage.Tags.Keys)
            {
                var tagValue = ircMessage.Tags[tag];

                switch (tag)
                {
                case Tags.Badges:
                    Badges = Common.Helpers.ParseBadges(tagValue);
                    break;

                case Tags.BadgeInfo:
                    BadgeInfo = Common.Helpers.ParseBadges(tagValue);
                    break;

                case Tags.Color:
                    Color = tagValue;
                    break;

                case Tags.DisplayName:
                    DisplayName = tagValue;
                    break;

                case Tags.Emotes:
                    Emotes = tagValue;
                    break;

                case Tags.Id:
                    Id = tagValue;
                    break;

                case Tags.Login:
                    Login = tagValue;
                    break;

                case Tags.Mod:
                    IsModerator = Common.Helpers.ConvertToBool(tagValue);
                    break;

                case Tags.MsgId:
                    MsgId = tagValue;
                    break;

                case Tags.MsgParamRitualName:
                    MsgParamRitualName = tagValue;
                    break;

                case Tags.RoomId:
                    RoomId = tagValue;
                    break;

                case Tags.Subscriber:
                    IsSubscriber = Common.Helpers.ConvertToBool(tagValue);
                    break;

                case Tags.SystemMsg:
                    SystemMsg       = tagValue;
                    SystemMsgParsed = tagValue.Replace("\\s", " ").Replace("\\n", "");
                    break;

                case Tags.TmiSentTs:
                    TmiSentTs = tagValue;
                    break;

                case Tags.Turbo:
                    IsTurbo = Common.Helpers.ConvertToBool(tagValue);
                    break;

                case Tags.UserId:
                    UserId = tagValue;
                    break;

                case Tags.UserType:
                    switch (tagValue)
                    {
                    case "mod":
                        UserType = UserType.Moderator;
                        break;

                    case "global_mod":
                        UserType = UserType.GlobalModerator;
                        break;

                    case "admin":
                        UserType = UserType.Admin;
                        break;

                    case "staff":
                        UserType = UserType.Staff;
                        break;

                    default:
                        UserType = UserType.Viewer;
                        break;
                    }
                    break;
                }
            }
        }
Exemple #56
0
        public GiftedSubscription(IrcMessage ircMessage)
        {
            foreach (var tag in ircMessage.Tags.Keys)
            {
                var tagValue = ircMessage.Tags[tag];

                switch (tag)
                {
                case Tags.Badges:
                    Badges = tagValue;
                    break;

                case Tags.Color:
                    Color = tagValue;
                    break;

                case Tags.DisplayName:
                    DisplayName = tagValue;
                    break;

                case Tags.Emotes:
                    Emotes = tagValue;
                    break;

                case Tags.Id:
                    Id = tagValue;
                    break;

                case Tags.Login:
                    Login = tagValue;
                    break;

                case Tags.Mod:
                    IsModerator = Common.Helpers.ConvertToBool(tagValue);
                    break;

                case Tags.MsgId:
                    MsgId = tagValue;
                    break;

                case Tags.MsgParamMonths:
                    MsgParamMonths = tagValue;
                    break;

                case Tags.MsgParamRecipientDisplayname:
                    MsgParamRecipientDisplayName = tagValue;
                    break;

                case Tags.MsgParamRecipientId:
                    MsgParamRecipientId = tagValue;
                    break;

                case Tags.MsgParamRecipientUsername:
                    MsgParamRecipientUserName = tagValue;
                    break;

                case Tags.MsgParamSubPlanName:
                    MsgParamSubPlanName = tagValue;
                    break;

                case Tags.MsgParamSubPlan:
                    switch (tagValue)
                    {
                    case "prime":
                        MsgParamSubPlan = SubscriptionPlan.Prime;
                        break;

                    case "1000":
                        MsgParamSubPlan = SubscriptionPlan.Tier1;
                        break;

                    case "2000":
                        MsgParamSubPlan = SubscriptionPlan.Tier2;
                        break;

                    case "3000":
                        MsgParamSubPlan = SubscriptionPlan.Tier3;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException(nameof(tagValue.ToLower));
                    }
                    break;

                case Tags.RoomId:
                    RoomId = tagValue;
                    break;

                case Tags.Subscriber:
                    IsSubscriber = Common.Helpers.ConvertToBool(tagValue);
                    break;

                case Tags.SystemMsg:
                    SystemMsg       = tagValue;
                    SystemMsgParsed = tagValue.Replace("\\s", " ").Replace("\\n", "");
                    break;

                case Tags.TmiSentTs:
                    TmiSentTs = tagValue;
                    break;

                case Tags.Turbo:
                    IsTurbo = Common.Helpers.ConvertToBool(tagValue);
                    break;

                case Tags.UserId:
                    UserId = tagValue;
                    break;

                case Tags.UserType:
                    switch (tagValue)
                    {
                    case "mod":
                        UserType = UserType.Moderator;
                        break;

                    case "global_mod":
                        UserType = UserType.GlobalModerator;
                        break;

                    case "admin":
                        UserType = UserType.Admin;
                        break;

                    case "staff":
                        UserType = UserType.Staff;
                        break;

                    default:
                        UserType = UserType.Viewer;
                        break;
                    }
                    break;
                }
            }
        }
 public static void Compatibility_ListChannel(IrcClient client, IrcMessage message)
 {
     message.IsValid = client.Network.Parameters.IsChannelName(message.CommandArguments[1]);
 }
Exemple #58
0
        //Example IRC message: @badges=moderator/1,warcraft/alliance;color=;display-name=Swiftyspiffyv4;emotes=;mod=1;room-id=40876073;subscriber=0;turbo=0;user-id=103325214;user-type=mod :[email protected] PRIVMSG #swiftyspiffy :asd
        /// <summary>Constructor for ChatMessage object.</summary>
        /// <param name="botUsername">The username of the bot that received the message.</param>
        /// <param name="ircMessage">The IRC message from Twitch to be processed.</param>
        /// <param name="emoteCollection">The <see cref="MessageEmoteCollection"/> to register new emotes on and, if desired, use for emote replacement.</param>
        /// <param name="replaceEmotes">Whether to replace emotes for this chat message. Defaults to false.</param>
        public ChatMessage(
            string botUsername,
            IrcMessage ircMessage,
            ref MessageEmoteCollection emoteCollection,
            bool replaceEmotes = false)
        {
            BotUsername      = botUsername;
            RawIrcMessage    = ircMessage.ToString();
            Message          = ircMessage.Message;
            _emoteCollection = emoteCollection;

            Username = ircMessage.User;
            Channel  = ircMessage.Channel;

            foreach (var tag in ircMessage.Tags.Keys)
            {
                var tagValue = ircMessage.Tags[tag];

                switch (tag)
                {
                case Tags.Badges:
                    Badges = Common.Helpers.ParseBadges(tagValue);
                    // Iterate through saved badges for special circumstances
                    foreach (var badge in Badges)
                    {
                        switch (badge.Key)
                        {
                        case "bits":
                            CheerBadge = new CheerBadge(int.Parse(badge.Value));
                            break;

                        case "subscriber":
                            // Prioritize BadgeInfo subscribe count, as its more accurate
                            if (SubscribedMonthCount == 0)
                            {
                                SubscribedMonthCount = int.Parse(badge.Value);
                            }
                            break;

                        case "vip":
                            IsVip = true;
                            break;

                        case "admin":
                            IsStaff = true;
                            break;

                        case "staff":
                            IsStaff = true;
                            break;

                        case "partner":
                            IsPartner = true;
                            break;
                        }
                    }
                    break;

                case Tags.BadgeInfo:
                    BadgeInfo = Common.Helpers.ParseBadges(tagValue);
                    // check if founder is one of them, and get months from that
                    var founderBadge = BadgeInfo.Find(b => b.Key == "founder");
                    if (!founderBadge.Equals(default(KeyValuePair <string, string>)))
                    {
                        IsSubscriber         = true;
                        SubscribedMonthCount = int.Parse(founderBadge.Value);
                    }
                    else
                    {
                        var subBadge = BadgeInfo.Find(b => b.Key == "subscriber");
                        // BadgeInfo has better accuracy than Badges subscriber value
                        if (!subBadge.Equals(default(KeyValuePair <string, string>)))
                        {
                            SubscribedMonthCount = int.Parse(subBadge.Value);
                        }
                    }
                    break;

                case Tags.Bits:
                    Bits          = int.Parse(tagValue);
                    BitsInDollars = ConvertBitsToUsd(Bits);
                    break;

                case Tags.Color:
                    ColorHex = tagValue;
                    if (!string.IsNullOrWhiteSpace(ColorHex))
                    {
                        Color = ColorTranslator.FromHtml(ColorHex);
                    }
                    break;

                case Tags.CustomRewardId:
                    CustomRewardId = tagValue;
                    break;

                case Tags.DisplayName:
                    DisplayName = tagValue;
                    break;

                case Tags.Emotes:
                    EmoteSet = new EmoteSet(tagValue, Message);
                    break;

                case Tags.Id:
                    Id = tagValue;
                    break;

                case Tags.MsgId:
                    handleMsgId(tagValue);
                    break;

                case Tags.Mod:
                    IsModerator = Common.Helpers.ConvertToBool(tagValue);
                    break;

                case Tags.Noisy:
                    Noisy = Common.Helpers.ConvertToBool(tagValue) ? Noisy.True : Noisy.False;
                    break;

                case Tags.RoomId:
                    RoomId = tagValue;
                    break;

                case Tags.Subscriber:
                    // this check because when founder is set, the subscriber value is actually 0, which is problematic
                    IsSubscriber = IsSubscriber == false?Common.Helpers.ConvertToBool(tagValue) : true;

                    break;

                case Tags.TmiSentTs:
                    TmiSentTs = tagValue;
                    break;

                case Tags.Turbo:
                    IsTurbo = Common.Helpers.ConvertToBool(tagValue);
                    break;

                case Tags.UserId:
                    UserId = tagValue;
                    break;

                case Tags.UserType:
                    switch (tagValue)
                    {
                    case "mod":
                        UserType = UserType.Moderator;
                        break;

                    case "global_mod":
                        UserType = UserType.GlobalModerator;
                        break;

                    case "admin":
                        UserType = UserType.Admin;
                        IsStaff  = true;
                        break;

                    case "staff":
                        UserType = UserType.Staff;
                        IsStaff  = true;
                        break;

                    default:
                        UserType = UserType.Viewer;
                        break;
                    }
                    break;
                }
            }

            if (Message.Length > 0 && (byte)Message[0] == 1 && (byte)Message[Message.Length - 1] == 1)
            {
                //Actions (/me {action}) are wrapped by byte=1 and prepended with "ACTION "
                //This setup clears all of that leaving just the action's text.
                //If you want to clear just the nonstandard bytes, use:
                //_message = _message.Substring(1, text.Length-2);
                if (Message.StartsWith("\u0001ACTION ") && Message.EndsWith("\u0001"))
                {
                    Message = Message.Trim('\u0001').Substring(7);
                    IsMe    = true;
                }
            }

            //Parse the emoteSet
            if (EmoteSet != null && Message != null && EmoteSet.Emotes.Count > 0)
            {
                var uniqueEmotes = EmoteSet.RawEmoteSetString.Split('/');
                foreach (var emote in uniqueEmotes)
                {
                    var firstColon = emote.IndexOf(':');
                    var firstComma = emote.IndexOf(',');
                    if (firstComma == -1)
                    {
                        firstComma = emote.Length;
                    }
                    var firstDash = emote.IndexOf('-');
                    if (firstColon > 0 && firstDash > firstColon && firstComma > firstDash)
                    {
                        if (int.TryParse(emote.Substring(firstColon + 1, firstDash - firstColon - 1), out var low) &&
                            int.TryParse(emote.Substring(firstDash + 1, firstComma - firstDash - 1), out var high))
                        {
                            if (low >= 0 && low < high && high < Message.Length)
                            {
                                //Valid emote, let's parse
                                var id = emote.Substring(0, firstColon);
                                //Pull the emote text from the message
                                var text = Message.Substring(low, high - low + 1);
                                _emoteCollection.Add(new MessageEmote(id, text));
                            }
                        }
                    }
                }
                if (replaceEmotes)
                {
                    EmoteReplacedMessage = _emoteCollection.ReplaceEmotes(Message);
                }
            }

            if (EmoteSet == null)
            {
                EmoteSet = new EmoteSet(default(string), Message);
            }

            // Check if display name was set, and if it wasn't, set it to username
            if (string.IsNullOrEmpty(DisplayName))
            {
                DisplayName = Username;
            }

            // Check if message is from broadcaster
            if (string.Equals(Channel, Username, StringComparison.InvariantCultureIgnoreCase))
            {
                UserType      = UserType.Broadcaster;
                IsBroadcaster = true;
            }

            if (Channel.Split(':').Length == 3)
            {
                if (string.Equals(Channel.Split(':')[1], UserId, StringComparison.InvariantCultureIgnoreCase))
                {
                    UserType      = UserType.Broadcaster;
                    IsBroadcaster = true;
                }
            }
        }
Exemple #59
0
 public static void HandleLoggedIn(IrcClient client, IrcMessage message)
 {
     client.User.Account = message.Parameters[2];
 }
Exemple #60
0
        public static void HandleWhox(IrcClient client, IrcMessage message)
        {
            int msgQueryType = int.Parse(message.Parameters[1]);
            var whoxQuery    = new KeyValuePair <string, RequestOperation>();

            foreach (var query in client.RequestManager.PendingOperations.Where(kvp => kvp.Key.StartsWith("WHO ")))
            {
                // Parse query to retrieve querytype
                string   key        = query.Key;
                string[] queryParts = key.Split(new[] { ' ' });

                int queryType = int.Parse(queryParts[2]);

                // Check querytype against message querytype
                if (queryType == msgQueryType)
                {
                    whoxQuery = query;
                }
            }

            if (whoxQuery.Key != string.Empty && whoxQuery.Value != null)
            {
                var whoxList = (List <ExtendedWho>)client.RequestManager.GetState(whoxQuery.Key);
                var whox     = new ExtendedWho();

                string   key        = whoxQuery.Key;
                string[] queryParts = key.Split(new[] { ' ' });

                // Handle what fields were included in the WHOX request
                WhoxField fields   = (WhoxField)int.Parse(queryParts[3]);
                int       fieldIdx = 1;
                do
                {
                    if ((fields & WhoxField.QueryType) != 0)
                    {
                        whox.QueryType = msgQueryType;
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.Channel) != 0)
                    {
                        whox.Channel = message.Parameters[fieldIdx];
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.Username) != 0)
                    {
                        whox.User.User = message.Parameters[fieldIdx];
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.UserIp) != 0)
                    {
                        whox.IP = message.Parameters[fieldIdx];
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.Hostname) != 0)
                    {
                        whox.User.Hostname = message.Parameters[fieldIdx];
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.ServerName) != 0)
                    {
                        whox.Server = message.Parameters[fieldIdx];
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.Nick) != 0)
                    {
                        whox.User.Nick = message.Parameters[fieldIdx];
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.Flags) != 0)
                    {
                        whox.Flags = message.Parameters[fieldIdx];
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.Hops) != 0)
                    {
                        whox.Hops = int.Parse(message.Parameters[fieldIdx]);
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.TimeIdle) != 0)
                    {
                        whox.TimeIdle = int.Parse(message.Parameters[fieldIdx]);
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.AccountName) != 0)
                    {
                        whox.User.Account = message.Parameters[fieldIdx];
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.OpLevel) != 0)
                    {
                        whox.OpLevel = message.Parameters[fieldIdx];
                        fieldIdx++;
                    }

                    if ((fields & WhoxField.RealName) != 0)
                    {
                        whox.User.RealName = message.Parameters[fieldIdx];
                        fieldIdx++;
                    }
                }while (fieldIdx < message.Parameters.Length - 1);
                whoxList.Add(whox);
            }
        }