private void SendCommandList(string sendto, string nick, IEnumerable <Commandlet> commandList)
        {
            if (!commandList.Any())
            {
                return;
            }

            var commandStrings = new List <string>();

            foreach (var commandlet in commandList)
            {
                if (string.IsNullOrEmpty(commandlet.AccessString))
                {
                    commandStrings.Add(scopeColor[commandlet.Scope] + commandlet.Command + IrcConstants.IrcColor + IrcConstants.IrcBold);
                }
                else if (Acl.Access(nick, commandlet.AccessString, false))
                {
                    commandStrings.Add(scopeColor[commandlet.Scope] + "<" + commandlet.Command + ">" + IrcConstants.IrcColor + IrcConstants.IrcBold);
                }
            }

            foreach (string com in commandStrings.ToLines(350, ", ", "Active Commands (" + scopeColor[CommandScope.Public] + "public" + IrcConstants.IrcColor + IrcConstants.IrcBold + ", " + scopeColor[CommandScope.Private] + "private" + IrcConstants.IrcColor + IrcConstants.IrcBold + ") <restricted>: ", null))
            {
                SendMessage(SendType.Message, sendto, com);
            }
        }
        private void CommandDispatcher(object sender, IrcEventArgs e)
        {
            var pub = !string.IsNullOrEmpty(e.Data.Channel);

            if (!commands.ContainsKey(e.Data.MessageArray[0]))
            {
                return;
            }

            if (pub && (commands[e.Data.MessageArray[0]].Scope == CommandScope.Private))
            {
                SendMessage(SendType.Message, e.Data.Nick, "This command (" + commands[e.Data.MessageArray[0]].Command + ") can only be invoked privatly in a query.");
                return;
            }
            if ((!pub) && (commands[e.Data.MessageArray[0]].Scope == CommandScope.Public))
            {
                SendMessage(SendType.Message, e.Data.Nick, "This command (" + commands[e.Data.MessageArray[0]].Command + ") can only be invoked publicly in a channel.");
                return;
            }

            // check if access to function is allowed
            if (!string.IsNullOrEmpty(commands[e.Data.MessageArray[0]].AccessString) && !Acl.Access(e.Data.Nick, commands[e.Data.MessageArray[0]].AccessString, true))
            {
                return;
            }

            if ((commands[e.Data.MessageArray[0]].ChannelList != null) && (!commands[e.Data.MessageArray[0]].ChannelList.Contains(e.Data.Channel)))
            {
                return;
            }

            if (commands[e.Data.MessageArray[0]].Handler != null)
            {
                commands[e.Data.MessageArray[0]].Handler.Invoke(sender, e);
            }
            else
            {
                foreach (var plug in PlugManager.Plugins.Where(plug => plug.FullName == (string)commands[e.Data.MessageArray[0]].Owner))
                {
                    plug.InvokeHandler(commands[e.Data.MessageArray[0]].HandlerName, e);
                    return;
                }
            }
        }