aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts/evergreen/cheatsheet.py
blob: 3a6890054b1a2eb7887f1e19409f7a12fd04d514 (plain) (blame)
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
import random
import re
import typing as t
from urllib.parse import quote_plus

from discord import Embed
from discord.ext import commands
from discord.ext.commands import BucketType, Context

from bot.constants import Channels, Colours, ERROR_REPLIES

ERROR_MESSAGE = """
Unknown cheat sheet. Please try to reformulate your query.

**Examples**:
```md
.cht read json
.cht hello world
.cht lambda
```
If the problem persists send a message in <#{channel}>
"""


class ChtSh(commands.Cog):
    """Commands that sends a result of a cht.sh search in code blocks."""

    def __init__(self, bot: commands.Bot):
        self.bot = bot

    @staticmethod
    def fmt_error_embed() -> Embed:
        """If the cht.sh search returned 404, overwrite it to send a custom error embed."""
        embed = Embed(colour=Colours.soft_red)
        embed.title = random.choice(ERROR_REPLIES)
        embed.description = ERROR_MESSAGE.format(channel=Channels.dev_contrib)
        return embed

    def result_fmt(self, url: str, body_text: str) -> t.Tuple[bool, t.Union[str, Embed]]:
        """Format Result."""
        if body_text.startswith("#  404 NOT FOUND"):
            embed = self.fmt_error_embed()
            return True, embed

        body_space = min(1986 - len(url), 1000)

        if len(body_text) > body_space:
            description = f"**Result Of cht.sh**\n" \
                          f"```python\n{body_text[:body_space]}\n" \
                          f"... (truncated - too many lines)```\n" \
                          f"Full results: {url} "
        else:
            description = f"**Result Of cht.sh**\n" \
                          f"```python\n{body_text}```\n" \
                          f"{url}"
        return False, description

    @commands.command(
        name="cheat",
        aliases=("cht.sh", "cheatsheet", "cheat-sheet", "cht"),
    )
    @commands.cooldown(1, 10, BucketType.user)
    async def cheat_sheet(
            self, ctx: Context, *search_terms: str
    ) -> None:
        """
        Search cheat.sh.

        Gets a post from https://cheat.sh/python/ by default.
        Usage:
        --> .cht read json
        """
        url = f'https://cheat.sh/python/{quote_plus(" ".join(search_terms))}'
        headers = {
            'User-Agent': 'curl/7.68.0'
        }

        escape_tt = str.maketrans({"`": "\\`"})
        ansi_re = re.compile(r"\x1b\[.*?m")

        async with self.bot.http_session.get(url, headers=headers) as response:
            result = ansi_re.sub("", await response.text()).translate(escape_tt)

        is_embed, desciprtion = self.result_fmt(url, result)
        if is_embed:
            await ctx.send(embed=desciprtion)
        else:
            await ctx.send(content=desciprtion)


def setup(bot: commands.Bot) -> None:
    """Load the ChtSh cog."""
    bot.add_cog(ChtSh(bot))