Merge branch 'master' into conquest_develop

# Conflicts:
#	conquest/info.json
conquest_develop
bobloy 4 years ago
commit aadd9a61a8

@ -38,6 +38,10 @@ class AnnounceDaily(Cog):
self.config.register_global(**default_global) self.config.register_global(**default_global)
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
async def _get_msgs(self): async def _get_msgs(self):
return DEFAULT_MESSAGES + await self.config.messages() return DEFAULT_MESSAGES + await self.config.messages()

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Send daily announcements to all servers at a specified times", "description": "Send daily announcements to all servers at a specified times",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing AnnounceDaily! Get started with `[p]load announcedaily` and `[p]help AnnounceDaily`", "install_msg": "Thank you for installing AnnounceDaily! Get started with `[p]load announcedaily` and `[p]help AnnounceDaily`",
"short": "Send daily announcements", "short": "Send daily announcements",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy" "bobloy"
] ]

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Start an Audio Trivia game", "description": "Start an Audio Trivia game",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing Audio trivia!\n You **MUST** unload trivia to use this (`[p]unload trivia`)\n Then you can get started with `[p]load audiotrivia` and `[p]help AudioTrivia`", "install_msg": "Thank you for installing Audio trivia!\n You **MUST** unload trivia to use this (`[p]unload trivia`)\n Then you can get started with `[p]load audiotrivia` and `[p]help AudioTrivia`",
"short": "Start an Audio Trivia game", "short": "Start an Audio Trivia game",
"end_user_data_statement": "This cog expands the core Audio and Trivia cogs without collecting any additional End User Data.\nSee the core End User Data storage for more information",
"tags": [ "tags": [
"fox", "fox",
"bobloy", "bobloy",

@ -22,6 +22,10 @@ class CCRole(commands.Cog):
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.guild_only() @commands.guild_only()
@commands.group() @commands.group()
async def ccrole(self, ctx: commands.Context): async def ccrole(self, ctx: commands.Context):

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Creates custom commands to adjust roles and send custom messages", "description": "Creates custom commands to adjust roles and send custom messages",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing Custom Commands w/ Roles. Get started with `[p]load ccrole` and `[p]help CCRole`", "install_msg": "Thank you for installing Custom Commands w/ Roles. Get started with `[p]load ccrole` and `[p]help CCRole`",
"short": "Creates commands that adjust roles", "short": "Creates commands that adjust roles",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"fox", "fox",
"bobloy", "bobloy",

@ -3,6 +3,7 @@ import logging
import os import os
import pathlib import pathlib
from datetime import datetime, timedelta from datetime import datetime, timedelta
from typing import Literal
import discord import discord
from chatterbot import ChatBot from chatterbot import ChatBot
@ -13,6 +14,7 @@ from redbot.core import Config, commands
from redbot.core.commands import Cog from redbot.core.commands import Cog
from redbot.core.data_manager import cog_data_path from redbot.core.data_manager import cog_data_path
from redbot.core.utils.predicates import MessagePredicate from redbot.core.utils.predicates import MessagePredicate
from redbot.core.utils import AsyncIter
log = logging.getLogger("red.fox_v3.chat") log = logging.getLogger("red.fox_v3.chat")
@ -65,6 +67,10 @@ class Chatter(Cog):
self.loop = asyncio.get_event_loop() self.loop = asyncio.get_event_loop()
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
def _create_chatbot(self): def _create_chatbot(self):
return ChatBot( return ChatBot(
@ -107,7 +113,7 @@ class Chatter(Cog):
for channel in ctx.guild.text_channels: for channel in ctx.guild.text_channels:
if in_channel: if in_channel:
channel = in_channel channel = in_channel
await ctx.send("Gathering {}".format(channel.mention)) await ctx.maybe_send_embed("Gathering {}".format(channel.mention))
user = None user = None
i = 0 i = 0
send_time = after - timedelta(days=100) # Makes the first message a new message send_time = after - timedelta(days=100) # Makes the first message a new message
@ -115,7 +121,7 @@ class Chatter(Cog):
try: try:
async for message in channel.history( async for message in channel.history(
limit=None, after=after, oldest_first=True limit=None, after=after, oldest_first=True
).filter( ).filter(
predicate=predicate predicate=predicate
): # type: discord.Message ): # type: discord.Message
@ -188,7 +194,7 @@ class Chatter(Cog):
""" """
if not confirm: if not confirm:
await ctx.send( await ctx.maybe_send_embed(
"Warning, this command will erase all your training data and reset your configuration\n" "Warning, this command will erase all your training data and reset your configuration\n"
"If you want to proceed, run the command again as `[p]chatter cleardata True`" "If you want to proceed, run the command again as `[p]chatter cleardata True`"
) )
@ -314,7 +320,7 @@ class Chatter(Cog):
Backup your training data to a json for later use Backup your training data to a json for later use
""" """
await ctx.send("Backing up data, this may take a while") await ctx.maybe_send_embed("Backing up data, this may take a while")
path: pathlib.Path = cog_data_path(self) path: pathlib.Path = cog_data_path(self)
@ -325,9 +331,9 @@ class Chatter(Cog):
) )
if future: if future:
await ctx.send(f"Backup successful! Look in {path} for your backup") await ctx.maybe_send_embed(f"Backup successful! Look in {path} for your backup")
else: else:
await ctx.send("Error occurred :(") await ctx.maybe_send_embed("Error occurred :(")
@chatter.command(name="trainubuntu") @chatter.command(name="trainubuntu")
async def chatter_train_ubuntu(self, ctx: commands.Context, confirmation: bool = False): async def chatter_train_ubuntu(self, ctx: commands.Context, confirmation: bool = False):
@ -359,9 +365,9 @@ class Chatter(Cog):
future = await self.loop.run_in_executor(None, self._train_english) future = await self.loop.run_in_executor(None, self._train_english)
if future: if future:
await ctx.send("Training successful!") await ctx.maybe_send_embed("Training successful!")
else: else:
await ctx.send("Error occurred :(") await ctx.maybe_send_embed("Error occurred :(")
@chatter.command() @chatter.command()
async def train(self, ctx: commands.Context, channel: discord.TextChannel): async def train(self, ctx: commands.Context, channel: discord.TextChannel):
@ -369,7 +375,7 @@ class Chatter(Cog):
Trains the bot based on language in this guild Trains the bot based on language in this guild
""" """
await ctx.send( await ctx.maybe_send_embed(
"Warning: The cog may use significant RAM or CPU if trained on large data sets.\n" "Warning: The cog may use significant RAM or CPU if trained on large data sets.\n"
"Additionally, large sets will use more disk space to save the trained data.\n\n" "Additionally, large sets will use more disk space to save the trained data.\n\n"
"If you experience issues, clear your trained data and train again on a smaller scope." "If you experience issues, clear your trained data and train again on a smaller scope."
@ -379,10 +385,10 @@ class Chatter(Cog):
conversation = await self._get_conversation(ctx, channel) conversation = await self._get_conversation(ctx, channel)
if not conversation: if not conversation:
await ctx.send("Failed to gather training data") await ctx.maybe_send_embed("Failed to gather training data")
return return
await ctx.send( await ctx.maybe_send_embed(
"Gather successful! Training begins now\n" "Gather successful! Training begins now\n"
"(**This will take a long time, be patient. See console for progress**)" "(**This will take a long time, be patient. See console for progress**)"
) )
@ -397,9 +403,9 @@ class Chatter(Cog):
pass pass
if future: if future:
await ctx.send("Training successful!") await ctx.maybe_send_embed("Training successful!")
else: else:
await ctx.send("Error occurred :(") await ctx.maybe_send_embed("Error occurred :(")
@commands.Cog.listener() @commands.Cog.listener()
async def on_message_without_command(self, message: discord.Message): async def on_message_without_command(self, message: discord.Message):

@ -2,11 +2,7 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.10",
3,
3,
10
],
"description": "Create an offline chatbot that talks like your average member using Machine Learning", "description": "Create an offline chatbot that talks like your average member using Machine Learning",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing Chatter! Get started ith `[p]load chatter` and `[p]help Chatter`", "install_msg": "Thank you for installing Chatter! Get started ith `[p]load chatter` and `[p]help Chatter`",
@ -24,6 +20,7 @@
"spacy>=2.3,<2.4" "spacy>=2.3,<2.4"
], ],
"short": "Local Chatbot run on machine learning", "short": "Local Chatbot run on machine learning",
"end_user_data_statement": "This cog only stores anonymous conversations data; no End User Data is stored.",
"tags": [ "tags": [
"chat", "chat",
"chatbot", "chatbot",

@ -28,6 +28,10 @@ class CogLint(Cog):
self.config.register_global(**default_global) self.config.register_global(**default_global)
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command() @commands.command()
async def autolint(self, ctx: commands.Context): async def autolint(self, ctx: commands.Context):
"""Toggles automatically linting code""" """Toggles automatically linting code"""
@ -35,7 +39,7 @@ class CogLint(Cog):
self.do_lint = not curr self.do_lint = not curr
await self.config.lint.set(not curr) await self.config.lint.set(not curr)
await ctx.send("Autolinting is now set to {}".format(not curr)) await ctx.maybe_send_embed("Autolinting is now set to {}".format(not curr))
@commands.command() @commands.command()
async def lint(self, ctx: commands.Context, *, code): async def lint(self, ctx: commands.Context, *, code):
@ -44,7 +48,7 @@ class CogLint(Cog):
Toggle autolinting with `[p]autolint` Toggle autolinting with `[p]autolint`
""" """
await self.lint_message(ctx.message) await self.lint_message(ctx.message)
await ctx.send("Hello World") await ctx.maybe_send_embed("Hello World")
async def lint_code(self, code): async def lint_code(self, code):
self.counter += 1 self.counter += 1

@ -2,16 +2,15 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Lint python code posted in chat", "description": "Lint python code posted in chat",
"hidden": true, "hidden": true,
"install_msg": "Thank you for installing CogLint! Get started with `[p]load coglint` and `[p]help CogLint`", "install_msg": "Thank you for installing CogLint! Get started with `[p]load coglint` and `[p]help CogLint`",
"requirements": ["pylint"], "requirements": [
"pylint"
],
"short": "Python cog linter", "short": "Python cog linter",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"utils", "utils",

@ -32,6 +32,10 @@ class Dad(Cog):
self.cooldown = defaultdict(datetime.now) self.cooldown = defaultdict(datetime.now)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command() @commands.command()
async def dadjoke(self, ctx: commands.Context): async def dadjoke(self, ctx: commands.Context):
headers = { headers = {

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Tell dad jokes and give out bad nicknames", "description": "Tell dad jokes and give out bad nicknames",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing Dad. Get started with `[p]load dad`, then `[p]help Dad`", "install_msg": "Thank you for installing Dad. Get started with `[p]load dad`, then `[p]help Dad`",
"short": "Dad joke bot", "short": "Dad joke bot",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"utils", "utils",

@ -18,6 +18,10 @@ class ExclusiveRole(Cog):
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.guild_only() @commands.guild_only()
@commands.group(aliases=["exclusiverole"]) @commands.group(aliases=["exclusiverole"])
async def exclusive(self, ctx): async def exclusive(self, ctx):

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Assign roles to be exclusive, preventing other roles from being added", "description": "Assign roles to be exclusive, preventing other roles from being added",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing ExclusiveRole. Get started with `[p]load exclusiverole` and `[p]help ExclusiveRole`", "install_msg": "Thank you for installing ExclusiveRole. Get started with `[p]load exclusiverole` and `[p]help ExclusiveRole`",
"short": "Set roles to be exclusive", "short": "Set roles to be exclusive",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"fox", "fox",
"bobloy", "bobloy",

@ -1,9 +1,11 @@
from datetime import date, timedelta from datetime import date, timedelta
from typing import Literal
import discord import discord
from redbot.core import Config, checks, commands from redbot.core import Config, checks, commands
from redbot.core.bot import Red from redbot.core.bot import Red
from redbot.core.commands import Cog from redbot.core.commands import Cog
from redbot.core.utils import AsyncIter
from redbot.core.utils.chat_formatting import pagify from redbot.core.utils.chat_formatting import pagify
@ -22,6 +24,21 @@ class Flag(Cog):
self.config.register_global(**default_global) self.config.register_global(**default_global)
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
async def red_delete_data_for_user(
self,
*,
requester: Literal["discord_deleted_user", "owner", "user", "user_strict"],
user_id: int,
):
if requester not in ["discord_deleted_user", "owner"]:
return
all_guilds = await self.config.all_guilds()
async for guild_id, guild_data in AsyncIter(all_guilds.items(), steps=100):
if user_id in guild_data["flags"]:
await self.config.guild_from_id(guild_id).flags.clear_raw(user_id)
@checks.is_owner() @checks.is_owner()
@commands.guild_only() @commands.guild_only()
@commands.command() @commands.command()
@ -29,7 +46,7 @@ class Flag(Cog):
"""Clears all flags for all members in this server""" """Clears all flags for all members in this server"""
await self.config.guild(ctx.guild).flags.clear() await self.config.guild(ctx.guild).flags.clear()
await ctx.send("Done") await ctx.maybe_send_embed("Done")
@checks.mod_or_permissions(manage_roles=True) @checks.mod_or_permissions(manage_roles=True)
@commands.guild_only() @commands.guild_only()
@ -49,7 +66,7 @@ class Flag(Cog):
Set the number of days for flags to expire after for server Set the number of days for flags to expire after for server
""" """
await self.config.guild(ctx.guild).days.set(days) await self.config.guild(ctx.guild).days.set(days)
await ctx.send("Number of days for new flags to expire is now {} days".format(days)) await ctx.maybe_send_embed("Number of days for new flags to expire is now {} days".format(days))
@flagset.command(name="dm") @flagset.command(name="dm")
async def flagset_dm(self, ctx: commands.Context): async def flagset_dm(self, ctx: commands.Context):
@ -58,7 +75,7 @@ class Flag(Cog):
dm = await self.config.guild(ctx.guild).dm() dm = await self.config.guild(ctx.guild).dm()
await self.config.guild(ctx.guild).dm.set(not dm) await self.config.guild(ctx.guild).dm.set(not dm)
await ctx.send("DM-ing members when they get a flag is now set to **{}**".format(not dm)) await ctx.maybe_send_embed("DM-ing members when they get a flag is now set to **{}**".format(not dm))
@staticmethod @staticmethod
def _flag_template(): def _flag_template():
@ -97,9 +114,9 @@ class Flag(Cog):
try: try:
await member.send(embed=outembed) await member.send(embed=outembed)
except discord.Forbidden: except discord.Forbidden:
await ctx.send("DM-ing user failed") await ctx.maybe_send_embed("DM-ing user failed")
else: else:
await ctx.send("This member has no flags.. somehow..") await ctx.maybe_send_embed("This member has no flags.. somehow..")
@commands.guild_only() @commands.guild_only()
@checks.mod_or_permissions(manage_roles=True) @checks.mod_or_permissions(manage_roles=True)
@ -111,7 +128,7 @@ class Flag(Cog):
await self.config.guild(guild).flags.set_raw(str(member.id), value=[]) await self.config.guild(guild).flags.set_raw(str(member.id), value=[])
await ctx.send("Success!") await ctx.maybe_send_embed("Success!")
@commands.guild_only() @commands.guild_only()
@commands.command(aliases=["flaglist"]) @commands.command(aliases=["flaglist"])
@ -125,7 +142,7 @@ class Flag(Cog):
if outembed: if outembed:
await ctx.send(embed=outembed) await ctx.send(embed=outembed)
else: else:
await ctx.send("This member has no flags!") await ctx.maybe_send_embed("This member has no flags!")
@commands.guild_only() @commands.guild_only()
@commands.command(aliases=["flagall"]) @commands.command(aliases=["flagall"])

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Add expiring flags on members to track warnings or incidents", "description": "Add expiring flags on members to track warnings or incidents",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing Flag! Get started with `[p]load flag` and `[p]help Flag`", "install_msg": "Thank you for installing Flag! Get started with `[p]load flag` and `[p]help Flag`",
"short": "Add expiring flags to members", "short": "Add expiring flags to members",
"end_user_data_statement": "This cog stores user IDs listed along with a provided explanation for being flagged",
"tags": [ "tags": [
"bobloy", "bobloy",
"warning", "warning",

@ -21,6 +21,10 @@ class ForceMention(Cog):
self.config.register_global(**default_global) self.config.register_global(**default_global)
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@checks.admin_or_permissions(manage_roles=True) @checks.admin_or_permissions(manage_roles=True)
@commands.command() @commands.command()
async def forcemention(self, ctx: commands.Context, role: str, *, message=""): async def forcemention(self, ctx: commands.Context, role: str, *, message=""):

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Mentions roles that are unmentionable", "description": "Mentions roles that are unmentionable",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing ForceMention! Get started with `[p]load forcemention`, then `[p]forcemention`", "install_msg": "Thank you for installing ForceMention! Get started with `[p]load forcemention`, then `[p]forcemention`",
"short": "Mention unmentionables", "short": "Mention unmentionables",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"utils" "utils"

@ -14,6 +14,7 @@ class Hangman(Cog):
letters = "🇦🇧🇨🇩🇪🇫🇬🇭🇮🇯🇰🇱🇲🇳🇴🇵🇶🇷🇸🇹🇺🇻🇼🇽🇾🇿" letters = "🇦🇧🇨🇩🇪🇫🇬🇭🇮🇯🇰🇱🇲🇳🇴🇵🇶🇷🇸🇹🇺🇻🇼🇽🇾🇿"
def __init__(self, bot): def __init__(self, bot):
super().__init__()
self.bot = bot self.bot = bot
self.config = Config.get_conf(self, identifier=1049711010310997110) self.config = Config.get_conf(self, identifier=1049711010310997110)
default_guild = {"theface": ":thinking:", "emojis": True} default_guild = {"theface": ":thinking:", "emojis": True}
@ -39,6 +40,10 @@ class Hangman(Cog):
self.hanglist = {} self.hanglist = {}
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
async def _update_hanglist(self): async def _update_hanglist(self):
for guild in self.bot.guilds: for guild in self.bot.guilds:
theface = await self.config.guild(guild).theface() theface = await self.config.guild(guild).theface()
@ -154,19 +159,19 @@ class Hangman(Cog):
theface = self.bot.get_emoji(int(theface.split(":")[2][:-1])) theface = self.bot.get_emoji(int(theface.split(":")[2][:-1]))
if theface is None: if theface is None:
await ctx.send("I could not find that emoji") await ctx.maybe_send_embed("I could not find that emoji")
return return
try: try:
# Use the face as reaction to see if it's valid (THANKS FLAPJACK <3) # Use the face as reaction to see if it's valid (THANKS FLAPJACK <3)
await message.add_reaction(theface) await message.add_reaction(theface)
except discord.errors.HTTPException: except discord.errors.HTTPException:
await ctx.send("That's not an emoji I recognize.") await ctx.maybe_send_embed("That's not an emoji I recognize.")
return return
await self.config.guild(ctx.guild).theface.set(str(theface)) await self.config.guild(ctx.guild).theface.set(str(theface))
await self._update_hanglist() await self._update_hanglist()
await ctx.send("Face has been updated!") await ctx.maybe_send_embed("Face has been updated!")
@hangset.command() @hangset.command()
async def toggleemoji(self, ctx: commands.Context): async def toggleemoji(self, ctx: commands.Context):
@ -174,26 +179,26 @@ class Hangman(Cog):
current = await self.config.guild(ctx.guild).emojis() current = await self.config.guild(ctx.guild).emojis()
await self.config.guild(ctx.guild).emojis.set(not current) await self.config.guild(ctx.guild).emojis.set(not current)
await ctx.send("Emoji Letter reactions have been set to {}".format(not current)) await ctx.maybe_send_embed("Emoji Letter reactions have been set to {}".format(not current))
@commands.command(aliases=["hang"]) @commands.command(aliases=["hang"])
async def hangman(self, ctx, guess: str = None): async def hangman(self, ctx, guess: str = None):
"""Play a game of hangman against the bot!""" """Play a game of hangman against the bot!"""
if guess is None: if guess is None:
if self.the_data[ctx.guild]["running"]: if self.the_data[ctx.guild]["running"]:
await ctx.send("Game of hangman is already running!\nEnter your guess!") await ctx.maybe_send_embed("Game of hangman is already running!\nEnter your guess!")
await self._printgame(ctx.channel) await self._printgame(ctx.channel)
"""await self.bot.send_cmd_help(ctx)""" """await self.bot.send_cmd_help(ctx)"""
else: else:
await ctx.send("Starting a game of hangman!") await ctx.maybe_send_embed("Starting a game of hangman!")
self._startgame(ctx.guild) self._startgame(ctx.guild)
await self._printgame(ctx.channel) await self._printgame(ctx.channel)
elif not self.the_data[ctx.guild]["running"]: elif not self.the_data[ctx.guild]["running"]:
await ctx.send("Game of hangman is not yet running!\nStarting a game of hangman!") await ctx.maybe_send_embed("Game of hangman is not yet running!\nStarting a game of hangman!")
self._startgame(ctx.guild) self._startgame(ctx.guild)
await self._printgame(ctx.channel) await self._printgame(ctx.channel)
else: else:
await ctx.send("Guess by reacting to the message") await ctx.maybe_send_embed("Guess by reacting to the message")
# await self._guessletter(guess, ctx.channel) # await self._guessletter(guess, ctx.channel)
def _startgame(self, guild): def _startgame(self, guild):

@ -2,16 +2,13 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Play Hangman with your friends", "description": "Play Hangman with your friends",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing Hangman! Get started with `[p]load hangman`, then `[p]help Hangman`", "install_msg": "Thank you for installing Hangman! Get started with `[p]load hangman`, then `[p]help Hangman`",
"requirements": [], "requirements": [],
"short": "Play Hangman", "short": "Play Hangman",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"game", "game",
"fun", "fun",

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Create a channel with updating server info", "description": "Create a channel with updating server info",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing InfoChannel. Get started with `[p]load infochannel`, then `[p]help InfoChannel`", "install_msg": "Thank you for installing InfoChannel. Get started with `[p]load infochannel`, then `[p]help InfoChannel`",
"short": "Updating server info channel", "short": "Updating server info channel",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"utils" "utils"

@ -41,6 +41,10 @@ class InfoChannel(Cog):
self._critical_section_wooah_ = 0 self._critical_section_wooah_ = 0
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command() @commands.command()
@checks.admin() @checks.admin()
async def infochannel(self, ctx: commands.Context): async def infochannel(self, ctx: commands.Context):

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Keeps track of when people leave the server, and posts a message notifying", "description": "Keeps track of when people leave the server, and posts a message notifying",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing Leaver. Get started with `[p]load leaver`, then `[p]help Leaver`", "install_msg": "Thank you for installing Leaver. Get started with `[p]load leaver`, then `[p]help Leaver`",
"short": "Send message on leave", "short": "Send message on leave",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"utils", "utils",

@ -10,12 +10,17 @@ class Leaver(Cog):
""" """
def __init__(self, bot: Red): def __init__(self, bot: Red):
super().__init__()
self.bot = bot self.bot = bot
self.config = Config.get_conf(self, identifier=9811198108111121, force_registration=True) self.config = Config.get_conf(self, identifier=9811198108111121, force_registration=True)
default_guild = {"channel": ""} default_guild = {"channel": ""}
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.group(aliases=["setleaver"]) @commands.group(aliases=["setleaver"])
@checks.mod_or_permissions(administrator=True) @checks.mod_or_permissions(administrator=True)
async def leaverset(self, ctx): async def leaverset(self, ctx):
@ -28,7 +33,7 @@ class Leaver(Cog):
"""Choose the channel to send leave messages to""" """Choose the channel to send leave messages to"""
guild = ctx.guild guild = ctx.guild
await self.config.guild(guild).channel.set(ctx.channel.id) await self.config.guild(guild).channel.set(ctx.channel.id)
await ctx.send("Channel set to " + ctx.channel.name) await ctx.maybe_send_embed("Channel set to " + ctx.channel.name)
@commands.Cog.listener() @commands.Cog.listener()
async def on_member_remove(self, member: discord.Member): async def on_member_remove(self, member: discord.Member):

@ -3,11 +3,7 @@
"Bobloy", "Bobloy",
"SnappyDragon" "SnappyDragon"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Calculate the love percentage for two users", "description": "Calculate the love percentage for two users",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing LoveCalculator. Love is in the air.\n Get started with `[p]load lovecalculator`, then `[p]help LoveCalculator`", "install_msg": "Thank you for installing LoveCalculator. Love is in the air.\n Get started with `[p]load lovecalculator`, then `[p]help LoveCalculator`",
@ -15,6 +11,7 @@
"beautifulsoup4" "beautifulsoup4"
], ],
"short": "Calculate love percentage", "short": "Calculate love percentage",
"end_user_data_statement": "This cog uses the core Bank cog. It store no End User Data otherwise.",
"tags": [ "tags": [
"bobloy", "bobloy",
"fun", "fun",

@ -9,8 +9,13 @@ class LoveCalculator(Cog):
"""Calculate the love percentage for two users!""" """Calculate the love percentage for two users!"""
def __init__(self, bot): def __init__(self, bot):
super().__init__()
self.bot = bot self.bot = bot
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command(aliases=["lovecalc"]) @commands.command(aliases=["lovecalc"])
async def lovecalculator( async def lovecalculator(
self, ctx: commands.Context, lover: discord.Member, loved: discord.Member self, ctx: commands.Context, lover: discord.Member, loved: discord.Member

@ -2,16 +2,15 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Keep track of when users were last seen online", "description": "Keep track of when users were last seen online",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing LastSeen. Get started with `[p]load lseen`, then `[p]help LastSeen`", "install_msg": "Thank you for installing LastSeen. Get started with `[p]load lseen`, then `[p]help LastSeen`",
"requirements": ["python-dateutil"], "requirements": [
"python-dateutil"
],
"short": "Last seen tracker", "short": "Last seen tracker",
"end_user_data_statement": "This cog stores user IDs along with a time they were last online per guild",
"tags": [ "tags": [
"bobloy", "bobloy",
"utils", "utils",

@ -1,10 +1,12 @@
from datetime import datetime from datetime import datetime
from typing import Literal
import dateutil.parser import dateutil.parser
import discord import discord
from redbot.core import Config, commands from redbot.core import Config, commands
from redbot.core.bot import Red from redbot.core.bot import Red
from redbot.core.commands import Cog from redbot.core.commands import Cog
from redbot.core.utils import AsyncIter
class LastSeen(Cog): class LastSeen(Cog):
@ -28,6 +30,19 @@ class LastSeen(Cog):
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
self.config.register_member(**default_member) self.config.register_member(**default_member)
async def red_delete_data_for_user(
self,
*,
requester: Literal["discord_deleted_user", "owner", "user", "user_strict"],
user_id: int,
):
all_members = await self.config.all_members()
async for guild_id, guild_data in AsyncIter(all_members.items(), steps=100):
if user_id in guild_data:
await self.config.member_from_ids(guild_id, user_id).clear()
@staticmethod @staticmethod
def get_date_time(s): def get_date_time(s):
d = dateutil.parser.parse(s) d = dateutil.parser.parse(s)
@ -45,7 +60,7 @@ class LastSeen(Cog):
enabled = not await self.config.guild(ctx.guild).enabled() enabled = not await self.config.guild(ctx.guild).enabled()
await self.config.guild(ctx.guild).enabled.set(enabled) await self.config.guild(ctx.guild).enabled.set(enabled)
await ctx.send( await ctx.maybe_send_embed(
"Seen for this server is now {}".format("Enabled" if enabled else "Disabled") "Seen for this server is now {}".format("Enabled" if enabled else "Disabled")
) )
@ -60,7 +75,7 @@ class LastSeen(Cog):
else: else:
last_seen = await self.config.member(member).seen() last_seen = await self.config.member(member).seen()
if last_seen is None: if last_seen is None:
await ctx.send(embed=discord.Embed(description="I've never seen this user")) await ctx.maybe_send_embed(embed=discord.Embed(description="I've never seen this user"))
return return
last_seen = self.get_date_time(last_seen) last_seen = self.get_date_time(last_seen)

@ -2,11 +2,7 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"min_bot_version": [ "min_bot_version": "3.3.11",
3,
3,
11
],
"description": "Monitor images for NSFW content and moves them to a nsfw channel if possible", "description": "Monitor images for NSFW content and moves them to a nsfw channel if possible",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing Nudity. Get started with `[p]load nudity`, then `[p]help Nudity`", "install_msg": "Thank you for installing Nudity. Get started with `[p]load nudity`, then `[p]help Nudity`",

@ -4,16 +4,13 @@
"SnappyDragon", "SnappyDragon",
"PaddoInWonderland" "PaddoInWonderland"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Grow your own plants! Be sure to take care of it. Do `[p]gardening` to get started", "description": "Grow your own plants! Be sure to take care of it. Do `[p]gardening` to get started",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing PlantTycoon. Check out all the commands with `[p]help PlantTycoon`", "install_msg": "Thank you for installing PlantTycoon. Check out all the commands with `[p]help PlantTycoon`",
"requirements": [], "requirements": [],
"short": "Grow your own plants! Do `[p]gardening` to get started.", "short": "Grow your own plants! Do `[p]gardening` to get started.",
"end_user_data_statement": "This cog stores user IDs along with their progress in the PlantTycoon game",
"tags": [ "tags": [
"bobloy", "bobloy",
"games", "games",

@ -5,18 +5,19 @@ import datetime
import json import json
import time import time
from random import choice from random import choice
from typing import Literal
import discord import discord
from redbot.core import Config, bank, commands from redbot.core import Config, bank, commands
from redbot.core.bot import Red from redbot.core.bot import Red
from redbot.core.data_manager import bundled_data_path from redbot.core.data_manager import bundled_data_path
from redbot.core.utils import AsyncIter
class Gardener(commands.Cog): class Gardener:
"""Gardener class""" """Gardener class"""
def __init__(self, user: discord.User, config: Config): def __init__(self, user: discord.User, config: Config):
super().__init__()
self.user = user self.user = user
self.config = config self.config = config
self.badges = [] self.badges = []
@ -180,7 +181,17 @@ class PlantTycoon(commands.Cog):
# self.bank = bot.get_cog('Economy').bank # self.bank = bot.get_cog('Economy').bank
async def red_delete_data_for_user(
self,
*,
requester: Literal["discord_deleted_user", "owner", "user", "user_strict"],
user_id: int,
):
await self.config.user_from_id(user_id).clear()
async def _load_plants_products(self): async def _load_plants_products(self):
"""Runs in __init__.py before cog is added to the bot"""
plant_path = bundled_data_path(self) / "plants.json" plant_path = bundled_data_path(self) / "plants.json"
product_path = bundled_data_path(self) / "products.json" product_path = bundled_data_path(self) / "products.json"
with plant_path.open() as json_data: with plant_path.open() as json_data:

@ -2,11 +2,7 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Create a QR code invite for the server", "description": "Create a QR code invite for the server",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing QRInvite! Get started with `[p]load qrinvite`, then `[p]help QRInvite`", "install_msg": "Thank you for installing QRInvite! Get started with `[p]load qrinvite`, then `[p]help QRInvite`",
@ -14,6 +10,7 @@
"MyQR" "MyQR"
], ],
"short": "Create a QR code invite", "short": "Create a QR code invite",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"tools", "tools",

@ -25,6 +25,10 @@ class QRInvite(Cog):
self.config.register_global(**default_global) self.config.register_global(**default_global)
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command() @commands.command()
async def qrinvite( async def qrinvite(
self, self,
@ -44,7 +48,7 @@ class QRInvite(Cog):
invite = await ctx.channel.invites() invite = await ctx.channel.invites()
invite = invite[0] invite = invite[0]
except discord.Forbidden: except discord.Forbidden:
await ctx.send("No permission to get an invite, please provide one") await ctx.maybe_send_embed("No permission to get an invite, please provide one")
return return
invite = invite.code invite = invite.code
@ -52,7 +56,7 @@ class QRInvite(Cog):
image_url = str(ctx.guild.icon_url) image_url = str(ctx.guild.icon_url)
if image_url == "": # Still if image_url == "": # Still
await ctx.send( await ctx.maybe_send_embed(
"Could not get an image, please provide one. *(`{}help qrinvite` for details)*".format( "Could not get an image, please provide one. *(`{}help qrinvite` for details)*".format(
ctx.prefix ctx.prefix
) )
@ -73,12 +77,12 @@ class QRInvite(Cog):
if extension == "webp": if extension == "webp":
new_path = convert_webp_to_png(str(image_path)) new_path = convert_webp_to_png(str(image_path))
elif extension == "gif": elif extension == "gif":
await ctx.send("gif is not supported yet, stay tuned") await ctx.maybe_send_embed("gif is not supported yet, stay tuned")
return return
elif extension == "png": elif extension == "png":
new_path = str(image_path) new_path = str(image_path)
else: else:
await ctx.send(f"{extension} is not supported yet, stay tuned") await ctx.maybe_send_embed(f"{extension} is not supported yet, stay tuned")
return return
myqr.run( myqr.run(

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Cog to prevent reactions on specific messages from certain users", "description": "Cog to prevent reactions on specific messages from certain users",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing ReactRestrict.", "install_msg": "Thank you for installing ReactRestrict.",
"short": "Prevent reactions to messages", "short": "Prevent reactions to messages",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"react", "react",
"reaction", "reaction",

@ -35,6 +35,10 @@ class ReactRestrict(Cog):
) )
self.config.register_global(registered_combos=[]) self.config.register_global(registered_combos=[])
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
async def combo_list(self) -> List[ReactRestrictCombo]: async def combo_list(self) -> List[ReactRestrictCombo]:
""" """
Returns a list of reactrestrict combos. Returns a list of reactrestrict combos.
@ -209,7 +213,7 @@ class ReactRestrict(Cog):
""" """
message = await self._get_message(ctx, message_id) message = await self._get_message(ctx, message_id)
if message is None: if message is None:
await ctx.send("That message doesn't seem to exist.") await ctx.maybe_send_embed("That message doesn't seem to exist.")
return return
# try: # try:
@ -228,7 +232,7 @@ class ReactRestrict(Cog):
# noinspection PyTypeChecker # noinspection PyTypeChecker
await self.add_reactrestrict(message_id, role) await self.add_reactrestrict(message_id, role)
await ctx.send("Message|Role combo added.") await ctx.maybe_send_embed("Message|Role combo added.")
@reactrestrict.command() @reactrestrict.command()
async def remove(self, ctx: commands.Context, message_id: int, role: discord.Role): async def remove(self, ctx: commands.Context, message_id: int, role: discord.Role):

@ -3,15 +3,12 @@
"Bobloy", "Bobloy",
"SnappyDragon" "SnappyDragon"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Apply for a job at the recycling plant! Sort out the garbage!", "description": "Apply for a job at the recycling plant! Sort out the garbage!",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing RecyclingPlant. Start recycling today with `[p]load recyclingplant`, then `[p]recyclingplant`", "install_msg": "Thank you for installing RecyclingPlant. Start recycling today with `[p]load recyclingplant`, then `[p]recyclingplant`",
"short": "Apply for a job at the recycling plant!", "short": "Apply for a job at the recycling plant!",
"end_user_data_statement": "This cog used the core",
"tags": [ "tags": [
"bobloy", "bobloy",
"environment", "environment",

@ -15,6 +15,10 @@ class RecyclingPlant(Cog):
self.bot = bot self.bot = bot
self.junk = None self.junk = None
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
def load_junk(self): def load_junk(self):
junk_path = bundled_data_path(self) / "junk.json" junk_path = bundled_data_path(self) / "junk.json"
with junk_path.open() as json_data: with junk_path.open() as json_data:

@ -3,16 +3,13 @@
"Bobloy", "Bobloy",
"SnappyDragon" "SnappyDragon"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Play Rock Papers Scissor Lizard Spock by Sam Kass in Discord!", "description": "Play Rock Papers Scissor Lizard Spock by Sam Kass in Discord!",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing RPSLS. Get started with `[p]load rpsls`, then `[p]rpsls`", "install_msg": "Thank you for installing RPSLS. Get started with `[p]load rpsls`, then `[p]rpsls`",
"requirements": [], "requirements": [],
"short": "Play Rock Papers Scissor Lizard Spock in Discord!", "short": "Play Rock Papers Scissor Lizard Spock in Discord!",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"star trek", "star trek",

@ -21,6 +21,10 @@ class RPSLS(Cog):
super().__init__() super().__init__()
self.bot = bot self.bot = bot
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command() @commands.command()
async def rpsls(self, ctx: commands.Context, choice: str): async def rpsls(self, ctx: commands.Context, choice: str):
""" """

@ -2,16 +2,15 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Convert any website into text and post it in chat", "description": "Convert any website into text and post it in chat",
"hidden": true, "hidden": true,
"install_msg": "Thank you for installing SayUrl! Get started with `[p]load sayurl`, then `[p]help SayUrl", "install_msg": "Thank you for installing SayUrl! Get started with `[p]load sayurl`, then `[p]help SayUrl",
"requirements": ["html2text"], "requirements": [
"html2text"
],
"short": "Convert URL to text", "short": "Convert URL to text",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"tools" "tools"

@ -27,6 +27,10 @@ class SayUrl(Cog):
self.config.register_global(**default_global) self.config.register_global(**default_global)
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command() @commands.command()
async def sayurl(self, ctx: commands.Context, url): async def sayurl(self, ctx: commands.Context, url):
""" """

@ -3,16 +3,13 @@
"Bobloy", "Bobloy",
"SnappyDragon" "SnappyDragon"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Look up SCP articles. Warning: Some of them may be too creepy or gruesome.", "description": "Look up SCP articles. Warning: Some of them may be too creepy or gruesome.",
"hidden": false, "hidden": false,
"install_msg": "You are now connected to the SCP database. You may now proceed to access the data using `[p]load scp`, then `[p]help SCP`", "install_msg": "You are now connected to the SCP database. You may now proceed to access the data using `[p]load scp`, then `[p]help SCP`",
"requirements": [], "requirements": [],
"short": "Look up SCP articles.", "short": "Look up SCP articles.",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"gruesom" "gruesom"

@ -11,6 +11,10 @@ class SCP(Cog):
super().__init__() super().__init__()
self.bot = bot self.bot = bot
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command() @commands.command()
async def scp(self, ctx: commands.Context, num: int): async def scp(self, ctx: commands.Context, num: int):
"""Look up SCP articles. """Look up SCP articles.

@ -2,16 +2,13 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Steals custom emojis the bot sees and moves them to an emoji server", "description": "Steals custom emojis the bot sees and moves them to an emoji server",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing StealEmoji", "install_msg": "Thank you for installing StealEmoji",
"requirements": [], "requirements": [],
"short": "Steals custom emojis", "short": "Steals custom emojis",
"end_user_data_statement": "This cog gathers custom emojis from all sources, but stores no End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"utils", "utils",

@ -49,6 +49,10 @@ class StealEmoji(Cog):
self.is_on = None self.is_on = None
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.group() @commands.group()
async def stealemoji(self, ctx: commands.Context): async def stealemoji(self, ctx: commands.Context):
""" """
@ -100,14 +104,14 @@ class StealEmoji(Cog):
if not curr_setting: if not curr_setting:
await self.config.notify.set(1) await self.config.notify.set(1)
await ctx.send("Bot owner will now be notified when an emoji is stolen") await ctx.maybe_send_embed("Bot owner will now be notified when an emoji is stolen")
elif curr_setting == 1: elif curr_setting == 1:
channel: discord.TextChannel = ctx.channel channel: discord.TextChannel = ctx.channel
await self.config.notify.set(channel.id) await self.config.notify.set(channel.id)
await ctx.send("This channel will now be notified when an emoji is stolen") await ctx.maybe_send_embed("This channel will now be notified when an emoji is stolen")
else: else:
await self.config.notify.set(0) await self.config.notify.set(0)
await ctx.send("Notifications are now off") await ctx.maybe_send_embed("Notifications are now off")
@checks.is_owner() @checks.is_owner()
@stealemoji.command(name="collect") @stealemoji.command(name="collect")
@ -118,7 +122,7 @@ class StealEmoji(Cog):
self.is_on = await self.config.on() self.is_on = await self.config.on()
await ctx.send("Collection is now " + str(not curr_setting)) await ctx.maybe_send_embed("Collection is now " + str(not curr_setting))
@checks.is_owner() @checks.is_owner()
@commands.guild_only() @commands.guild_only()
@ -136,12 +140,12 @@ class StealEmoji(Cog):
already_a_guildbank = ctx.guild.id in (await self.config.guildbanks()) already_a_guildbank = ctx.guild.id in (await self.config.guildbanks())
if already_a_guildbank: if already_a_guildbank:
await ctx.send( await ctx.maybe_send_embed(
"This is already an emoji bank\n" "This is already an emoji bank\n"
"Are you sure you want to remove the current server from the emoji bank list? (y/n)" "Are you sure you want to remove the current server from the emoji bank list? (y/n)"
) )
else: else:
await ctx.send( await ctx.maybe_send_embed(
"This will upload custom emojis to this server\n" "This will upload custom emojis to this server\n"
"Are you sure you want to make the current server an emoji bank? (y/n)" "Are you sure you want to make the current server an emoji bank? (y/n)"
) )
@ -149,7 +153,7 @@ class StealEmoji(Cog):
msg = await self.bot.wait_for("message", check=check) msg = await self.bot.wait_for("message", check=check)
if msg.content.upper() in ["N", "NO"]: if msg.content.upper() in ["N", "NO"]:
await ctx.send("Cancelled") await ctx.maybe_send_embed("Cancelled")
return return
async with self.config.guildbanks() as guildbanks: async with self.config.guildbanks() as guildbanks:
@ -159,9 +163,9 @@ class StealEmoji(Cog):
guildbanks.append(ctx.guild.id) guildbanks.append(ctx.guild.id)
if already_a_guildbank: if already_a_guildbank:
await ctx.send("This server has been removed from being an emoji bank") await ctx.maybe_send_embed("This server has been removed from being an emoji bank")
else: else:
await ctx.send("This server has been added to be an emoji bank") await ctx.maybe_send_embed("This server has been added to be an emoji bank")
@commands.Cog.listener() @commands.Cog.listener()
async def on_reaction_add(self, reaction: discord.Reaction, user: discord.User): async def on_reaction_add(self, reaction: discord.Reaction, user: discord.User):

@ -2,15 +2,12 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Apply roles based on the # of days on server", "description": "Apply roles based on the # of days on server",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing timerole.\nGet started with `[p]load timerole`. Configure with `[p]timerole`", "install_msg": "Thank you for installing timerole.\nGet started with `[p]load timerole`. Configure with `[p]timerole`",
"short": "Apply roles after # of days", "short": "Apply roles after # of days",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"utilities", "utilities",

@ -22,6 +22,10 @@ class Timerole(Cog):
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
self.updating = self.bot.loop.create_task(self.check_day()) self.updating = self.bot.loop.create_task(self.check_day())
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
def cog_unload(self): def cog_unload(self):
self.updating.cancel() self.updating.cancel()

@ -2,11 +2,7 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Send Text2Speech messages as an uploaded mp3", "description": "Send Text2Speech messages as an uploaded mp3",
"hidden": false, "hidden": false,
"install_msg": "Thank you for installing TTS. Get started with `[p]load tts`, then `[p]help TTS`", "install_msg": "Thank you for installing TTS. Get started with `[p]load tts`, then `[p]help TTS`",
@ -14,6 +10,7 @@
"gTTS" "gTTS"
], ],
"short": "Send TTS messages as uploaded mp3", "short": "Send TTS messages as uploaded mp3",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"utils", "utils",

@ -23,6 +23,10 @@ class TTS(Cog):
self.config.register_global(**default_global) self.config.register_global(**default_global)
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command(aliases=["t2s", "text2"]) @commands.command(aliases=["t2s", "text2"])
async def tts(self, ctx: commands.Context, *, text: str): async def tts(self, ctx: commands.Context, *, text: str):
""" """

@ -3,16 +3,13 @@
"Bobloy", "Bobloy",
"SnappyDragon" "SnappyDragon"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Encode/Decode Unicode characters!", "description": "Encode/Decode Unicode characters!",
"hidden": false, "hidden": false,
"install_msg": "\u0048\u0065\u006c\u006c\u006f\u0021 \u0054\u0068\u0069\u0073 \u006d\u0065\u0073\u0073\u0061\u0067\u0065 \u0077\u0061\u0073 \u0077\u0072\u0069\u0074\u0074\u0065\u006e \u0069\u006e \u0055\u004e\u0049\u0043\u004f\u0044\u0045\u002e", "install_msg": "\u0048\u0065\u006c\u006c\u006f\u0021 \u0054\u0068\u0069\u0073 \u006d\u0065\u0073\u0073\u0061\u0067\u0065 \u0077\u0061\u0073 \u0077\u0072\u0069\u0074\u0074\u0065\u006e \u0069\u006e \u0055\u004e\u0049\u0043\u004f\u0044\u0045\u002e",
"requirements": [], "requirements": [],
"short": "Encode/Decode Unicode characters!", "short": "Encode/Decode Unicode characters!",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [ "tags": [
"bobloy", "bobloy",
"utility", "utility",

@ -12,6 +12,10 @@ class Unicode(Cog):
super().__init__() super().__init__()
self.bot = bot self.bot = bot
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.group(name="unicode", pass_context=True) @commands.group(name="unicode", pass_context=True)
async def unicode(self, ctx): async def unicode(self, ctx):
"""Encode/Decode a Unicode character.""" """Encode/Decode a Unicode character."""

@ -97,7 +97,7 @@ class Game:
await self.get_roles(ctx) await self.get_roles(ctx)
if len(self.players) != len(self.roles): if len(self.players) != len(self.roles):
await ctx.send("Player count does not match role count, cannot start\n" await ctx.maybe_send_embed("Player count does not match role count, cannot start\n"
"Currently **{} / {}**\n" "Currently **{} / {}**\n"
"Use `{}ww code` to pick a new game" "Use `{}ww code` to pick a new game"
"".format(len(self.players), len(self.roles), ctx.prefix)) "".format(len(self.players), len(self.roles), ctx.prefix))
@ -112,7 +112,7 @@ class Game:
reason="(BOT) Werewolf game role") reason="(BOT) Werewolf game role")
self.to_delete.add(self.game_role) self.to_delete.add(self.game_role)
except (discord.Forbidden, discord.HTTPException): except (discord.Forbidden, discord.HTTPException):
await ctx.send("Game role not configured and unable to generate one, cannot start") await ctx.maybe_send_embed("Game role not configured and unable to generate one, cannot start")
self.roles = [] self.roles = []
return False return False
try: try:

@ -2,16 +2,13 @@
"author": [ "author": [
"Bobloy" "Bobloy"
], ],
"bot_version": [ "min_bot_version": "3.3.0",
3,
0,
0
],
"description": "Customizable Werewolf Game", "description": "Customizable Werewolf Game",
"hidden": false, "hidden": true,
"install_msg": "Thank you for installing Werewolf! Get started with `[p]load werewolf`\n Use `[p]wwset` to run inital setup", "install_msg": "Thank you for installing Werewolf! Get started with `[p]load werewolf`\n Use `[p]wwset` to run inital setup",
"requirements": [], "requirements": [],
"short": "Werewolf Game", "short": "Werewolf Game",
"end_user_data_statement": "This store user IDs in memory while they're actively using the cog, and store no persistent End User Data.",
"tags": [ "tags": [
"mafia", "mafia",
"werewolf", "werewolf",

@ -20,6 +20,7 @@ class Werewolf(Cog):
""" """
def __init__(self, bot: Red): def __init__(self, bot: Red):
super().__init__()
self.bot = bot self.bot = bot
self.config = Config.get_conf( self.config = Config.get_conf(
self, identifier=87101114101119111108102, force_registration=True self, identifier=87101114101119111108102, force_registration=True
@ -37,6 +38,10 @@ class Werewolf(Cog):
self.games = {} # Active games stored here, id is per guild self.games = {} # Active games stored here, id is per guild
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
def __unload(self): def __unload(self):
print("Unload called") print("Unload called")
for game in self.games.values(): for game in self.games.values():

Loading…
Cancel
Save