#dev-log

1 messages ยท Page 96 of 1

regal archBOT
#
[python-discord/sir-robin] New branch created: feat/zen\-command
#

This PR adds two main things.

Miscellaneous cog

This is used to group commands that are small & unique but unrelated usages.
This is where I have ported the original code to.

Error handling cog

The zen implementation relies heavily on an error handling cog. I have implemented a simple one that
can be extended as this project grows. I do not think this PR s...

#

What are the problems you are referring to?

I think because it runs on a server where we wouldn't beable to see the logs easily unless you have direct access, could cause unhandled errors to be harder to spot. This gives us a way to see them, so we can create issues and add handlers.

The codebase has nothing to hide from its users. I even took this snippet from the main bot here. I would expec...

#
[python-discord/sir-robin] branch deleted: feat/zen\-command
thin oysterBOT
#
Sir Robin

Connected!

regal archBOT
odd spireBOT
regal archBOT
#
[python-discord/bot] branch deleted: feat/timeit\-command
oak estuaryBOT
regal archBOT
odd spireBOT
regal archBOT
regal archBOT
regal archBOT
odd spireBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
#

Maybe also a timestamp for the time it was deleted? Because after a few days, the Discord message only shows the date, not the time and it'd be nice to have that at a glance

Oh I only just saw this now.

I wouldn't mind having the full timestamp in the embed footer for deletion time, but I think that can be scoped in a separate issue since this PR is currently ready to be merged.

There are a couple other log embeds I want to slightly change cosmetically as well.

odd spireBOT
regal archBOT
oak estuaryBOT
odd spireBOT
thin oysterBOT
#
Sir Robin

Connected!

regal archBOT
odd spireBOT
regal archBOT
regal archBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
thin oysterBOT
#
Sir Robin

Connected!

thin oysterBOT
#
Sir Robin

Connected!

odd spireBOT
thin oysterBOT
#
Sir Robin

Connected!

#
Sir Robin

Connected!

regal archBOT
regal archBOT
regal archBOT
#
[python-discord/sir-robin] branch deleted: fix/formatter
thin oysterBOT
#
Sir Robin

Connected!

regal archBOT
thin oysterBOT
#
Sir Robin

Connected!

regal archBOT
#
[python-discord/sir-robin] branch deleted: fix/formatter2
thin oysterBOT
#
Sir Robin

Connected!

regal archBOT
#
[python-discord/sir-robin] New branch created: fix/indented\-empty\-lines
regal archBOT
#
[python-discord/site] branch deleted: remove\-resource\-suggestion\-template
odd spireBOT
regal archBOT
regal archBOT
regal archBOT
odd spireBOT
oak estuaryBOT
odd spireBOT
regal archBOT
regal archBOT
regal archBOT
regal archBOT
#
[python-discord/sir-robin] branch deleted: fix/indented\-empty\-lines
thin oysterBOT
#
Sir Robin

Connected!

regal archBOT
#
[python-discord/sir-robin] branch deleted: hastebin\-blurple
#

3b1a28e Port hastebin to Sir Robin and add it to blurpl... - Bluenix2
7159e2f Rewrite send_to_paste_service() docstring to ... - Bluenix2
e345ae5 Remove unused logger from blurple formatter - Bluenix2
59ed88f Merge branch 'main' into hastebin-blurple - D0rs4n
7cb1604 Merge pull request #40 from python-discord/hast... - D0rs4n

thin oysterBOT
#
Sir Robin

Connected!

regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
thin oysterBOT
#
Sir Robin

Connected!

odd spireBOT
regal archBOT
regal archBOT
regal archBOT
#

It seems like it should be possible by using the Attributes keyword in the class/init docstring, adding a docstring after the attr, or using #: on the line before it.

However all of these methods result in the follow error when building the docs

Handler  for event 'doctree-read' threw an exception (exception: type object 'BotBase' has no attribute 'all_extensions')

I spent quite a while googling around trying to figure out why this happens but didn't manage to get anyw...

#
[python-discord/bot-core] branch deleted: bump\-d\.py\-and\-add\-BotBase
#
[python-discord/bot-core] New branch created: 5\.0\.0\-changelog
#
[python-discord/bot-core] branch deleted: 5\.0\.0\-changelog
#
[python-discord/bot-core] New branch created: update\-all\-deps
regal archBOT
#
[python-discord/bot-core] branch deleted: update\-all\-deps
#
[python-discord/bot-core] New branch created: add\-api\-test
#
[python-discord/bot-core] New branch created: move\-creation\-of\-AsyncResolver
regal archBOT
#
[python-discord/bot-core] branch deleted: move\-creation\-of\-AsyncResolver
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
#
[python-discord/bot-core] branch deleted: add\-api\-test
regal archBOT
#

Putting this here for reference if needed in the future:

from typing import Optional

import requests
from bs4 import BeautifulSoup
from discord import Embed
from discord.ext import commands

from bot.bot import Bot

RESOURCES_URL = "https://www.pythondiscord.com/resources/"
SITE_TOPICS_TITLE_CASE = []


def get_topics():
    """Scrape Python Discord website for updated list of topics to include in embed."""
    topics_split = []
    topics_title = ""
    dont_c...
odd spireBOT
odd spireBOT
regal archBOT
regal archBOT
regal archBOT
regal archBOT
#

Summary

Following python-discord/bot#2079 it was discussed having an API allowing the bot to fetch possible filters so that implementations don't need to scrape it.

This new API could power different future bot features like having interaction-based URL builder.

Description

Currently resources are loaded from a folder of yml, [then a number of different steps in processing are applied](https://github.com/python-discord/site/blob/main/pydis_site/apps/resources/views/resources...

regal archBOT
#
[python-discord/metricity] New branch created: fix\-channel\-sync
#

https://github.com/python-discord/metricity/blob/1e9044fb0c1f97c830d69702d3a635c29828690e/metricity/bot.py#L101-L104

If category.channel is None then channel.category and channel.category.id in BotConfig.staff_categories will be none. This field isn't nullable, so we get an error. We can fix this by casting the result to a bool. This assumes all channels that don't have a category are not staff channels.

#
[python-discord/metricity] branch deleted: fix\-channel\-sync
odd spireBOT
oak estuaryBOT
odd spireBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
oak estuaryBOT
odd spireBOT
regal archBOT
odd spireBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
#

Running locally on Windows I get this error.

metricity.database[24544] INFO Initiating connection to the database
Ignoring exception in on_guild_available
Traceback (most recent call last):
  File "C:\Users\wookie184\AppData\Local\pypoetry\Cache\virtualenvs\metricity-iF629sR3-py3.9\lib\site-packages\discord\client.py", line 373, in _run_event
    await coro(*args, **kwargs)
  File "C:\Users\wookie184\Documents\GitHub\metricity\metricity\bot.py", line 218, in on_guild_available
   ...
oak estuaryBOT
odd spireBOT
regal archBOT
regal archBOT
#
[python-discord/metricity] New branch created: pin\-d\.py\-version
#
[python-discord/metricity] branch deleted: pin\-d\.py\-version
regal archBOT
regal archBOT
#

Here's a simple unblurplifier (unformatter) that turns PEP 9001 code back into valid Python. Is it hacky? Yes, but at least it works well enough to qualify for "if it's stupid but it works, it ain't stupid". Also has an option to format the output with Black so it looks like proper Python code rather than a total mess.

import re
import black

import_context_code = """
import importlib
class ImportContext:
    def __init__(self, name: str):
        self.name = name

    de...
regal archBOT
#

This has been suggested several times over the years. It has been rejected (e.g. [here](#community-meta message)) on the grounds of defeating the educational purpose of the message โ€” to teach users how to format code themselves; automatic formatting removes incentive to learn.

I'm still in agreement with this view. I can't speak for others, but based on history, it is likely other developers and staff also agree. However, you're...

night lilyBOT
#
Sir Lancebot

Connected!

regal archBOT
regal archBOT
#

The main idea with it was that 3/4 of the time, the actual message from the bot alerting the user about their lack of backticks, is often larger than the code snippet itself.
And then 1/2 the time, the user either ignores it, or says that they don't understand.
Then there's also when a user asks a question, and like 3 or 4 people respond with !code.

The purpose of this was to avoid all of that by actually showing their code as an example as to how it is to be formatted.

I understand t...

regal archBOT
regal archBOT
regal archBOT
#

Yes, it's already configurable in dev, via the use of our trace loggers and debug flag.

What Mark was referring to was the logging level in production, since we pin it to info only. We could bump this down to debug/trace but it would mean a lot of logs would come in for the bot, and log rotation would be far quicker than before.

This is a hard one to debug since we need the extra logging, but also don't know what causes it to happen, so don't know when to enable the extra logging.

#

The main idea with it was that 3/4 of the time, the actual message from the bot alerting the user about their lack of backticks, is often larger than the code snippet itself.
And then 1/2 the time, the user either ignores it, or says that they don't understand.

Maybe this would be better solved by refining that message then? I think that whatever our solution is it's important it explains how they can format it properly so they can do that in the future.

Then there's also when a us...

regal archBOT
#

I like your idea wookie, using the ephemeral message and I do think that solution is a lot cleaner when compared to what I was suggesting.
I haven't been bothering with dpy after it went down, and I haven't looked back at it since it came back up, so I was not entirely aware of how the new system will work, so it slipped my mind that it was a thing. But yes.

As for the disadvantages that you listed:

  • People not reading the message may be rectified if the bot also mentions them to get th...
#

For me, I agree with Mark's initial point about "defeating the educational purpose of the message". However, I do see another use case for this.

When I am writing code on my phone in help channels (because I am sometimes an "on-the-go" helper), it is really annoying to find backticks and to format code correctly in comparison to PC. If this were an opt-in feature, much like our help DM notifications, it ...

odd spireBOT
regal archBOT
#

Description

Port &blurplify command from sir-robin to sir-lancebot, now that April fools is over. Contribution to this command can continue here.

Reasoning

There seems to be interest in contributing to this feature, so removing &blurplify altogether would be less than ideal.

Proposed Implementation

Shouldn't be very difficult. The code itself is already written, it should only be a matter of finding the right spot, pasting the code, testing, and PR'ing.

Additio...

regal archBOT
regal archBOT
#

Now that April Fool's is over, there was discussions on removing the &pep and &zen commands. However, I, along with others, thought it would be a shame to completely get rid of them. It was suggested that PEP 9001 be immortalized somehow. Specifically by moving the link into the &blurplify command which is planned to move to sir-lancebot (see here). As for &zen, to avoid confusion, there should be some sort of indication w...

regal archBOT
regal archBOT
regal archBOT
regal archBOT
#
[python-discord/bot-core] New branch created: minor\-fixes\-to\-BotBase
#

Sentry Issue: SITE-24

InvalidRegularExpression: invalid regular expression: quantifier operand invalid

  File "django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)

DataError: invalid regular expression: quantifier operand invalid

(17 additional frame(s) were not displayed)
...
  File "django/db/backends/utils.py", line 66, in execute
    return sel...
#
[python-discord/bot] New branch created: parse\-regex\-before\-querying\-site
odd spireBOT
odd spireBOT
regal archBOT
regal archBOT
regal archBOT
#
[python-discord/bot] branch deleted: parse\-regex\-before\-querying\-site
oak estuaryBOT
odd spireBOT
regal archBOT
odd spireBOT
odd spireBOT
regal archBOT
odd spireBOT
night lilyBOT
#
Sir Lancebot

Connected!

#
Sir Lancebot

Connected!

thin oysterBOT
#
Sir Robin

Connected!

oak estuaryBOT
oak estuaryBOT
oak estuaryBOT
thin oysterBOT
#
Sir Robin

Connected!

regal archBOT
#

Using nltk the bot could automatically detect topics ( https://towardsdatascience.com/topic-modelling-in-python-with-nltk-and-gensim-4ef03213cd21 for a comprehensive intro) and either automatically suggest to move to a topical/ot channel or it could suggest to check a specific resource that might relate to the topic at hand. Of course there should be a timer (maybe 2 minutes) to avoid spamming.

regal archBOT
regal archBOT
#
[python-discord/infra] New branch created: add\-meeting\-notes\-for\-today
#
[python-discord/infra] New branch created: remove\-authoritarian\-linter\-rule\-ruining\-my\-pull\-requests
#
[python-discord/infra] branch deleted: remove\-authoritarian\-linter\-rule\-ruining\-my\-pull\-requests
regal archBOT
#

My immediate reaction to 1 is that it's a wall for people unfamiliar with git right off the bat. "Learn the basics" seems vague and a person's reaction might be that it's a daunting task they will need to undertake before even touching the specific project they want to work on, when really all that's expected is to use a few commands.

What I would consider doing here is, instead of making 1 a point of its own, to just make a preliminary note that development is being done with a versioning...

#

My immediate reaction to 1 is that it's a wall for people unfamiliar with git right off the bat. "Learn the basics" seems vague and a person's reaction might be that it's a daunting task they will need to undertake before even touching the specific project they want to work on, when really all that's expected is to use a few commands.

What I would consider doing here is, instead of making 1 a point of its own, to just make a preliminary note that development is being done with a versioni...

odd spireBOT
odd spireBOT
odd spireBOT
regal archBOT
regal archBOT
regal archBOT
odd spireBOT
regal archBOT
regal archBOT
odd spireBOT
odd spireBOT
regal archBOT
regal archBOT
regal archBOT
regal archBOT
#

I suggest including the following (rephrasing it, below is a draft):

If you want to change the bot status, it is suggested to not do it during the on_ready event, since it would be called many times and making an API call on that event has a chance to disconnect the bot. 
Instead, set the desired status using the  activity / status kwarg of commands.Bot, for example 
bot = commands.Bot(command_prefix="!", activity=..., status=...)```
odd spireBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
oak estuaryBOT
#

Doc item doc_item.symbol_id='disnake.StoreChannel' present in loaded documentation inventories not found on site, inventories may need to be refreshed.

odd spireBOT
regal archBOT
regal archBOT
regal archBOT
night lilyBOT
#
Sir Lancebot

Connected!

odd spireBOT
regal archBOT
#

As this PR currently is, the resulting URL would be: pages/guides/python-guides/discordpy_help_command/

I think it would be better if this file were titled custom-help-commands.md or something similar. But I believe @Shom770 has plans to rearrange the structure of the discord-bot pin pages once they are all migrated, so I think it's fine if he tweaks the name in a subsequent PR since the URL is likely to change anyway.

regal archBOT
regal archBOT
#

On [Apr 10, 2022 03:01:49](#help-lollipop message) an occupied help channel was made available again without it going dormant. As a result the original claimant never got the Help Cooldown role removed.

Service logs:

2022-04-11 03:31:47 | bot.exts.help_channels._cog | INFO | Moving #help-lollipop (696432394974265374) to the In Use category.
2022-04-11 03:13:20 | bot.exts.help_channels._cog | INFO | Making #help-lollip...
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
#
[python-discord/site] New branch created: patch/aoclink
odd spireBOT
night lilyBOT
#
Sir Lancebot

Connected!

odd spireBOT
odd spireBOT
odd spireBOT
odd spireBOT
odd spireBOT
odd spireBOT
regal archBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
#

Currently the or-gotcha tag embed looks like:

While the embed is helpful, the first thing the eye is drawn to the first code block, and not the actual text around it. It's very tempting to just look at just the code examples, so I think adding a comment to the first code block to the following might make it clear at a glance that it's meant to be the incorrect way to do it:

# Incorrect
if favorite_fruit == 'grapefruit' or 'lemon':
    print("That's a weird favorite frui...
regal archBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
#
[python-discord/bot] New branch created: improve\-thread\-bump
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
regal archBOT
regal archBOT
regal archBOT
regal archBOT
regal archBOT
#
class MyHelp(commands.HelpCommand):

    async def send_bot_help(self, mapping):
        """
        This is triggered when !help is invoked.

        This example demonstrates how to list the commands that the member invoking the help command can run.
        """
        filtered = await self.filter_commands(self.context.bot.commands, sort=True) # returns a list of command objects
        names = [command.name for command in filtered] # iterating through the commands ...
regal archBOT
#
[python-discord/bot-core] New branch created: redis\-reconnect\-on\-setup
regal archBOT
odd spireBOT
regal archBOT
#
[python-discord/bot-core] branch deleted: minor\-fixes\-to\-BotBase
#
[python-discord/bot-core] branch deleted: redis\-reconnect\-on\-setup
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
regal archBOT
odd spireBOT
regal archBOT
#
[python-discord/bot] New branch created: slowmode/add\-better\-thread\-support
odd spireBOT
odd spireBOT
regal archBOT
#

Hi Chris,

Thank you for your tremendous efforts in getting the bot up to date. I am sure the rest of the team is filled with excitement at the prospect of using all the new features and maintaining a slimmer code base thanks to your work on bot-core.

I went through every commit and every line. Looks like everything is order. Notwithstanding, there are many changes, and it is easy for my eyes to miss something. Unfortunately, I did not run any of the code, nor do I really have time to do...

#

Hi Chris,

Thank you for your tremendous efforts in getting the bot up to date. I am sure the rest of the team is filled with excitement at the prospect of using all the new features and maintaining a slimmer code base thanks to your work on bot-core.

I went through every commit and every line. Looks like everything is order. Notwithstanding, there are many changes, and it is easy for my eyes to miss something. Unfortunately, I did not run any of the code, nor do I really have ...

#
[python-discord/bot-core] New branch created: BotBase\-api\_client\-kwarg
odd spireBOT
regal archBOT
odd spireBOT
odd spireBOT
regal archBOT
regal archBOT
#
[python-discord/bot-core] branch deleted: BotBase\-api\_client\-kwarg
odd spireBOT
regal archBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
#

For this, I would suggest instead of using literal, we do the same as what defcon has. https://github.com/python-discord/bot/blob/main/bot/exts/moderation/defcon.py#L163-L178

This Unions the DurationDelta with an int, if it's an int defcon assumed it's a number of days, for this we could assume a number of seconds and then use that

I don't mind, but the reason for this PR is that people are trying to use "0s" specifically

#

For this, I would suggest instead of using literal, we do the same as what defcon has. https://github.com/python-discord/bot/blob/main/bot/exts/moderation/defcon.py#L163-L178
This Unions the DurationDelta with an int, if it's an int defcon assumed it's a number of days, for this we could assume a number of seconds and then use that

I don't mind, but the reason for this PR is that people are trying to use "0s" specifically

Is there a specific reason that the duration delta d...

#
  1. Regarding the OP, I don't think it's necessary for all error messages to be in the same format. The bot is massive and is comprised of extensions, some of which have their own unique aspects. For example, the default error message for a bad or missing argument is handled by the error handler and is posted as an embed, but for some moderation commands there might be errors which are out of the moderator's control (e.g the member left the server). In the latter case it's more useful to have ...
#
[python-discord/bot-core] New branch created: bump\-d\.py
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
regal archBOT
#
[python-discord/bot-core] branch deleted: bump\-d\.py
odd spireBOT
regal archBOT
odd spireBOT
odd spireBOT
regal archBOT
regal archBOT
odd spireBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
#

As this was changed to a for loop it wont raise any more, instead just continuing execution without returning if there are no messages. Removing the try/except to give something like this should fix that:

async for message in channel.history(limit=1):
    return message

log.debug(f"No last message available; #{channel} ({channel.id}) has no messages.")
return None
odd spireBOT
regal archBOT
#
[python-discord/bot] branch deleted: bump\-d\.py\-version
odd spireBOT
odd spireBOT
regal archBOT
#
[python-discord/bot] branch deleted: fix\-modpings
odd spireBOT
oak estuaryBOT
regal archBOT
#
[python-discord/bot] New branch created: dont\-use\-modlog\-for\-defcon
odd spireBOT
oak estuaryBOT
regal archBOT
#
[python-discord/bot] New branch created: Use\-bot\-core\-extensions
odd spireBOT
regal archBOT
#
[python-discord/bot-core] New branch created: Add\-unqualify\-to\-the\-util\-namespace
#
[python-discord/bot-core] branch deleted: Add\-unqualify\-to\-the\-util\-namespace
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
#
First,  a [basic article](https://www.codesdope.com/course/python-subclass-of-a-class/) on subclassing will provide some fundamental knowledge, which is highly suggested before moving on to this topic, as subclassing [`Bot`](https://discordpy.readthedocs.io/en/latest/ext/commands/api.html#discord.ext.commands.Bot) can ultimately be a complicated task.
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
regal archBOT
#

Sentry Issue: BOT-33N

TypeError: wait_for() got some positional-only arguments passed as keyword arguments: 'event'
  File "discord/client.py", line 375, in _run_event
    await coro(*args, **kwargs)
  File "bot/exts/moderation/incidents.py", line 553, in on_raw_reaction_add
    await self.process_event(str(payload.emoji), message, payload.member)
  File "bot/exts/moderation/incidents.py", li...
#
[python-discord/bot] New branch created: remove\-wait\_for\-kwarg
odd spireBOT
regal archBOT
#

Sentry Issue: SITE-25

ValueError: Unknown format code 'X' for object of type 'str'
(16 additional frame(s) were not displayed)
...
  File "django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/base.py", line 988, in render
 ...
#
[python-discord/site] New branch created: support\-string\-colors
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
#

Sentry Issue: BOT-33P

HTTPException: 400 Bad Request (error code: 50035): Invalid Form Body
In message_reference: Unknown message
(2 additional frame(s) were not displayed)
...
  File "bot/exts/moderation/clean.py", line 444, in _clean_messages
    await ctx.reply(success_message)
  File "discord/ext/commands/context.py", line 544, in reply
    return await self.send(content, reference=self.m...
#
[python-discord/bot] New branch created: supress\-notfound\-when\-cleaning
odd spireBOT
odd spireBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
regal archBOT
#
[python-discord/bot] New branch created: mbaruh/modlog\_fix
odd spireBOT
regal archBOT
regal archBOT
#
[python-discord/bot] branch deleted: remove\-wait\_for\-kwarg
oak estuaryBOT
odd spireBOT
oak estuaryBOT
regal archBOT
#
[python-discord/bot] branch deleted: supress\-notfound\-when\-cleaning
odd spireBOT
regal archBOT
odd spireBOT
regal archBOT
regal archBOT
regal archBOT
#
[python-discord/bot-core] New branch created: load\-extensions\-in\-tasks
#
[python-discord/bot] branch deleted: dont\-use\-modlog\-for\-defcon
odd spireBOT
regal archBOT
#
[python-discord/bot-core] branch deleted: load\-extensions\-in\-tasks
#
[python-discord/bot] branch deleted: Use\-bot\-core\-extensions
odd spireBOT
regal archBOT
odd spireBOT
odd spireBOT
regal archBOT
odd spireBOT
odd spireBOT
regal archBOT
#
[python-discord/bot-core] New tag created: v6\.3\.0
#
[python-discord/bot-core] New branch created: mbaruh/document
#
[python-discord/bot-core] branch deleted: mbaruh/document
#
[python-discord/bot] New branch created: bump\-bot\-core
#
[python-discord/site] branch deleted: support\-string\-colors
odd spireBOT
regal archBOT
odd spireBOT
odd spireBOT