aboutsummaryrefslogtreecommitdiff
path: root/code/cogs/owner/stats.py
blob: 258b10242489f0b6acb1475127881630f5bbdf30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
from discord.ext import commands, tasks
import sqlite3
import discord
import os

from utils.config import BOT_COLOR, LOG


class Stats(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    def cog_load(self):
        if not os.path.exists("data"):
            os.makedirs("data")

        connection = sqlite3.connect("data/count.db")
        if not connection:
            LOG.error(
                "Could not create connection to database. Likely permissions"
                " issue."
            )

        cursor = connection.cursor()
        cursor.execute(
            "CREATE TABLE IF NOT EXISTS count (command_name, count, PRIMARY"
            " KEY (command_name))"
        )
        connection.commit()
        connection.close()

        self.dump_count.start()

    @tasks.loop(seconds=30)
    async def dump_count(self):
        connection = sqlite3.connect("data/count.db")
        if not connection:
            LOG.warning("No database connection. Skipping dump.")

        cursor = connection.cursor()

        for command_name, count in self.bot.temp_command_count.items():
            try:
                cursor.execute(
                    "INSERT INTO count (command_name, count) VALUES (?, ?)",
                    (command_name, count),
                )
            except sqlite3.IntegrityError:
                cursor.execute(
                    "UPDATE count SET count = count + ? WHERE"
                    " command_name = ?",
                    (count, command_name),
                )

        connection.commit()
        connection.close()
        self.bot.temp_command_count = {}

    @commands.Cog.listener()
    async def on_app_command_completion(self, interaction, command):
        try:
            self.bot.temp_command_count[interaction.command.name] += 1
        except KeyError:
            self.bot.temp_command_count[interaction.command.name] = 1

    @commands.command()
    @commands.dm_only()
    @commands.is_owner()
    async def stats(self, ctx: commands.Context):
        connection = sqlite3.connect("data/count.db")
        cursor = connection.cursor()

        # Pull the top 5 commands being run
        data = cursor.execute(
            "SELECT * FROM count ORDER BY count DESC LIMIT 5"
        ).fetchall()

        # Get the combined total amount of commands run
        total_commands = cursor.execute(
            "SELECT SUM(count) FROM count"
        ).fetchone()[0]

        embed = discord.Embed(
            title="Statistics",
            description=(
                f"Total Guilds: `{len(self.bot.guilds):,}`\n"
                f"Total Commands: `{total_commands:,}`\n\n"
                f"Total Players: `{len(self.bot.lavalink.get_players())}`\n"
                "Load:"
                f" `{round(self.bot.lavalink.nodes[0].stats.lavalink_load * 100, 2)}%`"
            ),
            color=BOT_COLOR,
        )

        for entry in data:
            embed.add_field(
                name=entry[0], value=f"` {entry[1]:,} `", inline=True
            )

        connection.close()
        await ctx.send(embed=embed)

    @stats.error
    async def stats_error(self, ctx, error):
        return


async def setup(bot):
    await bot.add_cog(Stats(bot))