Esempio n. 1
0
        /// <summary>
        /// Gets the Action that needs to be executed.
        /// </summary>
        /// <param name="line">The data line to parse</param>
        /// <param name="data">The BotData needed for variable replacement</param>
        /// <returns>The Action to execute</returns>
        public static Action Parse(string line, BotData data)
        {
            // Trim the line
            var input = line.Trim();

            // Initialize the action chain
            Actions actions = null;

            try
            {
                actions = new Actions(data.Driver);
            }
            catch { throw new Exception("No Browser initialized!"); }

            // Build it
            var         offsetX = 0;
            var         offsetY = 0;
            var         point1X = 0;
            var         point1Y = 0;
            var         point2X = 0;
            var         point2Y = 0;
            var         key     = "";
            var         gravity = 1;
            var         wind    = 1;
            var         qty     = 0;
            IWebElement elem1   = null;
            IWebElement elem2   = null;
            Line        newLine = null;

            while (input != "")
            {
                var parsed = LineParser.ParseToken(ref input, TokenType.Parameter, true).ToUpper();
                switch (parsed)
                {
                case "SPAWN":
                    // Spawn a div in a certain position so you can hook to it later via id
                    SpawnDiv(data.Driver, LineParser.ParseInt(ref input, "X"), LineParser.ParseInt(ref input, "Y"), LineParser.ParseLiteral(ref input, "ID"));
                    break;

                case "CLICK":
                    if (!LineParser.CheckIdentifier(ref input, "ELEMENT"))
                    {
                        actions.Click();
                    }
                    else
                    {
                        actions.Click(ParseElement(ref input, data));
                    }
                    break;

                case "CLICKANDHOLD":
                    if (!LineParser.CheckIdentifier(ref input, "ELEMENT"))
                    {
                        actions.ClickAndHold();
                    }
                    else
                    {
                        actions.ClickAndHold(ParseElement(ref input, data));
                    }
                    break;

                case "RIGHTCLICK":
                    if (!LineParser.CheckIdentifier(ref input, "ELEMENT"))
                    {
                        actions.ContextClick();
                    }
                    else
                    {
                        actions.ContextClick(ParseElement(ref input, data));
                    }
                    break;

                case "DOUBLECLICK":
                    if (!LineParser.CheckIdentifier(ref input, "ELEMENT"))
                    {
                        actions.DoubleClick();
                    }
                    else
                    {
                        actions.DoubleClick(ParseElement(ref input, data));
                    }
                    break;

                case "DRAGANDDROP":
                    elem1 = ParseElement(ref input, data);
                    LineParser.ParseToken(ref input, TokenType.Arrow, true);
                    elem2 = ParseElement(ref input, data);
                    actions.DragAndDrop(elem1, elem2);
                    break;

                case "DRAGANDDROPWITHOFFSET":
                    offsetX = LineParser.ParseInt(ref input, "OFFSET X");
                    offsetY = LineParser.ParseInt(ref input, "OFFSET Y");
                    actions.DragAndDropToOffset(ParseElement(ref input, data), offsetX, offsetY);
                    break;

                case "KEYDOWN":
                    key = LineParser.ParseLiteral(ref input, "KEY", true, data);
                    if (!LineParser.CheckIdentifier(ref input, "ELEMENT"))
                    {
                        actions.KeyDown(key);
                    }
                    else
                    {
                        actions.KeyDown(ParseElement(ref input, data), key);
                    }
                    break;

                case "KEYUP":
                    key = LineParser.ParseLiteral(ref input, "KEY", true, data);
                    if (!LineParser.CheckIdentifier(ref input, "ELEMENT"))
                    {
                        actions.KeyUp(key);
                    }
                    else
                    {
                        actions.KeyUp(ParseElement(ref input, data), key);
                    }
                    break;

                case "MOVEBY":
                    offsetX = LineParser.ParseInt(ref input, "OFFSET X");
                    offsetY = LineParser.ParseInt(ref input, "OFFSET Y");
                    actions.MoveByOffset(offsetX, offsetY);
                    break;

                case "MOVETO":
                    actions.MoveToElement(ParseElement(ref input, data));
                    break;

                case "RELEASE":
                    if (!LineParser.CheckIdentifier(ref input, "ELEMENT"))
                    {
                        actions.Release();
                    }
                    else
                    {
                        actions.Release(ParseElement(ref input, data));
                    }
                    break;

                case "SENDKEYS":
                    key = LineParser.ParseLiteral(ref input, "KEY", true, data);
                    if (!LineParser.CheckIdentifier(ref input, "ELEMENT"))
                    {
                        actions.SendKeys(key);
                    }
                    else
                    {
                        actions.SendKeys(ParseElement(ref input, data), key);
                    }
                    break;

                case "DRAWPOINTS":
                    offsetX = LineParser.ParseInt(ref input, "MAX WIDTH");
                    offsetY = LineParser.ParseInt(ref input, "MAX HEIGHT");
                    var    amount    = LineParser.ParseInt(ref input, "AMOUNT");
                    Random rand      = new Random();
                    var    previousx = 0;
                    var    previousy = 0;
                    // Move to the first point
                    actions.MoveToElement(data.Driver.FindElementByTagName("body"), point1X, point1Y);
                    List <Point> points = new List <Point>();
                    for (int i = 0; i < amount; i++)
                    {
                        var x = rand.Next(0, offsetX);
                        var y = rand.Next(0, offsetY);
                        actions.MoveByOffset(x - previousx, y - previousy);
                        previousx = x;
                        previousy = y;
                        points.Add(new Point(x, y));
                    }
                    if (data.GlobalSettings.Selenium.DrawMouseMovement)
                    {
                        DrawRedDots(data.Driver, points.ToArray(), 5);
                    }
                    break;

                case "DRAWLINE":
                    if (LineParser.Lookahead(ref input) == TokenType.Integer)
                    {
                        point1X = LineParser.ParseInt(ref input, "X1");
                        point1Y = LineParser.ParseInt(ref input, "Y1");
                        LineParser.ParseToken(ref input, TokenType.Arrow, true);
                        point2X = LineParser.ParseInt(ref input, "X2");
                        point2Y = LineParser.ParseInt(ref input, "Y2");
                    }
                    else
                    {
                        elem1   = ParseElement(ref input, data);
                        point1X = elem1.Location.X;
                        point1Y = elem1.Location.Y;
                        LineParser.ParseToken(ref input, TokenType.Arrow, true);
                        elem2   = ParseElement(ref input, data);
                        point2X = elem2.Location.X;
                        point2Y = elem2.Location.Y;
                    }
                    LineParser.EnsureIdentifier(ref input, ":");
                    qty = LineParser.ParseInt(ref input, "QUANTITY");
                    // Move to the first point
                    actions.MoveToElement(data.Driver.FindElementByTagName("body"), point1X, point1Y);
                    newLine = new Line(new Point(point1X, point1Y), new Point(point2X, point2Y));
                    if (data.GlobalSettings.Selenium.DrawMouseMovement)
                    {
                        DrawRedDots(data.Driver, newLine.getPoints(qty), 5);
                    }
                    foreach (var p in newLine.getOffsets(qty))
                    {
                        actions.MoveByOffset(p.X, p.Y);
                    }
                    break;

                case "DRAWLINEHUMAN":
                    if (LineParser.Lookahead(ref input) == TokenType.Integer)
                    {
                        point1X = LineParser.ParseInt(ref input, "X1");
                        point1Y = LineParser.ParseInt(ref input, "Y1");
                        LineParser.ParseToken(ref input, TokenType.Arrow, true);
                        point2X = LineParser.ParseInt(ref input, "X2");
                        point2Y = LineParser.ParseInt(ref input, "Y2");
                    }
                    else
                    {
                        elem1   = ParseElement(ref input, data);
                        point1X = elem1.Location.X;
                        point1Y = elem1.Location.Y;
                        LineParser.ParseToken(ref input, TokenType.Arrow, true);
                        elem2   = ParseElement(ref input, data);
                        point2X = elem2.Location.X;
                        point2Y = elem2.Location.Y;
                    }
                    LineParser.EnsureIdentifier(ref input, ":");
                    qty = LineParser.ParseInt(ref input, "QUANTITY");
                    if (LineParser.Lookahead(ref input) == TokenType.Integer)
                    {
                        gravity = LineParser.ParseInt(ref input, "GRAVITY");
                        wind    = LineParser.ParseInt(ref input, "WIND");
                    }
                    // Move to the first point
                    actions.MoveToElement(data.Driver.FindElementByTagName("body"), point1X, point1Y);
                    newLine = new Line(new Point(point1X, point1Y), new Point(point2X, point2Y));
                    var array    = newLine.HumanWindMouse(point1X, point1Y, point2X, point2Y, gravity, wind, 1);
                    var shrinked = ShrinkArray(array, qty);
                    if (data.GlobalSettings.Selenium.DrawMouseMovement)
                    {
                        DrawRedDots(data.Driver, shrinked, 5);
                    }
                    foreach (var p in GetOffsets(shrinked))
                    {
                        actions.MoveByOffset(p.X, p.Y);
                    }
                    break;
                }
            }

            return(new Action(() =>
            {
                actions.Build();
                actions.Perform();
                data.Log(new LogEntry("Executed Mouse Actions", Colors.White));
            }));
        }