From 240b72bbd3505d6677913e8fb37b75d37856ef4c Mon Sep 17 00:00:00 2001 From: brandons209 Date: Sat, 6 Feb 2021 03:40:00 -0500 Subject: [PATCH] add end user messages and functions, will ad functionality later --- Leveler/__init__.py | 1 + Leveler/leveler.py | 10 +- activitylog/__init__.py | 1 + activitylog/activitylog.py | 9 +- birthday/__init__.py | 1 + birthday/birthday.py | 10 +- confession/__init__.py | 1 + confession/confession.py | 10 +- costmanager/__init__.py | 1 + costmanager/manager.py | 9 ++ disable/__init__.py | 1 + disable/disable.py | 11 +- economytrickle/__init__.py | 1 + economytrickle/core.py | 9 ++ emoji/__init__.py | 1 + emoji/core.py | 10 +- events/__init__.py | 7 - events/events.py | 254 --------------------------------- isolate/__init__.py | 1 + isolate/isolate.py | 9 ++ markov/__init__.py | 1 + markov/markov.py | 9 ++ memeify/__init__.py | 1 + memeify/memeify.py | 9 ++ moreadmin/__init__.py | 1 + moreadmin/moreadmin.py | 9 ++ nitroemoji/__init__.py | 1 + nitroemoji/nitroemoji.py | 9 ++ personalroles/__init__.py | 1 + personalroles/info.json | 3 +- personalroles/personalroles.py | 9 ++ pony/__init__.py | 1 + pony/pony.py | 9 ++ punish/__init__.py | 1 + punish/info.json | 2 +- punish/punish.py | 9 ++ reactpoll/__init__.py | 1 + reactpoll/reactpoll.py | 9 ++ rolemanagement/__init__.py | 1 + rolemanagement/core.py | 10 +- rolemanagement/info.json | 4 +- roleplay/__init__.py | 1 + roleplay/roleplay.py | 9 ++ roletracker/__init__.py | 1 + roletracker/info.json | 2 +- roletracker/roletracker.py | 9 ++ rules/__init__.py | 1 + rules/rules.py | 10 +- sfx/__init__.py | 1 + sfx/sfx.py | 9 ++ shootout/__init__.py | 1 + shootout/shootout.py | 2 +- smartreact/__init__.py | 1 + smartreact/smartreact.py | 10 +- trickortreat/__init__.py | 1 + trickortreat/trickortreat.py | 9 ++ welcome/__init__.py | 2 +- welcome/welcome.py | 10 +- 58 files changed, 257 insertions(+), 279 deletions(-) delete mode 100644 events/__init__.py delete mode 100644 events/events.py diff --git a/Leveler/__init__.py b/Leveler/__init__.py index 59958ae..a6d0c03 100644 --- a/Leveler/__init__.py +++ b/Leveler/__init__.py @@ -1,5 +1,6 @@ from .leveler import Leveler +__red_end_user_data_statement__ = "Stores some level info like experience, profile description/picture, and message ID of user's last message in guild." def setup(bot): n = Leveler(bot) diff --git a/Leveler/leveler.py b/Leveler/leveler.py index 48f5698..58e248f 100644 --- a/Leveler/leveler.py +++ b/Leveler/leveler.py @@ -16,7 +16,7 @@ from redbot.core.i18n import Translator, cog_i18n from io import BytesIO import functools import textwrap - +from typing import Literal _ = Translator("Leveler", __file__) @@ -653,3 +653,11 @@ class Leveler(commands.Cog): return # reset level stats on leave. await self.profiles.data.member(member).clear() + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/activitylog/__init__.py b/activitylog/__init__.py index 77f8152..bd8e7f4 100644 --- a/activitylog/__init__.py +++ b/activitylog/__init__.py @@ -1,5 +1,6 @@ from .activitylog import ActivityLogger +__red_end_user_data_statement__ = "Depending on setup, can log user messages, voice channel activity, audit actions in guilds, activity statistics per guild, user name changes, and any moderation actions per guild." async def setup(bot): n = ActivityLogger(bot) diff --git a/activitylog/activitylog.py b/activitylog/activitylog.py index ba37f1a..25108e1 100644 --- a/activitylog/activitylog.py +++ b/activitylog/activitylog.py @@ -14,6 +14,8 @@ import asyncio import glob import io +from typing import Literal + # plotting from bisect import bisect_left import matplotlib.pyplot as plt @@ -1940,5 +1942,10 @@ class ActivityLogger(commands.Cog): # if member: # data[guild.name] = await self.config.member(member).stats() - async def red_delete_data_for_user(self, requester: str, user_id: int): + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): pass diff --git a/birthday/__init__.py b/birthday/__init__.py index 2eae7be..183cdcb 100644 --- a/birthday/__init__.py +++ b/birthday/__init__.py @@ -1,5 +1,6 @@ from .birthday import Birthday +__red_end_user_data_statement__ = "This cog will store a user's birthday." def setup(bot): bot.add_cog(Birthday(bot)) diff --git a/birthday/birthday.py b/birthday/birthday.py index fe095cb..8b08260 100644 --- a/birthday/birthday.py +++ b/birthday/birthday.py @@ -8,7 +8,7 @@ from dateutil import parser import asyncio import datetime import discord - +from typing import Literal class Birthday(commands.Cog): """Track birthdays, add birthday role, and annouce birthdays for users.""" @@ -268,3 +268,11 @@ class Birthday(commands.Cog): await ctx.send("No one has their birthday set in your server!") else: await menu(ctx, embeds, DEFAULT_CONTROLS) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/confession/__init__.py b/confession/__init__.py index c360d10..6050bd3 100644 --- a/confession/__init__.py +++ b/confession/__init__.py @@ -1,5 +1,6 @@ from .confession import Confession +__red_end_user_data_statement__ = "This cog won't store anything for a user." def setup(bot): n = Confession() diff --git a/confession/confession.py b/confession/confession.py index fc22645..3496cc0 100644 --- a/confession/confession.py +++ b/confession/confession.py @@ -1,11 +1,11 @@ from redbot.core import commands, checks, Config from redbot.core.utils.predicates import MessagePredicate from redbot.core.utils.menus import DEFAULT_CONTROLS, menu +from typing import Literal import contextlib import discord import asyncio - class Confession(commands.Cog): def __init__(self): self.config = Config.get_conf(self, identifier=665235, force_registration=True) @@ -184,3 +184,11 @@ class Confession(commands.Cog): pass await ctx.author.send("Your confession has been sent, you are forgiven now.") + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/costmanager/__init__.py b/costmanager/__init__.py index 9167606..6cab305 100644 --- a/costmanager/__init__.py +++ b/costmanager/__init__.py @@ -1,5 +1,6 @@ from .manager import CostManager +__red_end_user_data_statement__ = "This cog won't store anything for a user." def setup(bot): bot.add_cog(CostManager(bot)) diff --git a/costmanager/manager.py b/costmanager/manager.py index 1852cb9..a0577d4 100644 --- a/costmanager/manager.py +++ b/costmanager/manager.py @@ -1,5 +1,6 @@ from redbot.core.utils.chat_formatting import * from redbot.core import Config, checks, commands, bank +from typing import Literal import discord import asyncio @@ -406,3 +407,11 @@ class CostManager(commands.Cog): ) await asyncio.sleep(10) await message.delete() + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/disable/__init__.py b/disable/__init__.py index 4f9bfa4..d2cc476 100644 --- a/disable/__init__.py +++ b/disable/__init__.py @@ -1,5 +1,6 @@ from .disable import Disable +__red_end_user_data_statement__ = "This cog won't store any data for users." def setup(bot): bot.add_cog(Disable(bot)) diff --git a/disable/disable.py b/disable/disable.py index df30b51..e5bc767 100644 --- a/disable/disable.py +++ b/disable/disable.py @@ -1,8 +1,9 @@ from redbot.core.utils.chat_formatting import * from redbot.core import Config, checks, commands from redbot.core.utils.mod import is_admin_or_superior -import discord from discord.ext.commands import DisabledCommand +from typing import Literal +import discord class DisabledError(commands.CheckFailure): @@ -75,3 +76,11 @@ class Disable(commands.Cog): if isinstance(exception, DisabledError): msg = await self.config.guild(ctx.guild).disabled_message() await ctx.send(msg.format(ctx.command.name)) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/economytrickle/__init__.py b/economytrickle/__init__.py index 9778b1b..66ab0d0 100644 --- a/economytrickle/__init__.py +++ b/economytrickle/__init__.py @@ -1,5 +1,6 @@ from . import core +__red_end_user_data_statement__ = "This cog only stores internal variables per user." def setup(bot): bot.add_cog(core.EconomyTrickle(bot)) diff --git a/economytrickle/core.py b/economytrickle/core.py index 2b2dde0..1f55de6 100644 --- a/economytrickle/core.py +++ b/economytrickle/core.py @@ -11,6 +11,7 @@ from redbot.core import commands, checks from redbot.core.config import Config from redbot.core import bank from redbot.core.utils.chat_formatting import pagify, box +from typing import Literal from .activity import RecordHandler from .converters import configable_guild_defaults, settings_converter @@ -323,3 +324,11 @@ class EconomyTrickle(commands.Cog): pages = pagify(msg) for page in pages: await ctx.send(box(page)) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/emoji/__init__.py b/emoji/__init__.py index ec734b1..4d6474e 100644 --- a/emoji/__init__.py +++ b/emoji/__init__.py @@ -1,5 +1,6 @@ from .core import EveryoneEmoji +__red_end_user_data_statement__ = "This cog stores no data." def setup(bot): bot.add_cog(EveryoneEmoji(bot)) diff --git a/emoji/core.py b/emoji/core.py index c29a9b7..b1631ad 100644 --- a/emoji/core.py +++ b/emoji/core.py @@ -6,7 +6,7 @@ import unicodedata import aiohttp import discord from redbot.core import commands, checks - +from typing import Literal class EveryoneEmoji(commands.Cog): @@ -108,3 +108,11 @@ class EveryoneEmoji(commands.Cog): img = io.BytesIO(img) await ctx.send(f"{ctx.author.display_name} says:", file=discord.File(img, name)) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/events/__init__.py b/events/__init__.py deleted file mode 100644 index d7da4ad..0000000 --- a/events/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from .events import Events - - -def setup(bot): - n = Events(bot) - bot.add_cog(n) - bot.loop.create_task(n.update_events()) diff --git a/events/events.py b/events/events.py deleted file mode 100644 index fcfbf6a..0000000 --- a/events/events.py +++ /dev/null @@ -1,254 +0,0 @@ -import discord -from redbot.core import checks, commands -from redbot.core.utils.chat_formatting import * -from redbot.core import Config - -import time -import random -import asyncio -import datetime -import pytz -from tzlocal import get_localzone - - -basic_colors = [ - discord.Colour.blue(), - discord.Colour.teal(), - discord.Colour.dark_teal(), - discord.Colour.green(), - discord.Colour.dark_green(), - discord.Colour.dark_blue(), - discord.Colour.purple(), - discord.Colour.dark_purple(), - discord.Colour.magenta(), - discord.Colour.gold(), - discord.Colour.orange(), - discord.Colour.red(), - discord.Colour.dark_red(), - discord.Colour.blurple(), - discord.Colour.greyple(), -] - - -class Events(commands.Cog): - """ - Set events that track time since set events - """ - - def __init__(self, bot): - super().__init__() - self.config = Config.get_conf(self, identifier=6748392754) - self.timezone = get_localzone() - self.bot = bot - # set default values - self.config.register_guild(events={}, channel=0) - - @commands.group() - @commands.guild_only() - async def event(self, ctx): - """ - Track time since event occured. - """ - pass - - @event.command(name="add") - async def addevent(self, ctx, start_time: str, *, event_name: str = ""): - """ - Add event to track. If start time is not given, the current data and time is used. - Start time should be a UNIX timestamp in UTC. - """ - guild = ctx.guild - channel_id = await self.config.guild(guild).channel() - if channel_id == 0: - await ctx.send("Channel not setup, use ``{}eventset channel` to set channel for events.".format(ctx.prefix)) - return - channel = self.bot.get_channel(channel_id) - if not channel: - await ctx.send("Channel set not found, please setup channel.") - return - try: - start_time = datetime.datetime.utcfromtimestamp(int(start_time)) - except: - event_name = start_time + " " + event_name - start_time = datetime.datetime.utcnow() - - elapsed_time = datetime.datetime.utcnow() - start_time - embed = discord.Embed(title=event_name, colour=random.choice(basic_colors)) - embed.add_field( - name="Event time", - value=start_time.replace(tzinfo=pytz.utc).astimezone(self.timezone).strftime("%b %d, %Y, %H:%M"), - ) - day_msg = "{} day{},".format(elapsed_time.days, "s" if elapsed_time.days > 1 else "") - hour_msg = " {} hour{}".format( - int(elapsed_time.seconds / 60 / 60), "s" if int(elapsed_time.seconds / 60 / 60) > 1 else "" - ) - if elapsed_time.days > 0 or int(elapsed_time.seconds / 60 / 60) > 0: - minute_msg = ", and {} minute{}".format( - int(elapsed_time.seconds / 60 - int(elapsed_time.seconds / 60 / 60) * 60), - "s" if int(elapsed_time.seconds / 60 - int(elapsed_time.seconds / 60 / 60) * 60) > 1 else "", - ) - else: - minute_msg = "{} minute{}".format( - int(elapsed_time.seconds / 60 - int(elapsed_time.seconds / 60 / 60) * 60), - "s" if int(elapsed_time.seconds / 60 - int(elapsed_time.seconds / 60 / 60) * 60) > 1 else "", - ) - msg = "{}{}{}".format( - day_msg if elapsed_time.days > 0 else "", - hour_msg if int(elapsed_time.seconds / 60 / 60) > 0 else "", - minute_msg, - ) - embed.add_field(name="Elapsed time", value=msg) - message = await channel.send(embed=embed) - async with self.config.guild(guild).events() as events: - new_event = {"start_time": int(start_time.replace(tzinfo=pytz.utc).timestamp()), "name": event_name} - events[message.id] = new_event - await ctx.send("Event added!") - - @event.command(name="del") - async def delevent(self, ctx): - """ - Delete an event. Interactive deletion, so just run the command. - """ - guild = ctx.guild - channel_id = await self.config.guild(guild).channel() - if channel_id == 0: - await ctx.send("Channel not setup, use `{}eventset channel` to set channel for events.".format(ctx.prefix)) - return - channel = self.bot.get_channel(channel_id) - if not channel: - await ctx.send("Channel set not found, please setup channel.") - return - - counter = 0 - msg = "```" - async with self.config.guild(guild).events() as events: - for num, event in events.items(): - msg += "{}\t{}\n".format(counter, event["name"]) - if len(msg + "```") + 100 > 2000: - msg += "```" - await ctx.send(msg) - msg = "```" - counter += 1 - msg += "```" - await ctx.send(msg) - await ctx.send("Please choose which event you want to delete. (type number in chat)") - - def m_check(m): - try: - return ( - m.author.id == ctx.author.id - and m.channel.id == ctx.channel.id - and int(m.content) <= counter - and int(m.content) >= 0 - ) - except: - return False - - try: - response = await self.bot.wait_for("message", timeout=30, check=m_check) - except: - await ctx.send("Timed out, event deletion cancelled.") - return - for i, num in enumerate(events.keys()): - if i == int(response.content): - event_num = num - try: - message = await channel.fetch_message(event_num) - await message.delete() - except: - await ctx.send("Event message in {} was not found.".format(channel.mention)) - - await ctx.send("{} has been deleted!".format(events[event_num]["name"])) - del events[event_num] - - @event.command(name="list") - async def listevent(self, ctx): - """ - List all events for server. - """ - guild = ctx.guild - msg = "```\n" - async with self.config.guild(guild).events() as events: - if len(events) == 0: - msg += "None" - for num, event in events.items(): - msg += "{}\n".format(event["name"]) - if len(msg + "```") + 3 > 2000: - msg += "```" - await ctx.send(msg) - msg = "```" - - msg += "```" - await ctx.send(msg) - - @commands.group() - @commands.guild_only() - @checks.admin_or_permissions(administrator=True) - async def eventset(self, ctx: commands.Context): - """Manages event settings""" - pass - - @eventset.command(name="channel") - async def _channel_set(self, ctx, channel: discord.TextChannel): - """ - Set channel to send event messages too - """ - guild = ctx.guild - await self.config.guild(guild).channel.set(channel.id) - await ctx.send("Channel now set to {}".format(channel.mention)) - - async def update_events(self): - while True: - if self is not self.bot.get_cog("Events"): - print("events cog has been lost") - return - guilds = self.bot.guilds - for guild in guilds: - async with self.config.guild(guild).events() as events: - channel_id = await self.config.guild(guild).channel() - if channel_id == 0: - continue - channel = self.bot.get_channel(channel_id) - if channel is None: - continue - for message_id, event in events.items(): - try: - message = await channel.fetch_message(message_id) - except: - continue - start_time = datetime.datetime.utcfromtimestamp(event["start_time"]) - elapsed_time = datetime.datetime.utcnow() - start_time - embed = message.embeds[0] - embed.clear_fields() - embed.add_field( - name="Event time", - value=start_time.replace(tzinfo=pytz.utc) - .astimezone(self.timezone) - .strftime("%b %d, %Y, %H:%M"), - ) - day_msg = "{} day{},".format(elapsed_time.days, "s" if elapsed_time.days > 1 else "") - hour_msg = " {} hour{}".format( - int(elapsed_time.seconds / 60 / 60), "s" if int(elapsed_time.seconds / 60 / 60) > 1 else "" - ) - if elapsed_time.days > 0 or int(elapsed_time.seconds / 60 / 60) > 0: - minute_msg = ", and {} minute{}".format( - int(elapsed_time.seconds / 60 - int(elapsed_time.seconds / 60 / 60) * 60), - "s" - if int(elapsed_time.seconds / 60 - int(elapsed_time.seconds / 60 / 60) * 60) > 1 - else "", - ) - else: - minute_msg = "{} minute{}".format( - int(elapsed_time.seconds / 60 - int(elapsed_time.seconds / 60 / 60) * 60), - "s" - if int(elapsed_time.seconds / 60 - int(elapsed_time.seconds / 60 / 60) * 60) > 1 - else "", - ) - msg = "{}{}{}".format( - day_msg if elapsed_time.days > 0 else "", - hour_msg if int(elapsed_time.seconds / 60 / 60) > 0 else "", - minute_msg, - ) - embed.add_field(name="Elapsed time", value=msg) - await message.edit(embed=embed) - await asyncio.sleep(30) diff --git a/isolate/__init__.py b/isolate/__init__.py index 6904340..dd80997 100644 --- a/isolate/__init__.py +++ b/isolate/__init__.py @@ -1,5 +1,6 @@ from .isolate import Isolate +__red_end_user_data_statement__ = "This cog stores members who are currently isolated for moderation purposes." async def setup(bot): isolate = Isolate(bot) diff --git a/isolate/isolate.py b/isolate/isolate.py index ff2a27f..e152d7e 100644 --- a/isolate/isolate.py +++ b/isolate/isolate.py @@ -11,6 +11,7 @@ from .memoizer import Memoizer # general import asyncio from datetime import datetime +from typing import Literal import inspect import logging import time @@ -1430,3 +1431,11 @@ class Isolate(commands.Cog): msg += "\n\nOriginal reason was: " + member_data["reason"] await self._unisolate(member, reason=msg, apply_roles=False, update=True, quiet=True) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/markov/__init__.py b/markov/__init__.py index b29f415..4ef636e 100644 --- a/markov/__init__.py +++ b/markov/__init__.py @@ -1,5 +1,6 @@ from .markov import Markov +__red_end_user_data_statement__ = "This doesn't store any user data." def setup(bot): bot.add_cog(Markov(bot)) diff --git a/markov/markov.py b/markov/markov.py index 79c881a..100da2e 100644 --- a/markov/markov.py +++ b/markov/markov.py @@ -1,5 +1,6 @@ from redbot.core.utils.chat_formatting import * from redbot.core import Config, checks, commands +from typing import Literal import discord import random import asyncio @@ -193,3 +194,11 @@ class Markov(commands.Cog): model[str(message.channel.id)][content[i]].append(content[i + 1]) self.cache[guild.id]["model"] = model + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/memeify/__init__.py b/memeify/__init__.py index e4c02e7..68366d5 100644 --- a/memeify/__init__.py +++ b/memeify/__init__.py @@ -1,5 +1,6 @@ from .memeify import Memeify +__red_end_user_data_statement__ = "This cog does not store user data." def setup(bot): bot.add_cog(Memeify(bot)) diff --git a/memeify/memeify.py b/memeify/memeify.py index 0533600..987da54 100644 --- a/memeify/memeify.py +++ b/memeify/memeify.py @@ -1,5 +1,6 @@ from redbot.core import Config, commands from redbot.core.utils.chat_formatting import pagify +from typing import Literal import re import random import string @@ -294,3 +295,11 @@ class Memeify(commands.Cog): text = text[:-1] return text + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/moreadmin/__init__.py b/moreadmin/__init__.py index 269d9f8..6ea1bfc 100644 --- a/moreadmin/__init__.py +++ b/moreadmin/__init__.py @@ -1,5 +1,6 @@ from .moreadmin import MoreAdmin +__red_end_user_data_statement__ = "This will store a user's last few messages (depending on configuration)" def setup(bot): bot.add_cog(MoreAdmin(bot)) diff --git a/moreadmin/moreadmin.py b/moreadmin/moreadmin.py index 1662551..075fbf4 100644 --- a/moreadmin/moreadmin.py +++ b/moreadmin/moreadmin.py @@ -7,6 +7,7 @@ from redbot.core.data_manager import cog_data_path import discord from .utils import * +from typing import Literal import asyncio from typing import Union import os @@ -1069,3 +1070,11 @@ class MoreAdmin(commands.Cog): if to_add: await self.add_last_msg(message) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/nitroemoji/__init__.py b/nitroemoji/__init__.py index a7e2c7a..75fce3e 100644 --- a/nitroemoji/__init__.py +++ b/nitroemoji/__init__.py @@ -1,5 +1,6 @@ from .nitroemoji import NitroEmoji +__red_end_user_data_statement__ = "This cog will store a user's custom emojis in each guild." async def setup(bot): n = NitroEmoji(bot) diff --git a/nitroemoji/nitroemoji.py b/nitroemoji/nitroemoji.py index db3d4c4..071a865 100644 --- a/nitroemoji/nitroemoji.py +++ b/nitroemoji/nitroemoji.py @@ -1,6 +1,7 @@ from redbot.core.utils.chat_formatting import * from redbot.core import Config, checks, commands, bank from redbot.core.data_manager import cog_data_path +from typing import Literal import discord import aiohttp @@ -359,3 +360,11 @@ class NitroEmoji(commands.Cog): break except ValueError: pass + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/personalroles/__init__.py b/personalroles/__init__.py index 66e436a..2aeb488 100644 --- a/personalroles/__init__.py +++ b/personalroles/__init__.py @@ -1,5 +1,6 @@ from .personalroles import PersonalRoles +__red_end_user_data_statement__ = "This will store what a user's custom role is if they have one." def setup(bot): bot.add_cog(PersonalRoles(bot)) diff --git a/personalroles/info.json b/personalroles/info.json index 308c0f9..fe401b4 100644 --- a/personalroles/info.json +++ b/personalroles/info.json @@ -6,7 +6,7 @@ "install_msg": "Thanks for install.", "short": "Personal roles for members", "description": "Personal roles for members", - "min_bot_version": "3.2.1", + "min_bot_version": "3.4.0", "tags": [ "myrole", "personal role", @@ -15,6 +15,5 @@ "requirements": [ "tabulate" ], - "min_bot_version": "3.4.0", "end_user_data_statement": "This will store what a user's custom role is if they have one." } diff --git a/personalroles/personalroles.py b/personalroles/personalroles.py index e642335..32a63cc 100644 --- a/personalroles/personalroles.py +++ b/personalroles/personalroles.py @@ -9,6 +9,7 @@ from redbot.core.utils import chat_formatting as chat from redbot.core.utils.menus import menu, DEFAULT_CONTROLS from redbot.core.utils.mod import get_audit_reason from tabulate import tabulate +from typing import Literal import asyncio _ = Translator("PersonalRoles", __file__) @@ -434,3 +435,11 @@ class PersonalRoles(commands.Cog): await role.delete() except: pass + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/pony/__init__.py b/pony/__init__.py index fb4f105..61e43b8 100644 --- a/pony/__init__.py +++ b/pony/__init__.py @@ -1,5 +1,6 @@ from .pony import Pony +__red_end_user_data_statement__ = "This doesn't store any user data." def setup(bot): bot.add_cog(Pony()) diff --git a/pony/pony.py b/pony/pony.py index 70a711b..f716df9 100644 --- a/pony/pony.py +++ b/pony/pony.py @@ -2,6 +2,7 @@ import discord from redbot.core.utils.chat_formatting import * from redbot.core import Config, checks, commands from urllib import parse +from typing import Literal import aiohttp import os import traceback @@ -373,3 +374,11 @@ class Pony(commands.Cog): return await message.edit(content=f"Artists: `{artists}`\n{output}") else: return await message.edit(content=output) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/punish/__init__.py b/punish/__init__.py index 31de3d2..b45630c 100644 --- a/punish/__init__.py +++ b/punish/__init__.py @@ -1,5 +1,6 @@ from .punish import Punish +__red_end_user_data_statement__ = "This will store who is currently punished in each guild." async def setup(bot): punish = Punish(bot) diff --git a/punish/info.json b/punish/info.json index 9bffdf4..dbdef8d 100644 --- a/punish/info.json +++ b/punish/info.json @@ -17,5 +17,5 @@ "brandons209", "punish" ], - "end_user_data_statement": "This will store who is currently punished." + "end_user_data_statement": "This will store who is currently punished in each guild." } diff --git a/punish/punish.py b/punish/punish.py index e8bfc97..748aa3d 100644 --- a/punish/punish.py +++ b/punish/punish.py @@ -11,6 +11,7 @@ from .memoizer import Memoizer # general import asyncio from datetime import datetime +from typing import Literal import inspect import logging import time @@ -1497,3 +1498,11 @@ class Punish(commands.Cog): msg += "\n\nOriginal reason was: " + member_data["reason"] await self._unpunish(member, reason=msg, apply_roles=False, update=True, quiet=True) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/reactpoll/__init__.py b/reactpoll/__init__.py index db9a162..ef102e8 100644 --- a/reactpoll/__init__.py +++ b/reactpoll/__init__.py @@ -1,5 +1,6 @@ from .reactpoll import ReactPoll +__red_end_user_data_statement__ = "This cog won't store user data." def setup(bot): n = ReactPoll(bot) diff --git a/reactpoll/reactpoll.py b/reactpoll/reactpoll.py index f0717ed..7d25304 100644 --- a/reactpoll/reactpoll.py +++ b/reactpoll/reactpoll.py @@ -8,6 +8,7 @@ import asyncio import re import time from datetime import datetime, timedelta +from typing import Literal from .time_utils import * # May need to not save on every reaction add if it causes too much lag @@ -292,6 +293,14 @@ class NewReactPoll: del self.poll_sessions[str(self.channel.id)] await self.main.delete_poll(self) + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass + class LoadedPoll(NewReactPoll): """A reaction poll loaded from disk""" diff --git a/rolemanagement/__init__.py b/rolemanagement/__init__.py index 18a93e3..7255e40 100644 --- a/rolemanagement/__init__.py +++ b/rolemanagement/__init__.py @@ -1,5 +1,6 @@ from .core import RoleManagement +__red_end_user_data_statement__ = "This will only store sticky and subscribed roles for users." def setup(bot): cog = RoleManagement(bot) diff --git a/rolemanagement/core.py b/rolemanagement/core.py index 7562341..327ce48 100644 --- a/rolemanagement/core.py +++ b/rolemanagement/core.py @@ -5,7 +5,7 @@ import asyncio import re import time from abc import ABCMeta -from typing import AsyncIterator, Tuple, Optional, Union, List, Dict +from typing import AsyncIterator, Tuple, Optional, Union, List, Dict, Literal import discord from discord.ext.commands import CogMeta as DPYCogMeta @@ -1108,3 +1108,11 @@ class RoleManagement( for em, rdata in _outer.items(): if rdata and rdata["roleid"] == role.id: yield (mid, em, rdata) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/rolemanagement/info.json b/rolemanagement/info.json index 88eac14..68aa795 100644 --- a/rolemanagement/info.json +++ b/rolemanagement/info.json @@ -4,7 +4,7 @@ "DiscordLiz", "brandons209" ], - "install_msg": "If you need help, I have a channel in https://discord.gg/mb85deu", + "install_msg": "Thank you for using RoleManagement!", "name": "RoleManagement", "disabled": false, "short": "Role searches, reactroles, requirements for roles, etc.", @@ -18,5 +18,5 @@ ], "hidden": false, "min_bot_version": "3.4.0", - "end_user_data_statement": "This will only store sticky roles for users." + "end_user_data_statement": "This will only store sticky and subscribed roles for users." } diff --git a/roleplay/__init__.py b/roleplay/__init__.py index c34abdd..d7c1724 100644 --- a/roleplay/__init__.py +++ b/roleplay/__init__.py @@ -2,6 +2,7 @@ import os from .roleplay import RolePlay from redbot.core import Config +__red_end_user_data_statement__ = "No data is stored." def setup(bot): bot.add_cog(RolePlay(bot)) diff --git a/roleplay/roleplay.py b/roleplay/roleplay.py index fa5f0c0..0a3001c 100644 --- a/roleplay/roleplay.py +++ b/roleplay/roleplay.py @@ -3,6 +3,7 @@ from redbot.core.utils.chat_formatting import italics, pagify, box from redbot.core import Config, checks, commands import random from random import choice +from typing import Literal import asyncio import os @@ -439,3 +440,11 @@ class RolePlay(commands.Cog): await ctx.send(msg + "(╯°□°)╯︵ " + name[::-1]) else: await ctx.send("*flips a coin and... " + choice(["HEADS!*", "TAILS!*"])) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/roletracker/__init__.py b/roletracker/__init__.py index 378145c..50197d8 100644 --- a/roletracker/__init__.py +++ b/roletracker/__init__.py @@ -1,5 +1,6 @@ from .roletracker import RoleTracker +__red_end_user_data_statement__ = "This cog stores the users who have a trackable role." async def setup(bot): roletracker = RoleTracker(bot) diff --git a/roletracker/info.json b/roletracker/info.json index f9def53..d88b047 100644 --- a/roletracker/info.json +++ b/roletracker/info.json @@ -15,5 +15,5 @@ "brandons209", "pancakesparkle" ], - "end_user_data_statement": "Depending on setup, can log user messages, voice channel activity, audit actions in guilds, activity statistics per guild, user name changes, and any moderation actions per guild." + "end_user_data_statement": "This cog stores the users who have a trackable role." } diff --git a/roletracker/roletracker.py b/roletracker/roletracker.py index 8efd1f4..7fae79d 100644 --- a/roletracker/roletracker.py +++ b/roletracker/roletracker.py @@ -6,6 +6,7 @@ from datetime import datetime from redbot.core import checks, commands, Config, modlog from redbot.core.utils.chat_formatting import pagify from redbot.core.utils.predicates import MessagePredicate +from typing import Literal try: from redbot.core.commands import GuildContext @@ -267,3 +268,11 @@ class RoleTracker(commands.Cog): await case.edit(edits) await self.config.role(role).USERS.set(data) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/rules/__init__.py b/rules/__init__.py index 5eeca4d..901b2e7 100644 --- a/rules/__init__.py +++ b/rules/__init__.py @@ -1,5 +1,6 @@ from .rules import Rules +__red_end_user_data_statement__ = "This only stores rules added by admins of guilds." def setup(bot): bot.add_cog(Rules(bot)) diff --git a/rules/rules.py b/rules/rules.py index c1c0703..b3a2643 100644 --- a/rules/rules.py +++ b/rules/rules.py @@ -3,7 +3,7 @@ from redbot.core import checks, commands, Config from redbot.core.utils import chat_formatting as chat from redbot.core.utils.menus import menu, DEFAULT_CONTROLS import asyncio -from typing import Union +from typing import Union, Literal class Rules(commands.Cog): @@ -137,3 +137,11 @@ class Rules(commands.Cog): async with self.config.channel(channel).rules() as rules: rules[str(rule_num)] = rule await ctx.tick() + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/sfx/__init__.py b/sfx/__init__.py index b581e42..fe2626f 100644 --- a/sfx/__init__.py +++ b/sfx/__init__.py @@ -1,5 +1,6 @@ from .sfx import SFX +__red_end_user_data_statement__ = "This doesn't store any user data." def setup(bot): bot.add_cog(SFX(bot)) diff --git a/sfx/sfx.py b/sfx/sfx.py index 11cf92d..4a4d0a5 100644 --- a/sfx/sfx.py +++ b/sfx/sfx.py @@ -7,6 +7,7 @@ import os import glob import asyncio from difflib import get_close_matches +from typing import Literal import tabulate from .utils import saysound, code_path @@ -363,3 +364,11 @@ class SFX(commands.Cog): except: await ctx.send("Please allow DMs from server members so I can DM you the list!") return + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/shootout/__init__.py b/shootout/__init__.py index 826cb56..a77e345 100644 --- a/shootout/__init__.py +++ b/shootout/__init__.py @@ -1,5 +1,6 @@ from .shootout import Shootout +__red_end_user_data_statement__ = "This cog won't store anything for a user." def setup(bot): bot.add_cog(Shootout(bot)) diff --git a/shootout/shootout.py b/shootout/shootout.py index 083dab7..5bcc4bf 100644 --- a/shootout/shootout.py +++ b/shootout/shootout.py @@ -5,7 +5,7 @@ from redbot.core import bank, commands, checks, Config from redbot.core.utils.chat_formatting import * import asyncio, contextlib, discord, random, shlex - +from typing import Literal class Shootout(commands.Cog): default_config = { diff --git a/smartreact/__init__.py b/smartreact/__init__.py index 3aca637..e01a2f6 100644 --- a/smartreact/__init__.py +++ b/smartreact/__init__.py @@ -1,5 +1,6 @@ from .smartreact import SmartReact +__red_end_user_data_statement__ = "This doesn't store any user data." def setup(bot): bot.add_cog(SmartReact(bot)) diff --git a/smartreact/smartreact.py b/smartreact/smartreact.py index 8f81ed3..758588b 100644 --- a/smartreact/smartreact.py +++ b/smartreact/smartreact.py @@ -1,7 +1,7 @@ import discord from redbot.core import Config, commands, checks from redbot.core.utils.chat_formatting import pagify - +from typing import Literal class SmartReact(commands.Cog): """Create automatic reactions when trigger words are typed in chat""" @@ -137,3 +137,11 @@ class SmartReact(commands.Cog): pass except discord.errors.InvalidArgument: pass + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/trickortreat/__init__.py b/trickortreat/__init__.py index 0e3f408..5ca9062 100644 --- a/trickortreat/__init__.py +++ b/trickortreat/__init__.py @@ -1,5 +1,6 @@ from .trickortreat import TrickorTreat +__red_end_user_data_statement__ = "This doesn't store any user data." def setup(bot): bot.add_cog(TrickorTreat(bot)) diff --git a/trickortreat/trickortreat.py b/trickortreat/trickortreat.py index dc85d06..f453e45 100644 --- a/trickortreat/trickortreat.py +++ b/trickortreat/trickortreat.py @@ -1,6 +1,7 @@ from redbot.core.utils.chat_formatting import * from redbot.core import Config, checks, commands, bank from redbot.core.utils.predicates import MessagePredicate +from typing import Literal import discord import asyncio import random @@ -313,3 +314,11 @@ class TrickorTreat(commands.Cog): await bank.withdraw_credits(ctx.author, amount) await self.config.member(ctx.author).last_pay.set(time.time()) + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass diff --git a/welcome/__init__.py b/welcome/__init__.py index ee5bc68..15688c4 100644 --- a/welcome/__init__.py +++ b/welcome/__init__.py @@ -1,7 +1,7 @@ from redbot.core.bot import Red - from .welcome import Welcome +__red_end_user_data_statement__ = "This cog doesn't store any user data." def setup(bot: Red): bot.add_cog(Welcome(bot=bot)) diff --git a/welcome/welcome.py b/welcome/welcome.py index bcd8478..17e1316 100644 --- a/welcome/welcome.py +++ b/welcome/welcome.py @@ -3,7 +3,7 @@ import datetime import discord import logging import random -from typing import Optional, Union +from typing import Optional, Union, Literal from redbot.core import Config, checks, commands from redbot.core.utils.chat_formatting import box, pagify, humanize_list @@ -899,3 +899,11 @@ class Welcome(commands.Cog): """Gets today's date in ordinal form.""" return datetime.date.today().toordinal() + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + pass