We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Use embed timestamp in mod pings off
When a mods turns off mod pings, a confirmation is sent to inform the user that their pings have successfully been turned off.

In this confirmation, we currently include the time at which it is due to be sent, this time is in UTC.

I propose we refactor this part of the code to instead use an Embed, with a the timestamp field.
https://github.com/python-discord/bot/blob/ce819ade482e82ecbc474bce5fb8ac9dd8b37b40/bot/exts/moderation/modpings.py#L107
This would mean that the time would automatically get converted to the user's current time zone by Discord.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `bot/exts/moderation/modpings.py`
Content:
```
1 import datetime
2 import logging
3 
4 from async_rediscache import RedisCache
5 from dateutil.parser import isoparse
6 from discord import Member
7 from discord.ext.commands import Cog, Context, group, has_any_role
8 
9 from bot.bot import Bot
10 from bot.constants import Emojis, Guild, MODERATION_ROLES, Roles
11 from bot.converters import Expiry
12 from bot.utils.scheduling import Scheduler
13 
14 log = logging.getLogger(__name__)
15 
16 
17 class ModPings(Cog):
18     """Commands for a moderator to turn moderator pings on and off."""
19 
20     # RedisCache[discord.Member.id, 'Naïve ISO 8601 string']
21     # The cache's keys are mods who have pings off.
22     # The cache's values are the times when the role should be re-applied to them, stored in ISO format.
23     pings_off_mods = RedisCache()
24 
25     def __init__(self, bot: Bot):
26         self.bot = bot
27         self._role_scheduler = Scheduler(self.__class__.__name__)
28 
29         self.guild = None
30         self.moderators_role = None
31 
32         self.reschedule_task = self.bot.loop.create_task(self.reschedule_roles(), name="mod-pings-reschedule")
33 
34     async def reschedule_roles(self) -> None:
35         """Reschedule moderators role re-apply times."""
36         await self.bot.wait_until_guild_available()
37         self.guild = self.bot.get_guild(Guild.id)
38         self.moderators_role = self.guild.get_role(Roles.moderators)
39 
40         mod_team = self.guild.get_role(Roles.mod_team)
41         pings_on = self.moderators_role.members
42         pings_off = await self.pings_off_mods.to_dict()
43 
44         log.trace("Applying the moderators role to the mod team where necessary.")
45         for mod in mod_team.members:
46             if mod in pings_on:  # Make sure that on-duty mods aren't in the cache.
47                 if mod in pings_off:
48                     await self.pings_off_mods.delete(mod.id)
49                 continue
50 
51             # Keep the role off only for those in the cache.
52             if mod.id not in pings_off:
53                 await self.reapply_role(mod)
54             else:
55                 expiry = isoparse(pings_off[mod.id]).replace(tzinfo=None)
56                 self._role_scheduler.schedule_at(expiry, mod.id, self.reapply_role(mod))
57 
58     async def reapply_role(self, mod: Member) -> None:
59         """Reapply the moderator's role to the given moderator."""
60         log.trace(f"Re-applying role to mod with ID {mod.id}.")
61         await mod.add_roles(self.moderators_role, reason="Pings off period expired.")
62 
63     @group(name='modpings', aliases=('modping',), invoke_without_command=True)
64     @has_any_role(*MODERATION_ROLES)
65     async def modpings_group(self, ctx: Context) -> None:
66         """Allow the removal and re-addition of the pingable moderators role."""
67         await ctx.send_help(ctx.command)
68 
69     @modpings_group.command(name='off')
70     @has_any_role(*MODERATION_ROLES)
71     async def off_command(self, ctx: Context, duration: Expiry) -> None:
72         """
73         Temporarily removes the pingable moderators role for a set amount of time.
74 
75         A unit of time should be appended to the duration.
76         Units (∗case-sensitive):
77         \u2003`y` - years
78         \u2003`m` - months∗
79         \u2003`w` - weeks
80         \u2003`d` - days
81         \u2003`h` - hours
82         \u2003`M` - minutes∗
83         \u2003`s` - seconds
84 
85         Alternatively, an ISO 8601 timestamp can be provided for the duration.
86 
87         The duration cannot be longer than 30 days.
88         """
89         duration: datetime.datetime
90         delta = duration - datetime.datetime.utcnow()
91         if delta > datetime.timedelta(days=30):
92             await ctx.send(":x: Cannot remove the role for longer than 30 days.")
93             return
94 
95         mod = ctx.author
96 
97         until_date = duration.replace(microsecond=0).isoformat()  # Looks noisy with microseconds.
98         await mod.remove_roles(self.moderators_role, reason=f"Turned pings off until {until_date}.")
99 
100         await self.pings_off_mods.set(mod.id, duration.isoformat())
101 
102         # Allow rescheduling the task without cancelling it separately via the `on` command.
103         if mod.id in self._role_scheduler:
104             self._role_scheduler.cancel(mod.id)
105         self._role_scheduler.schedule_at(duration, mod.id, self.reapply_role(mod))
106 
107         await ctx.send(f"{Emojis.check_mark} Moderators role has been removed until {until_date}.")
108 
109     @modpings_group.command(name='on')
110     @has_any_role(*MODERATION_ROLES)
111     async def on_command(self, ctx: Context) -> None:
112         """Re-apply the pingable moderators role."""
113         mod = ctx.author
114         if mod in self.moderators_role.members:
115             await ctx.send(":question: You already have the role.")
116             return
117 
118         await mod.add_roles(self.moderators_role, reason="Pings off period canceled.")
119 
120         await self.pings_off_mods.delete(mod.id)
121 
122         # We assume the task exists. Lack of it may indicate a bug.
123         self._role_scheduler.cancel(mod.id)
124 
125         await ctx.send(f"{Emojis.check_mark} Moderators role has been re-applied.")
126 
127     def cog_unload(self) -> None:
128         """Cancel role tasks when the cog unloads."""
129         log.trace("Cog unload: canceling role tasks.")
130         self.reschedule_task.cancel()
131         self._role_scheduler.cancel_all()
132 
133 
134 def setup(bot: Bot) -> None:
135     """Load the ModPings cog."""
136     bot.add_cog(ModPings(bot))
137
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/bot/exts/moderation/modpings.py b/bot/exts/moderation/modpings.py
--- a/bot/exts/moderation/modpings.py
+++ b/bot/exts/moderation/modpings.py
@@ -3,11 +3,11 @@
 
 from async_rediscache import RedisCache
 from dateutil.parser import isoparse
-from discord import Member
+from discord import Embed, Member
 from discord.ext.commands import Cog, Context, group, has_any_role
 
 from bot.bot import Bot
-from bot.constants import Emojis, Guild, MODERATION_ROLES, Roles
+from bot.constants import Colours, Emojis, Guild, Icons, MODERATION_ROLES, Roles
 from bot.converters import Expiry
 from bot.utils.scheduling import Scheduler
 
@@ -104,7 +104,9 @@
             self._role_scheduler.cancel(mod.id)
         self._role_scheduler.schedule_at(duration, mod.id, self.reapply_role(mod))
 
-        await ctx.send(f"{Emojis.check_mark} Moderators role has been removed until {until_date}.")
+        embed = Embed(timestamp=duration, colour=Colours.bright_green)
+        embed.set_footer(text="Moderators role has been removed until", icon_url=Icons.green_checkmark)
+        await ctx.send(embed=embed)
 
     @modpings_group.command(name='on')
     @has_any_role(*MODERATION_ROLES)

{"golden_diff": "diff --git a/bot/exts/moderation/modpings.py b/bot/exts/moderation/modpings.py\n--- a/bot/exts/moderation/modpings.py\n+++ b/bot/exts/moderation/modpings.py\n@@ -3,11 +3,11 @@\n \n from async_rediscache import RedisCache\n from dateutil.parser import isoparse\n-from discord import Member\n+from discord import Embed, Member\n from discord.ext.commands import Cog, Context, group, has_any_role\n \n from bot.bot import Bot\n-from bot.constants import Emojis, Guild, MODERATION_ROLES, Roles\n+from bot.constants import Colours, Emojis, Guild, Icons, MODERATION_ROLES, Roles\n from bot.converters import Expiry\n from bot.utils.scheduling import Scheduler\n \n@@ -104,7 +104,9 @@\n             self._role_scheduler.cancel(mod.id)\n         self._role_scheduler.schedule_at(duration, mod.id, self.reapply_role(mod))\n \n-        await ctx.send(f\"{Emojis.check_mark} Moderators role has been removed until {until_date}.\")\n+        embed = Embed(timestamp=duration, colour=Colours.bright_green)\n+        embed.set_footer(text=\"Moderators role has been removed until\", icon_url=Icons.green_checkmark)\n+        await ctx.send(embed=embed)\n \n     @modpings_group.command(name='on')\n     @has_any_role(*MODERATION_ROLES)\n", "issue": "Use embed timestamp in mod pings off\nWhen a mods turns off mod pings, a confirmation is sent to inform the user that their pings have successfully been turned off.\r\n\r\nIn this confirmation, we currently include the time at which it is due to be sent, this time is in UTC.\r\n\r\nI propose we refactor this part of the code to instead use an Embed, with a the timestamp field.\r\nhttps://github.com/python-discord/bot/blob/ce819ade482e82ecbc474bce5fb8ac9dd8b37b40/bot/exts/moderation/modpings.py#L107\r\nThis would mean that the time would automatically get converted to the user's current time zone by Discord.\n", "before_files": [{"content": "import datetime\nimport logging\n\nfrom async_rediscache import RedisCache\nfrom dateutil.parser import isoparse\nfrom discord import Member\nfrom discord.ext.commands import Cog, Context, group, has_any_role\n\nfrom bot.bot import Bot\nfrom bot.constants import Emojis, Guild, MODERATION_ROLES, Roles\nfrom bot.converters import Expiry\nfrom bot.utils.scheduling import Scheduler\n\nlog = logging.getLogger(__name__)\n\n\nclass ModPings(Cog):\n    \"\"\"Commands for a moderator to turn moderator pings on and off.\"\"\"\n\n    # RedisCache[discord.Member.id, 'Na\u00efve ISO 8601 string']\n    # The cache's keys are mods who have pings off.\n    # The cache's values are the times when the role should be re-applied to them, stored in ISO format.\n    pings_off_mods = RedisCache()\n\n    def __init__(self, bot: Bot):\n        self.bot = bot\n        self._role_scheduler = Scheduler(self.__class__.__name__)\n\n        self.guild = None\n        self.moderators_role = None\n\n        self.reschedule_task = self.bot.loop.create_task(self.reschedule_roles(), name=\"mod-pings-reschedule\")\n\n    async def reschedule_roles(self) -> None:\n        \"\"\"Reschedule moderators role re-apply times.\"\"\"\n        await self.bot.wait_until_guild_available()\n        self.guild = self.bot.get_guild(Guild.id)\n        self.moderators_role = self.guild.get_role(Roles.moderators)\n\n        mod_team = self.guild.get_role(Roles.mod_team)\n        pings_on = self.moderators_role.members\n        pings_off = await self.pings_off_mods.to_dict()\n\n        log.trace(\"Applying the moderators role to the mod team where necessary.\")\n        for mod in mod_team.members:\n            if mod in pings_on:  # Make sure that on-duty mods aren't in the cache.\n                if mod in pings_off:\n                    await self.pings_off_mods.delete(mod.id)\n                continue\n\n            # Keep the role off only for those in the cache.\n            if mod.id not in pings_off:\n                await self.reapply_role(mod)\n            else:\n                expiry = isoparse(pings_off[mod.id]).replace(tzinfo=None)\n                self._role_scheduler.schedule_at(expiry, mod.id, self.reapply_role(mod))\n\n    async def reapply_role(self, mod: Member) -> None:\n        \"\"\"Reapply the moderator's role to the given moderator.\"\"\"\n        log.trace(f\"Re-applying role to mod with ID {mod.id}.\")\n        await mod.add_roles(self.moderators_role, reason=\"Pings off period expired.\")\n\n    @group(name='modpings', aliases=('modping',), invoke_without_command=True)\n    @has_any_role(*MODERATION_ROLES)\n    async def modpings_group(self, ctx: Context) -> None:\n        \"\"\"Allow the removal and re-addition of the pingable moderators role.\"\"\"\n        await ctx.send_help(ctx.command)\n\n    @modpings_group.command(name='off')\n    @has_any_role(*MODERATION_ROLES)\n    async def off_command(self, ctx: Context, duration: Expiry) -> None:\n        \"\"\"\n        Temporarily removes the pingable moderators role for a set amount of time.\n\n        A unit of time should be appended to the duration.\n        Units (\u2217case-sensitive):\n        \\u2003`y` - years\n        \\u2003`m` - months\u2217\n        \\u2003`w` - weeks\n        \\u2003`d` - days\n        \\u2003`h` - hours\n        \\u2003`M` - minutes\u2217\n        \\u2003`s` - seconds\n\n        Alternatively, an ISO 8601 timestamp can be provided for the duration.\n\n        The duration cannot be longer than 30 days.\n        \"\"\"\n        duration: datetime.datetime\n        delta = duration - datetime.datetime.utcnow()\n        if delta > datetime.timedelta(days=30):\n            await ctx.send(\":x: Cannot remove the role for longer than 30 days.\")\n            return\n\n        mod = ctx.author\n\n        until_date = duration.replace(microsecond=0).isoformat()  # Looks noisy with microseconds.\n        await mod.remove_roles(self.moderators_role, reason=f\"Turned pings off until {until_date}.\")\n\n        await self.pings_off_mods.set(mod.id, duration.isoformat())\n\n        # Allow rescheduling the task without cancelling it separately via the `on` command.\n        if mod.id in self._role_scheduler:\n            self._role_scheduler.cancel(mod.id)\n        self._role_scheduler.schedule_at(duration, mod.id, self.reapply_role(mod))\n\n        await ctx.send(f\"{Emojis.check_mark} Moderators role has been removed until {until_date}.\")\n\n    @modpings_group.command(name='on')\n    @has_any_role(*MODERATION_ROLES)\n    async def on_command(self, ctx: Context) -> None:\n        \"\"\"Re-apply the pingable moderators role.\"\"\"\n        mod = ctx.author\n        if mod in self.moderators_role.members:\n            await ctx.send(\":question: You already have the role.\")\n            return\n\n        await mod.add_roles(self.moderators_role, reason=\"Pings off period canceled.\")\n\n        await self.pings_off_mods.delete(mod.id)\n\n        # We assume the task exists. Lack of it may indicate a bug.\n        self._role_scheduler.cancel(mod.id)\n\n        await ctx.send(f\"{Emojis.check_mark} Moderators role has been re-applied.\")\n\n    def cog_unload(self) -> None:\n        \"\"\"Cancel role tasks when the cog unloads.\"\"\"\n        log.trace(\"Cog unload: canceling role tasks.\")\n        self.reschedule_task.cancel()\n        self._role_scheduler.cancel_all()\n\n\ndef setup(bot: Bot) -> None:\n    \"\"\"Load the ModPings cog.\"\"\"\n    bot.add_cog(ModPings(bot))\n", "path": "bot/exts/moderation/modpings.py"}], "after_files": [{"content": "import datetime\nimport logging\n\nfrom async_rediscache import RedisCache\nfrom dateutil.parser import isoparse\nfrom discord import Embed, Member\nfrom discord.ext.commands import Cog, Context, group, has_any_role\n\nfrom bot.bot import Bot\nfrom bot.constants import Colours, Emojis, Guild, Icons, MODERATION_ROLES, Roles\nfrom bot.converters import Expiry\nfrom bot.utils.scheduling import Scheduler\n\nlog = logging.getLogger(__name__)\n\n\nclass ModPings(Cog):\n    \"\"\"Commands for a moderator to turn moderator pings on and off.\"\"\"\n\n    # RedisCache[discord.Member.id, 'Na\u00efve ISO 8601 string']\n    # The cache's keys are mods who have pings off.\n    # The cache's values are the times when the role should be re-applied to them, stored in ISO format.\n    pings_off_mods = RedisCache()\n\n    def __init__(self, bot: Bot):\n        self.bot = bot\n        self._role_scheduler = Scheduler(self.__class__.__name__)\n\n        self.guild = None\n        self.moderators_role = None\n\n        self.reschedule_task = self.bot.loop.create_task(self.reschedule_roles(), name=\"mod-pings-reschedule\")\n\n    async def reschedule_roles(self) -> None:\n        \"\"\"Reschedule moderators role re-apply times.\"\"\"\n        await self.bot.wait_until_guild_available()\n        self.guild = self.bot.get_guild(Guild.id)\n        self.moderators_role = self.guild.get_role(Roles.moderators)\n\n        mod_team = self.guild.get_role(Roles.mod_team)\n        pings_on = self.moderators_role.members\n        pings_off = await self.pings_off_mods.to_dict()\n\n        log.trace(\"Applying the moderators role to the mod team where necessary.\")\n        for mod in mod_team.members:\n            if mod in pings_on:  # Make sure that on-duty mods aren't in the cache.\n                if mod in pings_off:\n                    await self.pings_off_mods.delete(mod.id)\n                continue\n\n            # Keep the role off only for those in the cache.\n            if mod.id not in pings_off:\n                await self.reapply_role(mod)\n            else:\n                expiry = isoparse(pings_off[mod.id]).replace(tzinfo=None)\n                self._role_scheduler.schedule_at(expiry, mod.id, self.reapply_role(mod))\n\n    async def reapply_role(self, mod: Member) -> None:\n        \"\"\"Reapply the moderator's role to the given moderator.\"\"\"\n        log.trace(f\"Re-applying role to mod with ID {mod.id}.\")\n        await mod.add_roles(self.moderators_role, reason=\"Pings off period expired.\")\n\n    @group(name='modpings', aliases=('modping',), invoke_without_command=True)\n    @has_any_role(*MODERATION_ROLES)\n    async def modpings_group(self, ctx: Context) -> None:\n        \"\"\"Allow the removal and re-addition of the pingable moderators role.\"\"\"\n        await ctx.send_help(ctx.command)\n\n    @modpings_group.command(name='off')\n    @has_any_role(*MODERATION_ROLES)\n    async def off_command(self, ctx: Context, duration: Expiry) -> None:\n        \"\"\"\n        Temporarily removes the pingable moderators role for a set amount of time.\n\n        A unit of time should be appended to the duration.\n        Units (\u2217case-sensitive):\n        \\u2003`y` - years\n        \\u2003`m` - months\u2217\n        \\u2003`w` - weeks\n        \\u2003`d` - days\n        \\u2003`h` - hours\n        \\u2003`M` - minutes\u2217\n        \\u2003`s` - seconds\n\n        Alternatively, an ISO 8601 timestamp can be provided for the duration.\n\n        The duration cannot be longer than 30 days.\n        \"\"\"\n        duration: datetime.datetime\n        delta = duration - datetime.datetime.utcnow()\n        if delta > datetime.timedelta(days=30):\n            await ctx.send(\":x: Cannot remove the role for longer than 30 days.\")\n            return\n\n        mod = ctx.author\n\n        until_date = duration.replace(microsecond=0).isoformat()  # Looks noisy with microseconds.\n        await mod.remove_roles(self.moderators_role, reason=f\"Turned pings off until {until_date}.\")\n\n        await self.pings_off_mods.set(mod.id, duration.isoformat())\n\n        # Allow rescheduling the task without cancelling it separately via the `on` command.\n        if mod.id in self._role_scheduler:\n            self._role_scheduler.cancel(mod.id)\n        self._role_scheduler.schedule_at(duration, mod.id, self.reapply_role(mod))\n\n        embed = Embed(timestamp=duration, colour=Colours.bright_green)\n        embed.set_footer(text=\"Moderators role has been removed until\", icon_url=Icons.green_checkmark)\n        await ctx.send(embed=embed)\n\n    @modpings_group.command(name='on')\n    @has_any_role(*MODERATION_ROLES)\n    async def on_command(self, ctx: Context) -> None:\n        \"\"\"Re-apply the pingable moderators role.\"\"\"\n        mod = ctx.author\n        if mod in self.moderators_role.members:\n            await ctx.send(\":question: You already have the role.\")\n            return\n\n        await mod.add_roles(self.moderators_role, reason=\"Pings off period canceled.\")\n\n        await self.pings_off_mods.delete(mod.id)\n\n        # We assume the task exists. Lack of it may indicate a bug.\n        self._role_scheduler.cancel(mod.id)\n\n        await ctx.send(f\"{Emojis.check_mark} Moderators role has been re-applied.\")\n\n    def cog_unload(self) -> None:\n        \"\"\"Cancel role tasks when the cog unloads.\"\"\"\n        log.trace(\"Cog unload: canceling role tasks.\")\n        self.reschedule_task.cancel()\n        self._role_scheduler.cancel_all()\n\n\ndef setup(bot: Bot) -> None:\n    \"\"\"Load the ModPings cog.\"\"\"\n    bot.add_cog(ModPings(bot))\n", "path": "bot/exts/moderation/modpings.py"}]}