Handle disabled DMs when starting Minesweeper
The minesweeper cog does not currently handle the situation where a user invokes the start command, but doesn't have DMs enabled. Discord will return a 403 and the command will fail on this line.

https://github.com/python-discord/seasonalbot/blob/c6c87378cd6dd65e2fac83b97d48430c3cb0917c/bot/exts/evergreen/minesweeper.py#L154-L158

The problem should be solved similarly to how the AoC cog handles it - by informing the user, in the channel where the command was invoked, that their DMs must be open in order to play minesweeper.

https://github.com/python-discord/seasonalbot/blob/c6c87378cd6dd65e2fac83b97d48430c3cb0917c/bot/exts/christmas/adventofcode.py#L241-L247

---

- [ ] I'd like to implement the bug fix
- [x] Anyone can implement the bug fix

diff --git a/bot/exts/evergreen/minesweeper.py b/bot/exts/evergreen/minesweeper.py
index ae057b30..3e40f493 100644
--- a/bot/exts/evergreen/minesweeper.py
+++ b/bot/exts/evergreen/minesweeper.py
@@ -141,9 +141,20 @@ class Minesweeper(commands.Cog):
             await ctx.message.delete(delay=2)
             return
 
+        try:
+            await ctx.author.send(
+                f"Play by typing: `{Client.prefix}ms reveal xy [xy]` or `{Client.prefix}ms flag xy [xy]` \\n"
+                f"Close the game with `{Client.prefix}ms end`\\n"
+            )
+        except discord.errors.Forbidden:
+            log.debug(f"{ctx.author.name} ({ctx.author.id}) has disabled DMs from server members")
+            await ctx.send(f":x: {ctx.author.mention}, please enable DMs to play minesweeper.")
+            return
+
         # Add game to list
         board: GameBoard = self.generate_board(bomb_chance)
         revealed_board: GameBoard = [["hidden"] * 10 for _ in range(10)]
+        dm_msg = await ctx.author.send(f"Here's your board!\\n{self.format_for_discord(revealed_board)}")
 
         if ctx.guild:
             await ctx.send(f"{ctx.author.mention} is playing Minesweeper")
@@ -151,12 +162,6 @@ class Minesweeper(commands.Cog):
         else:
             chat_msg = None
 
-        await ctx.author.send(
-            f"Play by typing: `{Client.prefix}ms reveal xy [xy]` or `{Client.prefix}ms flag xy [xy]` \\n"
-            f"Close the game with `{Client.prefix}ms end`\\n"
-        )
-        dm_msg = await ctx.author.send(f"Here's your board!\\n{self.format_for_discord(revealed_board)}")
-
         self.games[ctx.author.id] = Game(
             board=board,
             revealed=revealed_board,
['bot/exts/evergreen/minesweeper.py']