aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/__main__.py11
-rw-r--r--bot/cogs/antispam.py6
-rw-r--r--bot/cogs/bigbrother.py18
-rw-r--r--bot/cogs/bot.py7
-rw-r--r--bot/cogs/clean.py14
-rw-r--r--bot/cogs/cogs.py12
-rw-r--r--bot/cogs/deployment.py4
-rw-r--r--bot/cogs/doc.py6
-rw-r--r--bot/cogs/information.py9
-rw-r--r--bot/cogs/jams.py110
-rw-r--r--bot/cogs/moderation.py3
-rw-r--r--bot/cogs/snekbox.py6
-rw-r--r--bot/cogs/superstarify.py8
-rw-r--r--bot/cogs/tags.py5
-rw-r--r--bot/cogs/utils.py6
-rw-r--r--bot/cogs/wolfram.py11
-rw-r--r--bot/constants.py3
-rw-r--r--config-default.yml1
18 files changed, 178 insertions, 62 deletions
diff --git a/bot/__main__.py b/bot/__main__.py
index 568285cc3..6928a3960 100644
--- a/bot/__main__.py
+++ b/bot/__main__.py
@@ -38,11 +38,11 @@ else:
log.warning("Timed out while waiting for RabbitMQ")
# Internal/debug
-bot.load_extension("bot.cogs.logging")
-bot.load_extension("bot.cogs.security")
bot.load_extension("bot.cogs.events")
bot.load_extension("bot.cogs.filtering")
+bot.load_extension("bot.cogs.logging")
bot.load_extension("bot.cogs.modlog")
+bot.load_extension("bot.cogs.security")
# Commands, etc
bot.load_extension("bot.cogs.antispam")
@@ -60,12 +60,13 @@ if not DEBUG_MODE:
# Feature cogs
bot.load_extension("bot.cogs.alias")
-bot.load_extension("bot.cogs.deployment")
bot.load_extension("bot.cogs.defcon")
+bot.load_extension("bot.cogs.deployment")
bot.load_extension("bot.cogs.eval")
+bot.load_extension("bot.cogs.free")
bot.load_extension("bot.cogs.fun")
-bot.load_extension("bot.cogs.superstarify")
bot.load_extension("bot.cogs.information")
+bot.load_extension("bot.cogs.jams")
bot.load_extension("bot.cogs.moderation")
bot.load_extension("bot.cogs.off_topic_names")
bot.load_extension("bot.cogs.reddit")
@@ -73,11 +74,11 @@ bot.load_extension("bot.cogs.reminders")
bot.load_extension("bot.cogs.site")
bot.load_extension("bot.cogs.snakes")
bot.load_extension("bot.cogs.snekbox")
+bot.load_extension("bot.cogs.superstarify")
bot.load_extension("bot.cogs.tags")
bot.load_extension("bot.cogs.token_remover")
bot.load_extension("bot.cogs.utils")
bot.load_extension("bot.cogs.wolfram")
-bot.load_extension("bot.cogs.free")
if has_rmq:
bot.load_extension("bot.cogs.rmq")
diff --git a/bot/cogs/antispam.py b/bot/cogs/antispam.py
index 0d1c7c1e9..f65dbe8ab 100644
--- a/bot/cogs/antispam.py
+++ b/bot/cogs/antispam.py
@@ -11,7 +11,8 @@ from bot.cogs.modlog import ModLog
from bot.constants import (
AntiSpam as AntiSpamConfig, Channels,
Colours, DEBUG_MODE, Event,
- Guild as GuildConfig, Icons, Roles,
+ Guild as GuildConfig, Icons,
+ Roles, STAFF_ROLES,
)
@@ -35,7 +36,6 @@ WHITELISTED_CHANNELS = (
Channels.helpers, Channels.message_log,
Channels.mod_alerts, Channels.modlog, Channels.staff_lounge
)
-WHITELISTED_ROLES = (Roles.owner, Roles.admin, Roles.moderator, Roles.helpers)
class AntiSpam:
@@ -57,7 +57,7 @@ class AntiSpam:
or message.guild.id != GuildConfig.id
or message.author.bot
or (message.channel.id in WHITELISTED_CHANNELS and not DEBUG_MODE)
- or (message.author.top_role.id in WHITELISTED_ROLES and not DEBUG_MODE)
+ or (message.author.top_role.id in STAFF_ROLES and not DEBUG_MODE)
):
return
diff --git a/bot/cogs/bigbrother.py b/bot/cogs/bigbrother.py
index f07289985..03d2f1d42 100644
--- a/bot/cogs/bigbrother.py
+++ b/bot/cogs/bigbrother.py
@@ -9,7 +9,11 @@ from aiohttp import ClientError
from discord import Color, Embed, Guild, Member, Message, TextChannel, User
from discord.ext.commands import Bot, Context, command, group
-from bot.constants import BigBrother as BigBrotherConfig, Channels, Emojis, Guild as GuildConfig, Keys, Roles, URLs
+from bot.constants import (
+ BigBrother as BigBrotherConfig, Channels, Emojis,
+ Guild as GuildConfig, Keys,
+ MODERATION_ROLES, STAFF_ROLES, URLs
+)
from bot.decorators import with_role
from bot.pagination import LinePaginator
from bot.utils import messages
@@ -295,14 +299,14 @@ class BigBrother:
await ctx.send(f":x: the API returned an error: {error_reason}")
@group(name='bigbrother', aliases=('bb',), invoke_without_command=True)
- @with_role(Roles.owner, Roles.admin, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def bigbrother_group(self, ctx: Context):
"""Monitor users, NSA-style."""
await ctx.invoke(self.bot.get_command("help"), "bigbrother")
@bigbrother_group.command(name='watched', aliases=('all',))
- @with_role(Roles.owner, Roles.admin, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def watched_command(self, ctx: Context, from_cache: bool = True):
"""
Shows all users that are currently monitored and in which channel.
@@ -340,7 +344,7 @@ class BigBrother:
await ctx.send(f":x: got non-200 response from the API")
@bigbrother_group.command(name='watch', aliases=('w',))
- @with_role(Roles.owner, Roles.admin, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def watch_command(self, ctx: Context, user: User, *, reason: str):
"""
Relay messages sent by the given `user` to the `#big-brother-logs` channel
@@ -354,7 +358,7 @@ class BigBrother:
await self._watch_user(ctx, user, reason, channel_id)
@bigbrother_group.command(name='unwatch', aliases=('uw',))
- @with_role(Roles.owner, Roles.admin, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def unwatch_command(self, ctx: Context, user: User):
"""Stop relaying messages by the given `user`."""
@@ -378,7 +382,7 @@ class BigBrother:
await ctx.send(f":x: the API returned an error: {reason}")
@bigbrother_group.command(name='nominate', aliases=('n',))
- @with_role(Roles.owner, Roles.admin, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def nominate_command(self, ctx: Context, user: User, *, reason: str):
"""
Nominates a user for the helper role by adding them to the talent-pool channel
@@ -401,7 +405,7 @@ class HelperNomination:
self.bot = bot
@command(name='nominate', aliases=('n',))
- @with_role(Roles.owner, Roles.admin, Roles.moderator, Roles.helpers)
+ @with_role(*STAFF_ROLES)
async def nominate_command(self, ctx: Context, user: User, *, reason: str):
"""
Nominates a user for the helper role by adding them to the talent-pool channel
diff --git a/bot/cogs/bot.py b/bot/cogs/bot.py
index a6d9aa278..61bad422d 100644
--- a/bot/cogs/bot.py
+++ b/bot/cogs/bot.py
@@ -8,7 +8,8 @@ from discord.ext.commands import Bot, Context, command, group
from dulwich.repo import Repo
from bot.constants import (
- Channels, Guild, Roles, URLs
+ Channels, Guild, MODERATION_ROLES,
+ Roles, URLs,
)
from bot.decorators import with_role
from bot.utils.messages import wait_for_deletion
@@ -81,7 +82,7 @@ class Bot:
await ctx.send(embed=embed)
@command(name='echo', aliases=('print',))
- @with_role(Roles.owner, Roles.admin, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def echo_command(self, ctx: Context, *, text: str):
"""
Send the input verbatim to the current channel
@@ -90,7 +91,7 @@ class Bot:
await ctx.send(text)
@command(name='embed')
- @with_role(Roles.owner, Roles.admin, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def embed_command(self, ctx: Context, *, text: str):
"""
Send the input within an embed to the current channel
diff --git a/bot/cogs/clean.py b/bot/cogs/clean.py
index 8a9b01d07..b34d1118b 100644
--- a/bot/cogs/clean.py
+++ b/bot/cogs/clean.py
@@ -9,7 +9,7 @@ from discord.ext.commands import Bot, Context, group
from bot.cogs.modlog import ModLog
from bot.constants import (
Channels, CleanMessages, Colours, Event,
- Icons, NEGATIVE_REPLIES, Roles
+ Icons, MODERATION_ROLES, NEGATIVE_REPLIES
)
from bot.decorators import with_role
@@ -190,7 +190,7 @@ class Clean:
)
@group(invoke_without_command=True, name="clean", hidden=True)
- @with_role(Roles.moderator, Roles.admin, Roles.owner)
+ @with_role(*MODERATION_ROLES)
async def clean_group(self, ctx: Context):
"""
Commands for cleaning messages in channels
@@ -199,7 +199,7 @@ class Clean:
await ctx.invoke(self.bot.get_command("help"), "clean")
@clean_group.command(name="user", aliases=["users"])
- @with_role(Roles.moderator, Roles.admin, Roles.owner)
+ @with_role(*MODERATION_ROLES)
async def clean_user(self, ctx: Context, user: User, amount: int = 10):
"""
Delete messages posted by the provided user,
@@ -209,7 +209,7 @@ class Clean:
await self._clean_messages(amount, ctx, user=user)
@clean_group.command(name="all", aliases=["everything"])
- @with_role(Roles.moderator, Roles.admin, Roles.owner)
+ @with_role(*MODERATION_ROLES)
async def clean_all(self, ctx: Context, amount: int = 10):
"""
Delete all messages, regardless of poster,
@@ -219,7 +219,7 @@ class Clean:
await self._clean_messages(amount, ctx)
@clean_group.command(name="bots", aliases=["bot"])
- @with_role(Roles.moderator, Roles.admin, Roles.owner)
+ @with_role(*MODERATION_ROLES)
async def clean_bots(self, ctx: Context, amount: int = 10):
"""
Delete all messages posted by a bot,
@@ -229,7 +229,7 @@ class Clean:
await self._clean_messages(amount, ctx, bots_only=True)
@clean_group.command(name="regex", aliases=["word", "expression"])
- @with_role(Roles.moderator, Roles.admin, Roles.owner)
+ @with_role(*MODERATION_ROLES)
async def clean_regex(self, ctx: Context, regex, amount: int = 10):
"""
Delete all messages that match a certain regex,
@@ -239,7 +239,7 @@ class Clean:
await self._clean_messages(amount, ctx, regex=regex)
@clean_group.command(name="stop", aliases=["cancel", "abort"])
- @with_role(Roles.moderator, Roles.admin, Roles.owner)
+ @with_role(*MODERATION_ROLES)
async def clean_cancel(self, ctx: Context):
"""
If there is an ongoing cleaning process,
diff --git a/bot/cogs/cogs.py b/bot/cogs/cogs.py
index 0a33b3de0..11b64851a 100644
--- a/bot/cogs/cogs.py
+++ b/bot/cogs/cogs.py
@@ -5,7 +5,7 @@ from discord import Colour, Embed
from discord.ext.commands import Bot, Context, group
from bot.constants import (
- Emojis, Roles, URLs,
+ Emojis, MODERATION_ROLES, Roles, URLs
)
from bot.decorators import with_role
from bot.pagination import LinePaginator
@@ -37,14 +37,14 @@ class Cogs:
self.cogs.update({v: k for k, v in self.cogs.items()})
@group(name='cogs', aliases=('c',), invoke_without_command=True)
- @with_role(Roles.moderator, Roles.admin, Roles.owner, Roles.devops)
+ @with_role(*MODERATION_ROLES, Roles.devops)
async def cogs_group(self, ctx: Context):
"""Load, unload, reload, and list active cogs."""
await ctx.invoke(self.bot.get_command("help"), "cogs")
@cogs_group.command(name='load', aliases=('l',))
- @with_role(Roles.moderator, Roles.admin, Roles.owner, Roles.devops)
+ @with_role(*MODERATION_ROLES, Roles.devops)
async def load_command(self, ctx: Context, cog: str):
"""
Load up an unloaded cog, given the module containing it
@@ -97,7 +97,7 @@ class Cogs:
await ctx.send(embed=embed)
@cogs_group.command(name='unload', aliases=('ul',))
- @with_role(Roles.moderator, Roles.admin, Roles.owner, Roles.devops)
+ @with_role(*MODERATION_ROLES, Roles.devops)
async def unload_command(self, ctx: Context, cog: str):
"""
Unload an already-loaded cog, given the module containing it
@@ -149,7 +149,7 @@ class Cogs:
await ctx.send(embed=embed)
@cogs_group.command(name='reload', aliases=('r',))
- @with_role(Roles.moderator, Roles.admin, Roles.owner, Roles.devops)
+ @with_role(*MODERATION_ROLES, Roles.devops)
async def reload_command(self, ctx: Context, cog: str):
"""
Reload an unloaded cog, given the module containing it
@@ -254,7 +254,7 @@ class Cogs:
await ctx.send(embed=embed)
@cogs_group.command(name='list', aliases=('all',))
- @with_role(Roles.moderator, Roles.admin, Roles.owner, Roles.devops)
+ @with_role(*MODERATION_ROLES, Roles.devops)
async def list_command(self, ctx: Context):
"""
Get a list of all cogs, including their loaded status.
diff --git a/bot/cogs/deployment.py b/bot/cogs/deployment.py
index bc9dbf5ab..e71e07c2f 100644
--- a/bot/cogs/deployment.py
+++ b/bot/cogs/deployment.py
@@ -3,7 +3,7 @@ import logging
from discord import Colour, Embed
from discord.ext.commands import Bot, Context, command, group
-from bot.constants import Keys, Roles, URLs
+from bot.constants import Keys, MODERATION_ROLES, Roles, URLs
from bot.decorators import with_role
log = logging.getLogger(__name__)
@@ -18,7 +18,7 @@ class Deployment:
self.bot = bot
@group(name='redeploy', invoke_without_command=True)
- @with_role(Roles.owner, Roles.admin, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def redeploy_group(self, ctx: Context):
"""Redeploy the bot or the site."""
diff --git a/bot/cogs/doc.py b/bot/cogs/doc.py
index 2b310f11c..2f2cf8000 100644
--- a/bot/cogs/doc.py
+++ b/bot/cogs/doc.py
@@ -14,7 +14,7 @@ from markdownify import MarkdownConverter
from requests import ConnectionError
from sphinx.ext import intersphinx
-from bot.constants import ERROR_REPLIES, Keys, Roles, URLs
+from bot.constants import ERROR_REPLIES, Keys, MODERATION_ROLES, URLs
from bot.converters import ValidPythonIdentifier, ValidURL
from bot.decorators import with_role
from bot.pagination import LinePaginator
@@ -405,7 +405,7 @@ class Doc:
await ctx.send(embed=doc_embed)
@docs_group.command(name='set', aliases=('s',))
- @with_role(Roles.admin, Roles.owner, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def set_command(
self, ctx, package_name: ValidPythonIdentifier,
base_url: ValidURL, inventory_url: InventoryURL
@@ -443,7 +443,7 @@ class Doc:
await ctx.send(f"Added package `{package_name}` to database and refreshed inventory.")
@docs_group.command(name='delete', aliases=('remove', 'rm', 'd'))
- @with_role(Roles.admin, Roles.owner, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def delete_command(self, ctx, package_name: ValidPythonIdentifier):
"""
Removes the specified package from the database.
diff --git a/bot/cogs/information.py b/bot/cogs/information.py
index 0d31cb0d3..469999c00 100644
--- a/bot/cogs/information.py
+++ b/bot/cogs/information.py
@@ -5,15 +5,16 @@ import textwrap
from discord import CategoryChannel, Colour, Embed, Member, TextChannel, VoiceChannel
from discord.ext.commands import BadArgument, Bot, CommandError, Context, MissingPermissions, command
-from bot.constants import Channels, Emojis, Keys, NEGATIVE_REPLIES, Roles, URLs
+from bot.constants import (
+ Channels, Emojis, Keys, MODERATION_ROLES,
+ NEGATIVE_REPLIES, STAFF_ROLES, URLs
+)
from bot.decorators import with_role
from bot.utils.checks import with_role_check
from bot.utils.time import time_since
log = logging.getLogger(__name__)
-MODERATION_ROLES = Roles.owner, Roles.admin, Roles.moderator
-
class Information:
"""
@@ -137,7 +138,7 @@ class Information:
# Non-moderators may only do this in #bot-commands and can't see
# hidden infractions.
- if not with_role_check(ctx, *MODERATION_ROLES):
+ if not with_role_check(ctx, *STAFF_ROLES):
if not ctx.channel.id == Channels.bot:
raise MissingPermissions("You can't do that here!")
# Hide hidden infractions for users without a moderation role
diff --git a/bot/cogs/jams.py b/bot/cogs/jams.py
new file mode 100644
index 000000000..96b98e559
--- /dev/null
+++ b/bot/cogs/jams.py
@@ -0,0 +1,110 @@
+import logging
+
+from discord import Member, PermissionOverwrite, utils
+from discord.ext import commands
+
+from bot.constants import Roles
+from bot.decorators import with_role
+
+log = logging.getLogger(__name__)
+
+
+class CodeJams:
+ """
+ Manages the code-jam related parts of our server
+ """
+
+ def __init__(self, bot: commands.Bot):
+ self.bot = bot
+
+ @commands.command()
+ @with_role(Roles.admin)
+ async def createteam(
+ self, ctx: commands.Context,
+ team_name: str, members: commands.Greedy[Member]
+ ):
+ """
+ Create a team channel (both voice and text) in the Code Jams category, assign roles
+ and then add overwrites for the team.
+
+ The first user passed will always be the team leader.
+ """
+
+ # We had a little issue during Code Jam 4 here, the greedy converter did it's job
+ # and ignored anything which wasn't a valid argument which left us with teams of
+ # two members or at some times even 1 member. This fixes that by checking that there
+ # are always 3 members in the members list.
+ if len(members) < 3:
+ await ctx.send(":no_entry_sign: One of your arguments was invalid - there must be a "
+ f"minimum of 3 valid members in your team. Found: {len(members)} "
+ "members")
+ return
+
+ code_jam_category = utils.get(ctx.guild.categories, name="Code Jam")
+
+ if code_jam_category is None:
+ log.info("Code Jam category not found, creating it.")
+
+ category_overwrites = {
+ ctx.guild.default_role: PermissionOverwrite(read_messages=False),
+ ctx.guild.me: PermissionOverwrite(read_messages=True)
+ }
+
+ code_jam_category = await ctx.guild.create_category_channel(
+ "Code Jam",
+ overwrites=category_overwrites,
+ reason="It's code jam time!"
+ )
+
+ # First member is always the team leader
+ team_channel_overwrites = {
+ members[0]: PermissionOverwrite(
+ manage_messages=True,
+ read_messages=True,
+ manage_webhooks=True,
+ connect=True
+ ),
+ ctx.guild.default_role: PermissionOverwrite(read_messages=False, connect=False),
+ ctx.guild.get_role(Roles.developer): PermissionOverwrite(
+ read_messages=False,
+ connect=False
+ )
+ }
+
+ # Rest of members should just have read_messages
+ for member in members[1:]:
+ team_channel_overwrites[member] = PermissionOverwrite(
+ read_messages=True,
+ connect=True
+ )
+
+ # Create a text channel for the team
+ team_channel = await ctx.guild.create_text_channel(
+ team_name,
+ overwrites=team_channel_overwrites,
+ category=code_jam_category
+ )
+
+ # Create a voice channel for the team
+ team_voice_name = " ".join(team_name.split("-")).title()
+
+ await ctx.guild.create_voice_channel(
+ team_voice_name,
+ overwrites=team_channel_overwrites,
+ category=code_jam_category
+ )
+
+ # Assign team leader role
+ await members[0].add_roles(ctx.guild.get_role(Roles.team_leader))
+
+ # Assign rest of roles
+ jammer_role = ctx.guild.get_role(Roles.jammer)
+ for member in members:
+ await member.add_roles(jammer_role)
+
+ await ctx.send(f":ok_hand: Team created: {team_channel.mention}")
+
+
+def setup(bot):
+ bot.add_cog(CodeJams(bot))
+ log.info("Cog loaded: CodeJams")
diff --git a/bot/cogs/moderation.py b/bot/cogs/moderation.py
index 3c7f80a7a..5d8aa0217 100644
--- a/bot/cogs/moderation.py
+++ b/bot/cogs/moderation.py
@@ -13,7 +13,7 @@ from discord.ext.commands import (
from bot import constants
from bot.cogs.modlog import ModLog
-from bot.constants import Colours, Event, Icons, Keys, Roles, URLs
+from bot.constants import Colours, Event, Icons, Keys, MODERATION_ROLES, URLs
from bot.converters import InfractionSearchQuery
from bot.decorators import with_role
from bot.pagination import LinePaginator
@@ -23,7 +23,6 @@ from bot.utils.time import parse_rfc1123, wait_until
log = logging.getLogger(__name__)
-MODERATION_ROLES = Roles.owner, Roles.admin, Roles.moderator
INFRACTION_ICONS = {
"Mute": Icons.user_mute,
"Kick": Icons.sign_out,
diff --git a/bot/cogs/snekbox.py b/bot/cogs/snekbox.py
index cfbd032cb..1cef3986d 100644
--- a/bot/cogs/snekbox.py
+++ b/bot/cogs/snekbox.py
@@ -10,7 +10,7 @@ from discord.ext.commands import (
)
from bot.cogs.rmq import RMQ
-from bot.constants import Channels, ERROR_REPLIES, NEGATIVE_REPLIES, Roles, URLs
+from bot.constants import Channels, ERROR_REPLIES, NEGATIVE_REPLIES, STAFF_ROLES, URLs
from bot.decorators import InChannelCheckFailure, in_channel
from bot.utils.messages import wait_for_deletion
@@ -53,8 +53,6 @@ RAW_CODE_REGEX = re.compile(
re.DOTALL # "." also matches newlines
)
-BYPASS_ROLES = (Roles.owner, Roles.admin, Roles.moderator, Roles.helpers)
-
class Snekbox:
"""
@@ -71,7 +69,7 @@ class Snekbox:
@command(name='eval', aliases=('e',))
@guild_only()
- @in_channel(Channels.bot, bypass_roles=BYPASS_ROLES)
+ @in_channel(Channels.bot, bypass_roles=STAFF_ROLES)
async def eval_command(self, ctx: Context, *, code: str = None):
"""
Run some code. get the result back. We've done our best to make this safe, but do let us know if you
diff --git a/bot/cogs/superstarify.py b/bot/cogs/superstarify.py
index 84467bd8c..f46f62552 100644
--- a/bot/cogs/superstarify.py
+++ b/bot/cogs/superstarify.py
@@ -9,8 +9,8 @@ from bot.cogs.moderation import Moderation
from bot.cogs.modlog import ModLog
from bot.constants import (
Icons, Keys,
- NEGATIVE_REPLIES, POSITIVE_REPLIES,
- Roles, URLs
+ MODERATION_ROLES, NEGATIVE_REPLIES,
+ POSITIVE_REPLIES, URLs
)
from bot.decorators import with_role
@@ -143,7 +143,7 @@ class Superstarify:
)
@command(name='superstarify', aliases=('force_nick', 'star'))
- @with_role(Roles.admin, Roles.owner, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def superstarify(self, ctx: Context, member: Member, duration: str, *, forced_nick: str = None):
"""
This command will force a random superstar name (like Taylor Swift) to be the user's
@@ -235,7 +235,7 @@ class Superstarify:
await ctx.send(embed=embed)
@command(name='unsuperstarify', aliases=('release_nick', 'unstar'))
- @with_role(Roles.admin, Roles.owner, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def unsuperstarify(self, ctx: Context, member: Member):
"""
This command will remove the entry from our database, allowing the user
diff --git a/bot/cogs/tags.py b/bot/cogs/tags.py
index 8ecd80127..d6957e360 100644
--- a/bot/cogs/tags.py
+++ b/bot/cogs/tags.py
@@ -10,7 +10,8 @@ from discord.ext.commands import (
)
from bot.constants import (
- Channels, Cooldowns, ERROR_REPLIES, Keys, Roles, URLs
+ Channels, Cooldowns, ERROR_REPLIES, Keys,
+ MODERATION_ROLES, Roles, URLs
)
from bot.converters import TagContentConverter, TagNameConverter, ValidURL
from bot.decorators import with_role
@@ -212,7 +213,7 @@ class Tags:
return await ctx.send(embed=embed)
@tags_group.command(name='set', aliases=('add', 'edit', 's'))
- @with_role(Roles.admin, Roles.owner, Roles.moderator)
+ @with_role(*MODERATION_ROLES)
async def set_command(
self,
ctx: Context,
diff --git a/bot/cogs/utils.py b/bot/cogs/utils.py
index 65c729414..0c6d9d2ba 100644
--- a/bot/cogs/utils.py
+++ b/bot/cogs/utils.py
@@ -8,13 +8,11 @@ from io import StringIO
from discord import Colour, Embed
from discord.ext.commands import AutoShardedBot, Context, command
-from bot.constants import Channels, NEGATIVE_REPLIES, Roles
+from bot.constants import Channels, NEGATIVE_REPLIES, STAFF_ROLES
from bot.decorators import InChannelCheckFailure, in_channel
log = logging.getLogger(__name__)
-BYPASS_ROLES = (Roles.owner, Roles.admin, Roles.moderator, Roles.helpers)
-
class Utils:
"""
@@ -91,7 +89,7 @@ class Utils:
await ctx.message.channel.send(embed=pep_embed)
@command()
- @in_channel(Channels.bot, bypass_roles=BYPASS_ROLES)
+ @in_channel(Channels.bot, bypass_roles=STAFF_ROLES)
async def charinfo(self, ctx, *, characters: str):
"""
Shows you information on up to 25 unicode characters.
diff --git a/bot/cogs/wolfram.py b/bot/cogs/wolfram.py
index c36ef6075..f16c28dde 100644
--- a/bot/cogs/wolfram.py
+++ b/bot/cogs/wolfram.py
@@ -8,7 +8,7 @@ from discord import Embed
from discord.ext import commands
from discord.ext.commands import BucketType, Context, check, group
-from bot.constants import Colours, Roles, Wolfram
+from bot.constants import Colours, STAFF_ROLES, Wolfram
from bot.pagination import ImagePaginator
log = logging.getLogger(__name__)
@@ -18,7 +18,6 @@ DEFAULT_OUTPUT_FORMAT = "JSON"
QUERY = "http://api.wolframalpha.com/v2/{request}?{data}"
WOLF_IMAGE = "https://www.symbols.com/gi.php?type=1&id=2886&i=1"
-COOLDOWN_IGNORERS = Roles.moderator, Roles.owner, Roles.admin, Roles.helpers
MAX_PODS = 20
# Allows for 10 wolfram calls pr user pr day
@@ -159,7 +158,7 @@ class Wolfram:
self.bot = bot
@group(name="wolfram", aliases=("wolf", "wa"), invoke_without_command=True)
- @custom_cooldown(*COOLDOWN_IGNORERS)
+ @custom_cooldown(*STAFF_ROLES)
async def wolfram_command(self, ctx: Context, *, query: str) -> None:
"""
Requests all answers on a single image,
@@ -201,7 +200,7 @@ class Wolfram:
await send_embed(ctx, message, color, footer=footer, img_url=image_url, f=f)
@wolfram_command.command(name="page", aliases=("pa", "p"))
- @custom_cooldown(*COOLDOWN_IGNORERS)
+ @custom_cooldown(*STAFF_ROLES)
async def wolfram_page_command(self, ctx: Context, *, query: str) -> None:
"""
Requests a drawn image of given query
@@ -225,7 +224,7 @@ class Wolfram:
await ImagePaginator.paginate(pages, ctx, embed)
@wolfram_command.command(name="cut", aliases=("c",))
- @custom_cooldown(*COOLDOWN_IGNORERS)
+ @custom_cooldown(*STAFF_ROLES)
async def wolfram_cut_command(self, ctx, *, query: str) -> None:
"""
Requests a drawn image of given query
@@ -248,7 +247,7 @@ class Wolfram:
await send_embed(ctx, page[0], colour=Colours.soft_orange, img_url=page[1])
@wolfram_command.command(name="short", aliases=("sh", "s"))
- @custom_cooldown(*COOLDOWN_IGNORERS)
+ @custom_cooldown(*STAFF_ROLES)
async def wolfram_short_command(self, ctx: Context, *, query: str) -> None:
"""
Requests an answer to a simple question
diff --git a/bot/constants.py b/bot/constants.py
index ab62cd79d..99afc1e6e 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -372,6 +372,7 @@ class Roles(metaclass=YAMLGetter):
owner: int
verified: int
helpers: int
+ team_leader: int
class Guild(metaclass=YAMLGetter):
@@ -497,8 +498,10 @@ BOT_DIR = os.path.dirname(__file__)
PROJECT_ROOT = os.path.abspath(os.path.join(BOT_DIR, os.pardir))
# Default role combinations
+MODERATION_ROLES = Roles.moderator, Roles.admin, Roles.owner
STAFF_ROLES = Roles.helpers, Roles.moderator, Roles.admin, Roles.owner
+
# Bot replies
NEGATIVE_REPLIES = [
"Noooooo!!",
diff --git a/config-default.yml b/config-default.yml
index 747fa7fab..110dd12dd 100644
--- a/config-default.yml
+++ b/config-default.yml
@@ -134,6 +134,7 @@ guild:
verified: 352427296948486144
helpers: 267630620367257601
rockstars: &ROCKSTARS_ROLE 458226413825294336
+ team_leader: 501324292341104650
filter: