Repository: Rapptz/discord.py

Issue:
Bad Request when creating a guild sticker.
### Summary

Getting an error when creating guild sticker.

### Reproduction Steps

See code below.

### Minimal Reproducible Code

```python
emoji2 = self.client.stickers[0] #Index 0 is an example here, but it happens with every index.
            async with aiohttp.ClientSession() as session:
                async with session.get(f"https://media.discordapp.net/stickers/{emoji2.id}.png") as resp:
                    file = discord.File(fp=BytesIO(await resp.read()), filename="sticker.png") 
            await ctx.guild.create_sticker(name=emoji2.name, emoji=emoji2.emoji, file=file, reason="FightMan01 bot matrica másolás")
```


### Expected Results

The sticker will be created.

### Actual Results

I'm getting an error: 
```
Traceback (most recent call last):
  File "/home/fightman/fightman01bot/mod.py", line 2808, in fork_sticker
    await ctx.guild.create_sticker(name=emoji2.name, emoji=emoji2.emoji, file=file, reason="FightMan01 bot matrica másolás")
  File "/home/fightman/.local/lib/python3.8/site-packages/discord/guild.py", line 2165, in create_sticker
    data = await self._state.http.create_guild_sticker(self.id, payload, file, reason)
  File "/home/fightman/.local/lib/python3.8/site-packages/discord/http.py", line 338, in request
    raise HTTPException(response, data)
discord.errors.HTTPException: 400 Bad Request (error code: 0): The browser (or proxy) sent a request that this server could not understand.
Traceback (most recent call last):
  File "/home/fightman/fightman01bot/mod.py", line 2809, in fork_sticker
    await ctx.guild.create_sticker(name=emoji2.name, emoji=emoji2.emoji, file=file, reason="FightMan01 bot matrica másolás")
  File "/home/fightman/.local/lib/python3.8/site-packages/discord/guild.py", line 2165, in create_sticker
    data = await self._state.http.create_guild_sticker(self.id, payload, file, reason)
  File "/home/fightman/.local/lib/python3.8/site-packages/discord/http.py", line 338, in request
    raise HTTPException(response, data)
discord.errors.HTTPException: 400 Bad Request (error code: 50046): Invalid Asset
```

Using `await ctx.send(file=file)` will send the actual image. 
Tried without `filename=` but nothing changed.
In the documents it clearly says `File`
<img width="395" alt="image" src="https://user-images.githubusercontent.com/29693718/127737114-3a3fbd9b-00d4-47af-b31d-5c499887d9da.png">


### Intents

discord.Intents.all()

### System Information

- Python v3.8.10-final
- discord.py v2.0.0-alpha
    - discord.py pkg_resources: v2.0.0a3440+g3a451c9c
- aiohttp v3.6.2
- system info: Linux 5.4.0-80-generic #90-Ubuntu SMP Fri Jul 9 22:49:44 UTC 2021

### Checklist

- [X] I have searched the open issues for duplicates.
- [X] I have shown the entire traceback, if possible.
- [X] I have removed my token from display, if visible.

### Additional Context

Printing `self.client.stickers` will return the correct list of GuildSticker objects.


Discussion:
I believe I'm onto something here.

According to the [docs](https://discord.com/developers/docs/resources/sticker#create-guild-sticker), `name`, `description`, `tags` and `file` params must be provided when creating a sticker. Notice how description is a required parameter. If you don't need, you pass an empty string to the parameter.

However, in the way the create_sticker call is created, https://github.com/Rapptz/discord.py/blob/07a1311bf4bb0e3578efd1add5ca24df1480bedf/discord/guild.py#L2430-L2431
If method description parameter is None or an empty string, description parameter won't be entered and it will fail the request.


Replacing the above snippet with the one below seemed to have fixed the issue for me.
```py
payload['description'] = description or ""
```

Resolving patch:
diff --git a/discord/guild.py b/discord/guild.py
--- a/discord/guild.py
+++ b/discord/guild.py
@@ -2384,7 +2384,7 @@ async def create_sticker(
         self,
         *,
         name: str,
-        description: Optional[str] = None,
+        description: str,
         emoji: str,
         file: File,
         reason: Optional[str] = None,
@@ -2402,8 +2402,8 @@ async def create_sticker(
         -----------
         name: :class:`str`
             The sticker name. Must be at least 2 characters.
-        description: Optional[:class:`str`]
-            The sticker's description. Can be ``None``.
+        description: :class:`str`
+            The sticker's description.
         emoji: :class:`str`
             The name of a unicode emoji that represents the sticker's expression.
         file: :class:`File`
@@ -2427,8 +2427,7 @@ async def create_sticker(
             'name': name,
         }
 
-        if description:
-            payload['description'] = description
+        payload['description'] = description
 
         try:
             emoji = unicodedata.name(emoji)


Test patch: