diff options
| -rw-r--r-- | bot/__init__.py | 4 | ||||
| -rw-r--r-- | bot/__main__.py | 1 | ||||
| -rw-r--r-- | bot/cogs/antispam.py | 20 | ||||
| -rw-r--r-- | bot/cogs/information.py | 4 | ||||
| -rw-r--r-- | bot/cogs/moderation.py | 4 | ||||
| -rw-r--r-- | bot/cogs/site.py | 98 | ||||
| -rw-r--r-- | bot/constants.py | 1 | ||||
| -rw-r--r-- | config-default.yml | 49 | 
8 files changed, 151 insertions, 30 deletions
| diff --git a/bot/__init__.py b/bot/__init__.py index df168cba4..5a446d71c 100644 --- a/bot/__init__.py +++ b/bot/__init__.py @@ -88,7 +88,9 @@ for key, value in logging.Logger.manager.loggerDict.items():          value.addHandler(handler) -# Silence discord and websockets +# Silence aio_pika.pika.{callback,channel}, discord, PIL, and and websockets +logging.getLogger("aio_pika.pika.callback").setLevel(logging.ERROR) +logging.getLogger("aio_pika.pika.channel").setLevel(logging.ERROR)  logging.getLogger("discord.client").setLevel(logging.ERROR)  logging.getLogger("discord.gateway").setLevel(logging.ERROR)  logging.getLogger("discord.state").setLevel(logging.ERROR) diff --git a/bot/__main__.py b/bot/__main__.py index a2c10476c..aa73e42bd 100644 --- a/bot/__main__.py +++ b/bot/__main__.py @@ -65,6 +65,7 @@ bot.load_extension("bot.cogs.information")  bot.load_extension("bot.cogs.moderation")  bot.load_extension("bot.cogs.off_topic_names")  bot.load_extension("bot.cogs.reddit") +bot.load_extension("bot.cogs.site")  bot.load_extension("bot.cogs.snakes")  bot.load_extension("bot.cogs.snekbox")  bot.load_extension("bot.cogs.tags") diff --git a/bot/cogs/antispam.py b/bot/cogs/antispam.py index 04b030889..21161ff04 100644 --- a/bot/cogs/antispam.py +++ b/bot/cogs/antispam.py @@ -9,7 +9,11 @@ from discord import Member, Message, Object, TextChannel  from discord.ext.commands import Bot  from bot import rules -from bot.constants import AntiSpam as AntiSpamConfig, Channels, Colours, Guild as GuildConfig, Icons +from bot.constants import ( +    AntiSpam as AntiSpamConfig, Channels, +    Colours, Guild as GuildConfig, +    Icons, Roles +)  from bot.utils.time import humanize as humanize_delta @@ -27,6 +31,13 @@ RULE_FUNCTION_MAPPING = {      'newlines': rules.apply_newlines,      'role_mentions': rules.apply_role_mentions  } +WHITELISTED_CHANNELS = ( +    Channels.admin, Channels.announcements, Channels.big_brother_logs, +    Channels.devalerts, Channels.devlog, Channels.devtest, +    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: @@ -39,7 +50,12 @@ class AntiSpam:          self.muted_role = Object(role_id)      async def on_message(self, message: Message): -        if message.guild.id != GuildConfig.id or message.author.bot: +        if ( +            message.guild.id != GuildConfig.id +            or message.author.bot +            or message.channel.id in WHITELISTED_CHANNELS +            or message.author.top_role.id in WHITELISTED_ROLES +        ):              return          # Fetch the rule configuration with the highest rule interval. diff --git a/bot/cogs/information.py b/bot/cogs/information.py index ddc18fcf8..2390334d8 100644 --- a/bot/cogs/information.py +++ b/bot/cogs/information.py @@ -6,7 +6,8 @@ from dateutil.relativedelta import relativedelta  from discord import CategoryChannel, Colour, Embed, Member, TextChannel, VoiceChannel  from discord.ext.commands import Bot, Context, command -from bot.constants import Emojis, Keys, URLs +from bot.constants import Emojis, Keys, Roles, URLs +from bot.decorators import with_role  from bot.utils.time import humanize  log = logging.getLogger(__name__) @@ -23,6 +24,7 @@ class Information:          self.bot = bot          self.headers = {"X-API-Key": Keys.site_api} +    @with_role(Roles.owner, Roles.admin, Roles.moderator)      @command(name="roles")      async def roles_info(self, ctx: Context):          """ diff --git a/bot/cogs/moderation.py b/bot/cogs/moderation.py index b04887b3f..ee28a3600 100644 --- a/bot/cogs/moderation.py +++ b/bot/cogs/moderation.py @@ -172,7 +172,7 @@ class Moderation:          self.mod_log.ignore(Event.member_ban, user.id)          self.mod_log.ignore(Event.member_remove, user.id) -        await ctx.guild.ban(user, reason=reason) +        await ctx.guild.ban(user, reason=reason, delete_message_days=0)          if reason is None:              result_message = f":ok_hand: permanently banned {user.mention}." @@ -349,7 +349,7 @@ class Moderation:          self.mod_log.ignore(Event.member_ban, user.id)          self.mod_log.ignore(Event.member_remove, user.id)          guild: Guild = ctx.guild -        await guild.ban(user, reason=reason) +        await guild.ban(user, reason=reason, delete_message_days=0)          infraction_object = response_object["infraction"]          infraction_expiration = infraction_object["expires_at"] diff --git a/bot/cogs/site.py b/bot/cogs/site.py new file mode 100644 index 000000000..e5fd645fb --- /dev/null +++ b/bot/cogs/site.py @@ -0,0 +1,98 @@ +import logging + +from discord import Colour, Embed +from discord.ext.commands import Bot, Context, group + +from bot.constants import URLs + +log = logging.getLogger(__name__) + +INFO_URL = f"{URLs.site_schema}{URLs.site}/info" + + +class Site: +    """Commands for linking to different parts of the site.""" + +    def __init__(self, bot: Bot): +        self.bot = bot + +    @group(name="site", aliases=("s",), invoke_without_command=True) +    async def site_group(self, ctx): +        """Commands for getting info about our website.""" + +        await ctx.invoke(self.bot.get_command("help"), "site") + +    @site_group.command(name="home", aliases=("about",)) +    async def site_main(self, ctx: Context): +        """Info about the website itself.""" + +        url = f"{URLs.site_schema}{URLs.site}/" + +        embed = Embed(title="Python Discord website") +        embed.set_footer(text=url) +        embed.colour = Colour.blurple() +        embed.description = ( +            f"[Our official website]({url}) is an open-source community project " +            "created with Python and Flask. It contains information about the server " +            "itself, lets you sign up for upcoming events, has its own wiki, contains " +            "a list of valuable learning resources, and much more." +        ) + +        await ctx.send(embed=embed) + +    @site_group.command(name="resources") +    async def site_resources(self, ctx: Context): +        """Info about the site's Resources page.""" + +        url = f"{INFO_URL}/resources" + +        embed = Embed(title="Resources") +        embed.set_footer(text=url) +        embed.colour = Colour.blurple() +        embed.description = ( +            f"The [Resources page]({url}) on our website contains a " +            "list of hand-selected goodies that we regularly recommend " +            "to both beginners and experts." +        ) + +        await ctx.send(embed=embed) + +    @site_group.command(name="help") +    async def site_help(self, ctx: Context): +        """Info about the site's Getting Help page.""" + +        url = f"{INFO_URL}/help" + +        embed = Embed(title="Getting Help") +        embed.set_footer(text=url) +        embed.colour = Colour.blurple() +        embed.description = ( +            "Asking the right question about something that's new to you can sometimes be tricky. " +            f"To help with this, we've created a [guide to asking good questions]({url}) on our website. " +            "It contains everything you need to get the very best help from our community." +        ) + +        await ctx.send(embed=embed) + +    @site_group.command(name="faq") +    async def site_faq(self, ctx: Context): +        """Info about the site's FAQ page.""" + +        url = f"{INFO_URL}/faq" + +        embed = Embed(title="FAQ") +        embed.set_footer(text=url) +        embed.colour = Colour.blurple() +        embed.description = ( +            "As the largest Python community on Discord, we get hundreds of questions every day. " +            "Many of these questions have been asked before. We've compiled a list of the most " +            "frequently asked questions along with their answers, which can be found on " +            f"our [FAQ page]({url})." +        ) + +        await ctx.send(embed=embed) + + +def setup(bot): +    bot.add_cog(Site(bot)) +    log.info("Cog loaded: Site") diff --git a/bot/constants.py b/bot/constants.py index 5e1dc1e39..1e789ff3a 100644 --- a/bot/constants.py +++ b/bot/constants.py @@ -385,6 +385,7 @@ class URLs(metaclass=YAMLGetter):      gitlab_bot_repo: str      omdb: str      site: str +    site_api: str      site_facts_api: str      site_clean_api: str      site_clean_logs: str diff --git a/config-default.yml b/config-default.yml index fd0e33633..772169a29 100644 --- a/config-default.yml +++ b/config-default.yml @@ -209,29 +209,30 @@ rabbitmq:  urls:      # PyDis site vars -    site:        &DOMAIN "api.pythondiscord.com" -    site_schema: &SCHEMA "https://" - -    site_bigbrother_api:                !JOIN [*SCHEMA, *DOMAIN, "/bot/bigbrother"] -    site_clean_api:                     !JOIN [*SCHEMA, *DOMAIN, "/bot/clean"] -    site_clean_logs:                    !JOIN [*SCHEMA, *DOMAIN, "/bot/clean_logs"] -    site_docs_api:                      !JOIN [*SCHEMA, *DOMAIN, "/bot/docs"] -    site_facts_api:                     !JOIN [*SCHEMA, *DOMAIN, "/bot/snake_facts"] -    site_hiphopify_api:                 !JOIN [*SCHEMA, *DOMAIN, "/bot/hiphopify"] -    site_idioms_api:                    !JOIN [*SCHEMA, *DOMAIN, "/bot/snake_idioms"] -    site_infractions:                   !JOIN [*SCHEMA, *DOMAIN, "/bot/infractions"] -    site_infractions_user:              !JOIN [*SCHEMA, *DOMAIN, "/bot/infractions/user/{user_id}"] -    site_infractions_type:              !JOIN [*SCHEMA, *DOMAIN, "/bot/infractions/type/{infraction_type}"] -    site_infractions_by_id:             !JOIN [*SCHEMA, *DOMAIN, "/bot/infractions/id/{infraction_id}"] -    site_infractions_user_type_current: !JOIN [*SCHEMA, *DOMAIN, "/bot/infractions/user/{user_id}/{infraction_type}/current"] -    site_names_api:                     !JOIN [*SCHEMA, *DOMAIN, "/bot/snake_names"] -    site_off_topic_names_api:           !JOIN [*SCHEMA, *DOMAIN, "/bot/off-topic-names"] -    site_quiz_api:                      !JOIN [*SCHEMA, *DOMAIN, "/bot/snake_quiz"] -    site_settings_api:                  !JOIN [*SCHEMA, *DOMAIN, "/bot/settings"] -    site_special_api:                   !JOIN [*SCHEMA, *DOMAIN, "/bot/special_snakes"] -    site_tags_api:                      !JOIN [*SCHEMA, *DOMAIN, "/bot/tags"] -    site_user_api:                      !JOIN [*SCHEMA, *DOMAIN, "/bot/users"] -    site_user_complete_api:             !JOIN [*SCHEMA, *DOMAIN, "/bot/users/complete"] +    site:        &DOMAIN       "pythondiscord.com" +    site_api:    &API    !JOIN ["api.", *DOMAIN] +    site_schema: &SCHEMA       "https://" + +    site_bigbrother_api:                !JOIN [*SCHEMA, *API, "/bot/bigbrother"] +    site_clean_api:                     !JOIN [*SCHEMA, *API, "/bot/clean"] +    site_clean_logs:                    !JOIN [*SCHEMA, *API, "/bot/clean_logs"] +    site_docs_api:                      !JOIN [*SCHEMA, *API, "/bot/docs"] +    site_facts_api:                     !JOIN [*SCHEMA, *API, "/bot/snake_facts"] +    site_hiphopify_api:                 !JOIN [*SCHEMA, *API, "/bot/hiphopify"] +    site_idioms_api:                    !JOIN [*SCHEMA, *API, "/bot/snake_idioms"] +    site_infractions:                   !JOIN [*SCHEMA, *API, "/bot/infractions"] +    site_infractions_user:              !JOIN [*SCHEMA, *API, "/bot/infractions/user/{user_id}"] +    site_infractions_type:              !JOIN [*SCHEMA, *API, "/bot/infractions/type/{infraction_type}"] +    site_infractions_by_id:             !JOIN [*SCHEMA, *API, "/bot/infractions/id/{infraction_id}"] +    site_infractions_user_type_current: !JOIN [*SCHEMA, *API, "/bot/infractions/user/{user_id}/{infraction_type}/current"] +    site_names_api:                     !JOIN [*SCHEMA, *API, "/bot/snake_names"] +    site_off_topic_names_api:           !JOIN [*SCHEMA, *API, "/bot/off-topic-names"] +    site_quiz_api:                      !JOIN [*SCHEMA, *API, "/bot/snake_quiz"] +    site_settings_api:                  !JOIN [*SCHEMA, *API, "/bot/settings"] +    site_special_api:                   !JOIN [*SCHEMA, *API, "/bot/special_snakes"] +    site_tags_api:                      !JOIN [*SCHEMA, *API, "/bot/tags"] +    site_user_api:                      !JOIN [*SCHEMA, *API, "/bot/users"] +    site_user_complete_api:             !JOIN [*SCHEMA, *API, "/bot/users/complete"]      # Env vars      deploy: !ENV "DEPLOY_URL" @@ -279,7 +280,7 @@ anti_spam:          links:              interval: 10 -            max: 4 +            max: 20          mentions:              interval: 10 | 
