示例#1
0
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,
    )
示例#2
0
        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