Repository: Cog-Creators/Red-DiscordBot

Issue:
[V3 Streams] issue with `[p]streamset`
# Command bugs

<!-- 
Did you find a bug with a command? Fill out the following:
-->

#### Command name

`streamset`

#### What cog is this command from?

`Streams`

#### What were you expecting to happen?

Should output help

#### What actually happened?

```py
Exception in command 'streamset'
Traceback (most recent call last):
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/discord/ext/commands/core.py", line 62, in wrapped
    ret = yield from coro(*args, **kwargs)
  File "/home/palm/.pyenv/versions/3.6.5/envs/redbot/lib/python3.6/site-packages/redbot/cogs/streams/streams.py", line 283, in streamset
    await ctx.send_help()
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/commands/context.py", line 33, in send_help
    embeds = await self.bot.formatter.format_help_for(self, command)
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/help_formatter.py", line 233, in format_help_for
    emb = await self.format()
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/help_formatter.py", line 156, in format
    if self.command.help:
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/commands/commands.py", line 41, in help
    return inspect.cleandoc(translator(self.callback.__doc__))
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/i18n.py", line 181, in __call__
    normalized_untranslated = _normalize(untranslated, True)
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/i18n.py", line 127, in _normalize
    string = string.replace('\\n\\n', '\n\n')
AttributeError: 'NoneType' object has no attribute 'replace'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/discord/ext/commands/bot.py", line 886, in invoke
    yield from ctx.command.invoke(ctx)
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/discord/ext/commands/core.py", line 923, in invoke
    yield from injected(*ctx.args, **ctx.kwargs)
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/discord/ext/commands/core.py", line 71, in wrapped
    raise CommandInvokeError(e) from e
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'NoneType' object has no attribute 'replace'
```
NOTE: This is an issue occurring on `V3/develop`. I'm in the process of trying to confirm if this is also occurring on the beta 13 release

#### How can we reproduce this issue?

1. Do `[p]streamset`
2. See error

[V3 Streams] issue with `[p]streamset`
# Command bugs

<!-- 
Did you find a bug with a command? Fill out the following:
-->

#### Command name

`streamset`

#### What cog is this command from?

`Streams`

#### What were you expecting to happen?

Should output help

#### What actually happened?

```py
Exception in command 'streamset'
Traceback (most recent call last):
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/discord/ext/commands/core.py", line 62, in wrapped
    ret = yield from coro(*args, **kwargs)
  File "/home/palm/.pyenv/versions/3.6.5/envs/redbot/lib/python3.6/site-packages/redbot/cogs/streams/streams.py", line 283, in streamset
    await ctx.send_help()
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/commands/context.py", line 33, in send_help
    embeds = await self.bot.formatter.format_help_for(self, command)
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/help_formatter.py", line 233, in format_help_for
    emb = await self.format()
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/help_formatter.py", line 156, in format
    if self.command.help:
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/commands/commands.py", line 41, in help
    return inspect.cleandoc(translator(self.callback.__doc__))
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/i18n.py", line 181, in __call__
    normalized_untranslated = _normalize(untranslated, True)
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/redbot/core/i18n.py", line 127, in _normalize
    string = string.replace('\\n\\n', '\n\n')
AttributeError: 'NoneType' object has no attribute 'replace'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/discord/ext/commands/bot.py", line 886, in invoke
    yield from ctx.command.invoke(ctx)
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/discord/ext/commands/core.py", line 923, in invoke
    yield from injected(*ctx.args, **ctx.kwargs)
  File "/home/palm/.pyenv/versions/redbot/lib/python3.6/site-packages/discord/ext/commands/core.py", line 71, in wrapped
    raise CommandInvokeError(e) from e
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'NoneType' object has no attribute 'replace'
```
NOTE: This is an issue occurring on `V3/develop`. I'm in the process of trying to confirm if this is also occurring on the beta 13 release

#### How can we reproduce this issue?

1. Do `[p]streamset`
2. See error



Discussion:
Confirmed that this is NOT an issue on 3.0.0b13
new formatter fails on no docstring. Needs a NoneType check
Confirmed that this is NOT an issue on 3.0.0b13
new formatter fails on no docstring. Needs a NoneType check

Resolving patch:
diff --git a/redbot/core/i18n.py b/redbot/core/i18n.py
--- a/redbot/core/i18n.py
+++ b/redbot/core/i18n.py
@@ -124,6 +124,9 @@ def normalize_whitespace(s):
             s += ' '
         return s
 
+    if string is None:
+        return ""
+    
     string = string.replace('\\n\\n', '\n\n')
     string = string.replace('\\n', ' ')
     string = string.replace('\\"', '"')


Test patch: