Ejemplo n.º 1
0
        public async Task Execute(object arguments, Message message)
        {
            var a       = (Arguments)arguments;
            var expDiff = RSUtil.ExpBetweenLevels(a.Level1, a.Level2);

            await message.Channel.SendMessage(
                $"The total experience between levels **{a.Level1}** and **{a.Level2}** " +
                $"is **{expDiff.ToString("#,##0")}**");
        }
Ejemplo n.º 2
0
        private async Task <string> MakeChart(item item, int days)
        {
            var history = (await RSUtil.GetPriceHistory(item.Name, true))
                          .Reverse()
                          .Take(days)
                          .Reverse()
                          .ToIDictionary();
            var chart     = new Chart();
            var chartArea = new ChartArea();
            var series    = new Series();

            // Chart area setup
            double min = history.Aggregate(int.MaxValue, (a, h) => h.Value < a ? h.Value : a);
            double max = history.Aggregate(0, (a, h) => h.Value > a ? h.Value : a);

            min = Math.Floor(min * 0.95);
            max = Math.Ceiling(Math.Min(double.MaxValue, max * 1.05));

            // Chart setup
            chart.Size = new Size(539 + max.ToString("#,##0").Length * 8, 500);

            chartArea.AxisX.LabelStyle.Format    = days > 119 ? "MMM yyyy" : "MMM dd";
            chartArea.AxisY.LabelStyle.Format    = "#,##0";
            chartArea.AxisX.MajorGrid.LineColor  = Color.FromArgb(0x3e, 0x41, 0x46);
            chartArea.AxisY.MajorGrid.LineColor  = Color.FromArgb(0x3e, 0x41, 0x46);
            chartArea.AxisX.LabelStyle.ForeColor = Color.FromArgb(unchecked ((int)4294967264));
            chartArea.AxisY.LabelStyle.ForeColor = Color.FromArgb(unchecked ((int)4294967264));
            chartArea.BackColor             = Color.FromArgb(0x2e, 0x31, 0x36);
            chart.BackColor                 = Color.FromArgb(0x2e, 0x31, 0x36);
            chartArea.AxisX.LabelStyle.Font = new Font("Consolas", 8);
            chartArea.AxisY.LabelStyle.Font = new Font("Consolas", 8);
            chartArea.AxisY.Minimum         = min;
            chartArea.AxisY.Maximum         = max;
            chart.ChartAreas.Add(chartArea);

            // Series setup
            series.Name       = "Series1";
            series.ChartType  = SeriesChartType.Line;
            series.XValueType = ChartValueType.DateTime;
            chart.Series.Add(series);

            // bind the datapoints
            chart.Series["Series1"].Points.DataBindXY(history.Keys, history.Values);

            // draw!
            chart.Invalidate();

            // write out a file
            using (var ms = new MemoryStream())
            {
                chart.SaveImage(ms, ChartImageFormat.Png);
                return(await ImageUtil.PostToImgur(ms.ToArray()));
            }
        }
Ejemplo n.º 3
0
        public async Task <object> ParseArguments(string[] args, Message message)
        {
            var a = new Arguments();

            var optSet = new OptionSet
            {
                { "c|chart=", (int?c) => a.Days = c }
            };

            a.Item = await RSUtil.GetItemForDynamic(string.Join(" ", optSet.Parse(args)));

            // Validating
            if (a.Days < 31)
            {
                throw new ControlledException("Chart must be greater than or equal to 31.");
            }

            return(a);
        }
Ejemplo n.º 4
0
        public async Task Execute(object arguments, Message message)
        {
            var    a     = (Arguments)arguments;
            var    table = new Table();
            var    temp  = a.OSRS ? "OLDSCHOOL" : "RS3";
            string m;

            // Getting user's stats
            var stats = a.OSRS
                ? (object)await OSRSUtil.GetStatsForUser(a.Username)
                : (object)await RSUtil.GetStatsForUser(a.Username);

            // Table making
            table.SetTitle($"VIEWING {temp} STATS FOR {a.Username.ToUpper()}");
            table.SetHeadings("Skill", "Level", "Experience", "Rank");
            stats.GetType().GetProperties().ForEach(p =>
            {
                var stat = (Stat)p.GetMethod.Invoke(stats, null);

                table.AddRow(
                    p.Name,
                    new Table.Column(stat.Level, Table.Column.Alignment.Right),
                    new Table.Column(stat.Exp.ToString("#,##0"), Table.Column.Alignment.Right),
                    new Table.Column(stat.Rank.ToString("#,##0"), Table.Column.Alignment.Right));
            });

            // Uploading image
            if (a.Image)
            {
                m = await ImageUtil.PostToImgur(ImageUtil.ToImage(table.ToString()));
            }
            else
            {
                m = $"```{table}```";
            }

            await message.Channel.SendMessage(m);
        }
    private void Jump(GameEvent gameEvent)
    {
        if (gameEvent == GameEvent.Jump && charState.IsIdleOrMoving())
        {
            animator.SetBool("WallBounce", false);

            EventManager.OnCharEvent(GameEvent.Jump);
            InputController.jumpReleased = false;

            //jumpTime = Time.time;

            // Change the forward speed based on what kind of jump it is
            if (charState.IsIdle())
            {
                animator.SetTrigger(anim_idleJump);
            }

            else if (charState.IsRunning())
            {
                animator.SetTrigger(anim_runningJump);
            }

            else if (charState.IsSprinting())
            {
                animator.SetBool(anim_sprintJump, true);
                RSUtil.OrientCapsuleCollider(cCollider, false);
                //Debug.Break();
            }
        }

        //print (gameEvent);
        else if (gameEvent == GameEvent.Jump && charState.IsIdleOrRunningJumping() && !hasDoubleJumped)
        {
            animator.SetTrigger(anim_doubleJump);
        }
    }
Ejemplo n.º 6
0
        private async Task AddItem(AddArguments args, Message m)
        {
            using (Database db = new Database())
            {
                item item;
                var  message = "";

                // Removing item already in the DB
                for (var i = args.Items.Count() - 1; i >= 0; i--)
                {
                    string itemReadable = args.Items.ElementAt(i);
                    int    temp;

                    // Checking if the string is an int
                    if (int.TryParse(itemReadable, out temp))
                    {
                        item = await db.items.FindAsync(temp);
                    }
                    else
                    {
                        item = await db.items.FirstOrDefaultAsync(it => it.Name == itemReadable);
                    }

                    // Checking if item is in DB
                    if (item != null)
                    {
                        message += $"**{item.Name}** already exists in the database.\n";
                        args.Items.Remove(itemReadable);
                    }
                }

                var tasks = new Task <item> [args.Items.Count];

                // Fetching item data
                for (var i = 0; i < args.Items.Count; i++)
                {
                    tasks[i] = RSUtil.GetItemForDynamic(args.Items.ElementAt(i));
                }

                // Waiting for all items to complete
                await Task.Run(() => { try { Task.WaitAll(tasks); } catch (Exception) { } });

                // Adding items
                foreach (var t in tasks)
                {
                    // Skipping if task errored
                    if (t.Status != TaskStatus.RanToCompletion)
                    {
                        continue;
                    }

                    item = t.Result;
                    db.items.Add(item);
                    message += $"**{item.Name}** has added to the database.\n";

                    // Removing completed from array
                    args.Items.Remove(item.Name);
                    args.Items.Remove(item.Id.ToString());
                }

                // Outputting message for those that errors
                foreach (var s in args.Items)
                {
                    message += $"**{s}** could not be added to the database.\n";
                }

                // Saving
                if (await db.SaveChangesAsync() < 0)
                {
                    message += "There was an error saving the items to the database.\n";
                }

                await m.Channel.SendMessage(message.Substring(0, message.Length - 1));
            }
        }
Ejemplo n.º 7
0
	private void Awake ()
	{
		if (Instance == null)
			Instance = this;
	}
Ejemplo n.º 8
0
        private async Task UpdateItem(UpdateArguments args, Message message)
        {
            var m = await message.Channel.SendMessage("Updating...");

            using (var db = new Database())
            {
                // Excluding items not in the db
                var updated = 0;

                var runeday = await RSUtil.GetRuneday();

                var total = await db.Database.SqlQuery <int>(
                    "SELECT COUNT(*) " +
                    "FROM items " +
                    "WHERE Id <> 0 " +
                    "AND UpdatedAtRD <> @p0", runeday)
                            .FirstAsync();

                db.Database.Log = Console.WriteLine;

                for (var i = 0;; i++)
                {
                    // Getting item batch
                    var items = await db.Database.SqlQuery <item>(
                        "SELECT * " +
                        "FROM items " +
                        "WHERE Id <> 0 " +
                        "AND UpdatedAtRD <> @p0 " +
                        "LIMIT @p1, 50"
                        , runeday
                        , i * 50)
                                .ToListAsync();

                    if (items.Count <= 0)
                    {
                        break;
                    }

                    var tasks = new Task <item> [items.Count];

                    // Starting tasks
                    items.ForEachWithIndex((index, item)
                                           => tasks[index] = RSUtil.GetItemForId((int)item.Id, item.Name, runeday));

                    // Waiting for tasks to complete
                    await Task.Run(() =>
                    {
                        try { Task.WaitAll(tasks); } catch (Exception) {}
                    });

                    var updateQuery = "UPDATE items SET Price = (CASE";

                    var predicatedTasks = tasks.Where(t => t.Status == TaskStatus.RanToCompletion);
                    predicatedTasks.ForEach(t => updateQuery += $" WHEN Id = {t.Result.Id} THEN {t.Result.Price}");

                    updateQuery += " ELSE Price END), UpdatedAtRD = @p0, UpdatedAt = @p1 WHERE Id In " +
                                   $"({string.Join(",", predicatedTasks.Select(t => t.Result.Id))});";

                    updated += db.Database.ExecuteSqlCommand(updateQuery
                                                             , runeday
                                                             , DateTime.Now);

                    await m.Edit($"Updated **{updated}**/**{total}** items.");
                }

                await message.Channel.SendMessage($"Item updates completed. Updated **{updated}**/**{total}** items.");
            }
        }
Ejemplo n.º 9
0
        private async Task <object> ParseSearchArguments(string[] args, Message message)
        {
            SearchArguments a = new SearchArguments {
                Orders = new List <SearchArguments.Order>()
            };
            FluentCommandLineParser parser = new FluentCommandLineParser();
            string usernme    = null;
            bool   helpCalled = false;

            parser.Setup <AddArguments.Skill>('s', "skill")
            .Callback(s => a.Skill = s)
            .Required();

            parser.Setup <List <string> >('u', "username")
            .Required()
            .Callback(u => usernme = string.Join(" ", u));

            parser.Setup <bool>('i', "image")
            .Callback(i => a.Image = i);

            parser.Setup <int>('p', "page")
            .SetDefault(1)
            .Callback(p => a.Page = p);

            parser.Setup <int>('l', "limit")
            .SetDefault(10)
            .Callback(l => a.Limit = l);

            parser.Setup <int>('L', "level")
            .Required()
            .Callback(l => a.Level = l);

            parser.Setup <List <SearchArguments.Order> >('o', "order")
            .SetDefault(new List <SearchArguments.Order> {
                SearchArguments.Order.Name
            })
            .Callback(o => a.Orders = o);

            parser.Setup <bool>('?', "help")
            .Callback(h => helpCalled = h);

            var r = parser.Parse(args);

            if (r.HasErrors || helpCalled)
            {
                if (!helpCalled)
                {
                    await message.Channel.SendMessage($"```{r.ErrorText}```");

                    return(false);
                }

                await message.Channel.SendMessage(
                    "**Usage:**\n" +
                    "```!recipe search <-s|skill> <-u|username> <-L|level> [-q|query] [-p|page] [-l|limit] [-o|order]```\n" +
                    "**Options:**\n" +
                    "`-s`, `--skill` **REQUIRED**\n" +
                    "The skill you wish to get methods of training for.\n" +
                    "\n" +
                    "`-u`, `--username` **REQUIRED**\n" +
                    "Your in game name.\n" +
                    "\n" +
                    "`-L`, `--level` **REQUIRED**\n" +
                    "The level you wish to obtain\n" +
                    "\n" +
                    "`-p`, `--page` *OPTIONAL*\n" +
                    "The page of results to show.\n" +
                    "\n" +
                    "`-l`, `--limit` *OPTIONAL*\n" +
                    "Results per page.\n" +
                    "\n" +
                    "`-o`, `--order` *OPTIONAL*\n" +
                    "How the results will be ordered. Values can be Cheap, Expensive, Slow, Fast, Name, Level");

                return(false);
            }

            // Getting username
            a.RS3Stats = await RSUtil.GetStatsForUser(usernme);

            return(a);
        }
Ejemplo n.º 10
0
        private async Task SearchRecipe(SearchArguments a, Message message)
        {
            using (var db = new Database())
            {
                Stat stat        = a.RS3Stats.GetStatForName(a.Skill.ToString());
                int  levelDiff   = RSUtil.ExpBetweenLevels(stat, a.Level);
                var  dbLookup    = new Stopwatch();
                var  queryBuild  = new Stopwatch();
                var  upload      = new Stopwatch();
                var  convertText = new Stopwatch();

                queryBuild.Start();
                var tempQuery = db.recipes
                                .Where(r => r.Skill == (int)a.Skill)
                                .Where(r => r.Level <= stat.Level)
                                .Select(r => new Entity
                {
                    Id     = r.Id,
                    Name   = r.Name,
                    Level  = r.Level,
                    Exp    = r.Exp,
                    ExpH   = r.Exp * r.Units,
                    Number = (int)Math.Ceiling(levelDiff / r.Exp),
                    Cost   = (db.outputs.Where(o => o.RecipeId == r.Id).Sum(o => o.Quantity * o.item.Price)
                              - (db.inputs.Where(i => i.RecipeId == r.Id).Sum(i => i.Quantity * i.item.Price) + r.Extra))
                             * Math.Ceiling(levelDiff / r.Exp),
                    Time = Math.Ceiling(levelDiff / r.Exp) / r.Units
                });

                var firstOrder = a.Orders.First();
                IOrderedQueryable <Entity> query = null;

                // Doing first sort
                switch (firstOrder)
                {
                case SearchArguments.Order.Expensive:
                    query = tempQuery.OrderBy(r => r.Cost);
                    break;

                case SearchArguments.Order.Fast:
                    query = tempQuery.OrderBy(r => r.Time);
                    break;

                case SearchArguments.Order.Cheap:
                    query = tempQuery.OrderByDescending(r => r.Cost);
                    break;

                case SearchArguments.Order.Slow:
                    query = tempQuery.OrderByDescending(r => r.Time);
                    break;

                case SearchArguments.Order.Name:
                    query = tempQuery.OrderBy(r => r.Name);
                    break;

                case SearchArguments.Order.Level:
                    query = tempQuery.OrderBy(r => r.Level);
                    break;
                }

                // Consecutive sort
                for (var i = 1; i < a.Orders.Count; i++)
                {
                    switch (firstOrder)
                    {
                    case SearchArguments.Order.Expensive:
                        query = query.ThenByDescending(r => r.Cost);
                        break;

                    case SearchArguments.Order.Fast:
                        query = query.ThenBy(r => r.Time);
                        break;

                    case SearchArguments.Order.Cheap:
                        query = query.ThenBy(r => r.Cost);
                        break;

                    case SearchArguments.Order.Slow:
                        query = query.ThenByDescending(r => r.Time);
                        break;

                    case SearchArguments.Order.Name:
                        query = query.ThenBy(r => r.Name);
                        break;

                    case SearchArguments.Order.Level:
                        query = query.ThenBy(r => r.Level);
                        break;
                    }
                }

                // Stopping query builder timer
                queryBuild.Stop();

                var pages = Math.Ceiling((decimal)await query.LongCountAsync() / a.Limit);

                // Starting db lookup
                dbLookup.Start();

                var recipes = await query.Skip((a.Page - 1) *a.Limit)
                              .Take(a.Limit)
                              .ToListAsync();

                // END OF DB LOOKUP
                dbLookup.Stop();

                if (!recipes.Any())
                {
                    await message.Channel.SendMessage("No recipes found.");

                    return;
                }

                // Formatting
                Table table = new Table();
                table.SetTitle($"{a.Skill} Recipes ({a.Page}/{pages})");
                table.SetHeadings("Id", "Name", "Level", "Xp", "Xp/H", "Number", "Cost", "Time");
                recipes.ForEach(r => table.AddRow(
                                    r.Id
                                    , r.Name
                                    , new Table.Column(r.Level, Table.Column.Alignment.Right)
                                    , new Table.Column(r.Exp.ToString("#,##0.##"), Table.Column.Alignment.Right)
                                    , new Table.Column(r.ExpH.ToString("#,##0.##"), Table.Column.Alignment.Right)
                                    , new Table.Column(r.Number.ToString("#,##0"), Table.Column.Alignment.Right)
                                    , new Table.Column(r.Cost.ToString("#,##0"), Table.Column.Alignment.Right)
                                    , new Table.Column(r.Time.ToFormattedTime(), Table.Column.Alignment.Right)));

                string @out = $"{table}";

                // Outputing image
                if (a.Image)
                {
                    var img  = convertText.TimeTask(() => ImageUtil.ToImage(@out));
                    var link = await upload.TimeTaskAsync(async() => await ImageUtil.PostToImgur(img));

                    await message.Channel.SendMessage(link + "\n" +
                                                      $"**Build Query**: {dbLookup.ElapsedMilliseconds}ms | " +
                                                      $"**Query DB**: {queryBuild.Elapsed.Milliseconds}ms | " +
                                                      $"**Convert Text**: {convertText.ElapsedMilliseconds}ms | " +
                                                      $"**Upload Image**: {upload.ElapsedMilliseconds}ms");
                }
                else
                {
                    await message.Channel.SendMessage($"**Build Query**: {dbLookup.ElapsedMilliseconds}ms | " +
                                                      $"**Query DB**: {queryBuild.Elapsed.Milliseconds}ms" +
                                                      $"```{@out}```");
                }
            }
        }