async def create_thread_in_forum( self, channel_id: int, name: str, auto_archive_duration: int, message_payload: dict, applied_tags: List[str] = None, files: Optional[List[File]] = MISSING, rate_limit_per_user: Optional[int] = None, reason: Optional[str] = None, ) -> dict: """ From a given Forum channel, create a Thread with a message to start with. :param channel_id: The ID of the channel to create this thread in :param name: The name of the thread :param auto_archive_duration: duration in minutes to automatically archive the thread after recent activity, can be set to: 60, 1440, 4320, 10080 :param message_payload: The payload/dictionary contents of the first message in the forum thread. :param files: An optional list of files to send attached to the message. :param rate_limit_per_user: Seconds a user has to wait before sending another message (0 to 21600), if given. :param reason: An optional reason for the audit log :return: Returns a Thread in a Forum object with a starting Message. """ query = { "has_message": "True" } # TODO: Switch query after new feature breaking release. payload = {"name": name, "auto_archive_duration": auto_archive_duration} if rate_limit_per_user: payload["rate_limit_per_user"] = rate_limit_per_user if applied_tags: payload["applied_tags"] = applied_tags # payload.update(**{'use_nested_fields': 1}) data = None if files is not MISSING and len(files) > 0: data = MultipartWriter("form-data") part = data.append_json(payload) part.set_content_disposition("form-data", name="payload_json") payload = None for id, file in enumerate(files): part = data.append(file._fp, ) part.set_content_disposition("form-data", name=f"files[{str(id)}]", filename=file._filename) else: payload.update(message_payload) return await self._req.request( Route("POST", f"/channels/{channel_id}/threads?has_message=True"), json=payload, data=data, params=query, reason=reason, )
async def _process_multipart(reader: MultipartReader, writer: MultipartWriter) -> None: """Process multipart. Args: reader (MultipartReader): Response multipart to process. writer (MultipartWriter): Multipart to write out. """ while True: part = await reader.next() # noqa: B305 # https://github.com/PyCQA/flake8-bugbear/issues/59 if part is None: break if isinstance(part, MultipartReader): await _process_multipart(part, writer) elif part.headers.get("hdrs.CONTENT_TYPE"): if part.headers[hdrs.CONTENT_TYPE] == "application/json": part_data: Optional[Union[Text, Dict[Text, Any], List[Tuple[Text, Text]], bytes]] = await part.json() writer.append_json(part_data) elif part.headers[hdrs.CONTENT_TYPE].startswith("text"): part_data = await part.text() writer.append(part_data) elif part.headers[ hdrs. CONTENT_TYPE] == "application/www-urlform-encode": part_data = await part.form() writer.append_form(part_data) else: part_data = await part.read() writer.append(part_data) else: part_data = await part.read() if part.name: self.data.update({part.name: part_data}) elif part.filename: part_data = await part.read() self.data.update({part.filename: part_data}) writer.append(part_data)
async def edit_message( self, channel_id: int, message_id: int, payload: dict, files: Optional[List[File]] = MISSING ) -> dict: """ Edits a message that already exists. :param channel_id: Channel snowflake ID. :param message_id: Message snowflake ID. :param payload: Any new data that needs to be changed. :param files: An optional list of files to send attached to the message. :type payload: dict :return: A message object with edited attributes. """ data = None if files is not MISSING and len(files) > 0: data = MultipartWriter("form-data") part = data.append_json(payload) part.set_content_disposition("form-data", name="payload_json") payload = None for id, file in enumerate(files): part = data.append( file._fp, ) part.set_content_disposition( "form-data", name="files[" + str(id) + "]", filename=file._filename ) return await self._req.request( Route( "PATCH", "/channels/{channel_id}/messages/{message_id}", channel_id=channel_id, message_id=message_id, ), json=payload, data=data, )
async def create_message( self, payload: dict, channel_id: int, files: Optional[List[File]] = MISSING ) -> dict: """ Send a message to the specified channel. :param payload: Dictionary contents of a message. (i.e. message payload) :param channel_id: Channel snowflake ID. :param files: An optional list of files to send attached to the message. :return dict: Dictionary representing a message (?) """ data = None if files is not MISSING and len(files) > 0: data = MultipartWriter("form-data") part = data.append_json(payload) part.set_content_disposition("form-data", name="payload_json") payload = None for id, file in enumerate(files): part = data.append( file._fp, ) part.set_content_disposition( "form-data", name="files[" + str(id) + "]", filename=file._filename ) request = await self._req.request( Route("POST", "/channels/{channel_id}/messages", channel_id=channel_id), json=payload, data=data, ) if request.get("id"): self.cache.messages.add(Item(id=request["id"], value=Message(**request))) return request