23
23
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24
24
DEALINGS IN THE SOFTWARE.
25
25
"""
26
+ from __future__ import annotations
26
27
27
- from typing import Optional , TYPE_CHECKING
28
+
29
+ from typing import Optional , List , TYPE_CHECKING
30
+ from typing_extensions import Literal
28
31
29
32
from .asset import Asset
30
33
from .welcome_screen import WelcomeScreen
34
37
from .enums import ChannelType , VerificationLevel , try_enum
35
38
36
39
if TYPE_CHECKING :
40
+ from datetime import datetime
41
+
37
42
from .state import ConnectionState
38
43
from .scheduled_event import GuildScheduledEvent
39
44
@@ -88,7 +93,7 @@ def __repr__(self):
88
93
@property
89
94
def mention (self ):
90
95
""":class:`str`: The string that allows you to mention the channel."""
91
- return '<#%s>' % self .id
96
+ return f '<#{ self .id } >'
92
97
93
98
@property
94
99
def created_at (self ):
@@ -142,47 +147,54 @@ class PartialInviteGuild:
142
147
__slots__ = ('_state' , 'features' , 'icon' , 'banner' , 'id' , 'name' , 'splash' ,
143
148
'verification_level' , 'description' , 'welcome_screen' )
144
149
145
- def __init__ (self , state : 'ConnectionState' , data , id ):
146
- self ._state = state
147
- self .id = id
148
- self .name = data ['name' ]
149
- self .features = data .get ('features' , [])
150
- self .icon = data .get ('icon' )
151
- self .banner = data .get ('banner' )
152
- self .splash = data .get ('splash' )
153
- self .verification_level = try_enum (VerificationLevel , data .get ('verification_level' ))
154
- self .description = data .get ('description' )
150
+ def __init__ (self , state : ConnectionState , data , id ):
151
+ self ._state : ConnectionState = state
152
+ self .id : int = id
153
+ self .name : str = data ['name' ]
154
+ self .features : List [str ] = data .get ('features' , [])
155
+ self .icon : Optional [str ] = data .get ('icon' )
156
+ self .banner : Optional [str ] = data .get ('banner' )
157
+ self .splash : Optional [str ] = data .get ('splash' )
158
+ self .verification_level : VerificationLevel = try_enum (VerificationLevel , data .get ('verification_level' ))
159
+ self .description : Optional [str ] = data .get ('description' )
160
+ self .welcome_screen : Optional [WelcomeScreen ]
155
161
welcome_screen = data .get ('welcome_screen' , None )
156
162
if welcome_screen :
157
163
self .welcome_screen = WelcomeScreen (state = state , guild = self ._state ._get_guild (self .id ) or self , data = welcome_screen )
158
164
else :
159
165
self .welcome_screen = None
160
166
161
- def __str__ (self ):
167
+ def __str__ (self ) -> str :
162
168
return self .name
163
169
164
- def __repr__ (self ):
170
+ def __repr__ (self ) -> str :
165
171
return '<{0.__class__.__name__} id={0.id} name={0.name!r} features={0.features} ' \
166
172
'description={0.description!r}>' .format (self )
167
173
168
174
@property
169
- def created_at (self ):
175
+ def created_at (self ) -> datetime :
170
176
""":class:`datetime.datetime`: Returns the guild's creation time in UTC."""
171
177
return snowflake_time (self .id )
172
178
173
179
@property
174
- def icon_url (self ):
180
+ def icon_url (self ) -> Asset :
175
181
""":class:`Asset`: Returns the guild's icon asset."""
176
182
return self .icon_url_as ()
177
183
178
- def is_icon_animated (self ):
184
+ def is_icon_animated (self ) -> bool :
179
185
""":class:`bool`: Returns ``True`` if the guild has an animated icon.
180
186
181
187
.. versionadded:: 1.4
182
188
"""
183
189
return bool (self .icon and self .icon .startswith ('a_' ))
184
190
185
- def icon_url_as (self , * , format = None , static_format = 'webp' , size = 1024 ):
191
+ def icon_url_as (
192
+ self ,
193
+ * ,
194
+ format : Literal ['webp' , 'jpeg' , 'jpg' , 'png' , 'gif' ] = None ,
195
+ static_format : Literal ['webp' , 'jpeg' , 'jpg' , 'png' ] = 'webp' ,
196
+ size : int = 1024
197
+ ) -> Asset :
186
198
"""The same operation as :meth:`Guild.icon_url_as`.
187
199
188
200
Returns
@@ -193,11 +205,16 @@ def icon_url_as(self, *, format=None, static_format='webp', size=1024):
193
205
return Asset ._from_guild_icon (self ._state , self , format = format , static_format = static_format , size = size )
194
206
195
207
@property
196
- def banner_url (self ):
208
+ def banner_url (self ) -> Asset :
197
209
""":class:`Asset`: Returns the guild's banner asset."""
198
210
return self .banner_url_as ()
199
211
200
- def banner_url_as (self , * , format = 'webp' , size = 2048 ):
212
+ def banner_url_as (
213
+ self ,
214
+ * ,
215
+ format : Literal ['webp' , 'jpeg' , 'jpg' , 'png' ] = 'webp' ,
216
+ size : int = 2048
217
+ ) -> Asset :
201
218
"""The same operation as :meth:`Guild.banner_url_as`.
202
219
203
220
Returns
@@ -208,11 +225,16 @@ def banner_url_as(self, *, format='webp', size=2048):
208
225
return Asset ._from_guild_image (self ._state , self .id , self .banner , 'banners' , format = format , size = size )
209
226
210
227
@property
211
- def splash_url (self ):
228
+ def splash_url (self ) -> Asset :
212
229
""":class:`Asset`: Returns the guild's invite splash asset."""
213
230
return self .splash_url_as ()
214
231
215
- def splash_url_as (self , * , format = 'webp' , size = 2048 ):
232
+ def splash_url_as (
233
+ self ,
234
+ * ,
235
+ format : Literal ['webp' , 'jpeg' , 'jpg' , 'png' ] = 'webp' ,
236
+ size : int = 2048
237
+ ) -> Asset :
216
238
"""The same operation as :meth:`Guild.splash_url_as`.
217
239
218
240
Returns
@@ -222,6 +244,7 @@ def splash_url_as(self, *, format='webp', size=2048):
222
244
"""
223
245
return Asset ._from_guild_image (self ._state , self .id , self .splash , 'splashes' , format = format , size = size )
224
246
247
+
225
248
class Invite (Hashable ):
226
249
r"""Represents a Discord :class:`Guild` or :class:`abc.GuildChannel` invite.
227
250
@@ -265,6 +288,8 @@ class Invite(Hashable):
265
288
+------------------------------------+----------------------------------------------------------+
266
289
| :attr:`approximate_presence_count` | :meth:`Client.fetch_invite` |
267
290
+------------------------------------+----------------------------------------------------------+
291
+ | :attr:`scheduled_event` | :meth:`Client.fetch_invite` |
292
+ +------------------------------------+----------------------------------------------------------+
268
293
269
294
If it's not in the table above then it is available by all methods.
270
295
@@ -296,41 +321,44 @@ class Invite(Hashable):
296
321
approximate_presence_count: Optional[:class:`int`]
297
322
The approximate number of members currently active in the guild.
298
323
This includes idle, dnd, online, and invisible members. Offline members are excluded.
324
+ scheduled_event: Optional[:class:`GuildScheduledEvent`]
325
+ The scheduled event attached to this invite link, if any.
299
326
channel: Union[:class:`abc.GuildChannel`, :class:`Object`, :class:`PartialInviteChannel`]
300
327
The channel the invite is for.
301
328
"""
302
329
303
330
__slots__ = ('max_age' , 'code' , 'guild' , 'revoked' , 'created_at' , 'uses' ,
304
331
'temporary' , 'max_uses' , 'inviter' , 'channel' , '_state' ,
305
332
'approximate_member_count' , 'approximate_presence_count' ,
306
- 'event ' )
333
+ 'scheduled_event ' )
307
334
308
335
BASE = 'https://discord.gg'
309
336
310
- def __init__ (self , * , state : ' ConnectionState' , data ):
337
+ def __init__ (self , * , state : ConnectionState , data ) -> None :
311
338
self ._state = state
312
339
self .max_age = data .get ('max_age' )
313
340
self .code = data .get ('code' )
314
341
self .guild = data .get ('guild' )
315
- self .revoked = data .get ('revoked' )
316
- self .created_at = parse_time (data .get ('created_at' ))
317
- self .temporary = data .get ('temporary' )
318
- self .uses = data .get ('uses' )
319
- self .max_uses = data .get ('max_uses' )
320
- self .approximate_presence_count = data .get ('approximate_presence_count' )
321
- self .approximate_member_count = data .get ('approximate_member_count' )
342
+ self .revoked : Optional [ bool ] = data .get ('revoked' )
343
+ self .created_at : datetime = parse_time (data .get ('created_at' ))
344
+ self .temporary : Optional [ bool ] = data .get ('temporary' )
345
+ self .uses : Optional [ int ] = data .get ('uses' )
346
+ self .max_uses : Optional [ int ] = data .get ('max_uses' )
347
+ self .approximate_presence_count : Optional [ int ] = data .get ('approximate_presence_count' )
348
+ self .approximate_member_count : Optional [ int ] = data .get ('approximate_member_count' )
322
349
323
350
inviter_data = data .get ('inviter' )
324
351
self .inviter = None if inviter_data is None else self ._state .store_user (inviter_data )
325
352
self .channel = data .get ('channel' )
353
+ self .scheduled_event : Optional [GuildScheduledEvent ]
326
354
guild_scheduled_event = data .get ('guild_scheduled_event' , None )
327
355
if guild_scheduled_event is not None :
328
- self .event : Optional [ 'GuildScheduledEvent' ] = state .store_event (guild = self .guild , data = guild_scheduled_event )
356
+ self .scheduled_event = state .store_event (guild = self .guild , data = guild_scheduled_event )
329
357
else :
330
- self .event = None
358
+ self .scheduled_event = None
331
359
332
360
@classmethod
333
- def from_incomplete (cls , * , state , data ):
361
+ def from_incomplete (cls , * , state : ConnectionState , data ) -> Invite :
334
362
try :
335
363
guild_id = int (data ['guild' ]['id' ])
336
364
except KeyError :
@@ -358,7 +386,7 @@ def from_incomplete(cls, *, state, data):
358
386
return cls (state = state , data = data )
359
387
360
388
@classmethod
361
- def from_gateway (cls , * , state , data ):
389
+ def from_gateway (cls , * , state : ConnectionState , data ) -> Invite :
362
390
guild_id = _get_as_snowflake (data , 'guild_id' )
363
391
guild = state ._get_guild (guild_id )
364
392
channel_id = _get_as_snowflake (data , 'channel_id' )
@@ -372,28 +400,29 @@ def from_gateway(cls, *, state, data):
372
400
data ['channel' ] = channel
373
401
return cls (state = state , data = data )
374
402
375
- def __str__ (self ):
403
+ def __str__ (self ) -> str :
376
404
return self .url
377
405
378
- def __repr__ (self ):
379
- return '<Invite code={0.code!r} guild={0.guild!r} ' \
380
- 'online={0.approximate_presence_count} ' \
381
- 'members={0.approximate_member_count}>' .format (self )
406
+ def __repr__ (self ) -> str :
407
+ return f'<Invite code={ self .code !r} guild={ self .guild !r} ' \
408
+ f'online={ self .approximate_presence_count } ' \
409
+ f'members={ self .approximate_member_count } ' \
410
+ f'scheduled_event={ self .scheduled_event } >'
382
411
383
- def __hash__ (self ):
412
+ def __hash__ (self ) -> int :
384
413
return hash (self .code )
385
414
386
415
@property
387
- def id (self ):
416
+ def id (self ) -> str :
388
417
""":class:`str`: Returns the proper code portion of the invite."""
389
418
return self .code
390
419
391
420
@property
392
421
def url (self ):
393
422
""":class:`str`: A property that retrieves the invite URL."""
394
- return self .BASE + '/' + self .code
423
+ return f" { self .BASE } / { self . code } { f'?event= { self . scheduled_event . id } ' if self .scheduled_event else '' } "
395
424
396
- async def delete (self , * , reason = None ):
425
+ async def delete (self , * , reason : Optional [ str ] = None ) -> None :
397
426
"""|coro|
398
427
399
428
Revokes the instant invite.
@@ -416,3 +445,22 @@ async def delete(self, *, reason=None):
416
445
"""
417
446
418
447
await self ._state .http .delete_invite (self .code , reason = reason )
448
+
449
+ def set_scheduled_event (self , event : GuildScheduledEvent ) -> None :
450
+ """Links the given scheduled event to this invite.
451
+
452
+ .. note::
453
+
454
+ Scheduled events aren't actually associated with invites on the API.
455
+ Any guild channel invite can have an event attached to it. Using
456
+ :meth:`abc.GuildChannel.create_invite`, :meth:`Client.fetch_invite`,
457
+ or this method, you can link scheduled events.
458
+
459
+ .. versionadded:: 2.0
460
+
461
+ Parameters
462
+ ----------
463
+ event: :class:`ScheduledEvent`
464
+ The scheduled event object to link.
465
+ """
466
+ self .scheduled_event = event
0 commit comments