|
1
|
|
|
import re |
|
2
|
|
|
|
|
3
|
|
|
from pincer import __version__ |
|
4
|
|
|
from pincer.commands import ChatCommandHandler |
|
5
|
|
|
from pincer.objects import Embed, Message, InteractionFlags |
|
6
|
|
|
from pincer.utils import TaskScheduler |
|
7
|
|
|
|
|
8
|
|
|
from pincer_bot.core.command import guild_command |
|
9
|
|
|
from pincer_bot.tasks.get_pypi_downloads import get_pypi_stats |
|
10
|
|
|
|
|
11
|
|
|
DL_PATTERN = re.compile(r'downloads: \d*') |
|
12
|
|
|
|
|
13
|
|
|
|
|
14
|
|
|
class InfoCog: |
|
15
|
|
|
|
|
16
|
|
|
def __init__(self, client): |
|
17
|
|
|
self.client = client |
|
18
|
|
|
|
|
19
|
|
|
task = TaskScheduler(self.client) |
|
20
|
|
|
self.get_pypi_downloads = task.loop(minutes=10)(get_pypi_stats) |
|
21
|
|
|
self.get_pypi_downloads.start() |
|
22
|
|
|
|
|
23
|
|
|
@guild_command(name='about') |
|
24
|
|
|
async def about_command(self) -> Embed: |
|
25
|
|
|
return Embed( |
|
26
|
|
|
title=f"Pincer - {__version__}", |
|
27
|
|
|
description=( |
|
28
|
|
|
"🚀 An asynchronous python API wrapper meant to replace " |
|
29
|
|
|
"discord.py\n> Snappy discord api wrapper written " |
|
30
|
|
|
"with aiohttp & websockets" |
|
31
|
|
|
) |
|
32
|
|
|
).add_field( |
|
33
|
|
|
name="**Github Repository**", |
|
34
|
|
|
value="> https://github.com/Pincer-org/Pincer" |
|
35
|
|
|
).add_field( |
|
36
|
|
|
name="Website", |
|
37
|
|
|
value="> https://pincer.dev" |
|
38
|
|
|
).add_field( |
|
39
|
|
|
name="PyPI package", |
|
40
|
|
|
value="> https://pypi.org/project/Pincer" |
|
41
|
|
|
).add_field( |
|
42
|
|
|
name="ReadTheDocs", |
|
43
|
|
|
value="> https://pincer.readthedocs.io" |
|
44
|
|
|
).set_footer( |
|
45
|
|
|
text="The package is currently within the planning phase", |
|
46
|
|
|
icon_url="https://pincer.dev/img/icon.png" |
|
47
|
|
|
).set_author( |
|
48
|
|
|
name="Pincer", |
|
49
|
|
|
url='https://pincer.dev', |
|
50
|
|
|
icon_url="https://pincer.dev/img/icon.png" |
|
51
|
|
|
).set_thumbnail( |
|
52
|
|
|
url="https://pincer.dev/img/icon.png" |
|
53
|
|
|
).set_image( |
|
54
|
|
|
url=( |
|
55
|
|
|
"https://repository-images.githubusercontent.com" |
|
56
|
|
|
"/400871418/045ebf39-7c6e-4c3a-b744-0c3122374203" |
|
57
|
|
|
) |
|
58
|
|
|
) |
|
59
|
|
|
|
|
60
|
|
|
@guild_command(name="help") |
|
61
|
|
|
async def help_command(self): |
|
62
|
|
|
return Message( |
|
63
|
|
|
content='>>> ' + '\n'.join( |
|
64
|
|
|
f"`{cmd_name.capitalize()}` - {cmd_obj.app.description}" |
|
65
|
|
|
for cmd_name, cmd_obj in ChatCommandHandler.register.items() |
|
66
|
|
|
), |
|
67
|
|
|
flags=InteractionFlags.EPHEMERAL |
|
68
|
|
|
) |
|
69
|
|
|
|
|
70
|
|
|
@guild_command(name="pypi_dl") |
|
71
|
|
|
async def pypi_dl_command(self): |
|
72
|
|
|
height = 15 |
|
73
|
|
|
pypi = self.client.pypi |
|
74
|
|
|
|
|
75
|
|
|
lines = [ |
|
76
|
|
|
(round((n / pypi.daily_max) * height) * '█').rjust(height, '░') |
|
77
|
|
|
for n in self.client.pypi.downloads.values() |
|
78
|
|
|
] |
|
79
|
|
|
|
|
80
|
|
|
rotated = '\n'.join( |
|
81
|
|
|
''.join(line)[::-1] for line in zip(*lines) |
|
82
|
|
|
) |
|
83
|
|
|
|
|
84
|
|
|
return Embed( |
|
85
|
|
|
title="PyPI stats", |
|
86
|
|
|
description=( |
|
87
|
|
|
f"Totals downloads: `{self.client.pypi.total_downloads:,}`\n" |
|
88
|
|
|
f"Daily average: `{self.client.pypi.daily_average:,.0f}`" |
|
89
|
|
|
) |
|
90
|
|
|
).add_field( |
|
91
|
|
|
name="graph", |
|
92
|
|
|
value=f'```py\n{rotated}\n```' |
|
93
|
|
|
) |
|
94
|
|
|
|
|
95
|
|
|
|
|
96
|
|
|
setup = InfoCog |
|
97
|
|
|
|