276 Commits

Author SHA1 Message Date
Tom
9356e385d8 Merge pull request #2 from WhoTheOOF/patch-2
fix my dumb <>
2021-08-27 19:14:51 -07:00
6feab9abba fix my dumb <> 2021-08-27 21:11:40 -05:00
Tom
3bbb1187c9 Merge pull request #1 from WhoTheOOF/patch-1
update links to new links
2021-08-27 19:09:24 -07:00
cb3869f39c update links to new links 2021-08-27 21:07:45 -05:00
2b66f2288c well, that was another failed idea... 2021-07-13 20:06:54 -05:00
00619fc6cd Making progress, almost there... 2021-07-13 19:58:09 -05:00
3056c6f0f4 new attempr 2021-07-13 19:53:19 -05:00
d7a0b0af04 oops 2021-07-13 19:37:14 -05:00
f8bf64c9b7 that failed... 2021-07-13 19:32:30 -05:00
8e6601c2c5 first attempt to shortcuts 2021-07-13 19:28:52 -05:00
2df88ccc27 Apparently a conflict sneaked through 2021-06-25 21:07:02 -05:00
0f3b15f10d Merge branch 'Rapptz-v1.x' 2021-06-25 20:34:02 -05:00
2a32e56873 fix conflict 2021-06-25 20:33:22 -05:00
34f6c5db10 looks like I changed stuff? 2021-06-25 20:29:27 -05:00
462ba84809 Version bump to v1.7.3 2021-06-12 12:09:54 -04:00
9ff979572a Add changelog for v1.7.3 2021-06-12 12:09:38 -04:00
9376fcd69d Fix crash involving stickers 2021-06-12 12:04:25 -04:00
e79321c032 Fix DM channel permissions not having read_messages 2021-06-12 12:01:53 -04:00
81457330ed [docs] typo fix 2021-06-12 12:01:14 -04:00
72dd2381b0 Update docs for (Partial)Message.publish to reflect the actual permissions needed 2021-06-12 12:01:01 -04:00
f0c3568ea9 Fix for doc reference to python "raise" statement
:ref:`py:raise` -> :ref:`raise statement <py:raise>`

Before fix the text reads: "...define an on_error handler consisting
of a single empty The raise statement." After fix it should read: 
"...define an on_error handler consisting of a single empty raise
statement."
2021-06-12 12:00:33 -04:00
6a52eea6ff Fix AuditLogEntry.target being incorrect for bulk message delete
Fixes #6851
2021-05-05 00:18:44 -04:00
9d2576e464 Version bump to v1.7.2 2021-05-02 23:35:53 -04:00
69fdf8c67d Add changelog for v1.7.2 2021-05-02 23:35:25 -04:00
917649b1b2 fix conflicts 2021-05-02 21:05:05 -05:00
f6c8bfdf0d Clarify ClientUser.verified docs 2021-05-01 10:33:01 -04:00
5e7357efa5 Fix grammar in the Guild.edit docstring 2021-05-01 10:31:44 -04:00
318166d875 [docs] Update notes for get_user and get_member 2021-05-01 10:31:27 -04:00
648b786bc1 Adjust quickstart to not show commands example 2021-05-01 10:31:00 -04:00
ccf7e65c50 Fix documentation for RoleConverter 2021-05-01 10:30:27 -04:00
eb1d03f8f7 Fix typo within HelpCommand.verify_checks documentation 2021-05-01 10:30:02 -04:00
5b98ce1235 [docs] fix docstring of AppInfo 2021-05-01 10:29:31 -04:00
06184dc25f Update lavalink's repo url 2021-05-01 10:28:28 -04:00
a9dba2753f [tasks] Move the Loop's sleep to be before exit conditions
This change makes it more so that `Loop.stop()` gracefully makes the
current iteration the final one, by waiting AND THEN returning.
The current implementation is closer to `cancel`, while also not.

I encountered this because I was trying to run a
`@tasks.loop(count=1)`, and inside it I print some text and change the
interval, and in an `after_loop`, I restart the loop.

Without this change, it immediately floods my console, due to
not waiting before executing `after_loop`.
2021-05-01 10:28:00 -04:00
87dd046c32 Add periods to sticker docs 2021-05-01 10:27:12 -04:00
7d37c3a506 [docs] Fix various unresolved references 2021-05-01 10:26:11 -04:00
4d47436b02 Fix guild.chunk() not working on evicted guilds
If you're trying to chunk a guild that the bot is not in, 
it'll just hang on the chunk coro forever. It's weird, I know.
2021-05-01 10:24:40 -04:00
f50877c9b8 Add note to member docs about Spotify limitation 2021-05-01 10:24:07 -04:00
afca943f16 Fix exception for invalid channel types 2021-05-01 10:22:49 -04:00
81e3f58f43 Fix async adapter detection in message deletion 2021-04-29 19:21:33 -04:00
523e35e4f3 Merge pull request #17 from TheMoksej/patch-2
add silent feature back to delete() function
2021-04-17 16:57:46 +02:00
93da1d920e didn't mean to remove this 2021-04-17 16:47:15 +02:00
cdfd918604 add silent feature back to delete() function
latest commit removed the silent kwarg from the delete function so I'm adding it back
2021-04-17 16:46:06 +02:00
f1130e4985 Fix fail_if_not_exists not being set when constructed with state 2021-04-15 09:00:51 -04:00
187b811836 Add StageChannel to abc.GuildChannel docs 2021-04-15 09:00:09 -04:00
ff04cab119 [docs] Fix reference to Guild.id 2021-04-15 09:00:09 -04:00
65205a8e39 Fix Intents resolution in the docs 2021-04-15 09:00:09 -04:00
28934001b2 Bring back discord module in discord.ext.commands documentation 2021-04-15 09:00:09 -04:00
af7d93725d Remove current module reference in commands API docs 2021-04-15 09:00:09 -04:00
efa6482ac4 Add missing attribute tables 2021-04-15 08:58:32 -04:00
4756485ea4 [commands] Add StageChannelConverter to documentation 2021-04-15 08:58:00 -04:00
8b4d7f122c [commands] Update Converter list in ext.commands introduction 2021-04-15 08:57:45 -04:00
0d1cf57f62 [docs] add note for possible Embed.type strings 2021-04-15 08:57:25 -04:00
3ad795ab6a [docs] add label to basic converters section 2021-04-15 08:57:08 -04:00
a453266cd4 conflict fixes 2021-04-07 18:27:34 -05:00
8517f1e085 Version bump to v1.7.1 2021-04-05 21:21:41 -04:00
0a4be8f83c Update changelog for v1.7.1 2021-04-05 21:21:41 -04:00
56faa98e4b Fix versionadded not showing in docs for Attachment.content_type 2021-04-05 21:10:55 -04:00
1b2c527fc7 [commands] Fix logic in Cog.has_error_handler() 2021-04-05 21:08:54 -04:00
f1309aa4a1 added Client.get_message 2021-02-11 18:38:33 -06:00
86fd3fb738 conflict fixes 2021-01-14 18:03:09 -06:00
694e5e2861 guess I missed this one 2021-01-12 22:33:47 -06:00
54b5e253c9 another small fix 2021-01-12 22:30:55 -06:00
493fc88d6d fix some docs issues 2021-01-12 22:16:09 -06:00
732cab7c5c Works, so added to dos. + little cleanup 2021-01-12 21:57:23 -06:00
2c650feb98 cant support aiohttp 3.8 yet 2021-01-12 21:41:51 -06:00
316e74a9ec test for silent message deleting 2021-01-12 21:39:41 -06:00
89d2f00911 so eh, lets comment this out for now since using it crashes the machine... 2021-01-05 19:46:05 -06:00
a0d491c71f fix machine crashes? 2021-01-05 19:15:24 -06:00
be0933c928 broke case insensitive prefixes... Oops 2021-01-05 18:57:12 -06:00
db9dd93ad4 docs update + add case_insensitive_prefix 2021-01-05 18:20:23 -06:00
b50b8e903f update docs 2020-12-30 22:19:26 -06:00
57e6c946c9 Merge branch 'master' of https://github.com/iDutchy/discord.py 2020-12-30 18:52:30 -06:00
f4bec507c1 attempt at cog aliases 2020-12-30 18:52:15 -06:00
e090eb66d1 Merge pull request #12 from averwhy/master
fix typo in custom_features
2020-12-05 02:07:45 +01:00
0354036451 fix conflicts 2020-12-04 19:05:58 -06:00
9f54345f5c idk, first attempt at adding docs ig. Probably gonna break so yea... 2020-12-01 02:25:51 -06:00
4f3d489135 fix typo in custom_features 2020-11-27 20:22:19 -05:00
6e024871ec fix merge conflict 2020-11-24 17:19:31 -06:00
777c95aab2 update 2020-11-24 17:17:25 -06:00
b058b4730c update changelog 2020-11-19 18:48:07 -06:00
725f08e45d add Color.random 2020-11-19 18:46:42 -06:00
b61b5b7414 type fix 2020-11-18 18:09:18 -06:00
e47ff96c30 docs fix 2020-11-18 18:04:33 -06:00
a2b513bd72 docs fix 2020-11-18 18:02:05 -06:00
9e6461a419 docs fix 2020-11-18 17:57:32 -06:00
690dcdaf2e update docs and add message replies 2020-11-18 17:49:58 -06:00
195bace135 admin alias 2020-11-18 16:41:38 -06:00
ae0f11ce53 add a color 2020-11-04 19:51:07 -06:00
188b69c097 docs update 2020-10-28 21:04:30 -05:00
dea09cb5b3 conflict fix 2020-10-28 21:00:48 -05:00
c223d2e723 better prefix 2020-10-28 20:49:49 -05:00
12de975b69 better prefix 2020-10-28 19:49:13 -05:00
14d8310192 properly checking TextChannel.can_send 2020-10-21 20:06:47 -05:00
c6b417bc7b version bump 2020-10-21 17:54:07 -05:00
3521ae985a added versionadded 2020-10-21 17:44:46 -05:00
2b5490d4cb fixes 2020-10-17 20:22:16 -05:00
18f80a737f hmm 2020-10-17 20:09:06 -05:00
faa566040c final step 2020-10-17 20:04:37 -05:00
2d7b6e239b preparing 2020-10-17 20:03:53 -05:00
09168d880f int() support 2020-10-17 19:14:51 -05:00
24839be99d test 2020-10-17 19:07:04 -05:00
4010f09052 Remove int() support 2020-10-17 18:45:59 -05:00
b9642f785e Remove int() support 2020-10-17 18:45:51 -05:00
d75cd66b90 oh ffs 2020-10-17 18:42:19 -05:00
a09e096d42 add menus 2020-10-08 16:06:18 -05:00
0b8671e3d6 doc update 2020-10-04 02:05:24 +00:00
9e0303cc53 Extra security for not overriding bot.embed_color 2020-10-04 02:03:55 +00:00
e3bce1ba58 add doc 2020-10-04 01:58:06 +00:00
ecd898e62c oop 2020-10-04 01:53:57 +00:00
f96a537b8f oop 2020-10-04 01:11:49 +00:00
36bcbb19ee oop 2020-10-04 01:01:17 +00:00
9fc2fd38dc Another request from shivaco 2020-10-04 00:39:03 +00:00
ea73008ff2 update docs 2020-10-02 00:34:53 +00:00
525ee4be0a update docs 2020-10-02 00:34:01 +00:00
7a56f0b28a requested by shivaco ;) 2020-10-02 00:23:25 +00:00
60d383cb51 oop 2020-10-01 22:45:57 +00:00
4297eed591 hmm 2020-10-01 22:41:02 +00:00
0ed9d8ca6b oop 2020-10-01 22:27:07 +00:00
b5ef2bdec4 oop 2020-10-01 22:24:15 +00:00
768f409a84 hmm 2020-10-01 22:22:53 +00:00
7afaa6dfce hmm 2020-10-01 22:16:20 +00:00
21ea6fe9ac hmm 2020-10-01 22:16:05 +00:00
291237bac9 hmm 2020-10-01 22:11:25 +00:00
397535f1e5 hmm 2020-10-01 22:05:34 +00:00
b13eca9def hmm 2020-10-01 22:01:20 +00:00
e6cf6c4b8c hmm 2020-10-01 21:58:29 +00:00
e91a0d62f7 hmm 2020-10-01 21:55:05 +00:00
0860df8fa5 hmm 2020-10-01 21:53:49 +00:00
1c228f9548 oop 2020-10-01 21:43:22 +00:00
0088ab589b oop 2020-10-01 21:42:00 +00:00
d79bc7c3c9 support for default embed color 2020-10-01 21:37:37 +00:00
5b2c7db90b forgot 2020-10-01 02:27:11 +00:00
cd6f48b39c forgot this 2020-10-01 01:28:20 +00:00
74713b05ee add try_user 2020-10-01 01:24:30 +00:00
7cb96f7ba4 oop again 2020-10-01 01:02:28 +00:00
fe826b7134 changes 2020-10-01 01:01:18 +00:00
db6a7d46a1 oop 2020-10-01 00:34:59 +00:00
fd9ceb30f2 I suck 2020-09-30 23:59:06 +00:00
f514d45f99 oops 2020-09-30 23:56:50 +00:00
57efed682b update docs 2020-09-30 23:54:25 +00:00
f33cfbce0d docs update 2020-09-30 23:49:33 +00:00
e21fb1217e Merge pull request #8 from iDutchy/owner
add Bot.owners
2020-10-01 01:28:26 +02:00
73ed64c527 add Bot.owners 2020-10-01 01:24:25 +02:00
7356a641b5 Merge pull request #7 from iDutchy/owner
add Bot.owner
2020-10-01 01:22:12 +02:00
447a6a694e add Bot.owner 2020-10-01 01:20:34 +02:00
7af9f2af94 Merge branch 'Rapptz-neo-docs' 2020-09-30 22:42:38 +00:00
f80b4c166c conflict fix 2020-09-30 22:42:28 +00:00
b98fc6f2f6 Merge pull request #5 from Rapptz/master
1.5 release
2020-10-01 00:18:26 +02:00
c8bd6884dc Merge branch 'Rapptz-master' 2020-09-28 00:42:59 +00:00
64be57b192 fixes 2020-09-28 00:42:27 +00:00
3cc5e23392 Set maximimum sidebar width 2020-09-23 02:28:17 -04:00
ba7482921b [matrix] Style "View Documentation For" dropdown 2020-09-22 20:29:04 -04:00
2774cfd3e9 welp, wasnt aware __hex__ got removed in py3 2020-09-18 01:04:04 +00:00
bbaf3375a8 a fix I think? 2020-09-18 00:54:26 +00:00
d28f0ff35b add hex() support to Color 2020-09-18 00:44:40 +00:00
b2540ee312 Lets add some color! 2020-09-18 00:34:29 +00:00
a67bb723b4 competing type added 2020-09-15 20:34:43 +00:00
5756548a6a Merge branch 'Rapptz-feature/intents' 2020-09-15 00:37:04 +00:00
571ddb5a3e merge conflict fix 2020-09-15 00:36:19 +00:00
6546f63ad7 Add a special exception for required privileged intents 2020-09-14 03:49:21 -04:00
4c56e6da9c Pass default intents if not explicitly given 2020-09-14 03:20:41 -04:00
27b224778b Intern status and overwrite strings 2020-09-14 03:20:41 -04:00
ab049e3eb0 Allow finer grained control over the member cache. 2020-09-14 03:20:36 -04:00
6f22ba8ad0 Raise if member intent is not enabled 2020-09-14 03:20:17 -04:00
f3514a4d53 Don't cache members during guild start up if cache is disabled.
This is mainly a half-implemented commit. There are a few more places
where cache consistency is necessary. In the future there will
probably be a member cache policy enum that will be used and cache
consistency will be tackled in part of that larger refactoring.
2020-09-14 03:20:17 -04:00
141511471e Add Guild.chunk and deprecated Client.request_offline_members 2020-09-14 03:20:16 -04:00
27558ec71a Fix Client.request_offline_members no longer working 2020-09-14 03:20:16 -04:00
a6edb66742 Add versionadded for intents enum 2020-09-14 03:20:16 -04:00
b1de57f299 Explicitly disable the members presence by default 2020-09-14 03:20:16 -04:00
0fc8ac6f80 Fix timeouts due to hitting the gateway rate limit 2020-09-14 03:20:16 -04:00
18141c0cf9 Maximize the amount of concurrency while chunking.
In order to reduce our amount of backpressure we need to limit the
amount of concurrent chunk requests we can have so the gateway buffer
has some time to breathe.
2020-09-14 03:20:16 -04:00
022ec9af1d Check for zombie connections through last received payload
The previous code would check zombie connections depending on whether
HEARTBEAT_ACK was received. Unfortunately when there's exceeding
backpressure the connection can terminate since the HEARTBEAT_ACK is
buffered very far away despite it being there, just not received yet.
2020-09-14 03:20:16 -04:00
9492cb1242 Speed up chunking for guilds with presence intent enabled 2020-09-14 03:20:16 -04:00
a76f9ce8ef Maximize concurrency when chunking on AutoSharded clients 2020-09-14 03:20:16 -04:00
faf1db1583 Use a lock for the gateway rate limiter.
This will allow for higher concurrency in AutoSharded situations where
I can mostly "fire and forget" the chunk requests.
2020-09-14 03:20:15 -04:00
d6defbc6b2 Heartbeats bypass the rate limits for gateway 2020-09-14 03:20:15 -04:00
5db9a3551f All guilds require chunking if opting into it 2020-09-14 03:20:15 -04:00
e8e4886fd8 Handle user updates within GUILD_MEMBER_UPDATE 2020-09-14 03:20:15 -04:00
95bec0dcee Rewrite chunking to work with intents.
This slows down chunking significantly for bots in a large number of
guilds since it goes down from 75 guilds/request to 1 guild/request.
However the logic was rewritten to fire the chunking request
immediately after receiving the GUILD_CREATE rather than waiting for
all the guilds in the ready stream before doing it.
2020-09-14 03:20:15 -04:00
f46257faa6 Add more close codes that can't be handled for reconnecting. 2020-09-14 03:20:15 -04:00
c0a3aaa98c Change unknown cache log warnings from WARNING -> DEBUG 2020-09-14 03:20:15 -04:00
75c24bde16 Handle gateway rate limits by using a rate limiter.
With the new chunking changes this will become necessary and we don't
want to disconnect from having too many outwards requests.
2020-09-14 03:20:15 -04:00
a9cb851a3c Add support for guild intents 2020-09-14 03:20:15 -04:00
43c4d33a4a avatar urls in stead of assets 2020-09-13 23:57:18 +00:00
4b612aeece Merge pull request #1 from Rapptz/feature/intents
Feature/intents
2020-09-13 05:44:24 +02:00
1791b72f45 Add support for Guild.bots and Guild.humans 2020-09-13 01:17:35 +00:00
77b0ddca7c Raise if member intent is not enabled 2020-09-10 06:46:16 -04:00
61ec62da11 Don't cache members during guild start up if cache is disabled.
This is mainly a half-implemented commit. There are a few more places
where cache consistency is necessary. In the future there will
probably be a member cache policy enum that will be used and cache
consistency will be tackled in part of that larger refactoring.
2020-09-10 05:58:24 -04:00
009a961006 Add Guild.chunk and deprecated Client.request_offline_members 2020-09-10 05:56:48 -04:00
cb211c36bd Fix Client.request_offline_members no longer working 2020-09-10 05:26:35 -04:00
a293d87c77 Add versionadded for intents enum 2020-09-10 05:17:52 -04:00
41fd2740cb Explicitly disable the members presence by default 2020-09-10 05:17:52 -04:00
65f591705d Fix timeouts due to hitting the gateway rate limit 2020-09-10 05:17:52 -04:00
81bfdea9df Maximize the amount of concurrency while chunking.
In order to reduce our amount of backpressure we need to limit the
amount of concurrent chunk requests we can have so the gateway buffer
has some time to breathe.
2020-09-10 05:17:52 -04:00
2129ae29be Check for zombie connections through last received payload
The previous code would check zombie connections depending on whether
HEARTBEAT_ACK was received. Unfortunately when there's exceeding
backpressure the connection can terminate since the HEARTBEAT_ACK is
buffered very far away despite it being there, just not received yet.
2020-09-10 05:17:52 -04:00
82fa967f3c Speed up chunking for guilds with presence intent enabled 2020-09-10 05:17:51 -04:00
fdbe0c4f57 Maximize concurrency when chunking on AutoSharded clients 2020-09-10 05:17:51 -04:00
5837ad0804 Use a lock for the gateway rate limiter.
This will allow for higher concurrency in AutoSharded situations where
I can mostly "fire and forget" the chunk requests.
2020-09-10 05:17:51 -04:00
e6fddbdbe7 Heartbeats bypass the rate limits for gateway 2020-09-10 05:17:51 -04:00
37760e16dd All guilds require chunking if opting into it 2020-09-10 05:17:51 -04:00
fd5faac42b Handle user updates within GUILD_MEMBER_UPDATE 2020-09-10 05:17:50 -04:00
eb641569f7 Rewrite chunking to work with intents.
This slows down chunking significantly for bots in a large number of
guilds since it goes down from 75 guilds/request to 1 guild/request.
However the logic was rewritten to fire the chunking request
immediately after receiving the GUILD_CREATE rather than waiting for
all the guilds in the ready stream before doing it.
2020-09-10 05:17:50 -04:00
51704b10cb Add more close codes that can't be handled for reconnecting. 2020-09-10 05:17:50 -04:00
50a951e3ec Change unknown cache log warnings from WARNING -> DEBUG 2020-09-10 05:17:50 -04:00
63c454eaa0 Handle gateway rate limits by using a rate limiter.
With the new chunking changes this will become necessary and we don't
want to disconnect from having too many outwards requests.
2020-09-10 05:17:50 -04:00
f588834b0c Add support for guild intents 2020-09-10 05:17:50 -04:00
a668623d9f Make admonition-title un-selectable.
All admonition-title's should now be un-selectable.
2020-09-06 00:24:14 -04:00
0b020fc339 Add sidebar animation when collapsing 2020-09-01 15:24:03 -04:00
0124abb030 Thicken admonition borders a little 2020-08-31 02:35:38 -04:00
26cce4fb78 [matrix] Hide hamburger menu on pages without sidebar 2020-08-31 02:27:32 -04:00
3b90e2e74e [matrix] Fix JS errors on search results page 2020-08-30 02:55:53 -04:00
512d9aaccb Another take at fixing methods showing up under "Attributes" 2020-08-29 22:22:45 -04:00
39f1f9098e Fix collapsible sidebar not working 2020-08-29 20:39:25 -04:00
994de512cb Use the constructed value in the settings 2020-08-29 20:34:50 -04:00
597f7e30b8 [matrix] Update model styles 2020-08-29 20:19:49 -04:00
575435b4c9 Fix tooltips in settings and make strings translatable 2020-08-29 20:10:54 -04:00
7d8dae735d Move setting load to DOMContentLoaded 2020-08-29 19:56:28 -04:00
3ce7ab2fc4 [matrix] Refactor JS & add searchbar to mobile. 2020-08-29 19:17:44 -04:00
2d441cc533 Reduce CSS variable usage 2020-08-29 04:30:35 -04:00
7fec153cd7 Fix versionmodified not being italics 2020-08-29 04:14:08 -04:00
1aa93e70ac Change colour scheme and admonition colours
This should make both themes finally look decent
2020-08-29 04:11:05 -04:00
42498d26f7 [matrix] Set theme to system preferred by default 2020-08-29 03:57:17 -04:00
a9d6d90a8f [matrix] collapsible sidebar headings 2020-08-28 23:13:20 -04:00
d9a2c0c65d Fix methods from superclass showing under "Attributes" table 2020-08-22 16:26:50 -04:00
9cbb801fb0 Fix sidebar jank on desktop. 2020-07-22 23:35:51 -04:00
41153d6d90 Fix issues with horizontal overflow on mobile 2020-07-08 23:23:52 -04:00
b2b2d5ac96 Default to sans-serif font 2020-07-08 22:54:23 -04:00
c2a46f3b8b Redesign admonitions to look a little better.
Colours still need to be reworked though.
2020-07-01 03:42:58 -04:00
a53bf2660b [matrix] Display navbar links on mobile 2020-06-29 19:47:15 -04:00
c928fd13f1 Resize favicon to 256x256px for Chrome 2020-06-28 19:15:13 -04:00
597af3a582 Switch icon set over to Material Icons intead of FontAwesome 2020-06-28 18:21:37 -04:00
4ebbeb0f2a Rework attributetable to look prettier 2020-06-28 07:34:04 -04:00
2a8453828b Fix sidebar scrolling on mobile 2020-06-28 17:42:14 +10:00
7482a5de8d Refactor CSS to use a colour palette and make light theme greyer. 2020-06-28 03:36:59 -04:00
c69f7c7bd8 Make tables scroll if they overflow. 2020-06-27 07:55:47 -04:00
8feb74a018 Revert "Fix table wrapping"
This reverts commit c911cd0dbd.
2020-06-27 07:55:47 -04:00
69e2cd0180 Add border radius and padding to inline code 2020-06-27 12:33:51 +01:00
c911cd0dbd Fix table wrapping 2020-06-27 07:08:46 -04:00
f4d53d79df Fix margins in 600px view of settings and label 2020-06-27 06:30:38 -04:00
f1e9017df1 Fix jank on iPads 2020-06-27 19:42:25 +10:00
0a00aeb335 Show classmethods separately in attribute table 2020-06-27 02:25:50 -04:00
6eba27d98e Alphabetically sort attributetable output 2020-06-27 02:05:23 -04:00
7dd45a422c Show the search bar on mobile 2020-06-27 01:53:41 -04:00
2ef0695e81 [matrix] General Sidebar cleanup (#5061) 2020-06-27 01:16:37 -04:00
8abd4e1357 Various RTD related fixes. 2020-06-25 03:57:58 -04:00
5cb1b109bb Set colours for active sidebar elements 2020-06-08 19:21:44 +10:00
3c56240e5f Fix sidebar active link selection 2020-06-01 00:38:37 +10:00
90596485a2 First pass at double header display 2020-05-31 09:12:26 -04:00
b78f6a310b Create settings icon for mobile 2020-05-31 00:11:03 +10:00
74bdd8485e Use new HTML5 <section> instead of <div class="section"> 2020-05-30 04:59:31 -04:00
f03ecdbc69 [matrix] Search to top, icon
* Search bar to top, magnifying glass

* Remove old file

* Remove empty style directive
2020-05-29 23:42:50 -04:00
d14bf7f412 First pass at centering content for large displays 2020-05-29 09:34:21 -04:00
742b14a705 Add dark theme for codeblocks 2020-05-29 07:23:00 -04:00
71f6b950d1 Actually make overflowing have a scrollbar on mobile 2020-05-29 06:45:44 -04:00
8a94adcbcd Fix codeblock related things with mobile responsiveness. 2020-05-29 06:21:05 -04:00
a31cf94699 Use default scrollbar for body on webkit browsers 2020-05-29 03:52:56 -04:00
dc545f570e [matrix] Modal cleanup
* General modal cleanup

* Remove second scrollbar caused by modal
2020-05-29 03:25:13 -04:00
24c9e7b5fc [matrix] Dark Theme
* Apply width restructions to modals and images

* Dark theme 2.0

* Add webkit scrollbar

* Use Object.keys instead of Object.entries where applicable
2020-05-29 02:57:00 -04:00
38529e6e21 Proper padding for the copy button 2020-05-28 02:21:01 -04:00
439081081c Reverse the related links 2020-05-28 01:33:16 -04:00
aedd40e585 Use html_js_files instead of the old approach to add JS files. 2020-05-28 01:07:17 -04:00
da4e345f3d Cleanup copy button CSS and add a hover-over explanation. 2020-05-28 01:06:06 -04:00
4e9fdc6e4f Rewrite the DOM to use CSS grids
This also rewrites the CSS to use CSS variables. Currently this isn't
done to codeblocks however.
2020-05-27 23:43:58 -04:00
0a8b87cae7 add copy codeblock button
Apply suggestions from code review

Co-authored-by: Danny <Rapptz@users.noreply.github.com>

Change to icon, change according to slice's review
2020-05-27 23:39:11 -04:00
38a7cbb6a5 [matrix] Add sans-serif font toggle to settings modal
* Add sans serif font toggle

* remove unnecessary boolean comparison from setFont

Co-authored-by: slice <ryaneft@gmail.com>

* Update checkbox title

Co-authored-by: slice <ryaneft@gmail.com>

* General cleanup of settings system

* Apply overflow hidden to modal

Co-authored-by: slice <ryaneft@gmail.com>
2020-05-27 10:05:40 -04:00
e6712d76d1 [matrix] Create settings modal
* Create settings modal

* Fix issue with spacing after settings button

* Fix issue with modal background on mobile devices

* Add close button to modal

* Add tooltip to close button

* Support closing modal with escape key

* Add missing semicolon to keydown event listener
2020-05-27 02:22:21 -04:00
1e471b64e6 [matrix] Refactor docs JS
* Refactor custom.js

* Refactor scorer.js

* tables variable shoudn't be in global scope
2020-05-27 00:56:38 -04:00
509cc135d4 Add favicon 2020-05-26 23:18:42 -04:00
04cec0ec10 Use actual viewport tag with initial-scale set to 1 2020-05-26 07:04:58 -04:00
f2482d4fb3 Add fixed header links, fix some parts of mobile UI
Dynamic content width equal to old one if on 1080p

Fix mobile view

Disable fixed header on mobile
2020-05-25 22:37:01 -04:00
ccb4e0b6e7 Bump Sphinx to 3.0.3 2020-05-25 22:15:46 -04:00
3c558af0cb make documentation sphinx 3.x compatible 2020-05-25 21:39:59 -04:00
2eb9e3bc56 Move table JS outside of scrolling 2020-05-25 12:17:13 -04:00
de9a3b5f60 Bump Sphinx to 2.4.4 2020-05-25 11:55:13 -04:00
771c1c85d8 Add attributetable and add some class-level sections.
The extensions have yet to receive this treatment and CSS needs work,
but for now this is fine.
2020-05-25 11:48:16 -04:00
44 changed files with 7239 additions and 144 deletions

2
.gitignore vendored
View File

@ -14,3 +14,5 @@ docs/crowdin.py
*.jpg
*.flac
*.mo
dist
build

View File

@ -1,17 +1,19 @@
discord.py
==========
Enhanced-dpy (custom discord.py)
=================================
.. image:: https://discord.com/api/guilds/336642139381301249/embed.png
:target: https://discord.gg/r3sSKJJ
:alt: Discord server invite
.. image:: https://img.shields.io/pypi/v/discord.py.svg
:target: https://pypi.python.org/pypi/discord.py
:alt: PyPI version info
.. image:: https://img.shields.io/pypi/pyversions/discord.py.svg
:target: https://pypi.python.org/pypi/discord.py
:alt: PyPI supported Python versions
A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python.
Credits to the `original lib by Rapptz <https://github.com/Rapptz/discord.py>`_
**WARNING: This is not the official discord.py library! As of 8/27/2021 Danny (Rapptz) has stopped development due to breaking changes. You are still able to read the official library at https://github.com/Rapptz/discord.py!**
Custom Features
----------------
**Moved to:** `Custom Features <https://enhanced-dpy.readthedocs.io/en/latest/custom_features.html>`_
Key Features
-------------
@ -31,28 +33,17 @@ To install the library without full voice support, you can just run the followin
.. code:: sh
# Linux/macOS
python3 -m pip install -U discord.py
python3 -m pip install -U enhanced-dpy
# Windows
py -3 -m pip install -U discord.py
Otherwise to get voice support you should run the following command:
.. code:: sh
# Linux/macOS
python3 -m pip install -U "discord.py[voice]"
# Windows
py -3 -m pip install -U discord.py[voice]
py -3 -m pip install -U enhanced-dpy
To install the development version, do the following:
.. code:: sh
$ git clone https://github.com/Rapptz/discord.py
$ cd discord.py
$ git clone https://github.com/iDevision/enhanced-discord.py
$ cd enhanced-discord.py
$ python3 -m pip install -U .[voice]
@ -109,6 +100,6 @@ You can find more examples in the examples directory.
Links
------
- `Documentation <https://discordpy.readthedocs.io/en/latest/index.html>`_
- `Official Discord Server <https://discord.gg/r3sSKJJ>`_
- `Documentation <https://enhanced-dpy.readthedocs.io/en/latest/index.html>`_
- `Official Discord Server <https://discord.gg/wZSH7pz>`_
- `Discord API <https://discord.gg/discord-api>`_

View File

@ -13,7 +13,7 @@ __title__ = 'discord'
__author__ = 'Rapptz'
__license__ = 'MIT'
__copyright__ = 'Copyright 2015-present Rapptz'
__version__ = '2.0.0a'
__version__ = '1.7.3.7.post1'
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
@ -57,8 +57,8 @@ from .team import *
from .sticker import *
from .interactions import *
VersionInfo = namedtuple('VersionInfo', 'major minor micro releaselevel serial')
VersionInfo = namedtuple('VersionInfo', 'major minor micro enhanced releaselevel serial')
version_info = VersionInfo(major=2, minor=0, micro=0, releaselevel='alpha', serial=0)
version_info = VersionInfo(major=1, minor=7, micro=3, enhanced=7, releaselevel='final', serial=0)
logging.getLogger(__name__).addHandler(logging.NullHandler())

View File

@ -176,6 +176,7 @@ class GuildChannel(Protocol):
- :class:`~discord.TextChannel`
- :class:`~discord.VoiceChannel`
- :class:`~discord.CategoryChannel`
- :class:`~discord.StageChannel`
This ABC must also implement :class:`~discord.abc.Snowflake`.
@ -199,6 +200,9 @@ class GuildChannel(Protocol):
def __str__(self):
return self.name
def __int__(self):
return self.id
@property
def _sorting_bucket(self):
raise NotImplementedError
@ -734,10 +738,10 @@ class GuildChannel(Protocol):
Whether to move the channel to the end of the
channel list (or category if given).
This is mutually exclusive with ``beginning``, ``before``, and ``after``.
before: :class:`abc.Snowflake`
before: :class:`~discord.abc.Snowflake`
The channel that should be before our current channel.
This is mutually exclusive with ``beginning``, ``end``, and ``after``.
after: :class:`abc.Snowflake`
after: :class:`~discord.abc.Snowflake`
The channel that should be after our current channel.
This is mutually exclusive with ``beginning``, ``end``, and ``before``.
offset: :class:`int`
@ -747,7 +751,7 @@ class GuildChannel(Protocol):
while a negative number moves it above. Note that this
number is relative and computed after the ``beginning``,
``end``, ``before``, and ``after`` parameters.
category: Optional[:class:`abc.Snowflake`]
category: Optional[:class:`~discord.abc.Snowflake`]
The category to move this channel under.
If ``None`` is given then it moves it out of the category.
This parameter is ignored if moving a category channel.
@ -974,6 +978,12 @@ class Messageable(Protocol):
are used instead.
.. versionadded:: 1.4
message_reference: :class:`~discord.MessageReference`
A reference to the :class:`~discord.Message` to which you are replying, i.e. as created using
:meth:`~discord.MessageReference.from_message`. You can control whether this mentions the author
of the referenced Message using :attr:`~discord.AllowedMentions.replied_user`.
.. versionadded:: 1.5.1.5
reference: Union[:class:`~discord.Message`, :class:`~discord.MessageReference`]
A reference to the :class:`~discord.Message` to which you are replying, this can be created using

View File

@ -62,30 +62,32 @@ class AppInfo:
A list of RPC origin URLs, if RPC is enabled.
summary: :class:`str`
If this application is a game sold on Discord,
this field will be the summary field for the store page of its primary SKU
this field will be the summary field for the store page of its primary SKU.
.. versionadded:: 1.3
verify_key: :class:`str`
The base64 encoded key for the GameSDK's GetTicket
The hex encoded key for verification in interactions and the
GameSDK's `GetTicket <https://discord.com/developers/docs/game-sdk/applications#getticket>`_.
.. versionadded:: 1.3
guild_id: Optional[:class:`int`]
If this application is a game sold on Discord,
this field will be the guild to which it has been linked
this field will be the guild to which it has been linked to.
.. versionadded:: 1.3
primary_sku_id: Optional[:class:`int`]
If this application is a game sold on Discord,
this field will be the id of the "Game SKU" that is created, if exists
this field will be the id of the "Game SKU" that is created,
if it exists.
.. versionadded:: 1.3
slug: Optional[:class:`str`]
If this application is a game sold on Discord,
this field will be the URL slug that links to the store page
this field will be the URL slug that links to the store page.
.. versionadded:: 1.3

View File

@ -141,6 +141,13 @@ class TextChannel(discord.abc.Messageable, discord.abc.GuildChannel, Hashable):
def _sorting_bucket(self):
return ChannelType.text.value
@property
def can_send(self):
""":class:`bool`: Checks if the bot can send messages
.. versionadded:: 1.5.0.2"""
return self.permissions_for(self.guild.me).send_messages
@utils.copy_doc(discord.abc.GuildChannel.permissions_for)
def permissions_for(self, member):
base = super().permissions_for(member)
@ -1255,6 +1262,7 @@ class DMChannel(discord.abc.Messageable, Hashable):
"""
base = Permissions.text()
base.read_messages = True
base.send_tts_messages = False
base.manage_messages = False
return base
@ -1428,6 +1436,7 @@ class GroupChannel(discord.abc.Messageable, Hashable):
"""
base = Permissions.text()
base.read_messages = True
base.send_tts_messages = False
base.manage_messages = False
base.mention_everyone = True

View File

@ -24,33 +24,35 @@ DEALINGS IN THE SOFTWARE.
import asyncio
import logging
import os
import re
import signal
import sys
import traceback
import aiohttp
from .user import User
from .invite import Invite
from .template import Template
from .widget import Widget
from .guild import Guild
from .channel import _channel_factory
from .enums import ChannelType
from .mentions import AllowedMentions
from .errors import *
from .enums import Status, VoiceRegion
from .gateway import *
from .activity import BaseActivity, create_activity
from .voice_client import VoiceClient
from .http import HTTPClient
from .state import ConnectionState
from . import utils
from .object import Object
from .backoff import ExponentialBackoff
from .webhook import Webhook
from .iterators import GuildIterator
from .activity import BaseActivity, create_activity
from .appinfo import AppInfo
from .backoff import ExponentialBackoff
from .channel import _channel_factory
from .colour import Color, Colour
from .enums import ChannelType, Status, VoiceRegion
from .errors import *
from .gateway import *
from .guild import Guild
from .http import HTTPClient
from .invite import Invite
from .iterators import GuildIterator
from .mentions import AllowedMentions
from .object import Object
from .state import ConnectionState
from .template import Template
from .user import User
from .voice_client import VoiceClient
from .webhook import Webhook
from .widget import Widget
__all__ = (
'Client',
@ -167,7 +169,7 @@ class Client:
If this is set to ``False`` then the following features will be disabled:
- No user related updates (:func:`on_user_update` will not dispatch)
- No user related updates (:func:`on_user_update` will not dispatch)EmptyEmbed
- All member related events will be disabled.
- :func:`on_member_update`
- :func:`on_member_join`
@ -197,6 +199,12 @@ class Client:
sync your system clock to Google's NTP server.
.. versionadded:: 1.3
embed_color: Union[:class:`.Colour`, :class:`int`]
The default embed color you want to use when initialising a :class:`.Embed`. This will
remove the need to set the color per embed, but can still be overridden by setting a
color while creating an instance of an embed.
.. versionadded:: 1.5.0.1
Attributes
-----------
@ -211,6 +219,19 @@ class Client:
self._listeners = {}
self.shard_id = options.get('shard_id')
self.shard_count = options.get('shard_count')
colour = options.get('embed_color', Color.default())
if isinstance(colour, (Color, Colour)):
os.environ['DEFAULT_EMBED_COLOR'] = str(hex(colour))
else:
try:
HEX = re.compile(r'^(#)[A-Fa-f0-9]{6}$')
col = Color(colour)
if HEX.match(str(col)):
os.environ['DEFAULT_EMBED_COLOR'] = str(hex(col))
else:
raise TypeError('The hex value passed could not be converted to a color')
except:
raise TypeError('embed_color must be an instance of discord.Colour or a valid 0x****** hex value.')
connector = options.pop('connector', None)
proxy = options.pop('proxy', None)
@ -239,6 +260,65 @@ class Client:
# internals
def get_message(self, id):
"""Get a message from cache if the message is still in cache.
.. versionadded:: 1.6.0.7
Parameters
-----------
id: :class:`int`
The message ID to look for.
Returns
--------
Optional[:class:`.Message`]
The message asked for."""
return utils.get(self.cached_messages, id=id)
@property
def embed_color(self):
"""Optional[:class:`.Colour`]: The default embed colour that is
being used for all embed if no colour is passed."""
col = os.getenv("DEFAULT_EMBED_COLOR")
if not col:
return None
return Colour(int(col, 16))
def set_embed_color(self, color):
"""Set a new default embed color.
This will raise a TypeError if an improper format was passed.
.. versionadded:: 1.5.0.1
Parameters
-----------
color: Union[:class:`.Colour`, :class:`int`]
The new color you want to set as default embed color.
Pass either an instance of discord.Color or a valid
0x****** HEX value.
Returns
--------
:class:`.Colour`
The new color that has been set as default embed color.
"""
if isinstance(color, (Color, Colour)):
os.environ['DEFAULT_EMBED_COLOR'] = str(hex(color))
return color
else:
try:
HEX = re.compile(r'^(#)[A-Fa-f0-9]{6}$')
col = Color(color)
if HEX.match(str(col)):
os.environ['DEFAULT_EMBED_COLOR'] = str(hex(col))
return col
else:
raise TypeError('The hex value passed could not be converted to a color')
except:
raise TypeError('embed_color must be an instance of discord.Colour or a valid 0x****** hex value.')
def _get_websocket(self, guild_id=None, *, shard_id=None):
return self.ws
@ -690,7 +770,7 @@ class Client:
@property
def intents(self):
""":class:`Intents`: The intents configured for this connection.
""":class:`~discord.Intents`: The intents configured for this connection.
.. versionadded:: 1.5
"""
@ -1278,6 +1358,42 @@ class Client:
data['rpc_origins'] = None
return AppInfo(self._connection, data)
async def try_user(self, user_id):
"""|coro|
Retrieves a :class:`~discord.User` based on their ID. This can only
be used by bot accounts.
.. versionadded:: 1.5.0.1
.. note::
This will first attempt to get the user from the cache.
If that fails, it will make an API call.
For general usage, consider :meth:`get_user` instead.
Parameters
-----------
user_id: :class:`int`
The user's ID to fetch from.
Raises
-------
:exc:`.NotFound`
A user with this ID does not exist.
:exc:`.HTTPException`
Fetching the user failed.
Returns
--------
:class:`~discord.User`
The user you requested.
"""
user = self.get_user(user_id)
if user is None:
user = await self.fetch_user(user_id)
return user
async def fetch_user(self, user_id):
"""|coro|
@ -1288,7 +1404,7 @@ class Client:
.. note::
This method is an API call. For general usage, consider :meth:`get_user` instead.
This method is an API call. If you have :attr:`Intents.members` and member cache enabled, consider :meth:`get_user` instead.
Parameters
-----------

File diff suppressed because it is too large Load Diff

View File

@ -25,6 +25,7 @@ DEALINGS IN THE SOFTWARE.
from __future__ import annotations
import datetime
import os
from typing import Any, Dict, Final, List, Protocol, TYPE_CHECKING, Type, TypeVar, Union
from . import utils
@ -186,7 +187,13 @@ class Embed:
timestamp: datetime.datetime = None,
):
self.colour = colour if colour is not EmptyEmbed else color
if colour is EmptyEmbed and color is EmptyEmbed:
colour = os.getenv("DEFAULT_EMBED_COLOR", default=EmptyEmbed)
if isinstance(colour, str):
colour = int(colour, 16)
else:
colour = colour if colour is not EmptyEmbed else color
self.colour = colour
self.title = title
self.type = type
self.url = url

View File

@ -114,6 +114,9 @@ class Emoji(_EmojiTag):
return '<a:{0.name}:{0.id}>'.format(self)
return "<:{0.name}:{0.id}>".format(self)
def __int__(self):
return self.id
def __repr__(self):
return '<Emoji id={0.id} name={0.name!r} animated={0.animated} managed={0.managed}>'.format(self)

View File

@ -368,6 +368,8 @@ class AuditLogAction(Enum):
return 'webhook'
elif v < 70:
return 'emoji'
elif v == 73:
return 'channel'
elif v < 80:
return 'message'
elif v < 90:

View File

@ -24,20 +24,21 @@ DEALINGS IN THE SOFTWARE.
import asyncio
import collections
import inspect
import importlib.util
import inspect
import itertools
import sys
import traceback
import types
import discord
from .core import GroupMixin
from .view import StringView
from .context import Context
from . import errors
from .help import HelpCommand, DefaultHelpCommand
from .cog import Cog
from .context import Context
from .core import GroupMixin
from .help import DefaultHelpCommand, HelpCommand
from .view import StringView
__all__ = (
'when_mentioned',
@ -99,9 +100,10 @@ class _DefaultRepr:
_default = _DefaultRepr()
class BotBase(GroupMixin):
def __init__(self, command_prefix, help_command=_default, description=None, **options):
def __init__(self, command_prefix, case_insensitive_prefix=False, help_command=_default, description=None, **options):
super().__init__(**options)
self.command_prefix = command_prefix
self.case_insensitive_prefix = case_insensitive_prefix
self.extra_events = {}
self.__cogs = {}
self.__extensions = {}
@ -131,6 +133,29 @@ class BotBase(GroupMixin):
else:
self.help_command = help_command
@property
def owner(self):
""":class:`discord.User`: The owner, retrieved from owner_id. In case of improper caching, this can return None
.. versionadded:: 1.5.0.1"""
if not self.owner_id or self.owner_ids:
raise AttributeError('No owner_id specified or you used owner_ids. If you used owner_ids, please refer to `Bot.owners`')
return self.get_user(self.owner_id)
@property
def owners(self):
"""List[:class:`discord.User`]: The owners, retrieved from owner_ids. In case of improper caching, this list may not contain all owners.
.. versionadded:: 1.5.0.1"""
if not self.owner_ids or self.owner_id:
raise TypeError('No owner_ids specified or you used owner_id. If you used owner_id, please refer to `Bot.owner`')
owners = []
for user in self.owner_ids:
owner = self.get_user(user)
if owner:
owners.append(owner)
return owners
# internal helpers
def dispatch(self, event_name, *args, **kwargs):
@ -511,6 +536,9 @@ class BotBase(GroupMixin):
cog = cog._inject(self)
self.__cogs[cog.__cog_name__] = cog
if cog.aliases:
for alias in cog.aliases:
self.__cogs[alias] = cog
def get_cog(self, name):
"""Gets the cog instance requested.
@ -549,6 +577,10 @@ class BotBase(GroupMixin):
if cog is None:
return
if cog.aliases:
for alias in cog.aliases:
self.__cogs.pop(alias)
help_command = self._help_command
if help_command and help_command.cog is cog:
help_command.cog = None
@ -850,6 +882,16 @@ class BotBase(GroupMixin):
if not ret:
raise ValueError("Iterable command_prefix must contain at least one prefix")
# if self.case_insensitive_prefix:
# if isinstance(ret, list):
# temp = []
# for pre in ret:
# if pre in (self.user.mention + ' ', '<@!%s> ' % self.user.id):
# continue
# temp += list(map(''.join, itertools.product(*((c.upper(), c.lower()) for c in pre))))
# ret = temp
# else:
# ret = list(map(''.join, itertools.product(*((c.upper(), c.lower()) for c in ret))))
return ret
async def get_context(self, message, *, cls=Context):
@ -1024,6 +1066,10 @@ class Bot(BotBase, discord.Client):
matches messages starting with ``!?``. This is especially important
when passing an empty string, it should always be last as no prefix
after it will be matched.
case_insensitive_prefix: :class:`bool`
Wheter the provided command_prefix should be case insensitive or not
.. versionadded:: 1.6.0.7
case_insensitive: :class:`bool`
Whether the commands should be case insensitive. Defaults to ``False``. This
attribute does not carry over to groups. You must set it to every group if

View File

@ -89,6 +89,11 @@ class CogMeta(type):
@commands.command(hidden=False)
async def bar(self, ctx):
pass # hidden -> False
aliases: :class:`list`
A list of aliases for the cog name.
.. versionadded:: 1.6.0.7
"""
def __new__(cls, *args, **kwargs):
@ -96,6 +101,11 @@ class CogMeta(type):
attrs['__cog_name__'] = kwargs.pop('name', name)
attrs['__cog_settings__'] = kwargs.pop('command_attrs', {})
aliases = kwargs.pop('aliases', [])
if not isinstance(aliases, list):
raise TypeError("Cog aliases must be a list, not a {0}".format(type(aliases)))
attrs['aliases'] = aliases
description = kwargs.pop('description', None)
if description is None:
description = inspect.cleandoc(attrs.get('__doc__', ''))

View File

@ -21,6 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
"""
import re
import discord.abc
import discord.utils
@ -95,6 +96,15 @@ class Context(discord.abc.Messageable):
self.command_failed = attrs.pop('command_failed', False)
self._state = self.message._state
@property
def clean_prefix(self):
""":class:`str`: The cleaned up invoke prefix. i.e. mentions are ``@name`` instead of ``<@id>``.
.. versionadded:: 1.5.1.4"""
user = self.guild.me if self.guild else self.bot.user
pattern = re.compile(r"<@!?%s>" % user.id)
return pattern.sub("@%s" % user.display_name.replace('\\', r'\\'), self.prefix)
async def invoke(self, command, /, *args, **kwargs):
r"""|coro|

View File

@ -157,7 +157,7 @@ class MemberConverter(IDConverter[discord.Member]):
# If we're being rate limited on the WS, then fall back to using the HTTP API
# So we don't have to wait ~60 seconds for the query to finish
try:
member = await guild.fetch_member(user_id)
member = await guild.try_member(user_id)
except discord.HTTPException:
return None
@ -233,7 +233,7 @@ class UserConverter(IDConverter[discord.User]):
result = ctx.bot.get_user(user_id) or _utils_get(ctx.message.mentions, id=user_id)
if result is None:
try:
result = await ctx.bot.fetch_user(user_id)
result = await ctx.bot.try_user(user_id)
except discord.HTTPException:
raise UserNotFound(argument) from None
@ -617,8 +617,8 @@ ColorConverter = ColourConverter
class RoleConverter(IDConverter[discord.Role]):
"""Converts to a :class:`~discord.Role`.
All lookups are via the local guild. If in a DM context, then the lookup
is done by the global cache.
All lookups are via the local guild. If in a DM context, the converter raises
:exc:`.NoPrivateMessage` exception.
The lookup strategy is as follows (in order):

View File

@ -276,7 +276,7 @@ class HelpCommand:
If ``None``, only calls :attr:`.Commands.checks` in a guild setting.
If ``False``, never calls :attr:`.Commands.checks`. Defaults to ``True``.
..versionchanged:: 1.7
.. versionchanged:: 1.7
command_attrs: :class:`dict`
A dictionary of options to pass in for the construction of the help command.
This allows you to change the command behaviour without actually changing

File diff suppressed because it is too large Load Diff

View File

@ -111,13 +111,13 @@ class Loop:
raise
await asyncio.sleep(backoff.delay())
else:
await sleep_until(self._next_iteration)
if self._stop_next_iteration:
return
self._current_loop += 1
if self._current_loop == self.count:
break
await sleep_until(self._next_iteration)
except asyncio.CancelledError:
self._is_being_cancelled = True
raise

View File

@ -422,6 +422,22 @@ class Intents(BaseFlags):
raise TypeError(f'{key!r} is not a valid flag name.')
setattr(self, key, value)
@classmethod
def from_list(cls, intents_list):
"""A factory method that creates a :class:`Intents` with everything enabled
that has been passed in the list.
.. versionadded:: 1.5.0.1"""
for item in intents_list:
if item not in cls.VALID_FLAGS.keys():
intents_list.remove(item)
self = cls.none()
for item in intents_list:
setattr(self, item, True)
return self
@classmethod
def all(cls: Type[Intents]) -> Intents:
"""A factory method that creates a :class:`Intents` with everything enabled."""
@ -593,6 +609,7 @@ class Intents(BaseFlags):
@flag_value
def presences(self):
""":class:`bool`: Whether guild presence related events are enabled.
This corresponds to the following events:

View File

@ -26,23 +26,23 @@ import copy
from collections import namedtuple
from . import utils
from .role import Role
from .member import Member, VoiceState
from .emoji import Emoji
from .errors import InvalidData
from .permissions import PermissionOverwrite
from .colour import Colour
from .errors import InvalidArgument, ClientException
from .channel import *
from .enums import VoiceRegion, ChannelType, try_enum, VerificationLevel, ContentFilter, NotificationLevel
from .mixins import Hashable
from .user import User
from .invite import Invite
from .iterators import AuditLogIterator, MemberIterator
from .widget import Widget
from .asset import Asset
from .channel import *
from .colour import Colour
from .emoji import Emoji
from .enums import (ChannelType, ContentFilter, NotificationLevel,
VerificationLevel, VoiceRegion, try_enum)
from .errors import ClientException, InvalidArgument, InvalidData
from .flags import SystemChannelFlags
from .integrations import Integration
from .invite import Invite
from .iterators import AuditLogIterator, MemberIterator
from .member import Member, VoiceState
from .mixins import Hashable
from .permissions import PermissionOverwrite
from .role import Role
from .user import User
from .widget import Widget
__all__ = (
'Guild',
@ -96,7 +96,7 @@ class Guild(Hashable):
The guild owner's ID. Use :attr:`Guild.owner` instead.
unavailable: :class:`bool`
Indicates if the guild is unavailable. If this is ``True`` then the
reliability of other attributes outside of :meth:`Guild.id` is slim and they might
reliability of other attributes outside of :attr:`Guild.id` is slim and they might
all be ``None``. It is best to not do anything with the guild if it is unavailable.
Check the :func:`on_guild_unavailable` and :func:`on_guild_available` events.
@ -208,6 +208,9 @@ class Guild(Hashable):
def __str__(self):
return self.name or ''
def __int__(self):
return self.id
def __repr__(self):
attrs = (
('id', self.id),
@ -531,6 +534,20 @@ class Guild(Hashable):
"""List[:class:`Member`]: A list of members that belong to this guild."""
return list(self._members.values())
@property
def bots(self):
"""List[:class:`Member`]: A list of bots that belong to this guild.
.. versionadded:: 1.5.0.1"""
return list(m for m in self._members.values() if m.bot)
@property
def humans(self):
"""List[:class:`Member`]: A list of humans that belong to this guild.
.. versionadded:: 1.5.0.1"""
return list(m for m in self._members.values() if not m.bot)
def get_member(self, user_id):
"""Returns a member with the given ID.
@ -611,8 +628,8 @@ class Guild(Hashable):
@property
def icon_url(self):
""":class:`Asset`: Returns the guild's icon asset."""
return self.icon_url_as()
""":class:`str`: Returns the guild's direct icon url."""
return str(self.icon_url_as(static_format="png"))
def is_icon_animated(self):
""":class:`bool`: Returns True if the guild has an animated icon."""
@ -1112,8 +1129,8 @@ class Guild(Hashable):
The new description of the guild. This is only available to guilds that
contain ``PUBLIC`` in :attr:`Guild.features`.
icon: :class:`bytes`
A :term:`py:bytes-like object` representing the icon. Only PNG/JPEG supported
and GIF This is only available to guilds that contain ``ANIMATED_ICON`` in :attr:`Guild.features`.
A :term:`py:bytes-like object` representing the icon. Only PNG/JPEG is supported.
GIF is only available to guilds that contain ``ANIMATED_ICON`` in :attr:`Guild.features`.
Could be ``None`` to denote removal of the icon.
banner: :class:`bytes`
A :term:`py:bytes-like object` representing the banner.
@ -1313,7 +1330,7 @@ class Guild(Hashable):
def convert(d):
factory, ch_type = _channel_factory(d['type'])
if factory is None:
raise InvalidData('Unknown channel type {type} for channel ID {id}.'.format_map(data))
raise InvalidData('Unknown channel type {type} for channel ID {id}.'.format_map(d))
channel = factory(guild=self, state=self._state, data=d)
return channel
@ -1373,6 +1390,42 @@ class Guild(Hashable):
return MemberIterator(self, limit=limit, after=after)
async def try_member(self, member_id):
"""|coro|
Retreives a :class:`Member` from a guild ID, and a member ID.
.. versionadded:: 1.5.0.2
.. note::
This will first attempt to get the member from the cache.
If that fails, it will make an API call.
This method is an API call. For general usage, consider :meth:`get_member` instead.
Parameters
-----------
member_id: :class:`int`
The member's ID to fetch from.
Raises
-------
Forbidden
You do not have access to the guild.
HTTPException
Fetching the member failed.
Returns
--------
:class:`Member`
The member from the member ID.
"""
member = self.get_member(member_id)
if member is None:
member = await self.fetch_member(member_id)
return member
async def fetch_member(self, member_id):
"""|coro|
@ -1380,7 +1433,7 @@ class Guild(Hashable):
.. note::
This method is an API call. For general usage, consider :meth:`get_member` instead.
This method is an API call. If you have :attr:`Intents.members` and member cache enabled, consider :meth:`get_member` instead.
Parameters
-----------
@ -2207,7 +2260,8 @@ class Guild(Hashable):
if not self._state._intents.members:
raise ClientException('Intents.members must be enabled to use this.')
return await self._state.chunk_guild(self, cache=cache)
if not self._state.is_guild_evicted(self):
return await self._state.chunk_guild(self, cache=cache)
async def query_members(self, query=None, *, limit=5, user_ids=None, presences=False, cache=True):
"""|coro|

View File

@ -192,6 +192,13 @@ class Member(discord.abc.Messageable, _BaseUser):
If the member left and rejoined the guild, this will be the latest date. In certain cases, this can be ``None``.
activities: Tuple[Union[:class:`BaseActivity`, :class:`Spotify`]]
The activities that the user is currently doing.
.. note::
Due to a Discord API limitation, a user's Spotify activity may not appear
if they are listening to a song with a title longer
than 128 characters. See :issue:`1738` for more information.
guild: :class:`Guild`
The guild that the member belongs to.
nick: Optional[:class:`str`]
@ -225,6 +232,9 @@ class Member(discord.abc.Messageable, _BaseUser):
def __str__(self):
return str(self._user)
def __int__(self):
return self.id
def __repr__(self):
return f'<Member id={self._user.id} name={self._user.name!r} discriminator={self._user.discriminator!r}' \
f' bot={self._user.bot} nick={self.nick!r} guild={self.guild!r}>'
@ -444,6 +454,12 @@ class Member(discord.abc.Messageable, _BaseUser):
"""Union[:class:`BaseActivity`, :class:`Spotify`]: Returns the primary
activity the user is currently doing. Could be ``None`` if no activity is being done.
.. note::
Due to a Discord API limitation, this may be ``None`` if
the user is listening to a song on Spotify with a title longer
than 128 characters. See :issue:`1738` for more information.
.. note::
A user may have multiple activities, these can be accessed under :attr:`activities`.

View File

@ -131,6 +131,9 @@ class Attachment(Hashable):
""":class:`bool`: Whether this attachment contains a spoiler."""
return self.filename.startswith('SPOILER_')
def __int__(self):
return self.id
def __repr__(self):
return '<Attachment id={0.id} filename={0.filename!r} url={0.url!r}>'.format(self)
@ -339,6 +342,7 @@ class MessageReference:
self.message_id = utils._get_as_snowflake(data, 'message_id')
self.channel_id = int(data.pop('channel_id'))
self.guild_id = utils._get_as_snowflake(data, 'guild_id')
self.fail_if_not_exists = data.get('fail_if_not_exists', True)
self._state = state
self.resolved = None
return self
@ -368,6 +372,24 @@ class MessageReference:
self._state = message._state
return self
@classmethod
def from_message(cls, message):
"""Creates a :class:`MessageReference` from an existing :class:`Message`.
.. versionadded:: 1.5.1.5
Parameters
----------
message: :class:`Message`
The message to be converted into a reference.
Returns
-------
:class:`MessageReference`
A reference to the message.
"""
return cls(message._state, message_id=message.id, channel_id=message.channel.id, guild_id=message.guild and message.guild.id)
@property
def cached_message(self):
"""Optional[:class:`~discord.Message`]: The cached message, if found in the internal message cache."""
@ -579,6 +601,12 @@ class Message(Hashable):
except KeyError:
continue
def __str__(self):
return self.content
def __int__(self):
return self.id
def __repr__(self):
return '<Message id={0.id} channel={0.channel!r} type={0.type!r} author={0.author!r} flags={0.flags!r}>'.format(self)
@ -936,7 +964,7 @@ class Message(Hashable):
if self.type is MessageType.guild_discovery_grace_period_final_warning:
return 'This server has failed Discovery activity requirements for 3 weeks in a row. If this server fails for 1 more week, it will be removed from Discovery.'
async def delete(self, *, delay=None):
async def delete(self, *, delay=None, silent=False):
"""|coro|
Deletes the message.
@ -948,12 +976,17 @@ class Message(Hashable):
.. versionchanged:: 1.1
Added the new ``delay`` keyword-only parameter.
.. versionchanged:: 1.6.0.7
Added the new ``silent`` keyword-only parameter.
Parameters
-----------
delay: Optional[:class:`float`]
If provided, the number of seconds to wait in the background
before deleting the message. If the deletion fails then it is silently ignored.
silent: :class:`bool`
If silent is set to ``True``, the error will not be raised, it will be ignored.
This defaults to ``False``
Raises
------
Forbidden
@ -973,7 +1006,13 @@ class Message(Hashable):
asyncio.create_task(delete())
else:
await self._state.http.delete_message(self.channel.id, self.id)
try:
await self._state.http.delete_message(self.channel.id, self.id)
except Exception as e:
if silent:
pass
else:
raise e
async def edit(self, **fields):
"""|coro|
@ -1072,8 +1111,10 @@ class Message(Hashable):
Publishes this message to your announcement channel.
You must have the :attr:`~Permissions.send_messages` permission to do this.
If the message is not your own then the :attr:`~Permissions.manage_messages`
permission is needed.
permission is also needed.
Raises
-------
@ -1262,8 +1303,8 @@ class Message(Hashable):
async def reply(self, content=None, **kwargs):
"""|coro|
A shortcut method to :meth:`abc.Messageable.send` to reply to the
:class:`Message`.
A shortcut method to :meth:`.abc.Messageable.send` to reply to the
:class:`.Message`.
.. versionadded:: 1.6
@ -1279,7 +1320,7 @@ class Message(Hashable):
Returns
---------
:class:`Message`
:class:`.Message`
The message that was sent.
"""

View File

@ -283,6 +283,8 @@ class Permissions(BaseFlags):
"""
return 1 << 3
admin = administrator
@flag_value
def manage_channels(self):
""":class:`bool`: Returns ``True`` if a user can edit, delete, or create channels in the guild.

View File

@ -150,6 +150,9 @@ class Role(Hashable):
def __str__(self):
return self.name
def __int__(self):
return self.id
def __repr__(self):
return '<Role id={0.id} name={0.name!r}>'.format(self)

View File

@ -801,6 +801,9 @@ class ConnectionState:
return self._add_guild_from_data(data)
def is_guild_evicted(self, guild) -> bool:
return guild.id not in self._guilds
async def chunk_guild(self, guild, *, wait=True, cache=None):
cache = cache or self.member_cache_flags.joined
request = self._chunk_requests.get(guild.id)

View File

@ -32,7 +32,7 @@ __all__ = (
)
class Sticker(Hashable):
"""Represents a sticker
"""Represents a sticker.
.. versionadded:: 1.6
@ -40,34 +40,34 @@ class Sticker(Hashable):
.. describe:: str(x)
Returns the name of the sticker
Returns the name of the sticker.
.. describe:: x == y
Checks if the sticker is equal to another sticker
Checks if the sticker is equal to another sticker.
.. describe:: x != y
Checks if the sticker is not equal to another sticker
Checks if the sticker is not equal to another sticker.
Attributes
----------
name: :class:`str`
The sticker's name
The sticker's name.
id: :class:`int`
The id of the sticker
The id of the sticker.
description: :class:`str`
The description of the sticker
The description of the sticker.
pack_id: :class:`int`
The id of the sticker's pack
The id of the sticker's pack.
format: :class:`StickerType`
The format for the sticker's image
The format for the sticker's image.
image: :class:`str`
The sticker's image
The sticker's image.
tags: List[:class:`str`]
A list of tags for the sticker
A list of tags for the sticker.
preview_image: Optional[:class:`str`]
The sticker's preview asset hash
The sticker's preview asset hash.
"""
__slots__ = ('_state', 'id', 'name', 'description', 'pack_id', 'format', 'image', 'tags', 'preview_image')
@ -76,7 +76,7 @@ class Sticker(Hashable):
self.id = int(data['id'])
self.name = data['name']
self.description = data['description']
self.pack_id = int(data['pack_id'])
self.pack_id = int(data.get('pack_id', 0))
self.format = try_enum(StickerType, data['format_type'])
self.image = data['asset']
@ -103,7 +103,7 @@ class Sticker(Hashable):
"""Returns an :class:`Asset` for the sticker's image.
.. note::
This will return ``None`` if the format is ``StickerType.lottie``
This will return ``None`` if the format is ``StickerType.lottie``.
Returns
-------

View File

@ -46,6 +46,9 @@ class BaseUser(_BaseUser):
def __str__(self):
return '{0.name}#{0.discriminator}'.format(self)
def __int__(self):
return self.id
def __eq__(self, other):
return isinstance(other, _BaseUser) and other.id == self.id
@ -94,15 +97,12 @@ class BaseUser(_BaseUser):
@property
def avatar_url(self):
""":class:`Asset`: Returns an :class:`Asset` for the avatar the user has.
""":class:`str`: Returns an direct url for the avatar the user has.
If the user does not have a traditional avatar, an asset for
the default avatar is returned instead.
This is equivalent to calling :meth:`avatar_url_as` with
the default parameters (i.e. webp/gif detection and a size of 1024).
"""
return self.avatar_url_as(format=None, size=1024)
return str(self.avatar_url_as(static_format="png", size=1024))
def is_avatar_animated(self):
""":class:`bool`: Indicates if the user has an animated avatar."""
@ -269,7 +269,16 @@ class ClientUser(BaseUser):
.. versionadded:: 1.3
verified: :class:`bool`
<<<<<<< HEAD
Specifies if the user's email is verified.
email: Optional[:class:`str`]
The email the user used when registering.
.. deprecated:: 1.7
=======
Specifies if the user is a verified account.
>>>>>>> 523e35e4f3c3c49d4e471359f9fb559242bbecc8
locale: Optional[:class:`str`]
The IETF language tag used to identify the language the user is using.
mfa_enabled: :class:`bool`

View File

@ -73,7 +73,7 @@ class VoiceProtocol:
These classes are passed to :meth:`abc.Connectable.connect`.
.. _Lavalink: https://github.com/Frederikam/Lavalink
.. _Lavalink: https://github.com/freyacodes/Lavalink
Parameters
------------

View File

@ -597,7 +597,7 @@ class WebhookMessage(Message):
"""
if delay is not None:
if self._state.parent._adapter.is_async():
if self._state._webhook._adapter.is_async():
return self._delete_delay_async(delay)
else:
return self._delete_delay_sync(delay)

View File

@ -95,3 +95,9 @@ document.addEventListener('keydown', (event) => {
activeModal.close();
}
});
document.addEventListener('keydown', (event) => {
if (event.code == "Escape" && activeModal) {
activeModal.close();
}
});

View File

@ -271,6 +271,12 @@ header > nav.mobile-only {
header > nav.mobile-only .search {
width: 100%;
position: absolute;
top: 0;
right: 0;
z-index: -1;
padding-top: 0;
transition: top 0.5s ease-in-out;
}
header > nav.mobile-only .search-wrapper {

View File

@ -267,7 +267,7 @@ to handle it, which defaults to print a traceback and ignoring the exception.
If you want exception to propagate out of the :class:`Client` class
you can define an ``on_error`` handler consisting of a single empty
:ref:`py:raise`. Exceptions raised by ``on_error`` will not be
:ref:`raise statement <py:raise>`. Exceptions raised by ``on_error`` will not be
handled in any way by :class:`Client`.
.. note::
@ -834,7 +834,7 @@ to handle it, which defaults to print a traceback and ignoring the exception.
:type member: :class:`Member`
:param before: The voice state prior to the changes.
:type before: :class:`VoiceState`
:param after: The voice state after to the changes.
:param after: The voice state after the changes.
:type after: :class:`VoiceState`
.. function:: on_member_ban(guild, user)
@ -2791,6 +2791,8 @@ Role
RoleTags
~~~~~~~~~~
.. attributetable:: RoleTags
.. autoclass:: RoleTags()
:members:
@ -3051,24 +3053,32 @@ AllowedMentions
MessageReference
~~~~~~~~~~~~~~~~~
.. attributetable:: MessageReference
.. autoclass:: MessageReference
:members:
PartialMessage
~~~~~~~~~~~~~~~~~
.. attributetable:: PartialMessage
.. autoclass:: PartialMessage
:members:
Intents
~~~~~~~~~~
.. attributetable:: Intents
.. autoclass:: Intents
:members:
MemberCacheFlags
~~~~~~~~~~~~~~~~~~
.. attributetable:: MemberCacheFlags
.. autoclass:: MemberCacheFlags
:members:
@ -3147,24 +3157,32 @@ PermissionOverwrite
ShardInfo
~~~~~~~~~~~
.. attributetable:: ShardInfo
.. autoclass:: ShardInfo()
:members:
SystemChannelFlags
~~~~~~~~~~~~~~~~~~~~
.. attributetable:: SystemChannelFlags
.. autoclass:: SystemChannelFlags()
:members:
MessageFlags
~~~~~~~~~~~~
.. attributetable:: MessageFlags
.. autoclass:: MessageFlags()
:members:
PublicUserFlags
~~~~~~~~~~~~~~~
.. attributetable:: PublicUserFlags
.. autoclass:: PublicUserFlags()
:members:

34
docs/custom_features.rst Normal file
View File

@ -0,0 +1,34 @@
.. currentmodule:: discord
.. _custom_features:
Intro
=====
enhanced-dpy was made to add some extra features that make it just a bit easier. This custom version of discord.py will always remain up-to-date with the beta version, so not everything might work or be stable.
Custom Features
---------------
Here are the custom features listed that have been added to enhanced-dpy. You can refer to the changelog to see in what version they were added!
- **Documentation URL:** https://enhanced-dpy.readthedocs.io/en/latest/index.html
- Added :attr:`Guild.bots` and :attr:`Guild.humans`
- Added :attr:`Client.owner` and :attr:`Client.owners`
- Added :meth:`Client.try_user`
- :attr:`Guild.icon_url` and :attr:`User.avatar_url` return the string in stead of Asset. use icon/avatar url_as to get the :class:`Asset`
- Merged in ext-colors (https://github.com/MGardne8/DiscordPyColours)
- Using Rapptz/discord.py/tree/neo-docs for documentation
- Added support for ``hex()`` to :class:`Color`
- Added :attr:`Client.embed_color`
- Added :meth:`Client.set_embed_color`
- Added :attr:`TextChannel.can_send`
- Added :meth:`Intents.from_list`
- Added support for ``int()`` to :class:`User`, :class:`Member`, :class:`Emoji`, :class:`Role`, :class:`Guild`, :class:`Message`, :class:`TextChannel`, :class:`VoiceChannel`, :class:`CategoryChannel`, :class:`Attachment` and :class:`Message`. This will return their id
- Added support for ``str()`` to :class:`Message`. This will return the message content
- Added :meth:`Guild.try_member`
- Added :attr:`Context.clean_prefix <.ext.commands.Context.clean_prefix>`
- Added :meth:`Colour.nitro_booster`
- Added :attr:`Permissions.admin` as alias to :attr:`Permissions.administrator`
- Added :attr:`CogMeta.aliases <.ext.commands.CogMeta.aliases>`
- Added :attr:`Bot.case_insensitive_prefix <.ext.commands.Bot.case_insensitive_prefix>`
- Added ``silent`` kwarg to :meth:`Message.delete`
- Added :meth:`Client.get_message`

View File

@ -176,7 +176,8 @@ Paginator
Enums
------
.. class:: discord.ext.commands.BucketType
.. class:: BucketType
:module: discord.ext.commands
Specifies a type of bucket for, e.g. a cooldown.
@ -293,6 +294,9 @@ Converters
.. autoclass:: discord.ext.commands.StoreChannelConverter
:members:
.. autoclass:: discord.ext.commands.StageChannelConverter
:members:
.. autoclass:: discord.ext.commands.CategoryChannelConverter
:members:

View File

@ -327,7 +327,7 @@ For example, a common idiom would be to have a class and a converter for that cl
else:
await ctx.send("Hm you're not so new.")
This can get tedious, so an inline advanced converter is possible through a ``classmethod`` inside the type:
This can get tedious, so an inline advanced converter is possible through a :func:`classmethod` inside the type:
.. code-block:: python3
@ -379,6 +379,10 @@ A lot of discord models work out of the gate as a parameter:
- :class:`PartialMessage` (since v1.7)
- :class:`TextChannel`
- :class:`VoiceChannel`
<<<<<<< HEAD
- :class:`StageChannel` (since v1.7)
=======
>>>>>>> 523e35e4f3c3c49d4e471359f9fb559242bbecc8
- :class:`StoreChannel` (since v1.7)
- :class:`CategoryChannel`
- :class:`Invite`
@ -410,8 +414,15 @@ converter is given below:
+--------------------------+-------------------------------------------------+
| :class:`VoiceChannel` | :class:`~ext.commands.VoiceChannelConverter` |
+--------------------------+-------------------------------------------------+
<<<<<<< HEAD
| :class:`StageChannel` | :class:`~ext.commands.StageChannelConverter` |
+--------------------------+-------------------------------------------------+
| :class:`StoreChannel` | :class:`~ext.commands.StoreChannelConverter` |
+--------------------------+-------------------------------------------------+
=======
| :class:`StoreChannel` | :class:`~ext.commands.StoreChannelConverter` |
+--------------------------+-------------------------------------------------+
>>>>>>> 523e35e4f3c3c49d4e471359f9fb559242bbecc8
| :class:`CategoryChannel` | :class:`~ext.commands.CategoryChannelConverter` |
+--------------------------+-------------------------------------------------+
| :class:`Invite` | :class:`~ext.commands.InviteConverter` |

View File

@ -27,7 +27,7 @@ An example extension looks like this:
def setup(bot):
bot.add_command(hello)
In this example we define a simple command, and when the extension is loaded this command is added to the bot. Now the final step to this is loading the extension, which we do by calling :meth:`.commands.Bot.load_extension`. To load this extension we call ``bot.load_extension('hello')``.
In this example we define a simple command, and when the extension is loaded this command is added to the bot. Now the final step to this is loading the extension, which we do by calling :meth:`.Bot.load_extension`. To load this extension we call ``bot.load_extension('hello')``.
.. admonition:: Cogs
:class: helpful
@ -41,7 +41,7 @@ In this example we define a simple command, and when the extension is loaded thi
Reloading
-----------
When you make a change to the extension and want to reload the references, the library comes with a function to do this for you, :meth:`Bot.reload_extension`.
When you make a change to the extension and want to reload the references, the library comes with a function to do this for you, :meth:`.Bot.reload_extension`.
.. code-block:: python3

31
docs/ext/menus/index.rst Normal file
View File

@ -0,0 +1,31 @@
.. _discord_ext_menus:
``discord.ext.menus``
====================================================
Something something OOOOOOHH built in paginator!
Recipes
---------
Idk, some examples someday
.. _ext_menus_api:
API Reference
---------------
.. autoclass:: discord.ext.menus.Menu()
:members:
.. autoclass:: discord.ext.menus.PageSource()
:members:
.. autoclass:: discord.ext.menus.MenuPages()
:members:
.. autoclass:: discord.ext.menus.ListPageSource()
:members:
.. autofunction:: discord.ext.tasks.menus

View File

@ -234,7 +234,7 @@ technically in another thread, we must take caution in calling thread-safe opera
us, :mod:`asyncio` comes with a :func:`asyncio.run_coroutine_threadsafe` function that allows us to call
a coroutine from another thread.
However, this function returns a :class:`concurrent.Future` and to actually call it we have to fetch its result. Putting all of
However, this function returns a :class:`~concurrent.futures.Future` and to actually call it we have to fetch its result. Putting all of
this together we can do the following: ::
def my_after(error):
@ -295,7 +295,7 @@ How do I make a web request?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To make a request, you should use a non-blocking library.
This library already uses and requires a 3rd party library for making requests, ``aiohttp``.
This library already uses and requires a 3rd party library for making requests, :doc:`aiohttp <aio:index>`.
Quick example: ::
@ -393,7 +393,7 @@ Example: ::
How do I make a subcommand?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Use the ``group`` decorator. This will transform the callback into a ``Group`` which will allow you to add commands into
Use the :func:`~ext.commands.group` decorator. This will transform the callback into a :class:`~ext.commands.Group` which will allow you to add commands into
the group operating as "subcommands". These groups can be arbitrarily nested as well.
Example: ::

View File

@ -11,8 +11,17 @@ Welcome to discord.py
discord.py is a modern, easy to use, feature-rich, and async ready API wrapper
for Discord.
Credits to the `original lib by Rapptz <https://github.com/iDutchy/discord.py>`_
**Features:**
**WARNING: This is not the official discord.py lib! This is a custom version to which I add some features that might be useful or just makes things easier for the lazy people. See below which features have been added. This lib will also be kept updated with the BETA version of the original lib! So things may be unstable, please keep that in mind.**
Custom Features
---------------
**Moved to:** `Custom Features <https://enhanced-dpy.readthedocs.io/en/latest/custom_features.html>`_
Features
--------
- Modern Pythonic API using ``async``\/``await`` syntax
- Sane rate limit handling that prevents 429s

View File

@ -52,8 +52,9 @@ There's a lot going on here, so let's walk you through it step by step.
4. Since the :func:`on_message` event triggers for *every* message received, we have to make
sure that we ignore messages from ourselves. We do this by checking if the :attr:`Message.author`
is the same as the :attr:`Client.user`.
5. Afterwards, we check if the :class:`Message.content` starts with ``'$hello'``. If it is,
then we send a message in the channel it was used in with ``'Hello!'``.
5. Afterwards, we check if the :class:`Message.content` starts with ``'$hello'``. If it does,
then we send a message in the channel it was used in with ``'Hello!'``. This is a basic way of
handling commands, which can be later automated with the :ref:`ext.commands` framework.
6. Finally, we run the bot with our login token. If you need help getting your token or creating a bot,
look in the :ref:`discord-intro` section.

View File

@ -11,6 +11,29 @@ Changelog
This page keeps a detailed human friendly rendering of what's new and changed
in specific versions.
.. _vp1p7p3:
v1.7.3
--------
Bug Fixes
~~~~~~~~~~
- Fix a crash involving guild uploaded stickers
- Fix :meth:`DMChannel.permissions_for` not having :attr:`Permissions.read_messages` set.
.. _vp1p7p2:
v1.7.2
-------
Bug Fixes
~~~~~~~~~~~
- Fix ``fail_if_not_exists`` causing certain message references to not be usable within :meth:`abc.Messageable.send` and :meth:`Message.reply` (:issue:`6726`)
- Fix :meth:`Guild.chunk` hanging when the user left the guild. (:issue:`6730`)
- Fix loop sleeping after final iteration rather than before (:issue:`6744`)
.. _vp1p7p1:
v1.7.1
@ -32,9 +55,10 @@ Likewise, **this is the last version to support user bots**.
Development of v2.0 will have breaking changes and support for newer API features.
New Features
~~~~~~~~~~~~~~
<<<<<<< HEAD
=======
>>>>>>> 523e35e4f3c3c49d4e471359f9fb559242bbecc8
- Add support for stage channels via :class:`StageChannel` (:issue:`6602`, :issue:`6608`)
- Add support for :attr:`MessageReference.fail_if_not_exists` (:issue:`6484`)
- By default, if the message you're replying to doesn't exist then the API errors out.
@ -104,6 +128,19 @@ Miscellaneous
- :class:`Permission` class methods were updated to match the UI of the Discord client (:issue:`6476`)
- ``_`` and ``-`` characters are now stripped when making a new cog using the ``discord`` package (:issue:`6313`)
.. _vp1p6p0p7:
v1.6.0.7
--------
New Features
~~~~~~~~~~~~~~
- Add :attr:`CogMeta.aliases <.ext.commands.CogMeta.aliases>`
- Add :attr:`Bot.case_insensitive_prefix <.ext.commands.Bot.case_insensitive_prefix>`
- Add ``silent`` kwargs to :meth:`Message.delete`
- Add :meth:`Client.get_message`
.. _vp1p6p0:
v1.6.0
@ -176,6 +213,49 @@ Miscellaneous
- |commands| :class:`UserConverter <ext.commands.UserConverter>` now fetches the API if an ID is passed and the user is not cached.
- |commands| :func:`max_concurrency <ext.commands.max_concurrency>` is now called before cooldowns (:issue:`6172`)
.. _vp1p5p1p6:
v1.5.1.6
--------
New Features
~~~~~~~~~~~~~~
- Add :meth:`Colour.random`
.. _vp1p5p1p5:
v1.5.1.5
--------
New Features
~~~~~~~~~~~~~~
- Add :meth:`Colour.nitro_booster`
- Add :attr:`Permissions.admin` as alias to :attr:`Permissions.administrator`
New Beta Features
~~~~~~~~~~~~~~~~~~~
These are all for message replies. I have added them to 1.5.1.5 but they will most likely officially get added in the original lib in 1.6 or 2.0
- |commands| Add :meth:`Context.reply <ext.commands.Context>`
- Add :meth:`Message.reply`
- Add ``replied_user`` to :class:`AllowedMentions`
- Add :meth:`MessageReference.to_dict`
- Add :meth:`MessageReference.from_message`
- Add ``message_reference`` kwarg to :meth:`abc.Messageable.send`
.. _vp1p5p1p4:
v1.5.1.4
--------
New Features
~~~~~~~~~~~~~~
- |commands| Add :attr:`Context.clean_prefix <ext.commands.Context>`
.. _vp1p5p1:
v1.5.1
@ -201,6 +281,52 @@ Miscellaneous
- This is the same as having ``discord.Member`` as the type-hint.
- :meth:`Guild.chunk` now allows concurrent calls without spamming the gateway with requests.
.. _v1p5p0p3:
v1.5.0.3
--------
Bug Fixes
~~~~~~~~~~~
- Fix :attr:`TextChannel.can_send` to use proper checks
.. _vp1p5p0p2:
v1.5.0.2
--------
New Features
~~~~~~~~~~~~~~
- Add :attr:`Guild.try_member`
- Add :attr:`TextChannel.can_send`
.. _vp1p5p0p1:
v1.5.0.1
--------
New Features
~~~~~~~~~~~~~~
- Changed :attr:`Guild.icon_url` and :attr:`User.avatar_url` to return a string of the url in stead of an :class:`Asset`
- Documentation uses `Neo Docs by Rapptz <Rapptz/discord.py/tree/neo-docs>`_
- Add 1000+ colors from `ext colors <https://github.com/MGardne8/DiscordPyColours>`_
- Add support for ``hex()`` to :class:`Colour`
- Add :attr:`Guild.bots`
- Add :attr:`Guild.humans`
- |commands| Add :attr:`Bot.owner <ext.commands.Bot>`
- |commands| Add :attr:`Bot.owners <ext.commands.Bot>`
- Add :attr:`Guild.humans`
- Add :meth:`Client.try_user`
- Add :attr:`Client.embed_color`
- Add :meth:`Client.set_embed_color`
- Add :meth:`Intents.from_list`
- Add ``str()`` support to :class:`Message` which will return the :attr:`Message.content`
- Add ``int()`` support to :class:`User`, :class:`Member`, :class:`Emoji`, :class:`Role`, :class:`Guild`, :class:`Message`, :class:`TextChannel`, :class:`VoiceChannel`, :class:`CategoryChannel`, :class:`Attachment` and :class:`Message`. This will return the ID of the object
.. _vp1p5p0:
v1.5.0

View File

@ -1 +1 @@
aiohttp>=3.6.0,<3.8.0
aiohttp>=3.6.0,<3.7.0

View File

@ -42,12 +42,12 @@ extras_require = {
]
}
setup(name='discord.py',
author='Rapptz',
url='https://github.com/Rapptz/discord.py',
setup(name='enhanced-dpy',
author='iDutchy',
url='https://github.com/iDutchy/discord.py',
project_urls={
"Documentation": "https://discordpy.readthedocs.io/en/latest/",
"Issue tracker": "https://github.com/Rapptz/discord.py/issues",
"Documentation": "https://enhanced-dpy.readthedocs.io/en/latest/",
"Issue tracker": "https://github.com/iDutchy/discord.py/issues",
},
version=version,
packages=['discord', 'discord.types', 'discord.ext.commands', 'discord.ext.tasks'],