104 lines
4.1 KiB
Python
104 lines
4.1 KiB
Python
from datetime import datetime
|
|
|
|
import discord
|
|
from discord.utils import format_dt, utcnow
|
|
from redbot.core import Config, commands
|
|
from redbot.core.utils.chat_formatting import pagify
|
|
from redbot.core.utils.menus import DEFAULT_CONTROLS, menu
|
|
|
|
|
|
class RoleHistory(commands.Cog):
|
|
__version__ = "0.1.0"
|
|
|
|
def format_help_for_context(self, ctx):
|
|
pre_processed = super().format_help_for_context(ctx)
|
|
return f"{pre_processed}\nCog Version: {self.__version__}"
|
|
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
self.config = Config.get_conf(self, identifier=95932766180343808)
|
|
default_member = {"history": [], "toggle": False}
|
|
default_guild = {"toggle": False}
|
|
self.config.register_member(**default_member)
|
|
self.config.register_guild(**default_guild)
|
|
self.guild_cache = {}
|
|
self.toggle_cache = {}
|
|
|
|
async def initalize(self):
|
|
await self.bot.wait_until_ready()
|
|
self.guild_cache = await self.config.all_guilds()
|
|
self.toggle_cache = await self.config.all_members()
|
|
|
|
@commands.Cog.listener()
|
|
async def on_member_update(self, before, after):
|
|
guild = before.guild
|
|
if before.guild.id not in self.guild_cache:
|
|
return
|
|
if not self.guild_cache[before.guild.id]["toggle"]:
|
|
return
|
|
if guild.id not in self.toggle_cache:
|
|
return
|
|
if not self.toggle_cache[guild.id].get(before.id, {}).get("toggle", False):
|
|
return
|
|
if before.roles != after.roles:
|
|
roles = []
|
|
if len(before.roles) > len(after.roles):
|
|
roles.extend(
|
|
(role.id, role.name, "removed", utcnow().timestamp())
|
|
for role in before.roles
|
|
if role not in after.roles
|
|
)
|
|
elif len(before.roles) < len(after.roles):
|
|
roles.extend(
|
|
(role.id, role.name, "added", utcnow().timestamp())
|
|
for role in after.roles
|
|
if role not in before.roles
|
|
)
|
|
if roles:
|
|
async with self.config.member(before).history() as history:
|
|
for role in roles:
|
|
history.append(role)
|
|
|
|
@commands.hybrid_group()
|
|
async def rolehistory(self, ctx):
|
|
"""Role History Commands"""
|
|
|
|
@rolehistory.command()
|
|
async def toggle(self, ctx):
|
|
"""Toggle Role History"""
|
|
guild_toggle = await self.config.guild(ctx.guild).toggle()
|
|
if not guild_toggle:
|
|
return await ctx.send("Role History is disabled for this guild", ephemeral=True)
|
|
toggle = await self.config.member(ctx.author).toggle()
|
|
await self.config.member(ctx.author).toggle.set(not toggle)
|
|
await ctx.send(f"Role History is now {not toggle}", ephemeral=True)
|
|
self.toggle_cache = await self.config.all_members()
|
|
|
|
@rolehistory.command()
|
|
async def show(self, ctx):
|
|
"""Show Role History"""
|
|
history = await self.config.member(ctx.author).history()
|
|
if not history:
|
|
return await ctx.send("You have no role history", ephemeral=True)
|
|
minus = "\\-"
|
|
msg = "".join(
|
|
f"{'+' if role[2] == 'added' else minus} {role[1]} | {format_dt(datetime.fromtimestamp(role[3]), style='F')}\n"
|
|
for role in history
|
|
)
|
|
embeds = []
|
|
for i, page in enumerate(pagify(msg, page_length=1000)):
|
|
embed = discord.Embed(title=f"{ctx.author}'s Role History", description=page)
|
|
embed.set_footer(text=f"Page {i}")
|
|
embeds.append(embed)
|
|
if len(embeds) == 1:
|
|
return await ctx.send(embed=embeds[0])
|
|
await menu(ctx, embeds, DEFAULT_CONTROLS)
|
|
|
|
@rolehistory.command()
|
|
@commands.admin_or_permissions(manage_roles=True)
|
|
async def guildtoggle(self, ctx):
|
|
"""Toggle Role History for the guild"""
|
|
toggle = await self.config.guild(ctx.guild).toggle()
|
|
await self.config.guild(ctx.guild).toggle.set(not toggle)
|
|
await ctx.send(f"Role History is now {not toggle}", ephemeral=True)
|
|
self.guild_cache = await self.config.all_guilds()
|