We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[Mod] Bot doesn't record name changes correctly
# Other bugs

#### What were you trying to do?

Check past names using `[p]names` command

#### What were you expecting to happen?

Get past names

#### What actually happened?

I didn't get any names, because we're checking for it in wrong event (`on_member_update` instead of `on_user_update`).

#### How can we reproduce this issue?

1. Load mod cog
2. Change username
3. Use `[p]names` on yourself.


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `redbot/cogs/mod/events.py`
Content:
```
1 import logging
2 from datetime import datetime
3 from collections import defaultdict, deque
4 
5 import discord
6 from redbot.core import i18n, modlog, commands
7 from redbot.core.utils.mod import is_mod_or_superior
8 from .abc import MixinMeta
9 
10 _ = i18n.Translator("Mod", __file__)
11 log = logging.getLogger("red.mod")
12 
13 
14 class Events(MixinMeta):
15     """
16     This is a mixin for the core mod cog
17     Has a bunch of things split off to here.
18     """
19 
20     async def check_duplicates(self, message):
21         guild = message.guild
22         author = message.author
23 
24         guild_cache = self.cache.get(guild.id, None)
25         if guild_cache is None:
26             repeats = await self.settings.guild(guild).delete_repeats()
27             if repeats == -1:
28                 return False
29             guild_cache = self.cache[guild.id] = defaultdict(lambda: deque(maxlen=repeats))
30 
31         if not message.content:
32             return False
33 
34         guild_cache[author].append(message.content)
35         msgs = guild_cache[author]
36         if len(msgs) == msgs.maxlen and len(set(msgs)) == 1:
37             try:
38                 await message.delete()
39                 return True
40             except discord.HTTPException:
41                 pass
42         return False
43 
44     async def check_mention_spam(self, message):
45         guild = message.guild
46         author = message.author
47 
48         max_mentions = await self.settings.guild(guild).ban_mention_spam()
49         if max_mentions:
50             mentions = set(message.mentions)
51             if len(mentions) >= max_mentions:
52                 try:
53                     await guild.ban(author, reason=_("Mention spam (Autoban)"))
54                 except discord.HTTPException:
55                     log.info(
56                         "Failed to ban member for mention spam in server {}.".format(guild.id)
57                     )
58                 else:
59                     try:
60                         await modlog.create_case(
61                             self.bot,
62                             guild,
63                             message.created_at,
64                             "ban",
65                             author,
66                             guild.me,
67                             _("Mention spam (Autoban)"),
68                             until=None,
69                             channel=None,
70                         )
71                     except RuntimeError as e:
72                         print(e)
73                         return False
74                     return True
75         return False
76 
77     @commands.Cog.listener()
78     async def on_message(self, message):
79         author = message.author
80         if message.guild is None or self.bot.user == author:
81             return
82         valid_user = isinstance(author, discord.Member) and not author.bot
83         if not valid_user:
84             return
85 
86         #  Bots and mods or superior are ignored from the filter
87         mod_or_superior = await is_mod_or_superior(self.bot, obj=author)
88         if mod_or_superior:
89             return
90         # As are anyone configured to be
91         if await self.bot.is_automod_immune(message):
92             return
93         deleted = await self.check_duplicates(message)
94         if not deleted:
95             await self.check_mention_spam(message)
96 
97     @commands.Cog.listener()
98     async def on_member_update(self, before: discord.Member, after: discord.Member):
99         if before.name != after.name:
100             async with self.settings.user(before).past_names() as name_list:
101                 while None in name_list:  # clean out null entries from a bug
102                     name_list.remove(None)
103                 if after.name in name_list:
104                     # Ensure order is maintained without duplicates occuring
105                     name_list.remove(after.name)
106                 name_list.append(after.name)
107                 while len(name_list) > 20:
108                     name_list.pop(0)
109 
110         if before.nick != after.nick and after.nick is not None:
111             async with self.settings.member(before).past_nicks() as nick_list:
112                 while None in nick_list:  # clean out null entries from a bug
113                     nick_list.remove(None)
114                 if after.nick in nick_list:
115                     nick_list.remove(after.nick)
116                 nick_list.append(after.nick)
117                 while len(nick_list) > 20:
118                     nick_list.pop(0)
119
```
--- 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/redbot/cogs/mod/events.py b/redbot/cogs/mod/events.py
--- a/redbot/cogs/mod/events.py
+++ b/redbot/cogs/mod/events.py
@@ -95,7 +95,7 @@
             await self.check_mention_spam(message)
 
     @commands.Cog.listener()
-    async def on_member_update(self, before: discord.Member, after: discord.Member):
+    async def on_user_update(self, before: discord.User, after: discord.User):
         if before.name != after.name:
             async with self.settings.user(before).past_names() as name_list:
                 while None in name_list:  # clean out null entries from a bug
@@ -107,6 +107,8 @@
                 while len(name_list) > 20:
                     name_list.pop(0)
 
+    @commands.Cog.listener()
+    async def on_member_update(self, before: discord.Member, after: discord.Member):
         if before.nick != after.nick and after.nick is not None:
             async with self.settings.member(before).past_nicks() as nick_list:
                 while None in nick_list:  # clean out null entries from a bug

{"golden_diff": "diff --git a/redbot/cogs/mod/events.py b/redbot/cogs/mod/events.py\n--- a/redbot/cogs/mod/events.py\n+++ b/redbot/cogs/mod/events.py\n@@ -95,7 +95,7 @@\n             await self.check_mention_spam(message)\n \n     @commands.Cog.listener()\n-    async def on_member_update(self, before: discord.Member, after: discord.Member):\n+    async def on_user_update(self, before: discord.User, after: discord.User):\n         if before.name != after.name:\n             async with self.settings.user(before).past_names() as name_list:\n                 while None in name_list:  # clean out null entries from a bug\n@@ -107,6 +107,8 @@\n                 while len(name_list) > 20:\n                     name_list.pop(0)\n \n+    @commands.Cog.listener()\n+    async def on_member_update(self, before: discord.Member, after: discord.Member):\n         if before.nick != after.nick and after.nick is not None:\n             async with self.settings.member(before).past_nicks() as nick_list:\n                 while None in nick_list:  # clean out null entries from a bug\n", "issue": "[Mod] Bot doesn't record name changes correctly\n# Other bugs\r\n\r\n#### What were you trying to do?\r\n\r\nCheck past names using `[p]names` command\r\n\r\n#### What were you expecting to happen?\r\n\r\nGet past names\r\n\r\n#### What actually happened?\r\n\r\nI didn't get any names, because we're checking for it in wrong event (`on_member_update` instead of `on_user_update`).\r\n\r\n#### How can we reproduce this issue?\r\n\r\n1. Load mod cog\r\n2. Change username\r\n3. Use `[p]names` on yourself.\r\n\n", "before_files": [{"content": "import logging\nfrom datetime import datetime\nfrom collections import defaultdict, deque\n\nimport discord\nfrom redbot.core import i18n, modlog, commands\nfrom redbot.core.utils.mod import is_mod_or_superior\nfrom .abc import MixinMeta\n\n_ = i18n.Translator(\"Mod\", __file__)\nlog = logging.getLogger(\"red.mod\")\n\n\nclass Events(MixinMeta):\n    \"\"\"\n    This is a mixin for the core mod cog\n    Has a bunch of things split off to here.\n    \"\"\"\n\n    async def check_duplicates(self, message):\n        guild = message.guild\n        author = message.author\n\n        guild_cache = self.cache.get(guild.id, None)\n        if guild_cache is None:\n            repeats = await self.settings.guild(guild).delete_repeats()\n            if repeats == -1:\n                return False\n            guild_cache = self.cache[guild.id] = defaultdict(lambda: deque(maxlen=repeats))\n\n        if not message.content:\n            return False\n\n        guild_cache[author].append(message.content)\n        msgs = guild_cache[author]\n        if len(msgs) == msgs.maxlen and len(set(msgs)) == 1:\n            try:\n                await message.delete()\n                return True\n            except discord.HTTPException:\n                pass\n        return False\n\n    async def check_mention_spam(self, message):\n        guild = message.guild\n        author = message.author\n\n        max_mentions = await self.settings.guild(guild).ban_mention_spam()\n        if max_mentions:\n            mentions = set(message.mentions)\n            if len(mentions) >= max_mentions:\n                try:\n                    await guild.ban(author, reason=_(\"Mention spam (Autoban)\"))\n                except discord.HTTPException:\n                    log.info(\n                        \"Failed to ban member for mention spam in server {}.\".format(guild.id)\n                    )\n                else:\n                    try:\n                        await modlog.create_case(\n                            self.bot,\n                            guild,\n                            message.created_at,\n                            \"ban\",\n                            author,\n                            guild.me,\n                            _(\"Mention spam (Autoban)\"),\n                            until=None,\n                            channel=None,\n                        )\n                    except RuntimeError as e:\n                        print(e)\n                        return False\n                    return True\n        return False\n\n    @commands.Cog.listener()\n    async def on_message(self, message):\n        author = message.author\n        if message.guild is None or self.bot.user == author:\n            return\n        valid_user = isinstance(author, discord.Member) and not author.bot\n        if not valid_user:\n            return\n\n        #  Bots and mods or superior are ignored from the filter\n        mod_or_superior = await is_mod_or_superior(self.bot, obj=author)\n        if mod_or_superior:\n            return\n        # As are anyone configured to be\n        if await self.bot.is_automod_immune(message):\n            return\n        deleted = await self.check_duplicates(message)\n        if not deleted:\n            await self.check_mention_spam(message)\n\n    @commands.Cog.listener()\n    async def on_member_update(self, before: discord.Member, after: discord.Member):\n        if before.name != after.name:\n            async with self.settings.user(before).past_names() as name_list:\n                while None in name_list:  # clean out null entries from a bug\n                    name_list.remove(None)\n                if after.name in name_list:\n                    # Ensure order is maintained without duplicates occuring\n                    name_list.remove(after.name)\n                name_list.append(after.name)\n                while len(name_list) > 20:\n                    name_list.pop(0)\n\n        if before.nick != after.nick and after.nick is not None:\n            async with self.settings.member(before).past_nicks() as nick_list:\n                while None in nick_list:  # clean out null entries from a bug\n                    nick_list.remove(None)\n                if after.nick in nick_list:\n                    nick_list.remove(after.nick)\n                nick_list.append(after.nick)\n                while len(nick_list) > 20:\n                    nick_list.pop(0)\n", "path": "redbot/cogs/mod/events.py"}], "after_files": [{"content": "import logging\nfrom datetime import datetime\nfrom collections import defaultdict, deque\n\nimport discord\nfrom redbot.core import i18n, modlog, commands\nfrom redbot.core.utils.mod import is_mod_or_superior\nfrom .abc import MixinMeta\n\n_ = i18n.Translator(\"Mod\", __file__)\nlog = logging.getLogger(\"red.mod\")\n\n\nclass Events(MixinMeta):\n    \"\"\"\n    This is a mixin for the core mod cog\n    Has a bunch of things split off to here.\n    \"\"\"\n\n    async def check_duplicates(self, message):\n        guild = message.guild\n        author = message.author\n\n        guild_cache = self.cache.get(guild.id, None)\n        if guild_cache is None:\n            repeats = await self.settings.guild(guild).delete_repeats()\n            if repeats == -1:\n                return False\n            guild_cache = self.cache[guild.id] = defaultdict(lambda: deque(maxlen=repeats))\n\n        if not message.content:\n            return False\n\n        guild_cache[author].append(message.content)\n        msgs = guild_cache[author]\n        if len(msgs) == msgs.maxlen and len(set(msgs)) == 1:\n            try:\n                await message.delete()\n                return True\n            except discord.HTTPException:\n                pass\n        return False\n\n    async def check_mention_spam(self, message):\n        guild = message.guild\n        author = message.author\n\n        max_mentions = await self.settings.guild(guild).ban_mention_spam()\n        if max_mentions:\n            mentions = set(message.mentions)\n            if len(mentions) >= max_mentions:\n                try:\n                    await guild.ban(author, reason=_(\"Mention spam (Autoban)\"))\n                except discord.HTTPException:\n                    log.info(\n                        \"Failed to ban member for mention spam in server {}.\".format(guild.id)\n                    )\n                else:\n                    try:\n                        await modlog.create_case(\n                            self.bot,\n                            guild,\n                            message.created_at,\n                            \"ban\",\n                            author,\n                            guild.me,\n                            _(\"Mention spam (Autoban)\"),\n                            until=None,\n                            channel=None,\n                        )\n                    except RuntimeError as e:\n                        print(e)\n                        return False\n                    return True\n        return False\n\n    @commands.Cog.listener()\n    async def on_message(self, message):\n        author = message.author\n        if message.guild is None or self.bot.user == author:\n            return\n        valid_user = isinstance(author, discord.Member) and not author.bot\n        if not valid_user:\n            return\n\n        #  Bots and mods or superior are ignored from the filter\n        mod_or_superior = await is_mod_or_superior(self.bot, obj=author)\n        if mod_or_superior:\n            return\n        # As are anyone configured to be\n        if await self.bot.is_automod_immune(message):\n            return\n        deleted = await self.check_duplicates(message)\n        if not deleted:\n            await self.check_mention_spam(message)\n\n    @commands.Cog.listener()\n    async def on_user_update(self, before: discord.User, after: discord.User):\n        if before.name != after.name:\n            async with self.settings.user(before).past_names() as name_list:\n                while None in name_list:  # clean out null entries from a bug\n                    name_list.remove(None)\n                if after.name in name_list:\n                    # Ensure order is maintained without duplicates occuring\n                    name_list.remove(after.name)\n                name_list.append(after.name)\n                while len(name_list) > 20:\n                    name_list.pop(0)\n\n    @commands.Cog.listener()\n    async def on_member_update(self, before: discord.Member, after: discord.Member):\n        if before.nick != after.nick and after.nick is not None:\n            async with self.settings.member(before).past_nicks() as nick_list:\n                while None in nick_list:  # clean out null entries from a bug\n                    nick_list.remove(None)\n                if after.nick in nick_list:\n                    nick_list.remove(after.nick)\n                nick_list.append(after.nick)\n                while len(nick_list) > 20:\n                    nick_list.pop(0)\n", "path": "redbot/cogs/mod/events.py"}]}