Record users' nickname history

20 names and 20 nicknames maximum
This commit is contained in:
Twentysix 2016-06-22 01:08:47 +02:00
parent f1bd9da184
commit 8b52bd56af

View File

@ -1,8 +1,10 @@
import discord import discord
from discord.ext import commands from discord.ext import commands
from .utils.dataIO import fileIO from .utils.dataIO import fileIO, dataIO
from .utils import checks from .utils import checks
from __main__ import send_cmd_help, settings from __main__ import send_cmd_help, settings
from collections import deque
from cogs.utils.chat_formatting import escape_mass_mentions
import os import os
import logging import logging
import asyncio import asyncio
@ -13,11 +15,12 @@ class Mod:
def __init__(self, bot): def __init__(self, bot):
self.bot = bot self.bot = bot
self.whitelist_list = fileIO("data/mod/whitelist.json", "load") self.whitelist_list = dataIO.load_json("data/mod/whitelist.json")
self.blacklist_list = fileIO("data/mod/blacklist.json", "load") self.blacklist_list = dataIO.load_json("data/mod/blacklist.json")
self.ignore_list = fileIO("data/mod/ignorelist.json", "load") self.ignore_list = dataIO.load_json("data/mod/ignorelist.json")
self.filter = fileIO("data/mod/filter.json", "load") self.filter = dataIO.load_json("data/mod/filter.json")
self.past_names = fileIO("data/mod/past_names.json", "load") self.past_names = dataIO.load_json("data/mod/past_names.json")
self.past_nicknames = dataIO.load_json("data/mod/past_nicknames.json")
@commands.group(pass_context=True, no_pm=True) @commands.group(pass_context=True, no_pm=True)
@checks.serverowner_or_permissions(administrator=True) @checks.serverowner_or_permissions(administrator=True)
@ -101,7 +104,7 @@ class Mod:
except: except:
pass pass
await self.bot.ban(user, 1) await self.bot.ban(user, 1)
logger.info("{}({}) softbanned {}({}), deleting 1 day worth " logger.info("{}({}) softbanned {}({}), deleting 1 day worth "
"of messages".format(author.name, author.id, user.name, "of messages".format(author.name, author.id, user.name,
user.id)) user.id))
await self.bot.unban(server, user) await self.bot.unban(server, user)
@ -590,17 +593,29 @@ class Mod:
@commands.command() @commands.command()
async def names(self, user : discord.Member): async def names(self, user : discord.Member):
"""Show previous names of a user""" """Show previous names/nicknames of a user"""
exclude = ("@everyone", "@here") server = user.server
if user.id in self.past_names.keys(): names = self.past_names[user.id] if user.id in self.past_names else None
names = "" try:
for name in self.past_names[user.id]: nicks = self.past_nicknames[server.id][user.id]
if not any(mnt in name.lower() for mnt in exclude): nicks = [escape_mass_mentions(nick) for nick in nicks]
names += " {}".format(name) except:
names = "```{}```".format(names) nicks = None
await self.bot.say("Past names:\n{}".format(names)) msg = ""
if names:
names = [escape_mass_mentions(name) for name in names]
msg += "**Past 20 names**:\n"
msg += ", ".join(names)
if nicks:
if msg:
msg += "\n\n"
msg += "**Past 20 nicknames**:\n"
msg += ", ".join(nicks)
if msg:
await self.bot.say(msg)
else: else:
await self.bot.say("That user doesn't have any recorded name change.") await self.bot.say("That user doesn't have any recorded name or "
"nickname change.")
def discordpy_updated(self): def discordpy_updated(self):
try: try:
@ -638,7 +653,7 @@ class Mod:
server = message.server server = message.server
can_delete = message.channel.permissions_for(server.me).manage_messages can_delete = message.channel.permissions_for(server.me).manage_messages
if (message.author.id == self.bot.user.id or if (message.author.id == self.bot.user.id or
self.immune_from_filter(message) or not can_delete): # Owner, admins and mods are immune to the filter self.immune_from_filter(message) or not can_delete): # Owner, admins and mods are immune to the filter
return return
@ -653,15 +668,31 @@ class Mod:
pass pass
print("Message deleted. Filtered: " + w) print("Message deleted. Filtered: " + w)
async def check_names(self, before, after): async def check_names(self, before, after):
if before.name != after.name: if before.name != after.name:
if before.id not in self.past_names.keys(): if before.id not in self.past_names.keys():
self.past_names[before.id] = [before.name] self.past_names[before.id] = [after.name]
else: else:
if before.name not in self.past_names[before.id]: if after.name not in self.past_names[before.id]:
self.past_names[before.id].append(before.name) names = deque(self.past_names[before.id], maxlen=20)
fileIO("data/mod/past_names.json", "save", self.past_names) names.append(after.name)
self.past_names[before.id] = list(names)
dataIO.save_json("data/mod/past_names.json", self.past_names)
if before.nick != after.nick and after.nick is not None:
server = before.server
if not server.id in self.past_nicknames:
self.past_nicknames[server.id] = {}
if before.id in self.past_nicknames[server.id]:
nicks = deque(self.past_nicknames[server.id][before.id],
maxlen=20)
else:
nicks = []
if after.nick not in nicks:
nicks.append(after.nick)
self.past_nicknames[server.id][before.id] = list(nicks)
dataIO.save_json("data/mod/past_nicknames.json",
self.past_nicknames)
def check_folders(): def check_folders():
folders = ("data", "data/mod/") folders = ("data", "data/mod/")
@ -694,6 +725,10 @@ def check_files():
print("Creating empty past_names.json...") print("Creating empty past_names.json...")
fileIO("data/mod/past_names.json", "save", {}) fileIO("data/mod/past_names.json", "save", {})
if not os.path.isfile("data/mod/past_nicknames.json"):
print("Creating empty past_nicknames.json...")
fileIO("data/mod/past_nicknames.json", "save", {})
def setup(bot): def setup(bot):
@ -712,4 +747,4 @@ def setup(bot):
n = Mod(bot) n = Mod(bot)
bot.add_listener(n.check_filter, "on_message") bot.add_listener(n.check_filter, "on_message")
bot.add_listener(n.check_names, "on_member_update") bot.add_listener(n.check_names, "on_member_update")
bot.add_cog(n) bot.add_cog(n)