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_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
async def _get_msgs(self):
return DEFAULT_MESSAGES + await self.config.messages()

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

@ -2,15 +2,12 @@
"author": [
"Bobloy"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Start an Audio Trivia game",
"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`",
"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": [
"fox",
"bobloy",

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

@ -2,15 +2,12 @@
"author": [
"Bobloy"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Creates custom commands to adjust roles and send custom messages",
"hidden": false,
"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",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [
"fox",
"bobloy",

@ -3,6 +3,7 @@ import logging
import os
import pathlib
from datetime import datetime, timedelta
from typing import Literal
import discord
from chatterbot import ChatBot
@ -13,6 +14,7 @@ from redbot.core import Config, commands
from redbot.core.commands import Cog
from redbot.core.data_manager import cog_data_path
from redbot.core.utils.predicates import MessagePredicate
from redbot.core.utils import AsyncIter
log = logging.getLogger("red.fox_v3.chat")
@ -65,6 +67,10 @@ class Chatter(Cog):
self.loop = asyncio.get_event_loop()
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
def _create_chatbot(self):
return ChatBot(
@ -107,7 +113,7 @@ class Chatter(Cog):
for channel in ctx.guild.text_channels:
if in_channel:
channel = in_channel
await ctx.send("Gathering {}".format(channel.mention))
await ctx.maybe_send_embed("Gathering {}".format(channel.mention))
user = None
i = 0
send_time = after - timedelta(days=100) # Makes the first message a new message
@ -115,7 +121,7 @@ class Chatter(Cog):
try:
async for message in channel.history(
limit=None, after=after, oldest_first=True
limit=None, after=after, oldest_first=True
).filter(
predicate=predicate
): # type: discord.Message
@ -188,7 +194,7 @@ class Chatter(Cog):
"""
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"
"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
"""
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)
@ -325,9 +331,9 @@ class Chatter(Cog):
)
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:
await ctx.send("Error occurred :(")
await ctx.maybe_send_embed("Error occurred :(")
@chatter.command(name="trainubuntu")
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)
if future:
await ctx.send("Training successful!")
await ctx.maybe_send_embed("Training successful!")
else:
await ctx.send("Error occurred :(")
await ctx.maybe_send_embed("Error occurred :(")
@chatter.command()
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
"""
await ctx.send(
await ctx.maybe_send_embed(
"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"
"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)
if not conversation:
await ctx.send("Failed to gather training data")
await ctx.maybe_send_embed("Failed to gather training data")
return
await ctx.send(
await ctx.maybe_send_embed(
"Gather successful! Training begins now\n"
"(**This will take a long time, be patient. See console for progress**)"
)
@ -397,9 +403,9 @@ class Chatter(Cog):
pass
if future:
await ctx.send("Training successful!")
await ctx.maybe_send_embed("Training successful!")
else:
await ctx.send("Error occurred :(")
await ctx.maybe_send_embed("Error occurred :(")
@commands.Cog.listener()
async def on_message_without_command(self, message: discord.Message):

@ -2,11 +2,7 @@
"author": [
"Bobloy"
],
"bot_version": [
3,
3,
10
],
"min_bot_version": "3.3.10",
"description": "Create an offline chatbot that talks like your average member using Machine Learning",
"hidden": false,
"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"
],
"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": [
"chat",
"chatbot",

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

@ -2,16 +2,15 @@
"author": [
"Bobloy"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Lint python code posted in chat",
"hidden": true,
"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",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [
"bobloy",
"utils",

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

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

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

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

@ -1,9 +1,11 @@
from datetime import date, timedelta
from typing import Literal
import discord
from redbot.core import Config, checks, commands
from redbot.core.bot import Red
from redbot.core.commands import Cog
from redbot.core.utils import AsyncIter
from redbot.core.utils.chat_formatting import pagify
@ -22,6 +24,21 @@ class Flag(Cog):
self.config.register_global(**default_global)
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()
@commands.guild_only()
@commands.command()
@ -29,7 +46,7 @@ class Flag(Cog):
"""Clears all flags for all members in this server"""
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)
@commands.guild_only()
@ -49,7 +66,7 @@ class Flag(Cog):
Set the number of days for flags to expire after for server
"""
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")
async def flagset_dm(self, ctx: commands.Context):
@ -58,7 +75,7 @@ class Flag(Cog):
dm = await self.config.guild(ctx.guild).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
def _flag_template():
@ -97,9 +114,9 @@ class Flag(Cog):
try:
await member.send(embed=outembed)
except discord.Forbidden:
await ctx.send("DM-ing user failed")
await ctx.maybe_send_embed("DM-ing user failed")
else:
await ctx.send("This member has no flags.. somehow..")
await ctx.maybe_send_embed("This member has no flags.. somehow..")
@commands.guild_only()
@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 ctx.send("Success!")
await ctx.maybe_send_embed("Success!")
@commands.guild_only()
@commands.command(aliases=["flaglist"])
@ -125,7 +142,7 @@ class Flag(Cog):
if outembed:
await ctx.send(embed=outembed)
else:
await ctx.send("This member has no flags!")
await ctx.maybe_send_embed("This member has no flags!")
@commands.guild_only()
@commands.command(aliases=["flagall"])

@ -2,15 +2,12 @@
"author": [
"Bobloy"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Add expiring flags on members to track warnings or incidents",
"hidden": false,
"install_msg": "Thank you for installing Flag! Get started with `[p]load flag` and `[p]help Flag`",
"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": [
"bobloy",
"warning",

@ -21,6 +21,10 @@ class ForceMention(Cog):
self.config.register_global(**default_global)
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)
@commands.command()
async def forcemention(self, ctx: commands.Context, role: str, *, message=""):

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

@ -14,6 +14,7 @@ class Hangman(Cog):
letters = "🇦🇧🇨🇩🇪🇫🇬🇭🇮🇯🇰🇱🇲🇳🇴🇵🇶🇷🇸🇹🇺🇻🇼🇽🇾🇿"
def __init__(self, bot):
super().__init__()
self.bot = bot
self.config = Config.get_conf(self, identifier=1049711010310997110)
default_guild = {"theface": ":thinking:", "emojis": True}
@ -39,6 +40,10 @@ class Hangman(Cog):
self.hanglist = {}
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
async def _update_hanglist(self):
for guild in self.bot.guilds:
theface = await self.config.guild(guild).theface()
@ -154,19 +159,19 @@ class Hangman(Cog):
theface = self.bot.get_emoji(int(theface.split(":")[2][:-1]))
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
try:
# Use the face as reaction to see if it's valid (THANKS FLAPJACK <3)
await message.add_reaction(theface)
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
await self.config.guild(ctx.guild).theface.set(str(theface))
await self._update_hanglist()
await ctx.send("Face has been updated!")
await ctx.maybe_send_embed("Face has been updated!")
@hangset.command()
async def toggleemoji(self, ctx: commands.Context):
@ -174,26 +179,26 @@ class Hangman(Cog):
current = await self.config.guild(ctx.guild).emojis()
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"])
async def hangman(self, ctx, guess: str = None):
"""Play a game of hangman against the bot!"""
if guess is None:
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.bot.send_cmd_help(ctx)"""
else:
await ctx.send("Starting a game of hangman!")
await ctx.maybe_send_embed("Starting a game of hangman!")
self._startgame(ctx.guild)
await self._printgame(ctx.channel)
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)
await self._printgame(ctx.channel)
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)
def _startgame(self, guild):

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

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

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

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

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

@ -3,11 +3,7 @@
"Bobloy",
"SnappyDragon"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Calculate the love percentage for two users",
"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`",
@ -15,6 +11,7 @@
"beautifulsoup4"
],
"short": "Calculate love percentage",
"end_user_data_statement": "This cog uses the core Bank cog. It store no End User Data otherwise.",
"tags": [
"bobloy",
"fun",

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

@ -2,16 +2,15 @@
"author": [
"Bobloy"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Keep track of when users were last seen online",
"hidden": false,
"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",
"end_user_data_statement": "This cog stores user IDs along with a time they were last online per guild",
"tags": [
"bobloy",
"utils",

@ -1,10 +1,12 @@
from datetime import datetime
from typing import Literal
import dateutil.parser
import discord
from redbot.core import Config, commands
from redbot.core.bot import Red
from redbot.core.commands import Cog
from redbot.core.utils import AsyncIter
class LastSeen(Cog):
@ -28,6 +30,19 @@ class LastSeen(Cog):
self.config.register_guild(**default_guild)
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
def get_date_time(s):
d = dateutil.parser.parse(s)
@ -45,7 +60,7 @@ class LastSeen(Cog):
enabled = not await self.config.guild(ctx.guild).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")
)
@ -60,7 +75,7 @@ class LastSeen(Cog):
else:
last_seen = await self.config.member(member).seen()
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
last_seen = self.get_date_time(last_seen)

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

@ -4,16 +4,13 @@
"SnappyDragon",
"PaddoInWonderland"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Grow your own plants! Be sure to take care of it. Do `[p]gardening` to get started",
"hidden": false,
"install_msg": "Thank you for installing PlantTycoon. Check out all the commands with `[p]help PlantTycoon`",
"requirements": [],
"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": [
"bobloy",
"games",

@ -5,18 +5,19 @@ import datetime
import json
import time
from random import choice
from typing import Literal
import discord
from redbot.core import Config, bank, commands
from redbot.core.bot import Red
from redbot.core.data_manager import bundled_data_path
from redbot.core.utils import AsyncIter
class Gardener(commands.Cog):
class Gardener:
"""Gardener class"""
def __init__(self, user: discord.User, config: Config):
super().__init__()
self.user = user
self.config = config
self.badges = []
@ -180,7 +181,17 @@ class PlantTycoon(commands.Cog):
# 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):
"""Runs in __init__.py before cog is added to the bot"""
plant_path = bundled_data_path(self) / "plants.json"
product_path = bundled_data_path(self) / "products.json"
with plant_path.open() as json_data:

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

@ -25,6 +25,10 @@ class QRInvite(Cog):
self.config.register_global(**default_global)
self.config.register_guild(**default_guild)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command()
async def qrinvite(
self,
@ -44,7 +48,7 @@ class QRInvite(Cog):
invite = await ctx.channel.invites()
invite = invite[0]
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
invite = invite.code
@ -52,7 +56,7 @@ class QRInvite(Cog):
image_url = str(ctx.guild.icon_url)
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(
ctx.prefix
)
@ -73,12 +77,12 @@ class QRInvite(Cog):
if extension == "webp":
new_path = convert_webp_to_png(str(image_path))
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
elif extension == "png":
new_path = str(image_path)
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
myqr.run(

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

@ -35,6 +35,10 @@ class ReactRestrict(Cog):
)
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]:
"""
Returns a list of reactrestrict combos.
@ -209,7 +213,7 @@ class ReactRestrict(Cog):
"""
message = await self._get_message(ctx, message_id)
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
# try:
@ -228,7 +232,7 @@ class ReactRestrict(Cog):
# noinspection PyTypeChecker
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()
async def remove(self, ctx: commands.Context, message_id: int, role: discord.Role):

@ -3,15 +3,12 @@
"Bobloy",
"SnappyDragon"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Apply for a job at the recycling plant! Sort out the garbage!",
"hidden": false,
"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!",
"end_user_data_statement": "This cog used the core",
"tags": [
"bobloy",
"environment",

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

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

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

@ -2,16 +2,15 @@
"author": [
"Bobloy"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Convert any website into text and post it in chat",
"hidden": true,
"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",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [
"bobloy",
"tools"

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

@ -3,16 +3,13 @@
"Bobloy",
"SnappyDragon"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Look up SCP articles. Warning: Some of them may be too creepy or gruesome.",
"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`",
"requirements": [],
"short": "Look up SCP articles.",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [
"bobloy",
"gruesom"

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

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

@ -49,6 +49,10 @@ class StealEmoji(Cog):
self.is_on = None
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.group()
async def stealemoji(self, ctx: commands.Context):
"""
@ -100,14 +104,14 @@ class StealEmoji(Cog):
if not curr_setting:
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:
channel: discord.TextChannel = ctx.channel
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:
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()
@stealemoji.command(name="collect")
@ -118,7 +122,7 @@ class StealEmoji(Cog):
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()
@commands.guild_only()
@ -136,12 +140,12 @@ class StealEmoji(Cog):
already_a_guildbank = ctx.guild.id in (await self.config.guildbanks())
if already_a_guildbank:
await ctx.send(
await ctx.maybe_send_embed(
"This is already an emoji bank\n"
"Are you sure you want to remove the current server from the emoji bank list? (y/n)"
)
else:
await ctx.send(
await ctx.maybe_send_embed(
"This will upload custom emojis to this server\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)
if msg.content.upper() in ["N", "NO"]:
await ctx.send("Cancelled")
await ctx.maybe_send_embed("Cancelled")
return
async with self.config.guildbanks() as guildbanks:
@ -159,9 +163,9 @@ class StealEmoji(Cog):
guildbanks.append(ctx.guild.id)
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:
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()
async def on_reaction_add(self, reaction: discord.Reaction, user: discord.User):

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

@ -22,6 +22,10 @@ class Timerole(Cog):
self.config.register_guild(**default_guild)
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):
self.updating.cancel()

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

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

@ -3,16 +3,13 @@
"Bobloy",
"SnappyDragon"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"description": "Encode/Decode Unicode characters!",
"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",
"requirements": [],
"short": "Encode/Decode Unicode characters!",
"end_user_data_statement": "This cog does not store any End User Data",
"tags": [
"bobloy",
"utility",

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

@ -97,7 +97,7 @@ class Game:
await self.get_roles(ctx)
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"
"Use `{}ww code` to pick a new game"
"".format(len(self.players), len(self.roles), ctx.prefix))
@ -112,7 +112,7 @@ class Game:
reason="(BOT) Werewolf game role")
self.to_delete.add(self.game_role)
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 = []
return False
try:

@ -2,16 +2,13 @@
"author": [
"Bobloy"
],
"bot_version": [
3,
0,
0
],
"min_bot_version": "3.3.0",
"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",
"requirements": [],
"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": [
"mafia",
"werewolf",

@ -20,6 +20,7 @@ class Werewolf(Cog):
"""
def __init__(self, bot: Red):
super().__init__()
self.bot = bot
self.config = Config.get_conf(
self, identifier=87101114101119111108102, force_registration=True
@ -37,6 +38,10 @@ class Werewolf(Cog):
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):
print("Unload called")
for game in self.games.values():

Loading…
Cancel
Save