9292 welcome_screen ,
9393 widget ,
9494 )
95+ from .types .invite import (
96+ InviteTargetUsersJobStatus as InviteTargetUsersJobStatusPayload ,
97+ )
9598 from .types .snowflake import Snowflake , SnowflakeList
9699 from .types .soundboard import SoundboardSound as SoundboardSoundPayload
97100
103106API_VERSION : int = 10
104107
105108
106- async def json_or_text (response : aiohttp .ClientResponse ) -> dict [str , Any ] | str :
107- text = await response .text (encoding = "utf-8" )
109+ async def parse_response (
110+ response : aiohttp .ClientResponse ,
111+ ) -> dict [str , Any ] | str | bytes :
108112 try :
109113 if response .headers ["content-type" ] == "application/json" :
110- return utils ._from_json (text )
114+ return utils ._from_json (await response .text (encoding = "utf-8" ))
115+ elif response .headers ["content-type" ] == "text/csv" :
116+ return await response .read ()
111117 except KeyError :
112118 # Thanks Cloudflare
113119 pass
114120
115- return text
121+ return await response . text ( encoding = "utf-8" )
116122
117123
118124class Route :
@@ -281,7 +287,7 @@ async def request(
281287 await self ._global_over .wait ()
282288
283289 response : aiohttp .ClientResponse | None = None
284- data : dict [str , Any ] | str | None = None
290+ data : dict [str , Any ] | str | bytes | None = None
285291 await lock .acquire ()
286292 with MaybeUnlock (lock ) as maybe_lock :
287293 for tries in range (5 ):
@@ -308,7 +314,7 @@ async def request(
308314 )
309315
310316 # even errors have text involved in them so this is safe to call
311- data = await json_or_text (response )
317+ data = await parse_response (response )
312318
313319 # check if we have rate limit header information
314320 remaining = response .headers .get ("X-Ratelimit-Remaining" )
@@ -2046,9 +2052,10 @@ def create_invite(
20462052 target_type : invite .InviteTargetType | None = None ,
20472053 target_user_id : Snowflake | None = None ,
20482054 target_application_id : Snowflake | None = None ,
2055+ roles : list [Snowflake ] | None = None ,
2056+ target_users_file : File | None = None ,
20492057 ) -> Response [invite .Invite ]:
2050- r = Route ("POST" , "/channels/{channel_id}/invites" , channel_id = channel_id )
2051- payload = {
2058+ payload : dict [str , Any ] = {
20522059 "max_age" : max_age ,
20532060 "max_uses" : max_uses ,
20542061 "temporary" : temporary ,
@@ -2064,7 +2071,27 @@ def create_invite(
20642071 if target_application_id :
20652072 payload ["target_application_id" ] = str (target_application_id )
20662073
2067- return self .request (r , reason = reason , json = payload )
2074+ if roles :
2075+ payload ["role_ids" ] = roles
2076+
2077+ route = Route ("POST" , "/channels/{channel_id}/invites" , channel_id = channel_id )
2078+
2079+ if target_users_file is not None :
2080+ form = [
2081+ {
2082+ "name" : "target_users_file" ,
2083+ "value" : target_users_file .fp ,
2084+ "filename" : target_users_file .filename ,
2085+ "content_type" : "text/csv" ,
2086+ },
2087+ {
2088+ "name" : "payload_json" ,
2089+ "value" : utils ._to_json (payload ),
2090+ },
2091+ ]
2092+ return self .request (route , reason = reason , form = form )
2093+
2094+ return self .request (route , reason = reason , json = payload )
20682095
20692096 def get_invite (
20702097 self ,
@@ -2086,6 +2113,46 @@ def get_invite(
20862113 Route ("GET" , "/invites/{invite_id}" , invite_id = invite_id ), params = params
20872114 )
20882115
2116+ def get_invite_target_users (
2117+ self ,
2118+ invite_id : str ,
2119+ ) -> Response [bytes ]:
2120+ return self .request (
2121+ Route ("GET" , "/invites/{invite_id}/target-users" , invite_id = invite_id )
2122+ )
2123+
2124+ def update_invite_target_users (
2125+ self ,
2126+ invite_id : str ,
2127+ * ,
2128+ target_users_file : File ,
2129+ ) -> Response [invite .Invite ]:
2130+ form = [
2131+ {
2132+ "name" : "target_users_file" ,
2133+ "value" : target_users_file .fp ,
2134+ "filename" : target_users_file .filename ,
2135+ "content_type" : "text/csv" ,
2136+ },
2137+ ]
2138+
2139+ return self .request (
2140+ Route ("PUT" , "/invites/{invite_id}/target-users" , invite_id = invite_id ),
2141+ form = form ,
2142+ )
2143+
2144+ def get_invite_target_users_job_status (
2145+ self ,
2146+ invite_id : str ,
2147+ ) -> Response [InviteTargetUsersJobStatusPayload ]:
2148+ return self .request (
2149+ Route (
2150+ "GET" ,
2151+ "/invites/{invite_id}/target-users/job-status" ,
2152+ invite_id = invite_id ,
2153+ ),
2154+ )
2155+
20892156 def invites_from (self , guild_id : Snowflake ) -> Response [list [invite .Invite ]]:
20902157 return self .request (
20912158 Route ("GET" , "/guilds/{guild_id}/invites" , guild_id = guild_id )
0 commit comments