Repository: Pincer-org/Pincer (language: python)

Issue:
:art: Formatting with black once and for all
It does some formatting that i dont really like, but i guess we done really have the choice if we want to add noxfile and make everyone agree.


Discussion / hints:

Fix patch:
diff --git a/.flake8 b/.flake8
index c6768399..e10e08d5 100644
--- a/.flake8
+++ b/.flake8
@@ -1,6 +1,7 @@
 [flake8]
-max-line-length = 88
 ignore =
+    E501, # line length
+    E203 # whitespace before : in slicing.
     D203,
     # H101: Use TODO(NAME)
     # H501: Do not use self.__dict__ for string formatting
diff --git a/.github/scripts/all_sorter.py b/.github/scripts/all_sorter.py
deleted file mode 100644
index 714f517d..00000000
--- a/.github/scripts/all_sorter.py
+++ /dev/null
@@ -1,76 +0,0 @@
-import os
-from typing import List
-
-LINE_WRAP: int = 80
-
-
-def split_80_space(string: str, goal_list: List[str] = None) -> str:
-    if goal_list is None:
-        goal_list = []
-
-    if len(string) < LINE_WRAP:
-        goal_list.append(string)
-        return '\n'.join(goal_list)
-
-    to_reduce = string[:LINE_WRAP][::-1]
-    first_space = to_reduce.find(' ')
-
-    reduced, next_parse = to_reduce[first_space:], to_reduce[:first_space]
-
-    goal_list.append(reduced[::-1].rstrip())
-
-    return split_80_space(
-        '    ' + next_parse[::-1] + string[LINE_WRAP:],
-        goal_list
-    )
-
-
-def parse_list(string: str) -> List[str]:
-    return (
-        string.replace('\n', '')
-            .replace('"', '')
-            .replace(' ', '')
-            .split(',')
-    )
-
-
-def sort__all__(content: str) -> str:
-    pos__all__ = content.index('__all__')
-
-    left_parsed__all__ = content[pos__all__:]
-    end_parenthesis_pos = left_parsed__all__.index(')') - 1
-
-    right_parsed = left_parsed__all__[:end_parenthesis_pos]
-    __all__list = right_parsed[right_parsed.index('(') + 1:]
-
-    __all__declaration = '__all__ = (\n\t%s\n)' % ', '.join(
-        f'"{w}"' for w in sorted(set(parse_list(__all__list)))
-    )
-
-    return (
-            content[:pos__all__]
-            + split_80_space(__all__declaration)
-            + content[pos__all__ + end_parenthesis_pos + 2:]
-    ).replace('\t', '    ')
-
-
-def main():
-    for directory, _sub_folders, files in os.walk('pincer'):
-        if '__' in directory:
-            continue
-
-        if '__init__.py' not in files:
-            continue
-
-        with open(os.path.join(directory, '__init__.py')) as f:
-            file_content = f.read()
-
-        if '__all__' not in file_content:
-            continue
-
-        with open(os.path.join(directory, '__init__.py'), 'w') as f:
-            f.write(sort__all__(file_content))
-
-
-if __name__ == '__main__':
-    main()
diff --git a/.github/workflows/run_scripts.yml b/.github/workflows/run_scripts.yml
index 24b5275b..6d18579a 100644
--- a/.github/workflows/run_scripts.yml
+++ b/.github/workflows/run_scripts.yml
@@ -20,13 +20,6 @@ jobs:
           git config user.email "actions@pincer.dev"
           git pull
 
-      - name: running all sorter
-        run: |
-          python ./.github/scripts/all_sorter.py
-          git commit -am ":art: Automatic `__all__` sorting" || echo "No changes to commit"
-          git push || echo "No changes to push"
-
-
       - name: running license generator
         run: |
           python ./.github/scripts/license_generator.py
diff --git a/docs/conf.py b/docs/conf.py
index 12826df9..2df2edcf 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -11,9 +11,9 @@
 import os
 import sys
 
-sys.path.append(os.path.abspath('..'))
+sys.path.append(os.path.abspath(".."))
 sys.path.append(os.path.abspath("../.."))
-sys.path.append(os.path.abspath('extensions'))
+sys.path.append(os.path.abspath("extensions"))
 
 from pincer import __version__
 
@@ -21,14 +21,14 @@
 
 
 project = "Pincer Library"
-copyright = '2021, Pincer'
+copyright = "2021, Pincer"
 author = "Sigmanificient, Arthurdw"
 
 
 # The full version, including alpha/beta/rc tags.
 release = __version__
 
-branch = 'main' if __version__.endswith('a') else 'v' + __version__
+branch = "main" if __version__.endswith("a") else "v" + __version__
 
 # -- General configuration ---------------------------------------------------
 
@@ -37,38 +37,38 @@
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
 extensions = [
-    'sphinx_design',
-    'sphinx.ext.napoleon',
-    'sphinx.ext.autodoc',
-    'sphinx.ext.intersphinx',
-    'exception_hierarchy',
-    'attributetable',
-    'silence',
-    'sphinxcontrib_trio',
-    'sphinxcontrib.mermaid',
+    "sphinx_design",
+    "sphinx.ext.napoleon",
+    "sphinx.ext.autodoc",
+    "sphinx.ext.intersphinx",
+    "exception_hierarchy",
+    "attributetable",
+    "silence",
+    "sphinxcontrib_trio",
+    "sphinxcontrib.mermaid",
 ]
 
 add_module_names = False
 
-autodoc_typehints = 'none'
+autodoc_typehints = "none"
 
-autodoc_member_order = 'alphabetical'
+autodoc_member_order = "alphabetical"
 
 set_type_checking_flag = True
 
-mermaid_output_format = 'raw'
+mermaid_output_format = "raw"
 
 resource_links = {
-    'discord': 'https://discord.gg/et54DgVjMX',
-    'issues': 'https://github.com/Pincer-org/Pincer/issues',
-    'discussions': 'https://github.com/Pincer-org/Pincer/discussions',
-    'examples': f'https://github.com/Pincer-org/Pincer/tree/{branch}/examples',
+    "discord": "https://discord.gg/et54DgVjMX",
+    "issues": "https://github.com/Pincer-org/Pincer/issues",
+    "discussions": "https://github.com/Pincer-org/Pincer/discussions",
+    "examples": f"https://github.com/Pincer-org/Pincer/tree/{branch}/examples",
 }
 
 intersphinx_mapping = {
-    'py': ('https://docs.python.org/3', None),
-    'ws': ('https://websockets.readthedocs.io/en/stable', None),
-    'pil': ('https://pillow.readthedocs.io/en/stable', None)
+    "py": ("https://docs.python.org/3", None),
+    "ws": ("https://websockets.readthedocs.io/en/stable", None),
+    "pil": ("https://pillow.readthedocs.io/en/stable", None),
 }
 
 # Add any paths that contain templates here, relative to this directory.
@@ -77,44 +77,41 @@
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
 # This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
 
-autodoc_default_options = {
-    'members': True,
-    'show-inheritance': True
-}
+autodoc_default_options = {"members": True, "show-inheritance": True}
 
 # -- Options for HTML output -------------------------------------------------
 
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes.
 #
-html_logo = '../assets/img/icon_small.png'
-html_favicon = '../assets/img/icon.ico'
-html_theme = 'furo'
+html_logo = "../assets/img/icon_small.png"
+html_favicon = "../assets/img/icon.ico"
+html_theme = "furo"
 # Material theme options (see theme.conf for more information)
 html_theme_options = {
-    'light_css_variables': {
-        'color-brand-primary': '#4C8CBF',
-        'color-brand-content': '#306998',
-        'color-admonition-background': 'blue',
+    "light_css_variables": {
+        "color-brand-primary": "#4C8CBF",
+        "color-brand-content": "#306998",
+        "color-admonition-background": "blue",
     },
-    'dark_css_variables': {
-        'color-brand-primary': '#306998',
-        'color-brand-content': '#FFE871',
-        'color-admonition-background': 'yellow',
+    "dark_css_variables": {
+        "color-brand-primary": "#306998",
+        "color-brand-content": "#FFE871",
+        "color-admonition-background": "yellow",
     },
     "sidebar_hide_name": True,
 }
-pygments_style = 'monokai'
+pygments_style = "monokai"
 default_dark_mode = True
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
 # so a file named 'default.css' will overwrite the builtin 'default.css'.
-html_static_path = ['_static']
+html_static_path = ["_static"]
 html_css_files = ["custom.css"]
 
-rst_prolog = '''
+rst_prolog = """
 .. |coro| replace:: This function is a |coroutine_link|_.\n\n
 .. |maybecoro| replace:: This function *could be a* |coroutine_link|_.
 .. |coroutine_link| replace:: *coroutine*
@@ -122,7 +119,7 @@
 .. |default| raw:: html
 
     <div class="default-value-section"> <span class="default-value-label">Default:</span>
-'''
+"""
 
 # The suffix of source filenames.
-source_suffix = '.rst'
+source_suffix = ".rst"
diff --git a/docs/extensions/attributetable.py b/docs/extensions/attributetable.py
index 2514a714..709a33be 100644
--- a/docs/extensions/attributetable.py
+++ b/docs/extensions/attributetable.py
@@ -42,50 +42,50 @@ def visit_attributetable_node(self, node):
 
 
 def visit_attributetablecolumn_node(self, node):
-    self.body.append(self.starttag(
-        node, 'div', CLASS='py-attribute-table-column')
+    self.body.append(
+        self.starttag(node, "div", CLASS="py-attribute-table-column")
     )
 
 
 def visit_attributetabletitle_node(self, node):
-    self.body.append(self.starttag(node, 'span'))
+    self.body.append(self.starttag(node, "span"))
 
 
 def visit_attributetablebadge_node(self, node):
     attributes = {
-        'class': 'py-attribute-table-badge',
-        'title': node['badge-type'],
+        "class": "py-attribute-table-badge",
+        "title": node["badge-type"],
     }
-    self.body.append(self.starttag(node, 'span', **attributes))
+    self.body.append(self.starttag(node, "span", **attributes))
 
 
 def visit_attributetable_item_node(self, node):
-    self.body.append(self.starttag(
-        node, 'li', CLASS='py-attribute-table-entry')
+    self.body.append(
+        self.starttag(node, "li", CLASS="py-attribute-table-entry")
     )
 
 
 def depart_attributetable_node(self, node):
-    self.body.append('</div>')
+    self.body.append("</div>")
 
 
 def depart_attributetablecolumn_node(self, node):
-    self.body.append('</div>')
+    self.body.append("</div>")
 
 
 def depart_attributetabletitle_node(self, node):
-    self.body.append('</span>')
+    self.body.append("</span>")
 
 
 def depart_attributetablebadge_node(self, node):
-    self.body.append('</span>')
+    self.body.append("</span>")
 
 
 def depart_attributetable_item_node(self, node):
-    self.body.append('</li>')
+    self.body.append("</li>")
 
 
-_name_parser_regex = re.compile(r'(?P<module>[\w.]+\.)?(?P<name>\w+)')
+_name_parser_regex = re.compile(r"(?P<module>[\w.]+\.)?(?P<name>\w+)")
 
 
 class PyAttributeTable(SphinxDirective):
@@ -98,14 +98,16 @@ class PyAttributeTable(SphinxDirective):
     def parse_name(self, content):
         path, name = _name_parser_regex.match(content).groups()
         if path:
-            modulename = path.rstrip('.')
+            modulename = path.rstrip(".")
         else:
-            modulename = self.env.temp_data.get('autodoc:module')
+            modulename = self.env.temp_data.get("autodoc:module")
             if not modulename:
-                modulename = self.env.ref_context.get('py:module')
+                modulename = self.env.ref_context.get("py:module")
         if modulename is None:
-            raise RuntimeError('modulename somehow None for %s in %s.' % (
-                content, self.env.docname))
+            raise RuntimeError(
+                "modulename somehow None for %s in %s."
+                % (content, self.env.docname)
+            )
 
         return modulename, name
 
@@ -135,12 +137,12 @@ def run(self):
         replaced.
         """
         content = self.arguments[0].strip()
-        node = attributetableplaceholder('')
+        node = attributetableplaceholder("")
         modulename, name = self.parse_name(content)
-        node['python-doc'] = self.env.docname
-        node['python-module'] = modulename
-        node['python-class'] = name
-        node['python-full-name'] = f'{modulename}.{name}'
+        node["python-doc"] = self.env.docname
+        node["python-module"] = modulename
+        node["python-class"] = name
+        node["python-full-name"] = f"{modulename}.{name}"
         return [node]
 
 
@@ -148,17 +150,20 @@ def build_lookup_table(env):
     # Given an environment, load up a lookup table of
     # full-class-name: objects
     result = {}
-    domain = env.domains['py']
+    domain = env.domains["py"]
 
     ignored = {
-        'data', 'exception', 'module', 'class',
+        "data",
+        "exception",
+        "module",
+        "class",
     }
 
     for (fullname, _, objtype, docname, _, _) in domain.get_objects():
         if objtype in ignored:
             continue
 
-        classname, _, child = fullname.rpartition('.')
+        classname, _, child = fullname.rpartition(".")
         try:
             result[classname].append(child)
         except KeyError:
@@ -167,7 +172,7 @@ def build_lookup_table(env):
     return result
 
 
-TableElement = namedtuple('TableElement', 'fullname label badge')
+TableElement = namedtuple("TableElement", "fullname label badge")
 
 
 def process_attributetable(app, doctree, fromdocname):
@@ -175,16 +180,23 @@ def process_attributetable(app, doctree, fromdocname):
 
     lookup = build_lookup_table(env)
     for node in doctree.traverse(attributetableplaceholder):
-        modulename, classname, fullname = node['python-module'], node['python-class'], node['python-full-name']
+        modulename, classname, fullname = (
+            node["python-module"],
+            node["python-class"],
+            node["python-full-name"],
+        )
         groups = get_class_results(lookup, modulename, classname, fullname)
-        table = attributetable('')
+        table = attributetable("")
         for label, subitems in groups.items():
             if not subitems:
                 continue
-            table.append(class_results_to_node(
-                label, sorted(subitems, key=lambda c: c.label)))
+            table.append(
+                class_results_to_node(
+                    label, sorted(subitems, key=lambda c: c.label)
+                )
+            )
 
-        table['python-class'] = fullname
+        table["python-class"] = fullname
 
         node.replace_self([table] if table else [])
 
@@ -193,10 +205,12 @@ def get_class_results(lookup, modulename, name, fullname):
     module = importlib.import_module(modulename)
     cls = getattr(module, name)
 
-    groups = OrderedDict([
-        (_('Attributes'), []),
-        (_('Methods'), []),
-    ])
+    groups = OrderedDict(
+        [
+            (_("Attributes"), []),
+            (_("Methods"), []),
+        ]
+    )
 
     try:
         members = lookup[fullname]
@@ -204,8 +218,8 @@ def get_class_results(lookup, modulename, name, fullname):
         return groups
 
     for attr in members:
-        attrlookup = f'{fullname}.{attr}'
-        key = _('Attributes')
+        attrlookup = f"{fullname}.{attr}"
+        key = _("Attributes")
         badge = None
         label = attr
         value = None
@@ -216,67 +230,81 @@ def get_class_results(lookup, modulename, name, fullname):
                 break
 
         if value is not None:
-            doc = value.__doc__ or ''
-            if inspect.iscoroutinefunction(value) or doc.startswith('|coro|'):
-                key = _('Methods')
-                badge = attributetablebadge('async', 'async')
-                badge['badge-type'] = _('coroutine')
+            doc = value.__doc__ or ""
+            if inspect.iscoroutinefunction(value) or doc.startswith("|coro|"):
+                key = _("Methods")
+                badge = attributetablebadge("async", "async")
+                badge["badge-type"] = _("coroutine")
             elif isinstance(value, classmethod):
-                key = _('Methods')
-                label = f'{name}.{attr}'
-                badge = attributetablebadge('cls', 'cls')
-                badge['badge-type'] = _('classmethod')
-            elif (
-                inspect.isfunction(value)
-                or isinstance(value, staticmethod)
-            ):
-                if (
-                    doc.startswith(('A decorator', 'A shortcut decorator'))
-                    or label in ("event", "loop")
-                ):
+                key = _("Methods")
+                label = f"{name}.{attr}"
+                badge = attributetablebadge("cls", "cls")
+                badge["badge-type"] = _("classmethod")
+            elif inspect.isfunction(value) or isinstance(value, staticmethod):
+                if doc.startswith(
+                    ("A decorator", "A shortcut decorator")
+                ) or label in ("event", "loop"):
                     # finicky but surprisingly consistent
-                    badge = attributetablebadge('@', '@')
-                    badge['badge-type'] = _('decorator')
-                    key = _('Methods')
+                    badge = attributetablebadge("@", "@")
+                    badge["badge-type"] = _("decorator")
+                    key = _("Methods")
                 else:
-                    key = _('Methods')
-                    badge = attributetablebadge('def', 'def')
-                    badge['badge-type'] = _('method')
+                    key = _("Methods")
+                    badge = attributetablebadge("def", "def")
+                    badge["badge-type"] = _("method")
 
-        groups[key].append(TableElement(
-            fullname=attrlookup, label=label, badge=badge))
+        groups[key].append(
+            TableElement(fullname=attrlookup, label=label, badge=badge)
+        )
 
     return groups
 
 
 def class_results_to_node(key, elements):
     title = attributetabletitle(key, key)
-    ul = nodes.bullet_list('')
+    ul = nodes.bullet_list("")
     for element in elements:
-        ref = nodes.reference('', '', internal=True,
-                              refuri='#' + element.fullname,
-                              anchorname='',
-                              *[nodes.Text(element.label)])
-        para = addnodes.compact_paragraph('', '', ref)
+        ref = nodes.reference(
+            "",
+            "",
+            internal=True,
+            refuri="#" + element.fullname,
+            anchorname="",
+            *[nodes.Text(element.label)],
+        )
+        para = addnodes.compact_paragraph("", "", ref)
         if element.badge is not None:
-            ul.append(attributetable_item('', element.badge, para))
+            ul.append(attributetable_item("", element.badge, para))
         else:
-            ul.append(attributetable_item('', para))
+            ul.append(attributetable_item("", para))
 
-    return attributetablecolumn('', title, ul)
+    return attributetablecolumn("", title, ul)
 
 
 def setup(app):
-    app.add_directive('attributetable', PyAttributeTable)
-    app.add_node(attributetable, html=(
-        visit_attributetable_node, depart_attributetable_node))
-    app.add_node(attributetablecolumn, html=(
-        visit_attributetablecolumn_node, depart_attributetablecolumn_node))
-    app.add_node(attributetabletitle, html=(
-        visit_attributetabletitle_node, depart_attributetabletitle_node))
-    app.add_node(attributetablebadge, html=(
-        visit_attributetablebadge_node, depart_attributetablebadge_node))
-    app.add_node(attributetable_item, html=(
-        visit_attributetable_item_node, depart_attributetable_item_node))
+    app.add_directive("attributetable", PyAttributeTable)
+    app.add_node(
+        attributetable,
+        html=(visit_attributetable_node, depart_attributetable_node),
+    )
+    app.add_node(
+        attributetablecolumn,
+        html=(
+            visit_attributetablecolumn_node,
+            depart_attributetablecolumn_node,
+        ),
+    )
+    app.add_node(
+        attributetabletitle,
+        html=(visit_attributetabletitle_node, depart_attributetabletitle_node),
+    )
+    app.add_node(
+        attributetablebadge,
+        html=(visit_attributetablebadge_node, depart_attributetablebadge_node),
+    )
+    app.add_node(
+        attributetable_item,
+        html=(visit_attributetable_item_node, depart_attributetable_item_node),
+    )
     app.add_node(attributetableplaceholder)
-    app.connect('doctree-resolved', process_attributetable)
+    app.connect("doctree-resolved", process_attributetable)
diff --git a/docs/extensions/exception_hierarchy.py b/docs/extensions/exception_hierarchy.py
index 2acfdb26..3c816e1b 100644
--- a/docs/extensions/exception_hierarchy.py
+++ b/docs/extensions/exception_hierarchy.py
@@ -10,13 +10,11 @@ class exception_hierarchy(nodes.General, nodes.Element):
 
 
 def visit_exception_hierarchy_node(self, node):
-    self.starttag(
-        node, 'div', CLASS='exception-hierarchy-content'
-    )
+    self.starttag(node, "div", CLASS="exception-hierarchy-content")
 
 
 def depart_exception_hierarchy_node(self, node):
-    self.body.append('</div>\n')
+    self.body.append("</div>\n")
 
 
 class ExceptionHierarchyDirective(Directive):
@@ -24,12 +22,14 @@ class ExceptionHierarchyDirective(Directive):
 
     def run(self):
         self.assert_has_content()
-        node = exception_hierarchy('\n'.join(self.content))
+        node = exception_hierarchy("\n".join(self.content))
         self.state.nested_parse(self.content, self.content_offset, node)
         return [node]
 
 
 def setup(app):
-    app.add_node(exception_hierarchy, html=(
-        visit_exception_hierarchy_node, depart_exception_hierarchy_node))
-    app.add_directive('exception_hierarchy', ExceptionHierarchyDirective)
+    app.add_node(
+        exception_hierarchy,
+        html=(visit_exception_hierarchy_node, depart_exception_hierarchy_node),
+    )
+    app.add_directive("exception_hierarchy", ExceptionHierarchyDirective)
diff --git a/docs/extensions/silence.py b/docs/extensions/silence.py
index 849db100..2de85d26 100644
--- a/docs/extensions/silence.py
+++ b/docs/extensions/silence.py
@@ -2,11 +2,14 @@
 
 
 class PatchedPythonDomain(PythonDomain):
-    def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode):
-        if 'refspecific' in node:
-            del node['refspecific']
+    def resolve_xref(
+        self, env, fromdocname, builder, typ, target, node, contnode
+    ):
+        if "refspecific" in node:
+            del node["refspecific"]
         return super(PatchedPythonDomain, self).resolve_xref(
-            env, fromdocname, builder, typ, target, node, contnode)
+            env, fromdocname, builder, typ, target, node, contnode
+        )
 
 
 def setup(sphinx):
diff --git a/examples/basic_cogs/cogs.py b/examples/basic_cogs/cogs.py
index 55eb228b..4a276a8a 100644
--- a/examples/basic_cogs/cogs.py
+++ b/examples/basic_cogs/cogs.py
@@ -10,17 +10,14 @@ async def on_command_error(
         ctx: MessageContext,
         error: Exception,
         args: List[Any],
-        kwargs: Dict[str, Any]
+        kwargs: Dict[str, Any],
     ):
         return Embed(
             "Oops...",
             "An error occurred while trying to execute the "
             f"`{ctx.interaction.data.name}` command! Please retry later!",
-            color=0xff0000
-        ).add_field(
-            "Exception:",
-            f"```\n{type(error).__name__}:\n{error}\n```"
-        )
+            color=0xFF0000,
+        ).add_field("Exception:", f"```\n{type(error).__name__}:\n{error}\n```")
 
 
 class OnReadyCog(Cog):
diff --git a/examples/discord-welcomer/cogs/welcome.py b/examples/discord-welcomer/cogs/welcome.py
index 67dec232..4b97f59e 100644
--- a/examples/discord-welcomer/cogs/welcome.py
+++ b/examples/discord-welcomer/cogs/welcome.py
@@ -38,7 +38,7 @@ def _build_html(self, user: User) -> str:
         arguments = {
             "icon": user.get_avatar_url(256),
             "username": user.username,
-            "discriminator": user.discriminator
+            "discriminator": user.discriminator,
         }
 
         res = self.template
@@ -57,7 +57,7 @@ async def generate_welcome_for_user(self, user: User, ttl=0) -> File:
                 "width": 700,
                 "height": 258,
                 "transparent": True,
-            }
+            },
         }
 
         async with self.__session.post(
@@ -65,7 +65,7 @@ async def generate_welcome_for_user(self, user: User, ttl=0) -> File:
             # "/v1/html-to-image-chrome", # use this endpoint with the variant,
             # as it requires more modern css support
             data=json.dumps(body),
-            headers=self.REQUEST_HEADERS
+            headers=self.REQUEST_HEADERS,
         ) as res:
             if res.ok:
                 image_bytes = await res.read()
@@ -84,7 +84,9 @@ async def generate_welcome_for_user(self, user: User, ttl=0) -> File:
 
     @Client.event
     async def on_ready(self):
-        self.channel = await self.client.get_channel(int(getenv("WELCOME_CHANNEL")))
+        self.channel = await self.client.get_channel(
+            int(getenv("WELCOME_CHANNEL"))
+        )
 
     @Client.event
     async def on_guild_member_add(self, event: GuildMemberAddEvent):
diff --git a/examples/discord-welcomer/main.py b/examples/discord-welcomer/main.py
index 7245efc7..5a47635e 100644
--- a/examples/discord-welcomer/main.py
+++ b/examples/discord-welcomer/main.py
@@ -20,7 +20,9 @@ def __init__(self, *args, **kwargs):
         cog_loading_started = perf_counter()
         self.load_packages()
         cog_loading_ended = perf_counter()
-        self.cogs_load_time = round((cog_loading_ended - cog_loading_started) * 100, 2)
+        self.cogs_load_time = round(
+            (cog_loading_ended - cog_loading_started) * 100, 2
+        )
         super().__init__(*args, **kwargs)
 
     @Client.event
@@ -54,7 +56,8 @@ def load_packages(self):
                         self.load_cog(obj)
                         self.loaded_cogs += 1
                         logging.info(
-                            "Successfully loaded %s (%s)" % (definition, container)
+                            "Successfully loaded %s (%s)"
+                            % (definition, container)
                         )
 
 
diff --git a/examples/tweet_generator/tweet_generator.py b/examples/tweet_generator/tweet_generator.py
index b2fbb5c3..01edb1f5 100644
--- a/examples/tweet_generator/tweet_generator.py
+++ b/examples/tweet_generator/tweet_generator.py
@@ -37,7 +37,7 @@ async def on_ready(self):
     async def twitter(
         self,
         ctx: MessageContext,
-        content: CommandArg[str, Description["The content of the message"]]
+        content: CommandArg[str, Description["The content of the message"]],
     ):
         await ctx.interaction.ack()
 
@@ -61,7 +61,7 @@ async def twitter(
             Image.new(
                 "RGBA",
                 (800, 250 + 50 * len(textwrap.wrap(content, 38))),
-                (255, 255, 255)
+                (255, 255, 255),
             ),
             box=(15, 15),
         )
@@ -74,16 +74,13 @@ async def twitter(
         # write the name and username on the Image
         draw = ImageDraw.Draw(tweet)
         draw.text(
-            (180, 20),
-            str(ctx.author.user),
-            fill=(0, 0, 0),
-            font=font_bold
+            (180, 20), str(ctx.author.user), fill=(0, 0, 0), font=font_bold
         )
         draw.text(
             (180, 70),
             f"@{ctx.author.user.username}",
             fill=(120, 120, 120),
-            font=font_normal
+            font=font_normal,
         )
 
         content = add_color_to_mentions(content)
diff --git a/pincer/__init__.py b/pincer/__init__.py
index f3c25a58..de560440 100644
--- a/pincer/__init__.py
+++ b/pincer/__init__.py
@@ -14,18 +14,51 @@
 from .cog import Cog
 from .commands import command, ChatCommandHandler
 from .exceptions import (
-    PincerError, InvalidPayload, UnhandledException, NoExportMethod,
-    CogError, CogNotFound, CogAlreadyExists, NoValidSetupMethod,
-    TooManySetupArguments, NoCogManagerReturnFound, CommandError,
-    CommandCooldownError, CommandIsNotCoroutine, CommandAlreadyRegistered,
-    CommandDescriptionTooLong, TooManyArguments, InvalidArgumentAnnotation,
-    CommandReturnIsEmpty, InvalidCommandGuild, InvalidCommandName,
-    InvalidEventName, InvalidUrlError, EmbedFieldError, TaskError,
-    TaskAlreadyRunning, TaskCancelError, TaskIsNotCoroutine, TaskInvalidDelay,
-    DispatchError, DisallowedIntentsError, InvalidTokenError, HeartbeatError,
-    UnavailableGuildError, HTTPError, NotModifiedError, BadRequestError,
-    UnauthorizedError, ForbiddenError, NotFoundError, MethodNotAllowedError,
-    RateLimitError, GatewayError, ServerError, EmbedOverflow, ImageEncodingError
+    PincerError,
+    InvalidPayload,
+    UnhandledException,
+    NoExportMethod,
+    CogError,
+    CogNotFound,
+    CogAlreadyExists,
+    NoValidSetupMethod,
+    TooManySetupArguments,
+    NoCogManagerReturnFound,
+    CommandError,
+    CommandCooldownError,
+    CommandIsNotCoroutine,
+    CommandAlreadyRegistered,
+    CommandDescriptionTooLong,
+    TooManyArguments,
+    InvalidArgumentAnnotation,
+    CommandReturnIsEmpty,
+    InvalidCommandGuild,
+    InvalidCommandName,
+    InvalidEventName,
+    InvalidUrlError,
+    EmbedFieldError,
+    TaskError,
+    TaskAlreadyRunning,
+    TaskCancelError,
+    TaskIsNotCoroutine,
+    TaskInvalidDelay,
+    DispatchError,
+    DisallowedIntentsError,
+    InvalidTokenError,
+    HeartbeatError,
+    UnavailableGuildError,
+    HTTPError,
+    NotModifiedError,
+    BadRequestError,
+    UnauthorizedError,
+    ForbiddenError,
+    NotFoundError,
+    MethodNotAllowedError,
+    RateLimitError,
+    GatewayError,
+    ServerError,
+    EmbedOverflow,
+    ImageEncodingError,
 )
 from .objects import Intents
 
@@ -51,8 +84,8 @@ class VersionInfo(NamedTuple):
 
     def __repr__(self) -> str:
         return f"{self.major}.{self.minor}.{self.micro}" + (
-                f"-{self.release_level}{self.serial}"
-                * (self.release_level is not None)
+            f"-{self.release_level}{self.serial}"
+            * (self.release_level is not None)
         )
 
 
@@ -60,20 +93,62 @@ def __repr__(self) -> str:
 __version__ = repr(version_info)
 
 __all__ = (
-    "BadRequestError", "Bot", "ChatCommandHandler", "Client", "Cog",
-    "CogAlreadyExists", "CogError", "CogNotFound", "CommandAlreadyRegistered",
-    "CommandCooldownError", "CommandDescriptionTooLong", "CommandError",
-    "CommandIsNotCoroutine", "CommandReturnIsEmpty", "DisallowedIntentsError",
-    "DispatchError", "EmbedFieldError", "EmbedOverflow", "ForbiddenError",
-    "GatewayConfig", "GatewayError", "HTTPError", "HeartbeatError",
-    "ImageEncodingError", "Intents", "InvalidArgumentAnnotation",
-    "InvalidCommandGuild", "InvalidCommandName", "InvalidEventName",
-    "InvalidPayload", "InvalidTokenError", "InvalidUrlError",
-    "MethodNotAllowedError", "NoCogManagerReturnFound", "NoExportMethod",
-    "NoValidSetupMethod", "NotFoundError", "NotModifiedError", "PincerError",
-    "RateLimitError", "ServerError", "TaskAlreadyRunning", "TaskCancelError",
-    "TaskError", "TaskInvalidDelay", "TaskIsNotCoroutine", "TooManyArguments",
-    "TooManySetupArguments", "UnauthorizedError", "UnavailableGuildError",
-    "UnhandledException", "__author__", "__email__", "__package__",
-    "__title__", "__version__", "command", "event_middleware"
+    "BadRequestError",
+    "Bot",
+    "ChatCommandHandler",
+    "Client",
+    "Cog",
+    "CogAlreadyExists",
+    "CogError",
+    "CogNotFound",
+    "CommandAlreadyRegistered",
+    "CommandCooldownError",
+    "CommandDescriptionTooLong",
+    "CommandError",
+    "CommandIsNotCoroutine",
+    "CommandReturnIsEmpty",
+    "DisallowedIntentsError",
+    "DispatchError",
+    "EmbedFieldError",
+    "EmbedOverflow",
+    "ForbiddenError",
+    "GatewayConfig",
+    "GatewayError",
+    "HTTPError",
+    "HeartbeatError",
+    "ImageEncodingError",
+    "Intents",
+    "InvalidArgumentAnnotation",
+    "InvalidCommandGuild",
+    "InvalidCommandName",
+    "InvalidEventName",
+    "InvalidPayload",
+    "InvalidTokenError",
+    "InvalidUrlError",
+    "MethodNotAllowedError",
+    "NoCogManagerReturnFound",
+    "NoExportMethod",
+    "NoValidSetupMethod",
+    "NotFoundError",
+    "NotModifiedError",
+    "PincerError",
+    "RateLimitError",
+    "ServerError",
+    "TaskAlreadyRunning",
+    "TaskCancelError",
+    "TaskError",
+    "TaskInvalidDelay",
+    "TaskIsNotCoroutine",
+    "TooManyArguments",
+    "TooManySetupArguments",
+    "UnauthorizedError",
+    "UnavailableGuildError",
+    "UnhandledException",
+    "__author__",
+    "__email__",
+    "__package__",
+    "__title__",
+    "__version__",
+    "command",
+    "event_middleware",
 )
diff --git a/pincer/_config.py b/pincer/_config.py
index a5361080..0d2fc0eb 100644
--- a/pincer/_config.py
+++ b/pincer/_config.py
@@ -9,6 +9,7 @@ class GatewayConfig:
     """This file is to make maintaining the library and its gateway
     configuration easier. Leave compression blank for no compression.
     """
+
     MAX_RETRIES: int = 5
     version: int = 9
     encoding: str = "json"
@@ -23,9 +24,7 @@ def make_uri(cls, uri) -> str:
             The GatewayConfig's uri.
         """
         return (
-            f"{uri}"
-            f"?v={cls.version}"
-            f"&encoding={cls.encoding}"
+            f"{uri}" f"?v={cls.version}" f"&encoding={cls.encoding}"
         ) + f"&compress={cls.compression}" * cls.compressed()
 
     @classmethod
diff --git a/pincer/client.py b/pincer/client.py
index fb9d480d..3e8c149e 100644
--- a/pincer/client.py
+++ b/pincer/client.py
@@ -258,7 +258,9 @@ def chat_commands(self) -> List[str]:
         Get a list of chat command calls which have been registered in
         the :class:`~pincer.commands.ChatCommandHandler`\\.
         """
-        return [cmd.metadata.name for cmd in ChatCommandHandler.register.values()]
+        return [
+            cmd.metadata.name for cmd in ChatCommandHandler.register.values()
+        ]
 
     @property
     def guild_ids(self) -> List[Snowflake]:
@@ -346,7 +348,9 @@ async def on_ready(self):
         return event
 
     @staticmethod
-    def get_event_coro(name: str) -> List[Optional[InteractableStructure[None]]]:
+    def get_event_coro(
+        name: str,
+    ) -> List[Optional[InteractableStructure[None]]]:
         """get the coroutine for an event
 
         Parameters
@@ -372,10 +376,7 @@ def get_event_coro(name: str) -> List[Optional[InteractableStructure[None]]]:
 
     @staticmethod
     def execute_event(
-        events: List[InteractableStructure],
-        gateway: Gateway,
-        *args,
-        **kwargs
+        events: List[InteractableStructure], gateway: Gateway, *args, **kwargs
     ):
         """Invokes an event.
 
@@ -1185,7 +1186,9 @@ async def delete_stage(self, _id: int, reason: Optional[str] = None):
             f"stage-instances/{_id}", headers={"reason": reason}
         )
 
-    async def crosspost_message(self, channel_id: int, message_id: int) -> UserMessage:
+    async def crosspost_message(
+        self, channel_id: int, message_id: int
+    ) -> UserMessage:
         """|coro|
         Crosspost a message in a News Channel to following channels.
 
@@ -1207,6 +1210,9 @@ async def crosspost_message(self, channel_id: int, message_id: int) -> UserMessa
             The crossposted message
         """
 
-        return await self._http.post(f"channels/{channel_id}/{message_id}/crosspost")
+        return await self._http.post(
+            f"channels/{channel_id}/{message_id}/crosspost"
+        )
+
 
 Bot = Client
diff --git a/pincer/cog.py b/pincer/cog.py
index aee3063b..d55c8ca8 100644
--- a/pincer/cog.py
+++ b/pincer/cog.py
@@ -128,7 +128,8 @@ def cogs(self) -> List[Cog]:
             The list of cogs
         """
         return [
-            manager for manager in ChatCommandHandler.managers
+            manager
+            for manager in ChatCommandHandler.managers
             if isinstance(manager, Cog)
         ]
 
diff --git a/pincer/commands/__init__.py b/pincer/commands/__init__.py
index ea8a15a5..cff20f3b 100644
--- a/pincer/commands/__init__.py
+++ b/pincer/commands/__init__.py
@@ -14,17 +14,45 @@
     Modifier,
 )
 from .components import (
-    ActionRow, Button, ButtonStyle, ComponentHandler, SelectMenu, SelectOption,
-    component, button, select_menu, LinkButton
+    ActionRow,
+    Button,
+    ButtonStyle,
+    ComponentHandler,
+    SelectMenu,
+    SelectOption,
+    component,
+    button,
+    select_menu,
+    LinkButton,
 )
 from .groups import Group, Subgroup
 from .interactable import Interactable, INTERACTION_REGISTERS
 
 __all__ = (
-    "ActionRow", "Button", "ButtonStyle", "ChannelTypes",
-    "ChatCommandHandler", "Choice", "Choices", "CommandArg",
-    "ComponentHandler", "Description", "Group", "INTERACTION_REGISTERS",
-    "Interactable", "LinkButton", "MaxValue", "MinValue", "Modifier",
-    "SelectMenu", "SelectOption", "Subgroup", "button", "command", "component",
-    "message_command", "select_menu", "user_command"
+    "ActionRow",
+    "Button",
+    "ButtonStyle",
+    "ChannelTypes",
+    "ChatCommandHandler",
+    "Choice",
+    "Choices",
+    "CommandArg",
+    "ComponentHandler",
+    "Description",
+    "Group",
+    "INTERACTION_REGISTERS",
+    "Interactable",
+    "LinkButton",
+    "MaxValue",
+    "MinValue",
+    "Modifier",
+    "SelectMenu",
+    "SelectOption",
+    "Subgroup",
+    "button",
+    "command",
+    "component",
+    "message_command",
+    "select_menu",
+    "user_command",
 )
diff --git a/pincer/commands/chat_command_handler.py b/pincer/commands/chat_command_handler.py
index 1772f2b0..969a0028 100644
--- a/pincer/commands/chat_command_handler.py
+++ b/pincer/commands/chat_command_handler.py
@@ -77,9 +77,7 @@ class ChatCommandHandler(metaclass=Singleton):
     def __init__(self, client: Client):
         self.client = client
         self._api_commands: List[AppCommand] = []
-        _log.debug(
-            "%i commands registered.", len(ChatCommandHandler.register)
-        )
+        _log.debug("%i commands registered.", len(ChatCommandHandler.register))
 
         self.__prefix = f"applications/{self.client.bot.id}"
 
@@ -94,13 +92,17 @@ async def get_commands(self) -> List[AppCommand]:
             List of commands.
         """
         # TODO: Update if discord adds bulk get guild commands
-        guild_commands = await gather(*(
-            self.client.http.get(
-                self.__prefix + self.__get_guild.format(
-                    guild_id=guild.id if isinstance(guild, Guild) else guild
+        guild_commands = await gather(
+            *(
+                self.client.http.get(
+                    self.__prefix
+                    + self.__get_guild.format(
+                        guild_id=guild.id if isinstance(guild, Guild) else guild
+                    )
                 )
-            ) for guild in self.client.guilds
-        ))
+                for guild in self.client.guilds
+            )
+        )
         return list(
             map(
                 AppCommand.from_dict,
@@ -209,7 +211,7 @@ def __build_local_commands():
                         description=cmd.group.description,
                         type=AppCommandType.CHAT_INPUT,
                         guild_id=cmd.metadata.guild_id,
-                        options=[]
+                        options=[],
                     )
 
                 # The top-level command now exists. A subcommand group now if placed
@@ -221,7 +223,7 @@ def __build_local_commands():
                     name=cmd.sub_group.name,
                     description=cmd.sub_group.description,
                     type=AppCommandOptionType.SUB_COMMAND_GROUP,
-                    options=[]
+                    options=[],
                 )
 
                 # This for-else makes sure that sub_command_group will hold a reference
@@ -230,7 +232,8 @@ def __build_local_commands():
                 for cmd_in_children in children:
                     if (
                         cmd_in_children.name == sub_command_group.name
-                        and cmd_in_children.description == sub_command_group.description
+                        and cmd_in_children.description
+                        == sub_command_group.description
                         and cmd_in_children.type == sub_command_group.type
                     ):
                         sub_command_group = cmd_in_children
@@ -238,12 +241,14 @@ def __build_local_commands():
                 else:
                     children.append(sub_command_group)
 
-                sub_command_group.options.append(AppCommandOption(
-                    name=cmd.metadata.name,
-                    description=cmd.metadata.description,
-                    type=AppCommandOptionType.SUB_COMMAND,
-                    options=cmd.metadata.options,
-                ))
+                sub_command_group.options.append(
+                    AppCommandOption(
+                        name=cmd.metadata.name,
+                        description=cmd.metadata.description,
+                        type=AppCommandOptionType.SUB_COMMAND,
+                        options=cmd.metadata.options,
+                    )
+                )
 
                 continue
 
@@ -264,7 +269,7 @@ def __build_local_commands():
                     cmd.metadata.guild_id,
                     AppCommandOptionType.SUB_COMMAND,
                     None,
-                    None
+                    None,
                 )
 
                 if key not in ChatCommandHandler.built_register:
@@ -273,7 +278,7 @@ def __build_local_commands():
                         description=cmd.group.description,
                         type=AppCommandOptionType.SUB_COMMAND,
                         guild_id=cmd.metadata.guild_id,
-                        options=[]
+                        options=[],
                     )
 
                 # No checking has to be done before appending `cmd` since it is the
@@ -283,7 +288,7 @@ def __build_local_commands():
                         name=cmd.metadata.name,
                         description=cmd.metadata.description,
                         type=AppCommandType.CHAT_INPUT,
-                        options=cmd.metadata.options
+                        options=cmd.metadata.options,
                     )
                 )
 
@@ -330,13 +335,10 @@ def should_be_removed(target: AppCommand) -> bool:
         # NOTE: Cannot be generator since it can't be consumed due to lines 743-745
         to_remove = [*filter(should_be_removed, self._api_commands)]
 
-        await gather(
-            *(self.remove_command(cmd) for cmd in to_remove)
-        )
+        await gather(*(self.remove_command(cmd) for cmd in to_remove))
 
         self._api_commands = [
-            cmd for cmd in self._api_commands
-            if cmd not in to_remove
+            cmd for cmd in self._api_commands if cmd not in to_remove
         ]
 
     async def __add_commands(self):
@@ -374,28 +376,22 @@ async def initialize(self):
         await self.__add_commands()
 
 
-def _hash_interactable_structure(interactable: InteractableStructure[AppCommand]):
+def _hash_interactable_structure(
+    interactable: InteractableStructure[AppCommand],
+):
     return _hash_app_command(
-        interactable.metadata,
-        interactable.group,
-        interactable.sub_group
+        interactable.metadata, interactable.group, interactable.sub_group
     )
 
 
 def _hash_app_command(
-    command: AppCommand,
-    group: Optional[str],
-    sub_group: Optional[str]
+    command: AppCommand, group: Optional[str], sub_group: Optional[str]
 ) -> int:
     """
     See :func:`~pincer.commands.commands._hash_app_command_params` for information.
     """
     return _hash_app_command_params(
-        command.name,
-        command.guild_id,
-        command.type,
-        group,
-        sub_group
+        command.name, command.guild_id, command.type, group, sub_group
     )
 
 
@@ -404,7 +400,7 @@ def _hash_app_command_params(
     guild_id: Union[Snowflake, None, MISSING],
     app_command_type: AppCommandType,
     group: Optional[str],
-    sub_group: Optional[str]
+    sub_group: Optional[str],
 ) -> int:
     """
     The group layout in Pincer is very different from what discord has on their docs.
diff --git a/pincer/commands/commands.py b/pincer/commands/commands.py
index a36c8931..ef3cba25 100644
--- a/pincer/commands/commands.py
+++ b/pincer/commands/commands.py
@@ -11,9 +11,7 @@
 from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union, List
 
 from . import __package__
-from .chat_command_handler import (
-    ChatCommandHandler, _hash_app_command_params
-)
+from .chat_command_handler import ChatCommandHandler, _hash_app_command_params
 from ..commands.arg_types import (
     ChannelTypes,
     CommandArg,
@@ -88,7 +86,7 @@ def command(
     cooldown: Optional[int] = 0,
     cooldown_scale: Optional[float] = 60.0,
     cooldown_scope: Optional[ThrottleScope] = ThrottleScope.USER,
-    parent: Optional[Union[Group, Subgroup]] = None
+    parent: Optional[Union[Group, Subgroup]] = None,
 ):
     """A decorator to create a slash command to register and respond to
     with the discord API from a function.
@@ -193,7 +191,7 @@ async def test_command(
             cooldown=cooldown,
             cooldown_scale=cooldown_scale,
             cooldown_scope=cooldown_scope,
-            parent=parent
+            parent=parent,
         )
 
     cmd = name or func.__name__
@@ -268,9 +266,7 @@ def get_arg(t: T) -> APINullable[T]:
                         return obj.get_payload()
                 return MISSING
 
-        argument_description = (
-            get_arg(Description) or "Description not set"
-        )
+        argument_description = get_arg(Description) or "Description not set"
 
         choices = get_arg(Choices)
 
@@ -284,10 +280,7 @@ def get_arg(t: T) -> APINullable[T]:
             )
         if choices is not MISSING:
             for choice in choices:
-                if (
-                    isinstance(choice.value, int)
-                    and argument_type is float
-                ):
+                if isinstance(choice.value, int) and argument_type is float:
                     continue
                 if not isinstance(choice.value, argument_type):
                     raise InvalidArgumentAnnotation(
@@ -295,10 +288,7 @@ def get_arg(t: T) -> APINullable[T]:
                     )
 
         channel_types = get_arg(ChannelTypes)
-        if (
-            channel_types is not MISSING
-            and argument_type is not Channel
-        ):
+        if channel_types is not MISSING and argument_type is not Channel:
             raise InvalidArgumentAnnotation(
                 "ChannelTypes are only available for Channels"
             )
@@ -346,7 +336,7 @@ def get_arg(t: T) -> APINullable[T]:
         cooldown_scale=cooldown_scale,
         cooldown_scope=cooldown_scope,
         command_options=options,
-        parent=parent
+        parent=parent,
     )
 
 
@@ -546,7 +536,7 @@ def register_command(
     cooldown_scale: Optional[float] = 60.0,
     cooldown_scope: Optional[ThrottleScope] = ThrottleScope.USER,
     command_options=MISSING,  # Missing typehint?
-    parent: Optional[Union[Group, Subgroup]] = MISSING
+    parent: Optional[Union[Group, Subgroup]] = MISSING,
 ):
     cmd = name or func.__name__
 
@@ -594,9 +584,7 @@ def register_command(
             f"registered by `{reg.call.__name__}`."
         )
 
-    _log.info(
-        f"Registered command `{cmd}` to `{func.__name__}` locally."
-    )
+    _log.info(f"Registered command `{cmd}` to `{func.__name__}` locally.")
 
     interactable = InteractableStructure(
         call=func,
@@ -612,17 +600,13 @@ def register_command(
             type=app_command_type,
             default_permission=enable_default,
             options=command_options,
-            guild_id=guild_id
+            guild_id=guild_id,
         ),
     )
 
     ChatCommandHandler.register[
         _hash_app_command_params(
-            cmd,
-            guild_id,
-            app_command_type,
-            group,
-            sub_group
+            cmd, guild_id, app_command_type, group, sub_group
         )
     ] = interactable
 
diff --git a/pincer/commands/components/__init__.py b/pincer/commands/components/__init__.py
index 05d4499a..7778dc0a 100644
--- a/pincer/commands/components/__init__.py
+++ b/pincer/commands/components/__init__.py
@@ -8,7 +8,14 @@
 from .select_menu import SelectMenu, SelectOption
 
 __all__ = (
-    "ActionRow", "Button", "ButtonStyle", "ComponentHandler",
-    "LinkButton", "SelectMenu", "SelectOption", "button", "component",
-    "select_menu"
+    "ActionRow",
+    "Button",
+    "ButtonStyle",
+    "ComponentHandler",
+    "LinkButton",
+    "SelectMenu",
+    "SelectOption",
+    "button",
+    "component",
+    "select_menu",
 )
diff --git a/pincer/commands/components/action_row.py b/pincer/commands/components/action_row.py
index a3d26783..a7194dc8 100644
--- a/pincer/commands/components/action_row.py
+++ b/pincer/commands/components/action_row.py
@@ -9,6 +9,7 @@
 from ...objects.app.command import InteractableStructure
 
 from ...utils.api_object import APIObject
+
 if TYPE_CHECKING:
     from typing import Dict
 
@@ -32,5 +33,5 @@ def to_dict(self) -> Dict:
             "type": 1,
             "components": [
                 component.metadata.to_dict() for component in self.components
-            ]
+            ],
         }
diff --git a/pincer/commands/components/button.py b/pincer/commands/components/button.py
index 48bc9725..e4cfb2fb 100644
--- a/pincer/commands/components/button.py
+++ b/pincer/commands/components/button.py
@@ -37,6 +37,7 @@ class ButtonStyle(IntEnum):
         - color: gray, navigates to a URL
         - required_field: url
     """
+
     PRIMARY = 1
     SECONDARY = 2
     SUCCESS = 3
@@ -67,6 +68,7 @@ class Button(_Component):
     disabled: APINullable[:class:`bool`]
         Whether the button is disabled |default| :data:`False`
     """
+
     custom_id: APINullable[str]
     label: APINullable[str]
     style: ButtonStyle
diff --git a/pincer/commands/components/decorators.py b/pincer/commands/components/decorators.py
index e9bd08cc..bdc00440 100644
--- a/pincer/commands/components/decorators.py
+++ b/pincer/commands/components/decorators.py
@@ -26,6 +26,7 @@ def component(custom_id):
     custom_id : str
         The ID of the message component to handle.
     """
+
     def wrap(custom_id, func):
         ComponentHandler().register_id(_id=custom_id, func=func)
         return func
@@ -39,7 +40,7 @@ def button(
     emoji: Emoji = None,
     url: str = None,
     disabled: bool = None,
-    custom_id: str = None
+    custom_id: str = None,
 ) -> Button:
     """
     Turn a function into handler for a :class:`~pincer.commands.components.button.Button`.
@@ -72,7 +73,9 @@ async def button_one():
     def wrap(custom_id, func) -> Button:
 
         if not iscoroutinefunction(func):
-            raise CommandIsNotCoroutine(f"`{func.__name__}` must be a coroutine.")
+            raise CommandIsNotCoroutine(
+                f"`{func.__name__}` must be a coroutine."
+            )
 
         if custom_id is None:
             custom_id = func.__name__
@@ -91,10 +94,12 @@ def wrap(custom_id, func) -> Button:
                         "url": url,
                     }
                 )
-            )
+            ),
         )
 
-        ComponentHandler.register[interactable.metadata.custom_id] = interactable
+        ComponentHandler.register[
+            interactable.metadata.custom_id
+        ] = interactable
 
         return interactable
 
@@ -108,7 +113,7 @@ def select_menu(
     min_values: int = None,
     max_values: int = None,
     disabled: bool = None,
-    custom_id: str = None
+    custom_id: str = None,
 ) -> SelectMenu:
     """
     Turn a function into handler for a :class:`~pincer.commands.components.select_menu.SelectMenu`.
@@ -145,7 +150,9 @@ async def select_menu(values: List[str]):
     def wrap(custom_id, func) -> SelectMenu:
 
         if not iscoroutinefunction(func):
-            raise CommandIsNotCoroutine(f"`{func.__name__}` must be a coroutine.")
+            raise CommandIsNotCoroutine(
+                f"`{func.__name__}` must be a coroutine."
+            )
 
         if custom_id is None:
             custom_id = func.__name__
@@ -164,10 +171,12 @@ def wrap(custom_id, func) -> SelectMenu:
                         "disabled": disabled,
                     }
                 )
-            )
+            ),
         )
 
-        ComponentHandler.register[interactable.metadata.custom_id] = interactable
+        ComponentHandler.register[
+            interactable.metadata.custom_id
+        ] = interactable
 
         return interactable
 
diff --git a/pincer/commands/components/select_menu.py b/pincer/commands/components/select_menu.py
index c6f89d64..cb9cdd81 100644
--- a/pincer/commands/components/select_menu.py
+++ b/pincer/commands/components/select_menu.py
@@ -35,6 +35,7 @@ class SelectOption(APIObject):
     default: APINullable[:class:`bool`]
         Will render this option as selected by default
     """
+
     label: str
     value: APINullable[str] = MISSING
     description: APINullable[str] = MISSING
@@ -72,6 +73,7 @@ class SelectMenu(_Component):
         Disable the selects
         |default| False
     """
+
     custom_id: str
     options: Optional[List[SelectOption]] = None
 
diff --git a/pincer/commands/groups.py b/pincer/commands/groups.py
index bb7d8d07..50e89509 100644
--- a/pincer/commands/groups.py
+++ b/pincer/commands/groups.py
@@ -32,6 +32,7 @@ async def a_very_cool_command():
         The description of the command. This has to be sent to Discord, but it does
         nothing, so it is optional.
     """
+
     name: str
     description: Optional[str] = None
 
@@ -69,6 +70,7 @@ async def a_very_cool_command():
         The description of the command. This has to be sent to Discord, but it does
         nothing, so it is optional.
     """
+
     name: str
     parent: Group
     description: Optional[str] = None
diff --git a/pincer/commands/interactable.py b/pincer/commands/interactable.py
index 050ec2f7..34a68a51 100644
--- a/pincer/commands/interactable.py
+++ b/pincer/commands/interactable.py
@@ -11,7 +11,9 @@
 from ..objects.app.command import AppCommand, InteractableStructure
 
 
-INTERACTION_REGISTERS = ChainMap(ChatCommandHandler.register, ComponentHandler.register)
+INTERACTION_REGISTERS = ChainMap(
+    ChatCommandHandler.register, ComponentHandler.register
+)
 
 
 class Interactable:
@@ -37,9 +39,8 @@ def unassign(self):
         ComponentHandler and removes loaded events from the client.
         """
         for value in vars(type(self)).values():
-            if (
-                isinstance(value, InteractableStructure)
-                and isinstance(value.metadata, AppCommand)
+            if isinstance(value, InteractableStructure) and isinstance(
+                value.metadata, AppCommand
             ):
                 for key, _value in INTERACTION_REGISTERS.items():
                     if value is _value:
diff --git a/pincer/core/__init__.py b/pincer/core/__init__.py
index a5e55f0f..96ff3233 100644
--- a/pincer/core/__init__.py
+++ b/pincer/core/__init__.py
@@ -8,6 +8,10 @@
 
 
 __all__ = (
-    "Bucket", "Gateway", "GatewayDispatch", "GatewayInfo",
-    "HTTPClient", "RateLimiter"
+    "Bucket",
+    "Gateway",
+    "GatewayDispatch",
+    "GatewayInfo",
+    "HTTPClient",
+    "RateLimiter",
 )
diff --git a/pincer/core/dispatch.py b/pincer/core/dispatch.py
index c1fe1bce..4e0ba935 100644
--- a/pincer/core/dispatch.py
+++ b/pincer/core/dispatch.py
@@ -28,11 +28,11 @@ class GatewayDispatch:
     """
 
     def __init__(
-            self,
-            op: int,
-            data: Optional[Union[int, bool, Dict[str, Any]]] = None,
-            seq: Optional[int] = None,
-            name: Optional[str] = None
+        self,
+        op: int,
+        data: Optional[Union[int, bool, Dict[str, Any]]] = None,
+        seq: Optional[int] = None,
+        name: Optional[str] = None,
     ):
         self.op: int = op
         self.data: Optional[Union[int, bool, Dict[str, Any]]] = data
@@ -41,12 +41,7 @@ def __init__(
 
     def __str__(self) -> str:
         return dumps(
-            dict(
-                op=self.op,
-                d=self.data,
-                s=self.seq,
-                t=self.event_name
-            )
+            dict(op=self.op, d=self.data, s=self.seq, t=self.event_name)
         )
 
     @classmethod
@@ -69,5 +64,5 @@ def from_string(cls, payload: str) -> GatewayDispatch:
             payload.get("op"),
             payload.get("d"),
             payload.get("s"),
-            payload.get("t")
+            payload.get("t"),
         )
diff --git a/pincer/core/gateway.py b/pincer/core/gateway.py
index 76d0f21c..667926e2 100644
--- a/pincer/core/gateway.py
+++ b/pincer/core/gateway.py
@@ -15,7 +15,10 @@
 from zlib import decompressobj
 
 from aiohttp import (
-    ClientSession, WSMsgType, ClientConnectorError, ClientWebSocketResponse
+    ClientSession,
+    WSMsgType,
+    ClientConnectorError,
+    ClientWebSocketResponse,
 )
 
 from . import __package__
@@ -23,22 +26,27 @@
 from .._config import GatewayConfig
 from ..core.dispatch import GatewayDispatch
 from ..exceptions import (
-    InvalidTokenError, GatewayConnectionError, GatewayError, UnhandledException
+    InvalidTokenError,
+    GatewayConnectionError,
+    GatewayError,
+    UnhandledException,
 )
 
 if TYPE_CHECKING:
     from ..objects.app.intents import Intents
+
     Handler = Callable[[GatewayDispatch], None]
 
 _log = logging.getLogger(__package__)
 
-ZLIB_SUFFIX = b'\x00\x00\xff\xff'
+ZLIB_SUFFIX = b"\x00\x00\xff\xff"
 inflator = decompressobj()
 
 
 @dataclass
 class SessionStartLimit(APIObject):
     """Session start limit info returned from the `gateway/bot` endpoint"""
+
     total: int
     remaining: int
     reset_after: int
@@ -48,6 +56,7 @@ class SessionStartLimit(APIObject):
 @dataclass
 class GatewayInfo(APIObject):
     """Gateway info returned from the `gateway/bot` endpoint"""
+
     url: str
     shards: int
     session_start_limit: SessionStartLimit
@@ -83,11 +92,12 @@ class Gateway:
 
     def __init__(
         self,
-        token: str, *,
+        token: str,
+        *,
         intents: Intents,
         url: str,
         shard: int,
-        num_shards: int
+        num_shards: int,
     ) -> None:
         if len(token) != 59:
             raise InvalidTokenError(
@@ -106,7 +116,7 @@ def __init__(
             7: self.handle_reconnect,
             9: self.handle_invalid_session,
             10: self.identify_and_handle_hello,
-            11: self.handle_heartbeat
+            11: self.handle_heartbeat,
         }
 
         # 4000 and 4009 are not included. The client will reconnect when receiving
@@ -120,13 +130,15 @@ def __init__(
             4005: GatewayError(
                 "Authentication was sent after client already authenticated"
             ),
-            4007: GatewayError("Invalid sequence sent when starting new session"),
+            4007: GatewayError(
+                "Invalid sequence sent when starting new session"
+            ),
             4008: GatewayError("Client was rate limited"),
             4010: GatewayError("Invalid shard"),
             4011: GatewayError("Sharding required"),
             4012: GatewayError("Invalid API version"),
             4013: GatewayError("Invalid intents"),
-            4014: GatewayError("Disallowed intents")
+            4014: GatewayError("Disallowed intents"),
         }
 
         # ClientSession to be used for this Dispatcher
@@ -224,7 +236,7 @@ async def start_loop(self):
                 _log.warning(
                     "%s Could not open websocket with Discord."
                     " Retrying in 15 seconds...",
-                    self.shard_key
+                    self.shard_key,
                 )
                 await sleep(15)
 
@@ -257,7 +269,7 @@ async def event_loop(self):
 
         _log.debug(
             "%s Disconnected from Gateway due without any errors. Reconnecting.",
-            self.shard_key
+            self.shard_key,
         )
         # ensure_future prevents a stack overflow
         ensure_future(self.start_loop())
@@ -279,19 +291,23 @@ async def handle_data(self, data: Dict[Any]):
             "%s %s GatewayDispatch with opcode %s received",
             self.shard_key,
             datetime.now(),
-            payload.op
+            payload.op,
         )
 
         # Many events are sent with a `null` sequence. This sequence should not
         # be tracked.
         if payload.seq is not None:
             self.__sequence_number = payload.seq
-            _log.debug("%s Set sequence number to %s", self.shard_key, payload.seq)
+            _log.debug(
+                "%s Set sequence number to %s", self.shard_key, payload.seq
+            )
 
         handler = self.__dispatch_handlers.get(payload.op)
 
         if handler is None:
-            raise UnhandledException(f"Opcode {payload.op} does not have a handler")
+            raise UnhandledException(
+                f"Opcode {payload.op} does not have a handler"
+            )
 
         ensure_future(handler(payload))
 
@@ -308,7 +324,7 @@ async def handle_reconnect(self, payload: GatewayDispatch):
         _log.debug(
             "%s Requested to reconnect to Discord. Closing session and attempting to"
             " resume...",
-            self.shard_key
+            self.shard_key,
         )
 
         self.__should_resume = True
@@ -324,7 +340,7 @@ async def handle_invalid_session(self, payload: GatewayDispatch):
         _log.debug(
             "%s Invalid session, attempting to %s...",
             self.shard_key,
-            "reconnect" if payload.data else "relog"
+            "reconnect" if payload.data else "relog",
         )
 
         self.__should_resume = payload.data
@@ -344,30 +360,38 @@ async def identify_and_handle_hello(self, payload: GatewayDispatch):
         if self.__should_resume:
             _log.debug("%s Resuming connection with Discord", self.shard_key)
 
-            await self.send(str(GatewayDispatch(
-                6, {
-                    "token": self.token,
-                    "session_id": self.__session_id,
-                    "seq": self.__sequence_number
-                }
-            )))
+            await self.send(
+                str(
+                    GatewayDispatch(
+                        6,
+                        {
+                            "token": self.token,
+                            "session_id": self.__session_id,
+                            "seq": self.__sequence_number,
+                        },
+                    )
+                )
+            )
             return
 
-        await self.send(str(
-            GatewayDispatch(
-                2, {
-                    "token": self.token,
-                    "intents": self.intents,
-                    "properties": {
-                        "$os": system(),
-                        "$browser": __package__,
-                        "$device": __package__
+        await self.send(
+            str(
+                GatewayDispatch(
+                    2,
+                    {
+                        "token": self.token,
+                        "intents": self.intents,
+                        "properties": {
+                            "$os": system(),
+                            "$browser": __package__,
+                            "$device": __package__,
+                        },
+                        "compress": GatewayConfig.compressed(),
+                        "shard": self.shard_key,
                     },
-                    "compress": GatewayConfig.compressed(),
-                    "shard": self.shard_key
-                }
+                )
             )
-        ))
+        )
         self.__heartbeat_interval = payload.data["heartbeat_interval"]
 
         self.start_heartbeat()
@@ -392,16 +416,11 @@ async def send(self, payload: str):
                 self.__session_id, "%s..." % self.__session_id[:4]
             )
 
-        _log.debug(
-            "%s Sending payload: %s",
-            self.shard_key,
-            safe_payload
-        )
+        _log.debug("%s Sending payload: %s", self.shard_key, safe_payload)
 
         if self.__socket.closed:
             _log.debug(
-                "%s Socket is closing. Payload not sent.",
-                self.shard_key
+                "%s Socket is closing. Payload not sent.", self.shard_key
             )
             return
 
@@ -442,14 +461,13 @@ async def __heartbeat_loop(self):
 
             _log.debug(
                 "%s %s sending heartbeat in %sms",
-                self.shard_key, datetime.now(),
-                duration
+                self.shard_key,
+                datetime.now(),
+                duration,
             )
 
             # Task is needed so waiting can be cancelled by op code 1
-            self.__wait_for_heartbeat = create_task(
-                sleep(duration / 1000)
-            )
+            self.__wait_for_heartbeat = create_task(sleep(duration / 1000))
 
             await self.__wait_for_heartbeat
 
@@ -459,7 +477,7 @@ async def __heartbeat_loop(self):
                     "%s %s ack not received. Attempting to reconnect."
                     " Closing socket with close code 4000. \U0001f480",
                     datetime.now(),
-                    self.shard_key
+                    self.shard_key,
                 )
                 await self.__socket.close(code=4000)
                 self.__should_resume = True
@@ -468,5 +486,7 @@ async def __heartbeat_loop(self):
                 return
 
             self.__has_received_ack = False
-            await self.send(str(GatewayDispatch(1, data=self.__sequence_number)))
+            await self.send(
+                str(GatewayDispatch(1, data=self.__sequence_number))
+            )
             _log.debug("%s sent heartbeat", self.shard_key)
diff --git a/pincer/core/http.py b/pincer/core/http.py
index 63c3bc47..0395cd01 100644
--- a/pincer/core/http.py
+++ b/pincer/core/http.py
@@ -15,9 +15,15 @@
 from .ratelimiter import RateLimiter
 from .._config import GatewayConfig
 from ..exceptions import (
-    NotFoundError, BadRequestError, NotModifiedError, UnauthorizedError,
-    ForbiddenError, MethodNotAllowedError, RateLimitError, ServerError,
-    HTTPError
+    NotFoundError,
+    BadRequestError,
+    NotModifiedError,
+    UnauthorizedError,
+    ForbiddenError,
+    MethodNotAllowedError,
+    RateLimitError,
+    ServerError,
+    HTTPError,
 )
 from ..utils.conversion import remove_none
 
@@ -34,13 +40,16 @@
 
 class HttpCallable(Protocol):
     """Aiohttp HTTP method."""
+
     __name__: str
 
     def __call__(
-            self, url: StrOrURL, *,
-            allow_redirects: bool = True,
-            method: Optional[Union[Dict, str, Payload]] = None,
-            **kwargs: Any
+        self,
+        url: StrOrURL,
+        *,
+        allow_redirects: bool = True,
+        method: Optional[Union[Dict, str, Payload]] = None,
+        **kwargs: Any,
     ) -> _RequestContextManager:
         ...
 
@@ -79,7 +88,7 @@ def __init__(self, token: str, *, version: int = None, ttl: int = 5):
 
         headers: Dict[str, str] = {
             "Authorization": f"Bot {token}",
-            "User-Agent": f"DiscordBot (https://github.com/Pincer-org/Pincer, {pincer.__version__})"  # noqa: E501
+            "User-Agent": f"DiscordBot (https://github.com/Pincer-org/Pincer, {pincer.__version__})",  # noqa: E501
         }
         self.__rate_limiter = RateLimiter()
         self.__session: ClientSession = ClientSession(headers=headers)
@@ -91,7 +100,7 @@ def __init__(self, token: str, *, version: int = None, ttl: int = 5):
             403: ForbiddenError(),
             404: NotFoundError(),
             405: MethodNotAllowedError(),
-            429: RateLimitError()
+            429: RateLimitError(),
         }
 
     # for with block
@@ -109,14 +118,15 @@ async def close(self):
         await self.__session.close()
 
     async def __send(
-            self,
-            method: HttpCallable,
-            endpoint: str, *,
-            content_type: str = "application/json",
-            data: Optional[Union[Dict, str, Payload]] = None,
-            headers: Optional[Dict[str, Any]] = None,
-            _ttl: Optional[int] = None,
-            params: Optional[Dict] = None,
+        self,
+        method: HttpCallable,
+        endpoint: str,
+        *,
+        content_type: str = "application/json",
+        data: Optional[Union[Dict, str, Payload]] = None,
+        headers: Optional[Dict[str, Any]] = None,
+        _ttl: Optional[int] = None,
+        params: Optional[Dict] = None,
     ) -> Optional[Dict]:
         """
         Send an api request to the Discord REST API.
@@ -168,33 +178,30 @@ async def __send(
         # TODO: Adjust to work non-json types
         _log.debug(f"{method.__name__.upper()} {endpoint} | {data}")
 
-        await self.__rate_limiter.wait_until_not_ratelimited(
-            endpoint,
-            method
-        )
+        await self.__rate_limiter.wait_until_not_ratelimited(endpoint, method)
 
         url = f"{self.url}/{endpoint}"
         async with method(
-                url,
-                data=data,
-                headers={
-                    "Content-Type": content_type,
-                    **(remove_none(headers) or {})
-                },
-                params=remove_none(params)
+            url,
+            data=data,
+            headers={
+                "Content-Type": content_type,
+                **(remove_none(headers) or {}),
+            },
+            params=remove_none(params),
         ) as res:
             return await self.__handle_response(
                 res, method, endpoint, content_type, data, ttl
             )
 
     async def __handle_response(
-            self,
-            res: ClientResponse,
-            method: HttpCallable,
-            endpoint: str,
-            content_type: str,
-            data: Optional[str],
-            _ttl: int,
+        self,
+        res: ClientResponse,
+        method: HttpCallable,
+        endpoint: str,
+        content_type: str,
+        data: Optional[str],
+        _ttl: int,
     ) -> Optional[Dict]:
         """
         Handle responses from the discord API.
@@ -226,15 +233,11 @@ async def __handle_response(
         """
         _log.debug(f"Received response for {endpoint} | {await res.text()}")
 
-        self.__rate_limiter.save_response_bucket(
-            endpoint, method, res.headers
-        )
+        self.__rate_limiter.save_response_bucket(endpoint, method, res.headers)
 
         if res.ok:
             if res.status == 204:
-                _log.debug(
-                    "Request has been sent successfully. "
-                )
+                _log.debug("Request has been sent successfully. ")
                 return
 
             _log.debug(
@@ -257,10 +260,7 @@ async def __handle_response(
                 )
                 await sleep(timeout)
                 return await self.__send(
-                    method,
-                    endpoint,
-                    content_type=content_type,
-                    data=data
+                    method, endpoint, content_type=content_type, data=data
                 )
 
             _log.error(
@@ -287,13 +287,11 @@ async def __handle_response(
             endpoint,
             content_type=content_type,
             _ttl=_ttl - 1,
-            data=data
+            data=data,
         )
 
     async def delete(
-            self,
-            route: str,
-            headers: Optional[Dict[str, Any]] = None
+        self, route: str, headers: Optional[Dict[str, Any]] = None
     ) -> Optional[Dict]:
         """|coro|
 
@@ -312,16 +310,10 @@ async def delete(
         Optional[:class:`Dict`]
             The response from discord.
         """
-        return await self.__send(
-            self.__session.delete,
-            route,
-            headers=headers
-        )
+        return await self.__send(self.__session.delete, route, headers=headers)
 
     async def get(
-        self,
-        route: str,
-        params: Optional[Dict] = None
+        self, route: str, params: Optional[Dict] = None
     ) -> Optional[Dict]:
         """|coro|
 
@@ -340,11 +332,7 @@ async def get(
         Optional[:class:`Dict`]
             The response from discord.
         """
-        return await self.__send(
-            self.__session.get,
-            route,
-            params=params
-        )
+        return await self.__send(self.__session.get, route, params=params)
 
     async def head(self, route: str) -> Optional[Dict]:
         """|coro|
@@ -381,11 +369,11 @@ async def options(self, route: str) -> Optional[Dict]:
         return await self.__send(self.__session.options, route)
 
     async def patch(
-            self,
-            route: str,
-            data: Optional[Dict] = None,
-            content_type: str = "application/json",
-            headers: Optional[Dict[str, Any]] = None
+        self,
+        route: str,
+        data: Optional[Dict] = None,
+        content_type: str = "application/json",
+        headers: Optional[Dict[str, Any]] = None,
     ) -> Optional[Dict]:
         """|coro|
 
@@ -413,15 +401,15 @@ async def patch(
             route,
             content_type=content_type,
             data=data,
-            headers=headers
+            headers=headers,
         )
 
     async def post(
-            self,
-            route: str,
-            data: Optional[Dict] = None,
-            content_type: str = "application/json",
-            headers: Optional[Dict[str, Any]] = None
+        self,
+        route: str,
+        data: Optional[Dict] = None,
+        content_type: str = "application/json",
+        headers: Optional[Dict[str, Any]] = None,
     ) -> Optional[Dict]:
         """|coro|
 
@@ -448,15 +436,15 @@ async def post(
             route,
             content_type=content_type,
             data=data,
-            headers=headers
+            headers=headers,
         )
 
     async def put(
-            self,
-            route: str,
-            data: Optional[Dict] = None,
-            content_type: str = "application/json",
-            headers: Optional[Dict[str, Any]] = None
+        self,
+        route: str,
+        data: Optional[Dict] = None,
+        content_type: str = "application/json",
+        headers: Optional[Dict[str, Any]] = None,
     ) -> Optional[Dict]:
         """|coro|
 
@@ -483,5 +471,5 @@ async def put(
             route,
             content_type=content_type,
             data=data,
-            headers=headers
+            headers=headers,
         )
diff --git a/pincer/core/ratelimiter.py b/pincer/core/ratelimiter.py
index 37849aec..fe3bf97d 100644
--- a/pincer/core/ratelimiter.py
+++ b/pincer/core/ratelimiter.py
@@ -33,6 +33,7 @@ class Bucket:
     time_cached : float
         Time since epoch when this bucket was last saved.
     """
+
     limit: int
     remaining: int
     reset: float
@@ -55,10 +56,7 @@ def __init__(self) -> None:
         self.buckets: Dict[str, Bucket] = {}
 
     def save_response_bucket(
-        self,
-        endpoint: str,
-        method: HttpCallable,
-        header: Dict
+        self, endpoint: str, method: HttpCallable, header: Dict
     ):
         """
         Parameters
@@ -82,19 +80,17 @@ def save_response_bucket(
             remaining=int(header["X-RateLimit-Remaining"]),
             reset=float(header["X-RateLimit-Reset"]),
             reset_after=float(header["X-RateLimit-Reset-After"]),
-            time_cached=time()
+            time_cached=time(),
         )
 
         _log.info(
             "Rate limit bucket detected: %s - %r.",
             bucket_id,
-            self.buckets[bucket_id]
+            self.buckets[bucket_id],
         )
 
     async def wait_until_not_ratelimited(
-        self,
-        endpoint: str,
-        method: HttpCallable
+        self, endpoint: str, method: HttpCallable
     ):
         """|coro|
         Waits until the response no longer needs to be blocked to prevent a
@@ -121,12 +117,9 @@ async def wait_until_not_ratelimited(
             _log.info(
                 "Waiting for %ss until rate limit for bucket %s is over.",
                 sleep_time,
-                bucket_id
+                bucket_id,
             )
 
             await sleep(sleep_time)
 
-            _log.info(
-                "Message sent. Bucket %s rate limit ended.",
-                bucket_id
-            )
+            _log.info("Message sent. Bucket %s rate limit ended.", bucket_id)
diff --git a/pincer/exceptions.py b/pincer/exceptions.py
index f895ea4e..1baebaaf 100644
--- a/pincer/exceptions.py
+++ b/pincer/exceptions.py
@@ -245,7 +245,7 @@ class InvalidTokenError(DispatchError, ValueError):
     """Exception raised when the authorization token is invalid."""
 
     def __init__(self, hint: Optional[str] = None):
-        hint = hint or ''
+        hint = hint or ""
 
         super(InvalidTokenError, self).__init__(
             "The given token is not a valid token.\n" + hint
diff --git a/pincer/middleware/channel_pins_update.py b/pincer/middleware/channel_pins_update.py
index d2ca6d22..ab3c58c1 100644
--- a/pincer/middleware/channel_pins_update.py
+++ b/pincer/middleware/channel_pins_update.py
@@ -16,9 +16,7 @@
 
 
 async def channel_pins_update_middleware(
-    self: Client,
-    gateway: Gateway,
-    payload: GatewayDispatch
+    self: Client, gateway: Gateway, payload: GatewayDispatch
 ):
     """|coro|
 
diff --git a/pincer/middleware/interaction_create.py b/pincer/middleware/interaction_create.py
index be4137ff..52ce8809 100644
--- a/pincer/middleware/interaction_create.py
+++ b/pincer/middleware/interaction_create.py
@@ -88,7 +88,9 @@ def get_command_from_registry(interaction: Interaction):
     )
 
 
-def get_call(self: Client, interaction: Interaction) -> Optional[Tuple[Coro, Any]]:
+def get_call(
+    self: Client, interaction: Interaction
+) -> Optional[Tuple[Coro, Any]]:
     if interaction.type == InteractionType.APPLICATION_COMMAND:
         command = get_command_from_registry(interaction)
         if command is None:
@@ -157,7 +159,7 @@ async def interaction_handler(
     interaction: Interaction,
     context: MessageContext,
     command: Coro,
-    manager: Any
+    manager: Any,
 ):
     """|coro|
 
diff --git a/pincer/middleware/resumed.py b/pincer/middleware/resumed.py
index d1b1e429..4c6012b7 100644
--- a/pincer/middleware/resumed.py
+++ b/pincer/middleware/resumed.py
@@ -21,9 +21,7 @@
 
 
 async def on_resumed(
-    self: Client,
-    gateway: Gateway,
-    payload: GatewayDispatch
+    self: Client, gateway: Gateway, payload: GatewayDispatch
 ) -> Tuple[str]:
     """|coro|
 
@@ -44,7 +42,7 @@ async def on_resumed(
 
     _log.debug(
         "%s Successfully reconnected to Discord gateway. Restarting heartbeat.",
-        gateway.shard_key
+        gateway.shard_key,
     )
     gateway.start_heartbeat()
 
diff --git a/pincer/objects/__init__.py b/pincer/objects/__init__.py
index 6e84fb5f..3b3b46bd 100644
--- a/pincer/objects/__init__.py
+++ b/pincer/objects/__init__.py
@@ -3,18 +3,22 @@
 
 from .app.application import Application
 from .app.command import (
-    AppCommandType, AppCommandOptionType, AppCommandInteractionDataOption,
-    AppCommandOptionChoice, AppCommandOption, AppCommand,
-    InteractableStructure
+    AppCommandType,
+    AppCommandOptionType,
+    AppCommandInteractionDataOption,
+    AppCommandOptionChoice,
+    AppCommandOption,
+    AppCommand,
+    InteractableStructure,
 )
 from .app.intents import Intents
 from .app.interaction_base import (
-    CallbackType, InteractionType, MessageInteraction
+    CallbackType,
+    InteractionType,
+    MessageInteraction,
 )
 from .app.interaction_flags import InteractionFlags
-from .app.interactions import (
-    ResolvedData, InteractionData, Interaction
-)
+from .app.interactions import ResolvedData, InteractionData, Interaction
 from .app.mentionable import Mentionable
 from .app.session_start_limit import SessionStartLimit
 from .app.throttle_scope import ThrottleScope
@@ -22,50 +26,84 @@
 from .events.channel import ChannelPinsUpdateEvent
 from .events.error import DiscordError
 from .events.gateway_commands import (
-    Identify, Resume, RequestGuildMembers, UpdateVoiceState,
-    StatusType, UpdatePresence
+    Identify,
+    Resume,
+    RequestGuildMembers,
+    UpdateVoiceState,
+    StatusType,
+    UpdatePresence,
 )
 from .events.guild import (
-    GuildBanAddEvent, GuildBanRemoveEvent, GuildEmojisUpdateEvent,
-    GuildStickersUpdateEvent, GuildIntegrationsUpdateEvent,
-    GuildMemberRemoveEvent, GuildMemberUpdateEvent, GuildMembersChunkEvent,
-    GuildRoleCreateEvent, GuildRoleUpdateEvent, GuildRoleDeleteEvent
+    GuildBanAddEvent,
+    GuildBanRemoveEvent,
+    GuildEmojisUpdateEvent,
+    GuildStickersUpdateEvent,
+    GuildIntegrationsUpdateEvent,
+    GuildMemberRemoveEvent,
+    GuildMemberUpdateEvent,
+    GuildMembersChunkEvent,
+    GuildRoleCreateEvent,
+    GuildRoleUpdateEvent,
+    GuildRoleDeleteEvent,
 )
 from .events.hello_ready import HelloEvent, ReadyEvent
 from .events.integration import IntegrationDeleteEvent
 from .events.invite import InviteCreateEvent, InviteDeleteEvent
 from .events.message import (
-    MessageDeleteEvent, MessageDeleteBulkEvent, MessageReactionAddEvent,
-    MessageReactionRemoveEvent, MessageReactionRemoveAllEvent,
-    MessageReactionRemoveEmojiEvent
+    MessageDeleteEvent,
+    MessageDeleteBulkEvent,
+    MessageReactionAddEvent,
+    MessageReactionRemoveEvent,
+    MessageReactionRemoveAllEvent,
+    MessageReactionRemoveEmojiEvent,
 )
 from .events.presence import (
-    ActivityType, ActivityTimestamp, ActivityEmoji, ActivityParty,
-    ActivityAssets, ActivitySecrets, ActivityFlags, ActivityButton,
-    Activity, ClientStatus, PresenceUpdateEvent
+    ActivityType,
+    ActivityTimestamp,
+    ActivityEmoji,
+    ActivityParty,
+    ActivityAssets,
+    ActivitySecrets,
+    ActivityFlags,
+    ActivityButton,
+    Activity,
+    ClientStatus,
+    PresenceUpdateEvent,
 )
 from .events.thread import ThreadListSyncEvent, ThreadMembersUpdateEvent
 from .events.typing_start import TypingStartEvent
 from .events.voice import VoiceServerUpdateEvent
 from .events.webhook import WebhooksUpdateEvent
 from .guild.audit_log import (
-    AuditLogEvent, AuditLogChange, AuditEntryInfo, AuditLogEntry, AuditLog
+    AuditLogEvent,
+    AuditLogChange,
+    AuditEntryInfo,
+    AuditLogEntry,
+    AuditLog,
 )
 from .guild.ban import Ban
 from .guild.channel import (
-    ChannelType, Channel, TextChannel, VoiceChannel, CategoryChannel,
-    NewsChannel, ChannelMention
+    ChannelType,
+    Channel,
+    TextChannel,
+    VoiceChannel,
+    CategoryChannel,
+    NewsChannel,
+    ChannelMention,
 )
 from .guild.features import GuildFeature
 from .guild.followed_channel import FollowedChannel
 from .guild.guild import (
-    PremiumTier, GuildNSFWLevel, ExplicitContentFilterLevel, MFALevel,
-    VerificationLevel, DefaultMessageNotificationLevel, SystemChannelFlags,
-    Guild
-)
-from .guild.invite import (
-    InviteTargetType, InviteStageInstance, Invite
+    PremiumTier,
+    GuildNSFWLevel,
+    ExplicitContentFilterLevel,
+    MFALevel,
+    VerificationLevel,
+    DefaultMessageNotificationLevel,
+    SystemChannelFlags,
+    Guild,
 )
+from .guild.invite import InviteTargetType, InviteStageInstance, Invite
 from .guild.member import GuildMember, PartialGuildMember, BaseMember
 from .guild.overwrite import Overwrite
 from .guild.permissions import Permissions
@@ -80,8 +118,14 @@
 from .message.component import MessageComponent, ComponentType
 from .message.context import MessageContext
 from .message.embed import (
-    Embed, EmbedField, EmbedImage, EmbedAuthor, EmbedProvider, EmbedThumbnail,
-    EmbedVideo, EmbedFooter
+    Embed,
+    EmbedField,
+    EmbedImage,
+    EmbedAuthor,
+    EmbedProvider,
+    EmbedThumbnail,
+    EmbedVideo,
+    EmbedFooter,
 )
 from .message.emoji import Emoji
 from .message.file import File
@@ -89,61 +133,180 @@
 from .message.reaction import Reaction
 from .message.reference import MessageReference
 from .message.sticker import (
-    StickerType, StickerFormatType, Sticker, StickerItem, StickerPack
+    StickerType,
+    StickerFormatType,
+    Sticker,
+    StickerItem,
+    StickerPack,
 )
 from .message.user_message import (
-    MessageActivityType, MessageFlags, MessageType, MessageActivity,
-    AllowedMentions, AllowedMentionTypes, UserMessage
+    MessageActivityType,
+    MessageFlags,
+    MessageType,
+    MessageActivity,
+    AllowedMentions,
+    AllowedMentionTypes,
+    UserMessage,
 )
 from .user.connection import Connection
 from .user.integration import (
-    IntegrationExpireBehavior, IntegrationApplication, Integration,
-    IntegrationAccount
+    IntegrationExpireBehavior,
+    IntegrationApplication,
+    Integration,
+    IntegrationAccount,
 )
 from .user.user import User, PremiumTypes, VisibilityType
 from .user.voice_state import VoiceState
 from .voice.region import VoiceRegion
 
 __all__ = (
-    "Activity", "ActivityAssets", "ActivityButton", "ActivityEmoji",
-    "ActivityFlags", "ActivityParty", "ActivitySecrets", "ActivityTimestamp",
-    "ActivityType", "AllowedMentionTypes", "AllowedMentions", "AppCommand",
-    "AppCommandInteractionDataOption", "AppCommandOption",
-    "AppCommandOptionChoice", "AppCommandOptionType", "AppCommandType",
-    "Application", "Attachment", "AuditEntryInfo", "AuditLog",
-    "AuditLogChange", "AuditLogEntry", "AuditLogEvent", "Ban", "BaseMember",
-    "CallbackType", "CategoryChannel", "Channel", "ChannelMention",
-    "ChannelPinsUpdateEvent", "ChannelType", "ClientStatus", "ComponentType",
-    "Connection", "DefaultMessageNotificationLevel", "DefaultThrottleHandler",
-    "DiscordError", "Embed", "EmbedAuthor", "EmbedField", "EmbedFooter",
-    "EmbedImage", "EmbedProvider", "EmbedThumbnail", "EmbedVideo", "Emoji",
-    "ExplicitContentFilterLevel", "File", "FollowedChannel", "Guild",
-    "GuildBanAddEvent", "GuildBanRemoveEvent", "GuildEmojisUpdateEvent",
-    "GuildFeature", "GuildIntegrationsUpdateEvent", "GuildMember",
-    "GuildMemberRemoveEvent", "GuildMemberUpdateEvent",
-    "GuildMembersChunkEvent", "GuildNSFWLevel", "GuildRoleCreateEvent",
-    "GuildRoleDeleteEvent", "GuildRoleUpdateEvent", "GuildStickersUpdateEvent",
-    "GuildTemplate", "GuildWidget", "HelloEvent", "Identify", "Integration",
-    "IntegrationAccount", "IntegrationApplication", "IntegrationDeleteEvent",
-    "IntegrationExpireBehavior", "Intents", "InteractableStructure",
-    "Interaction", "InteractionData", "InteractionFlags", "InteractionType",
-    "Invite", "InviteCreateEvent", "InviteDeleteEvent", "InviteStageInstance",
-    "InviteTargetType", "MFALevel", "Mentionable", "Message",
-    "MessageActivity", "MessageActivityType", "MessageComponent",
-    "MessageContext", "MessageDeleteBulkEvent", "MessageDeleteEvent",
-    "MessageFlags", "MessageInteraction", "MessageReactionAddEvent",
-    "MessageReactionRemoveAllEvent", "MessageReactionRemoveEmojiEvent",
-    "MessageReactionRemoveEvent", "MessageReference", "MessageType",
-    "NewsChannel", "Overwrite", "PartialGuildMember", "Permissions",
-    "PremiumTier", "PremiumTypes", "PresenceUpdateEvent", "PrivacyLevel",
-    "Reaction", "ReadyEvent", "RequestGuildMembers", "ResolvedData", "Resume",
-    "Role", "RoleTags", "SessionStartLimit", "StageInstance", "StatusType",
-    "Sticker", "StickerFormatType", "StickerItem", "StickerPack",
-    "StickerType", "SystemChannelFlags", "TextChannel", "ThreadListSyncEvent",
-    "ThreadMember", "ThreadMembersUpdateEvent", "ThreadMetadata",
-    "ThrottleInterface", "ThrottleScope", "TypingStartEvent", "UpdatePresence",
-    "UpdateVoiceState", "User", "UserMessage", "VerificationLevel",
-    "VisibilityType", "VoiceChannel", "VoiceRegion", "VoiceServerUpdateEvent",
-    "VoiceState", "Webhook", "WebhookType", "WebhooksUpdateEvent",
-    "WelcomeScreen", "WelcomeScreenChannel"
+    "Activity",
+    "ActivityAssets",
+    "ActivityButton",
+    "ActivityEmoji",
+    "ActivityFlags",
+    "ActivityParty",
+    "ActivitySecrets",
+    "ActivityTimestamp",
+    "ActivityType",
+    "AllowedMentionTypes",
+    "AllowedMentions",
+    "AppCommand",
+    "AppCommandInteractionDataOption",
+    "AppCommandOption",
+    "AppCommandOptionChoice",
+    "AppCommandOptionType",
+    "AppCommandType",
+    "Application",
+    "Attachment",
+    "AuditEntryInfo",
+    "AuditLog",
+    "AuditLogChange",
+    "AuditLogEntry",
+    "AuditLogEvent",
+    "Ban",
+    "BaseMember",
+    "CallbackType",
+    "CategoryChannel",
+    "Channel",
+    "ChannelMention",
+    "ChannelPinsUpdateEvent",
+    "ChannelType",
+    "ClientStatus",
+    "ComponentType",
+    "Connection",
+    "DefaultMessageNotificationLevel",
+    "DefaultThrottleHandler",
+    "DiscordError",
+    "Embed",
+    "EmbedAuthor",
+    "EmbedField",
+    "EmbedFooter",
+    "EmbedImage",
+    "EmbedProvider",
+    "EmbedThumbnail",
+    "EmbedVideo",
+    "Emoji",
+    "ExplicitContentFilterLevel",
+    "File",
+    "FollowedChannel",
+    "Guild",
+    "GuildBanAddEvent",
+    "GuildBanRemoveEvent",
+    "GuildEmojisUpdateEvent",
+    "GuildFeature",
+    "GuildIntegrationsUpdateEvent",
+    "GuildMember",
+    "GuildMemberRemoveEvent",
+    "GuildMemberUpdateEvent",
+    "GuildMembersChunkEvent",
+    "GuildNSFWLevel",
+    "GuildRoleCreateEvent",
+    "GuildRoleDeleteEvent",
+    "GuildRoleUpdateEvent",
+    "GuildStickersUpdateEvent",
+    "GuildTemplate",
+    "GuildWidget",
+    "HelloEvent",
+    "Identify",
+    "Integration",
+    "IntegrationAccount",
+    "IntegrationApplication",
+    "IntegrationDeleteEvent",
+    "IntegrationExpireBehavior",
+    "Intents",
+    "InteractableStructure",
+    "Interaction",
+    "InteractionData",
+    "InteractionFlags",
+    "InteractionType",
+    "Invite",
+    "InviteCreateEvent",
+    "InviteDeleteEvent",
+    "InviteStageInstance",
+    "InviteTargetType",
+    "MFALevel",
+    "Mentionable",
+    "Message",
+    "MessageActivity",
+    "MessageActivityType",
+    "MessageComponent",
+    "MessageContext",
+    "MessageDeleteBulkEvent",
+    "MessageDeleteEvent",
+    "MessageFlags",
+    "MessageInteraction",
+    "MessageReactionAddEvent",
+    "MessageReactionRemoveAllEvent",
+    "MessageReactionRemoveEmojiEvent",
+    "MessageReactionRemoveEvent",
+    "MessageReference",
+    "MessageType",
+    "NewsChannel",
+    "Overwrite",
+    "PartialGuildMember",
+    "Permissions",
+    "PremiumTier",
+    "PremiumTypes",
+    "PresenceUpdateEvent",
+    "PrivacyLevel",
+    "Reaction",
+    "ReadyEvent",
+    "RequestGuildMembers",
+    "ResolvedData",
+    "Resume",
+    "Role",
+    "RoleTags",
+    "SessionStartLimit",
+    "StageInstance",
+    "StatusType",
+    "Sticker",
+    "StickerFormatType",
+    "StickerItem",
+    "StickerPack",
+    "StickerType",
+    "SystemChannelFlags",
+    "TextChannel",
+    "ThreadListSyncEvent",
+    "ThreadMember",
+    "ThreadMembersUpdateEvent",
+    "ThreadMetadata",
+    "ThrottleInterface",
+    "ThrottleScope",
+    "TypingStartEvent",
+    "UpdatePresence",
+    "UpdateVoiceState",
+    "User",
+    "UserMessage",
+    "VerificationLevel",
+    "VisibilityType",
+    "VoiceChannel",
+    "VoiceRegion",
+    "VoiceServerUpdateEvent",
+    "VoiceState",
+    "Webhook",
+    "WebhookType",
+    "WebhooksUpdateEvent",
+    "WelcomeScreen",
+    "WelcomeScreenChannel",
 )
diff --git a/pincer/objects/app/__init__.py b/pincer/objects/app/__init__.py
index d7e96006..f808c806 100644
--- a/pincer/objects/app/__init__.py
+++ b/pincer/objects/app/__init__.py
@@ -4,8 +4,10 @@
 from .application import Application
 from .command import (
     AppCommandInteractionDataOption,
-    AppCommandOptionChoice, AppCommandOption, AppCommand,
-    InteractableStructure
+    AppCommandOptionChoice,
+    AppCommandOption,
+    AppCommand,
+    InteractableStructure,
 )
 from .command_types import AppCommandType, AppCommandOptionType
 from .intents import Intents
@@ -19,10 +21,25 @@
 
 
 __all__ = (
-    "AppCommand", "AppCommandInteractionDataOption",
-    "AppCommandOption", "AppCommandOptionChoice", "AppCommandOptionType",
-    "AppCommandType", "Application", "CallbackType", "DefaultThrottleHandler",
-    "Intents", "InteractableStructure", "Interaction", "InteractionData",
-    "InteractionFlags", "InteractionType", "Mentionable", "MessageInteraction",
-    "ResolvedData", "SessionStartLimit", "ThrottleInterface", "ThrottleScope"
+    "AppCommand",
+    "AppCommandInteractionDataOption",
+    "AppCommandOption",
+    "AppCommandOptionChoice",
+    "AppCommandOptionType",
+    "AppCommandType",
+    "Application",
+    "CallbackType",
+    "DefaultThrottleHandler",
+    "Intents",
+    "InteractableStructure",
+    "Interaction",
+    "InteractionData",
+    "InteractionFlags",
+    "InteractionType",
+    "Mentionable",
+    "MessageInteraction",
+    "ResolvedData",
+    "SessionStartLimit",
+    "ThrottleInterface",
+    "ThrottleScope",
 )
diff --git a/pincer/objects/app/application.py b/pincer/objects/app/application.py
index f41c6820..b1c168ce 100644
--- a/pincer/objects/app/application.py
+++ b/pincer/objects/app/application.py
@@ -64,6 +64,7 @@ class Application(APIObject, GuildProperty):
     terms_of_service_url: APINullable[:class:`str`]
         the url of the app's terms of service
     """
+
     bot_public: bool
     bot_require_code_grant: bool
     description: str
diff --git a/pincer/objects/app/command.py b/pincer/objects/app/command.py
index 3c3b9046..a7c9f5fe 100644
--- a/pincer/objects/app/command.py
+++ b/pincer/objects/app/command.py
@@ -4,7 +4,17 @@
 from __future__ import annotations
 
 from dataclasses import dataclass, field
-from typing import Any, Awaitable, Callable, Generic, List, Optional, Union, TYPE_CHECKING, TypeVar
+from typing import (
+    Any,
+    Awaitable,
+    Callable,
+    Generic,
+    List,
+    Optional,
+    Union,
+    TYPE_CHECKING,
+    TypeVar,
+)
 
 from .command_types import AppCommandOptionType, AppCommandType
 from ..app.throttle_scope import ThrottleScope
@@ -20,6 +30,7 @@
 
 T = TypeVar("T")
 
+
 @dataclass(repr=False)
 class AppCommandInteractionDataOption(APIObject):
     """Represents a Discord Application Command Interaction Data Option
@@ -35,12 +46,12 @@ class AppCommandInteractionDataOption(APIObject):
     options: APINullable[List[:data:`~pincer.objects.app.command.AppCommandInteractionDataOption`]]
         Present if this option is a group or subcommand
     """
+
     # noqa: E501
     name: str
     value: APINullable[str] = MISSING
     type: APINullable[AppCommandOptionType] = MISSING
-    options: APINullable[
-        List[AppCommandInteractionDataOption]] = MISSING
+    options: APINullable[List[AppCommandInteractionDataOption]] = MISSING
 
 
 @dataclass(repr=False)
@@ -54,6 +65,7 @@ class AppCommandOptionChoice(APIObject):
     value: Union[:data:`~pincer.utils.types.choice_value_types`]
         Value of the choice, up to 100 characters if string
     """
+
     name: str
     value: choice_value_types
 
@@ -83,6 +95,7 @@ class AppCommandOption(APIObject):
         If the option is a subcommand or subcommand group type,
         this nested options will be the parameters
     """
+
     # noqa: E501
     type: AppCommandOptionType
     name: str
@@ -125,6 +138,7 @@ class AppCommand(APIObject, GuildProperty):
         Whether the command is enabled by default
         when the app is added to a guild
     """
+
     # noqa: E501
     type: AppCommandType
     name: str
@@ -150,9 +164,7 @@ def __eq__(self, other: Union[AppCommand, InteractableStructure]):
             other = other.app
 
         # `description` and `options` are tested for equality with a custom check
-        eq_props = (
-            "type", "name", "guild_id", "default_permission", "options"
-        )
+        eq_props = ("type", "name", "guild_id", "default_permission", "options")
 
         eq = (
             self.__getattribute__(prop) == other.__getattribute__(prop)
@@ -165,7 +177,7 @@ def __eq__(self, other: Union[AppCommand, InteractableStructure]):
                 self.description == other.description
                 # If this command has a MISSING description, Discord would return
                 # registered the command with the description ''
-                or self.description is MISSING and not other.description
+                or self.description is MISSING and not other.description,
             )
         )
 
@@ -210,11 +222,14 @@ class InteractableStructure(Generic[T]):
     cooldown_scope: :class:`~pincer.objects.app.throttle_scope.ThrottleScope`
         The type of cooldown |default| :data:`ThrottleScope.USER`
     """
+
     call: Coro
 
     metadata: Optional[T] = None
     manager: Optional[Any] = None
-    extensions: List[Callable[..., Awaitable[bool]]] = field(default_factory=list)
+    extensions: List[Callable[..., Awaitable[bool]]] = field(
+        default_factory=list
+    )
 
     cooldown: int = 0
     cooldown_scale: float = 60.0
diff --git a/pincer/objects/app/command_types.py b/pincer/objects/app/command_types.py
index 62141add..5170bc03 100644
--- a/pincer/objects/app/command_types.py
+++ b/pincer/objects/app/command_types.py
@@ -22,6 +22,7 @@ class AppCommandType(IntEnum):
         A UI-based command that shows up when you right-click or tap on
         a message
     """
+
     CHAT_INPUT = 1
     USER = 2
     MESSAGE = 3
@@ -63,6 +64,7 @@ class AppCommandOptionType(IntEnum):
     NUMBER:
         The parameter will be a float. (-2^53 and 2^53)
     """
+
     SUB_COMMAND = 1
     SUB_COMMAND_GROUP = 2
     STRING = 3
diff --git a/pincer/objects/app/intents.py b/pincer/objects/app/intents.py
index b1ae6457..9c170e42 100644
--- a/pincer/objects/app/intents.py
+++ b/pincer/objects/app/intents.py
@@ -50,6 +50,7 @@ class Intents(IntFlag):
     DIRECT_MESSAGE_TYPING:
         DM typing to message intent.
     """
+
     NONE = 0
     GUILDS = 1 << 0
     GUILD_MEMBERS = 1 << 1
diff --git a/pincer/objects/app/interaction_base.py b/pincer/objects/app/interaction_base.py
index 2bff375f..d7e33a85 100644
--- a/pincer/objects/app/interaction_base.py
+++ b/pincer/objects/app/interaction_base.py
@@ -35,6 +35,7 @@ class CallbackType(IntEnum):
     UPDATE_MESSAGE:
         For components, edit the message the component was attached to
     """
+
     # noqa: E501
     PONG = 1
     MESSAGE = 4
@@ -56,6 +57,7 @@ class InteractionType(IntEnum):
     MESSAGE_COMPONENT:
         A ui component like buttons and selects.
     """
+
     PING = 1
     APPLICATION_COMMAND = 2
     MESSAGE_COMPONENT = 3
@@ -82,6 +84,7 @@ class MessageInteraction(APIObject):
     member: APINullable[Dict]
         The member who invoked the interaction
     """
+
     id: Snowflake
     type: InteractionType
     name: str
diff --git a/pincer/objects/app/interaction_flags.py b/pincer/objects/app/interaction_flags.py
index 5492209f..2d3015fa 100644
--- a/pincer/objects/app/interaction_flags.py
+++ b/pincer/objects/app/interaction_flags.py
@@ -12,4 +12,5 @@ class InteractionFlags(IntFlag):
     EPHEMERAL:
         only the user receiving the message can see it
     """
+
     EPHEMERAL = 1 << 6
diff --git a/pincer/objects/app/interactions.py b/pincer/objects/app/interactions.py
index 08b5fe51..f2608271 100644
--- a/pincer/objects/app/interactions.py
+++ b/pincer/objects/app/interactions.py
@@ -16,8 +16,13 @@
 from ..message.message import Message
 from ..message.user_message import UserMessage
 from ..user import User
-from ...exceptions import InteractionDoesNotExist, UseFollowup, \
-    InteractionAlreadyAcknowledged, NotFoundError, InteractionTimedOut
+from ...exceptions import (
+    InteractionDoesNotExist,
+    UseFollowup,
+    InteractionAlreadyAcknowledged,
+    NotFoundError,
+    InteractionTimedOut,
+)
 from ...utils import APIObject
 from ...utils.convert_message import convert_message
 from ...utils.snowflake import Snowflake
@@ -49,6 +54,7 @@ class ResolvedData(APIObject):
     messages: APINullable[Dict[:class:`~pincer.utils.snowflake.Snowflake`, :class:`~pincer.objects.message.user_message.UserMessage`]]
         Map of Snowflakes to partial message objects
     """
+
     # noqa: E501
     users: APINullable[Dict[Snowflake, User]] = MISSING
     members: APINullable[Dict[Snowflake, GuildMember]] = MISSING
@@ -82,6 +88,7 @@ class InteractionData(APIObject):
     target_id: APINullable[:class:`~pincer.utils.snowflake.Snowflake`]
         Id of the user or message targeted by a user or message command
     """  # noqa: E501
+
     id: APINullable[Snowflake] = MISSING
     name: APINullable[str] = MISSING
     type: APINullable[int] = MISSING
@@ -122,6 +129,7 @@ class Interaction(APIObject, ChannelProperty, GuildProperty):
     message: APINullable[:class:`~pincer.objects.message.user_message.UserMessage`]
         For components, the message they were attached to
     """
+
     # noqa: E501
     id: Snowflake
     application_id: Snowflake
@@ -174,21 +182,17 @@ def __post_init__(self):
             elif option.type is AppCommandOptionType.MENTIONABLE:
                 user = self.return_type(option, self.data.resolved.members)
                 if user:
-                    user.set_user_data(self.return_type(
-                        option, self.data.resolved.users)
+                    user.set_user_data(
+                        self.return_type(option, self.data.resolved.users)
                     )
 
                 option.value = Mentionable(
-                    user,
-                    self.return_type(
-                        option, self.data.resolved.roles
-                    )
+                    user, self.return_type(option, self.data.resolved.roles)
                 )
 
     @staticmethod
     def return_type(
-        option: Snowflake,
-        data: Dict[Snowflake, Any]
+        option: Snowflake, data: Dict[Snowflake, Any]
     ) -> Optional[APIObject]:
         """
         Returns a value from the option or None if it doesn't exist.
@@ -206,7 +210,7 @@ def get_message_context(self):
             self.member or self.user,
             self,
             self.guild_id,
-            self.channel_id
+            self.channel_id,
         )
 
     async def response(self) -> UserMessage:
@@ -230,9 +234,7 @@ async def response(self) -> UserMessage:
         return UserMessage.from_dict(resp)
 
     async def _base_ack(
-        self,
-        flags: Optional[InteractionFlags],
-        callback_type: CallbackType
+        self, flags: Optional[InteractionFlags], callback_type: CallbackType
     ):
         """|coro|
 
@@ -261,12 +263,7 @@ async def _base_ack(
         self.has_acknowledged = True
         await self._http.post(
             f"interactions/{self.id}/{self.token}/callback",
-            {
-                "type": callback_type,
-                "data": {
-                    "flags": flags
-                }
-            }
+            {"type": callback_type, "data": {"flags": flags}},
         )
 
     async def ack(self, flags: Optional[InteractionFlags] = None):
@@ -281,7 +278,9 @@ async def ack(self, flags: Optional[InteractionFlags] = None):
         """
         return await self._base_ack(flags, CallbackType.DEFERRED_MESSAGE)
 
-    async def deferred_update_ack(self, flags: Optional[InteractionFlags] = None):
+    async def deferred_update_ack(
+        self, flags: Optional[InteractionFlags] = None
+    ):
         """|coro|
         Same as ack but for updating a message.
 
@@ -320,7 +319,7 @@ async def _base_reply(
         self,
         message: MessageConvertable,
         message_type: CallbackType,
-        allow_empty: bool
+        allow_empty: bool,
     ):
         """|coro|
 
@@ -358,15 +357,14 @@ async def _base_reply(
 
         message = convert_message(self._client, message)
         content_type, data = message.serialize(
-            message_type=message_type,
-            allow_empty=allow_empty
+            message_type=message_type, allow_empty=allow_empty
         )
 
         try:
             await self._http.post(
                 f"interactions/{self.id}/{self.token}/callback",
                 data,
-                content_type=content_type
+                content_type=content_type,
             )
         except NotFoundError:
             raise InteractionTimedOut(
@@ -388,7 +386,9 @@ async def update(self, message: MessageConvertable) -> UserMessage:
         Edits the reply to an interaction. Only works with Message Component
         Interactions.
         """
-        return await self._base_reply(message, CallbackType.UPDATE_MESSAGE, True)
+        return await self._base_reply(
+            message, CallbackType.UPDATE_MESSAGE, True
+        )
 
     async def edit(self, message: MessageConvertable) -> UserMessage:
         """|coro|
@@ -424,7 +424,7 @@ async def edit(self, message: MessageConvertable) -> UserMessage:
         resp = await self._http.patch(
             f"webhooks/{self._client.bot.id}/{self.token}/messages/@original",
             data,
-            content_type=content_type
+            content_type=content_type,
         )
         self.__post_sent(message)
         return UserMessage.from_dict(resp)
@@ -450,9 +450,7 @@ async def delete(self):
         )
 
     async def __post_followup_send_handler(
-            self,
-            followup: UserMessage,
-            message: Message
+        self, followup: UserMessage, message: Message
     ):
         """Process a followup after it was sent.
 
@@ -468,11 +466,7 @@ async def __post_followup_send_handler(
             await sleep(message.delete_after)
             await self.delete_followup(followup.id)
 
-    def __post_followup_sent(
-            self,
-            followup: UserMessage,
-            message: Message
-    ):
+    def __post_followup_sent(self, followup: UserMessage, message: Message):
         """Ensure the `__post_followup_send_handler` method its future.
 
         Parameters
@@ -506,16 +500,14 @@ async def followup(self, message: MessageConvertable) -> UserMessage:
         resp = await self._http.post(
             f"webhooks/{self._client.bot.id}/{self.token}",
             data,
-            content_type=content_type
+            content_type=content_type,
         )
         msg = UserMessage.from_dict(resp)
         self.__post_followup_sent(msg, message)
         return msg
 
     async def edit_followup(
-            self,
-            message_id: int,
-            message: MessageConvertable
+        self, message_id: int, message: MessageConvertable
     ) -> UserMessage:
         """|coro|
 
@@ -539,7 +531,7 @@ async def edit_followup(
         resp = await self._http.patch(
             f"webhooks/{self._client.bot.id}/{self.token}/messages/{message_id}",
             data,
-            content_type=content_type
+            content_type=content_type,
         )
         msg = UserMessage.from_dict(resp)
         self.__post_followup_sent(msg, message)
diff --git a/pincer/objects/app/mentionable.py b/pincer/objects/app/mentionable.py
index 696c64ff..36a3a27b 100644
--- a/pincer/objects/app/mentionable.py
+++ b/pincer/objects/app/mentionable.py
@@ -18,6 +18,7 @@ class Mentionable:
     role: Optional[:class:`~pincer.objects.guild.role.Role`]
         Role object returned from a discord interaction
     """
+
     user: Optional[User] = None
     role: Optional[Role] = None
 
diff --git a/pincer/objects/app/session_start_limit.py b/pincer/objects/app/session_start_limit.py
index 5ee75394..571e9e98 100644
--- a/pincer/objects/app/session_start_limit.py
+++ b/pincer/objects/app/session_start_limit.py
@@ -22,6 +22,7 @@ class SessionStartLimit(APIObject):
     max_concurrency: :class:`int`
         The number of identify requests allowed per 5 seconds
     """
+
     total: int
     remaining: int
     reset_after: int
diff --git a/pincer/objects/app/throttle_scope.py b/pincer/objects/app/throttle_scope.py
index 8f907303..40d79fa0 100644
--- a/pincer/objects/app/throttle_scope.py
+++ b/pincer/objects/app/throttle_scope.py
@@ -18,6 +18,7 @@ class ThrottleScope(Enum):
     GLOBAL:
         The cooldown is global.
     """
+
     GUILD = auto()
     CHANNEL = auto()
     USER = auto()
diff --git a/pincer/objects/app/throttling.py b/pincer/objects/app/throttling.py
index 31eeadfa..558a8e85 100644
--- a/pincer/objects/app/throttling.py
+++ b/pincer/objects/app/throttling.py
@@ -18,7 +18,10 @@
 
 class ThrottleInterface(ABC):
     """An ABC for throttling."""
-    throttle: DefaultDict[Coro, Dict[Optional[str], SlidingWindow]] = DefaultDict(dict)
+
+    throttle: DefaultDict[
+        Coro, Dict[Optional[str], SlidingWindow]
+    ] = DefaultDict(dict)
 
     @staticmethod
     @abstractmethod
@@ -30,11 +33,12 @@ class DefaultThrottleHandler(ThrottleInterface, ABC):
     """The default throttle-handler based off the
     :class:`~pincer.objects.app.throttling.ThrottleInterface` ABC
     """
+
     __throttle_scopes = {
         ThrottleScope.GLOBAL: None,
         ThrottleScope.GUILD: "guild_id",
         ThrottleScope.CHANNEL: "channel_id",
-        ThrottleScope.USER: "author.user.id"
+        ThrottleScope.USER: "author.user.id",
     }
 
     @staticmethod
@@ -65,9 +69,12 @@ def get_key_from_scope(command: InteractableStructure) -> Optional[int]:
         return last_obj
 
     @staticmethod
-    def init_throttler(command: InteractableStructure, throttle_key: Optional[int]):
-        DefaultThrottleHandler.throttle[command.call][throttle_key] \
-            = SlidingWindow(command.cooldown, command.cooldown_scale)
+    def init_throttler(
+        command: InteractableStructure, throttle_key: Optional[int]
+    ):
+        DefaultThrottleHandler.throttle[command.call][
+            throttle_key
+        ] = SlidingWindow(command.cooldown, command.cooldown_scale)
 
     @staticmethod
     def handle(command: InteractableStructure, **kwargs):
@@ -81,8 +88,7 @@ def handle(command: InteractableStructure, **kwargs):
         if window_slider:
             if not window_slider.allow():
                 raise CommandCooldownError(
-                    f"Cooldown for command {command.app.name} not met!",
-                    command
+                    f"Cooldown for command {command.app.name} not met!", command
                 )
         else:
             DefaultThrottleHandler.init_throttler(command, throttle_key)
diff --git a/pincer/objects/events/__init__.py b/pincer/objects/events/__init__.py
index 2e4cced2..db60b405 100644
--- a/pincer/objects/events/__init__.py
+++ b/pincer/objects/events/__init__.py
@@ -4,27 +4,49 @@
 from .channel import ChannelPinsUpdateEvent
 from .error import DiscordError
 from .gateway_commands import (
-    Identify, Resume, RequestGuildMembers, UpdateVoiceState,
-    StatusType, UpdatePresence
+    Identify,
+    Resume,
+    RequestGuildMembers,
+    UpdateVoiceState,
+    StatusType,
+    UpdatePresence,
 )
 from .guild import (
-    GuildBanAddEvent, GuildBanRemoveEvent, GuildEmojisUpdateEvent,
-    GuildStickersUpdateEvent, GuildIntegrationsUpdateEvent,
-    GuildMemberRemoveEvent, GuildMemberUpdateEvent, GuildMembersChunkEvent,
-    GuildRoleCreateEvent, GuildRoleUpdateEvent, GuildRoleDeleteEvent
+    GuildBanAddEvent,
+    GuildBanRemoveEvent,
+    GuildEmojisUpdateEvent,
+    GuildStickersUpdateEvent,
+    GuildIntegrationsUpdateEvent,
+    GuildMemberRemoveEvent,
+    GuildMemberUpdateEvent,
+    GuildMembersChunkEvent,
+    GuildRoleCreateEvent,
+    GuildRoleUpdateEvent,
+    GuildRoleDeleteEvent,
 )
 from .hello_ready import HelloEvent, ReadyEvent
 from .integration import IntegrationDeleteEvent
 from .invite import InviteCreateEvent, InviteDeleteEvent
 from .message import (
-    MessageDeleteEvent, MessageDeleteBulkEvent, MessageReactionAddEvent,
-    MessageReactionRemoveEvent, MessageReactionRemoveAllEvent,
-    MessageReactionRemoveEmojiEvent
+    MessageDeleteEvent,
+    MessageDeleteBulkEvent,
+    MessageReactionAddEvent,
+    MessageReactionRemoveEvent,
+    MessageReactionRemoveAllEvent,
+    MessageReactionRemoveEmojiEvent,
 )
 from .presence import (
-    ActivityType, ActivityTimestamp, ActivityEmoji, ActivityParty,
-    ActivityAssets, ActivitySecrets, ActivityFlags, ActivityButton,
-    Activity, ClientStatus, PresenceUpdateEvent
+    ActivityType,
+    ActivityTimestamp,
+    ActivityEmoji,
+    ActivityParty,
+    ActivityAssets,
+    ActivitySecrets,
+    ActivityFlags,
+    ActivityButton,
+    Activity,
+    ClientStatus,
+    PresenceUpdateEvent,
 )
 from .thread import ThreadListSyncEvent, ThreadMembersUpdateEvent
 from .typing_start import TypingStartEvent
@@ -32,19 +54,50 @@
 from .webhook import WebhooksUpdateEvent
 
 __all__ = (
-    "Activity", "ActivityAssets", "ActivityButton", "ActivityEmoji",
-    "ActivityFlags", "ActivityParty", "ActivitySecrets", "ActivityTimestamp",
-    "ActivityType", "ChannelPinsUpdateEvent", "ClientStatus", "DiscordError",
-    "GuildBanAddEvent", "GuildBanRemoveEvent", "GuildEmojisUpdateEvent",
-    "GuildIntegrationsUpdateEvent", "GuildMemberRemoveEvent",
-    "GuildMemberUpdateEvent", "GuildMembersChunkEvent", "GuildRoleCreateEvent",
-    "GuildRoleDeleteEvent", "GuildRoleUpdateEvent", "GuildStickersUpdateEvent",
-    "HelloEvent", "Identify", "IntegrationDeleteEvent", "InviteCreateEvent",
-    "InviteDeleteEvent", "MessageDeleteBulkEvent", "MessageDeleteEvent",
-    "MessageReactionAddEvent", "MessageReactionRemoveAllEvent",
-    "MessageReactionRemoveEmojiEvent", "MessageReactionRemoveEvent",
-    "PresenceUpdateEvent", "ReadyEvent", "RequestGuildMembers", "Resume",
-    "StatusType", "ThreadListSyncEvent", "ThreadMembersUpdateEvent",
-    "TypingStartEvent", "UpdatePresence", "UpdateVoiceState",
-    "VoiceServerUpdateEvent", "WebhooksUpdateEvent"
+    "Activity",
+    "ActivityAssets",
+    "ActivityButton",
+    "ActivityEmoji",
+    "ActivityFlags",
+    "ActivityParty",
+    "ActivitySecrets",
+    "ActivityTimestamp",
+    "ActivityType",
+    "ChannelPinsUpdateEvent",
+    "ClientStatus",
+    "DiscordError",
+    "GuildBanAddEvent",
+    "GuildBanRemoveEvent",
+    "GuildEmojisUpdateEvent",
+    "GuildIntegrationsUpdateEvent",
+    "GuildMemberRemoveEvent",
+    "GuildMemberUpdateEvent",
+    "GuildMembersChunkEvent",
+    "GuildRoleCreateEvent",
+    "GuildRoleDeleteEvent",
+    "GuildRoleUpdateEvent",
+    "GuildStickersUpdateEvent",
+    "HelloEvent",
+    "Identify",
+    "IntegrationDeleteEvent",
+    "InviteCreateEvent",
+    "InviteDeleteEvent",
+    "MessageDeleteBulkEvent",
+    "MessageDeleteEvent",
+    "MessageReactionAddEvent",
+    "MessageReactionRemoveAllEvent",
+    "MessageReactionRemoveEmojiEvent",
+    "MessageReactionRemoveEvent",
+    "PresenceUpdateEvent",
+    "ReadyEvent",
+    "RequestGuildMembers",
+    "Resume",
+    "StatusType",
+    "ThreadListSyncEvent",
+    "ThreadMembersUpdateEvent",
+    "TypingStartEvent",
+    "UpdatePresence",
+    "UpdateVoiceState",
+    "VoiceServerUpdateEvent",
+    "WebhooksUpdateEvent",
 )
diff --git a/pincer/objects/events/channel.py b/pincer/objects/events/channel.py
index fca5a76e..0ff7084f 100644
--- a/pincer/objects/events/channel.py
+++ b/pincer/objects/events/channel.py
@@ -28,6 +28,7 @@ class ChannelPinsUpdateEvent(APIObject, ChannelProperty, GuildProperty):
     last_pin_timestamp: APINullable[:class:`~pincer.utils.timestamp.Timestamp`]
         The time at which the most recent pinned message was pinned
     """
+
     channel_id: Snowflake
 
     guild_id: APINullable[Snowflake] = MISSING
diff --git a/pincer/objects/events/error.py b/pincer/objects/events/error.py
index 3fa54e2f..13fa73f6 100644
--- a/pincer/objects/events/error.py
+++ b/pincer/objects/events/error.py
@@ -18,5 +18,6 @@ class DiscordError(PincerError, APIObject):
     message: :class:`str`
         The error description.
     """
+
     code: int
     message: str
diff --git a/pincer/objects/events/gateway_commands.py b/pincer/objects/events/gateway_commands.py
index 560f9f8c..649d05e4 100644
--- a/pincer/objects/events/gateway_commands.py
+++ b/pincer/objects/events/gateway_commands.py
@@ -41,6 +41,7 @@ class Identify(APIObject):
     presence: APINullable[Any]
         Presence structure for initial presence information
     """
+
     token: str
     properties: Dict[str, str]
     intents: Intents
@@ -64,6 +65,7 @@ class Resume(APIObject):
     seq: :class:`int`
         Last sequence number received
     """
+
     token: str
     session_id: str
     seq: int
@@ -94,6 +96,7 @@ class RequestGuildMembers(APIObject, GuildProperty):
     nonce:
         nonce to identify the Guild Members Chunk response
     """
+
     guild_id: Snowflake
     limit: int
 
@@ -121,6 +124,7 @@ class UpdateVoiceState(APIObject, GuildProperty):
     self_deaf:
         is the client deafened
     """
+
     guild_id: Snowflake
     self_mute: bool
     self_deaf: bool
@@ -144,6 +148,7 @@ class StatusType(Enum):
     offline:
         Offline
     """
+
     online = auto()
     dnd = auto()
     idle = auto()
@@ -168,6 +173,7 @@ class UpdatePresence(APIObject):
     afk:
         whether the client is afk
     """
+
     activities: List[Activity]
     status: StatusType
     afk: bool
diff --git a/pincer/objects/events/hello_ready.py b/pincer/objects/events/hello_ready.py
index 2ffc7aaf..68b368b5 100644
--- a/pincer/objects/events/hello_ready.py
+++ b/pincer/objects/events/hello_ready.py
@@ -26,6 +26,7 @@ class HelloEvent(APIObject):
     heartbeat_interval: :class:`int`
         The interval (in milliseconds) the client should heartbeat with
     """
+
     heartbeat_interval: int
 
 
@@ -50,6 +51,7 @@ class ReadyEvent(APIObject):
         The shard information associated
         with this session, if sent when identifying
     """
+
     v: int
     user: User
     guilds: List[Guild]
diff --git a/pincer/objects/events/integration.py b/pincer/objects/events/integration.py
index e847d1a0..83a39e32 100644
--- a/pincer/objects/events/integration.py
+++ b/pincer/objects/events/integration.py
@@ -26,6 +26,7 @@ class IntegrationDeleteEvent(APIObject, GuildProperty):
     application_id: APINullable[:class:`~pincer.utils.snowflake.Snowflake`]
         id of the bot/OAuth2 application for this discord integration
     """
+
     id: Snowflake
     guild_id: Snowflake
     application_id: APINullable[Snowflake] = MISSING
@@ -47,6 +48,7 @@ class IntegrationCreateEvent(APIObject, GuildProperty):
     application_id : APINullable[:class:`Snowflake`]
         id of the bot/OAuth2 application for this discord integration
     """
+
     id: Snowflake
     guild_id: Snowflake
     application_id: APINullable[Snowflake] = MISSING
@@ -68,6 +70,7 @@ class IntegrationUpdateEvent(APIObject, GuildProperty):
     application_id : APINullable[:class:`Snowflake`]
         id of the bot/OAuth2 application for this discord integration
     """
+
     id: Snowflake
     guild_id: Snowflake
     application_id: APINullable[Snowflake] = MISSING
diff --git a/pincer/objects/events/invite.py b/pincer/objects/events/invite.py
index e1ccbff3..2136ec98 100644
--- a/pincer/objects/events/invite.py
+++ b/pincer/objects/events/invite.py
@@ -47,6 +47,7 @@ class InviteCreateEvent(APIObject, ChannelProperty, GuildProperty):
     uses: :class:`int`
         How many times the invite has been used (always will be ``0``)
     """
+
     # noqa: E501
     channel_id: Snowflake
     code: str
@@ -75,6 +76,7 @@ class InviteDeleteEvent(APIObject, ChannelProperty, GuildProperty):
     guild_id: APINullable[:class:`~pincer.utils.snowflake.Snowflake`]
         The guild of the invite
     """
+
     channel_id: Snowflake
     code: str
 
diff --git a/pincer/objects/events/message.py b/pincer/objects/events/message.py
index 1131078f..dd20fcaf 100644
--- a/pincer/objects/events/message.py
+++ b/pincer/objects/events/message.py
@@ -30,6 +30,7 @@ class MessageDeleteEvent(APIObject, ChannelProperty, GuildProperty):
     guild_id: APIObject[:class:`~pincer.utils.snowflake.Snowflake`]
         The id of the guild
     """
+
     id: Snowflake
     channel_id: Snowflake
 
@@ -49,6 +50,7 @@ class MessageDeleteBulkEvent(APIObject, ChannelProperty, GuildProperty):
     guild_id: APIObject[:class:`~pincer.utils.snowflake.Snowflake`]
         The id of the guild
     """
+
     ids: List[Snowflake]
     channel_id: Snowflake
 
@@ -74,6 +76,7 @@ class MessageReactionAddEvent(APIObject, ChannelProperty, GuildProperty):
     member: :class:`~pincer.objects.guild.member.GuildMember`
         The member who reacted if this happened in a guild
     """
+
     user_id: Snowflake
     channel_id: Snowflake
     message_id: Snowflake
@@ -100,6 +103,7 @@ class MessageReactionRemoveEvent(APIObject, ChannelProperty, GuildProperty):
     guild_id: APINullable[:class:`~pincer.utils.snowflake.Snowflake`]
         The id of the guild
     """
+
     user_id: Snowflake
     channel_id: Snowflake
     message_id: Snowflake
@@ -121,13 +125,16 @@ class MessageReactionRemoveAllEvent(APIObject, ChannelProperty, GuildProperty):
     guild_id: APINullable[:class:`~pincer.utils.snowflake.Snowflake`]
         The id of the guild
     """
+
     channel_id: Snowflake
     message_id: Snowflake
     guild_id: APINullable[Snowflake] = MISSING
 
 
 @dataclass(repr=False)
-class MessageReactionRemoveEmojiEvent(APIObject, ChannelProperty, GuildProperty):
+class MessageReactionRemoveEmojiEvent(
+    APIObject, ChannelProperty, GuildProperty
+):
     """Sent when a bot removes all instances of a given
     emoji from the reactions of a message.
 
@@ -142,6 +149,7 @@ class MessageReactionRemoveEmojiEvent(APIObject, ChannelProperty, GuildProperty)
     guild_id: APINullable[:class:`~pincer.utils.snowflake.Snowflake`]
         The id of the guild
     """
+
     channel_id: Snowflake
     message_id: Snowflake
     emoji: Emoji
diff --git a/pincer/objects/events/presence.py b/pincer/objects/events/presence.py
index a3f2947e..4f20c85d 100644
--- a/pincer/objects/events/presence.py
+++ b/pincer/objects/events/presence.py
@@ -34,6 +34,7 @@ class ActivityType(IntEnum):
     COMPETING:
         Competing in {name}; e.g. "Competing in Arena World Champions"
     """  # noqa: E501
+
     GAME = 0
     STREAMING = 1
     LISTENING = 2
@@ -53,6 +54,7 @@ class ActivityTimestamp(APIObject):
     end: APINullable[:class:`int`]
         Unix time (in milliseconds) of when the activity ends
     """
+
     start: APINullable[int] = MISSING
     end: APINullable[int] = MISSING
 
@@ -70,6 +72,7 @@ class ActivityEmoji(APIObject):
     animated: APINullable[:class:`bool`]
         Whether this emoji is animated
     """
+
     name: str
     id: APINullable[Snowflake] = MISSING
     animated: APINullable[bool] = MISSING
@@ -86,6 +89,7 @@ class ActivityParty(APIObject):
     size: APINullable[Tuple[:class:`int`, :class:`int`]]
         Array of two integers (current_size, max_size)
     """
+
     id: APINullable[str] = MISSING
     size: APINullable[Tuple[int, int]] = MISSING
 
@@ -107,6 +111,7 @@ class ActivityAssets(APIObject):
         text displayed when hovering over
         the small image of the activity
     """
+
     large_image: APINullable[str] = MISSING
     large_text: APINullable[str] = MISSING
     small_image: APINullable[str] = MISSING
@@ -126,6 +131,7 @@ class ActivitySecrets(APIObject):
     match: APINullable[:class:`str`]
         The secret for a specific instanced match
     """
+
     join: APINullable[str] = MISSING
     spectate: APINullable[str] = MISSING
     match_: APINullable[str] = MISSING
@@ -163,6 +169,7 @@ class ActivityButton(APIObject):
     url: :class:`str`
         The url opened when clicking the button (1-512 characters)
     """
+
     label: str
     url: str
 
@@ -206,6 +213,7 @@ class Activity(APIObject):
     buttons: APINullable[List[:class:`~pincer.objects.events.presence.ActivityButton`]]
         The url button on an activity.
     """
+
     # noqa: E501
     name: str
     type: ActivityType
@@ -244,6 +252,7 @@ class ClientStatus(APIObject):
         The user's status set for an active web
         (browser, bot account) application session
     """
+
     desktop: APINullable[str] = MISSING
     mobile: APINullable[str] = MISSING
     web: APINullable[str] = MISSING
@@ -267,6 +276,7 @@ class PresenceUpdateEvent(APIObject, GuildProperty):
     client_status: :class:`~pincer.objects.events.presence.ClientStatus`
         User's platform-dependent status
     """
+
     user: User
     status: str
     activities: List[Activity]
diff --git a/pincer/objects/events/thread.py b/pincer/objects/events/thread.py
index ce3ed4dc..ea1a2652 100644
--- a/pincer/objects/events/thread.py
+++ b/pincer/objects/events/thread.py
@@ -38,6 +38,7 @@ class ThreadListSyncEvent(APIObject, GuildProperty):
         This array may contain channel_ids that have no active
         threads as well, so you know to clear that data.
     """
+
     guild_id: Snowflake
     threads: List[Channel]
     members: List[ThreadMember]
@@ -65,6 +66,7 @@ class ThreadMembersUpdateEvent(APIObject, GuildProperty):
     removed_member_ids: APINullable[List[:class:`~pincer.utils.snowflake.Snowflake`]]
         The id of the users who were removed from the thread
     """
+
     # noqa: E501
     id: Snowflake
     guild_id: Snowflake
diff --git a/pincer/objects/events/typing_start.py b/pincer/objects/events/typing_start.py
index ea86f86c..ddd4e5e1 100644
--- a/pincer/objects/events/typing_start.py
+++ b/pincer/objects/events/typing_start.py
@@ -31,6 +31,7 @@ class TypingStartEvent(APIObject, ChannelProperty, GuildProperty):
     member: APINullable[:class:`~pincer.objects.guild.member.GuildMember`]
         The member who started typing if this happened in a guild
     """
+
     channel_id: Snowflake
     user_id: Snowflake
     timestamp: int
diff --git a/pincer/objects/events/webhook.py b/pincer/objects/events/webhook.py
index c403653f..a63a123e 100644
--- a/pincer/objects/events/webhook.py
+++ b/pincer/objects/events/webhook.py
@@ -25,5 +25,6 @@ class WebhooksUpdateEvent(APIObject, ChannelProperty):
     channel_id: :class:`~pincer.utils.snowflake.Snowflake`
         id of the channel
     """
+
     guild_id: Snowflake
     channel_id: Snowflake
diff --git a/pincer/objects/guild/__init__.py b/pincer/objects/guild/__init__.py
index e16421fb..51ac4a05 100644
--- a/pincer/objects/guild/__init__.py
+++ b/pincer/objects/guild/__init__.py
@@ -2,28 +2,48 @@
 # Full MIT License can be found in `LICENSE` at the project root.
 
 from .audit_log import (
-    AuditLogEvent, AuditLogChange, AuditEntryInfo, AuditLogEntry, AuditLog
+    AuditLogEvent,
+    AuditLogChange,
+    AuditEntryInfo,
+    AuditLogEntry,
+    AuditLog,
 )
 from .ban import Ban
 from .channel import (
-    ChannelType, Channel, TextChannel, VoiceChannel, CategoryChannel,
-    NewsChannel, ChannelMention, PrivateThread, PublicThread
+    ChannelType,
+    Channel,
+    TextChannel,
+    VoiceChannel,
+    CategoryChannel,
+    NewsChannel,
+    ChannelMention,
+    PrivateThread,
+    PublicThread,
 )
 from .features import GuildFeature
 from .followed_channel import FollowedChannel
 from .guild import (
-    PremiumTier, GuildNSFWLevel, ExplicitContentFilterLevel, MFALevel,
-    VerificationLevel, DefaultMessageNotificationLevel, SystemChannelFlags,
-    Guild, UnavailableGuild
-)
-from .invite import (
-    InviteTargetType, InviteStageInstance, Invite
+    PremiumTier,
+    GuildNSFWLevel,
+    ExplicitContentFilterLevel,
+    MFALevel,
+    VerificationLevel,
+    DefaultMessageNotificationLevel,
+    SystemChannelFlags,
+    Guild,
+    UnavailableGuild,
 )
+from .invite import InviteTargetType, InviteStageInstance, Invite
 from .member import GuildMember, PartialGuildMember, BaseMember
 from .overwrite import Overwrite
 from .permissions import Permissions
 from .role import RoleTags, Role
-from .scheduled_events import GuildScheduledEventEntityType, GuildScheduledEventUser, EventStatus, ScheduledEvent
+from .scheduled_events import (
+    GuildScheduledEventEntityType,
+    GuildScheduledEventUser,
+    EventStatus,
+    ScheduledEvent,
+)
 from .stage import PrivacyLevel, StageInstance
 from .template import GuildTemplate
 from .thread import ThreadMetadata, ThreadMember
@@ -33,17 +53,52 @@
 
 
 __all__ = (
-    "", "AuditEntryInfo", "AuditLog", "AuditLogChange",
-    "AuditLogEntry", "AuditLogEvent", "Ban", "BaseMember", "CategoryChannel",
-    "Channel", "ChannelMention", "ChannelType",
-    "DefaultMessageNotificationLevel", "EventStatus",
-    "ExplicitContentFilterLevel", "FollowedChannel", "Guild", "GuildFeature",
-    "GuildMember", "GuildNSFWLevel", "GuildScheduledEventEntityType",
-    "GuildTemplate", "GuildWidget", "Invite", "InviteStageInstance",
-    "InviteTargetType", "MFALevel", "NewsChannel", "Overwrite",
-    "PartialGuildMember", "Permissions", "PremiumTier", "PrivacyLevel", "Role",
-    "RoleTags", "ScheduledEvent", "StageInstance", "SystemChannelFlags",
-    "TextChannel", "ThreadMember", "ThreadMetadata", "UnavailableGuild",
-    "VerificationLevel", "VoiceChannel", "Webhook", "WebhookType",
-    "WelcomeScreen", "WelcomeScreenChannel"
+    "",
+    "AuditEntryInfo",
+    "AuditLog",
+    "AuditLogChange",
+    "AuditLogEntry",
+    "AuditLogEvent",
+    "Ban",
+    "BaseMember",
+    "CategoryChannel",
+    "Channel",
+    "ChannelMention",
+    "ChannelType",
+    "DefaultMessageNotificationLevel",
+    "EventStatus",
+    "ExplicitContentFilterLevel",
+    "FollowedChannel",
+    "Guild",
+    "GuildFeature",
+    "GuildMember",
+    "GuildNSFWLevel",
+    "GuildScheduledEventEntityType",
+    "GuildTemplate",
+    "GuildWidget",
+    "Invite",
+    "InviteStageInstance",
+    "InviteTargetType",
+    "MFALevel",
+    "NewsChannel",
+    "Overwrite",
+    "PartialGuildMember",
+    "Permissions",
+    "PremiumTier",
+    "PrivacyLevel",
+    "Role",
+    "RoleTags",
+    "ScheduledEvent",
+    "StageInstance",
+    "SystemChannelFlags",
+    "TextChannel",
+    "ThreadMember",
+    "ThreadMetadata",
+    "UnavailableGuild",
+    "VerificationLevel",
+    "VoiceChannel",
+    "Webhook",
+    "WebhookType",
+    "WelcomeScreen",
+    "WelcomeScreenChannel",
 )
diff --git a/pincer/objects/guild/audit_log.py b/pincer/objects/guild/audit_log.py
index 4fd37072..69fdae32 100644
--- a/pincer/objects/guild/audit_log.py
+++ b/pincer/objects/guild/audit_log.py
@@ -117,6 +117,7 @@ class AuditLogEvent(IntEnum):
     THREAD_DELETE1:
         Thread deleted.
     """
+
     GUILD_UPDATE = 1
     CHANNEL_CREATE = 10
     CHANNEL_UPDATE = 11
@@ -176,6 +177,7 @@ class AuditLogChange(APIObject):
     key: :class:`str`
         Name of audit log change key
     """
+
     new_value: Any
     old_value: Any
     key: str
@@ -204,6 +206,7 @@ class AuditEntryInfo(APIObject, ChannelProperty):
     role_name: :class:`str`
         Name of the role if type is "0" (not present if type is "1")
     """
+
     delete_member_days: str
     members_removed: str
     channel_id: Snowflake
@@ -235,6 +238,7 @@ class AuditLogEntry(APIObject):
     reason: APINullable[:class:`str`]
         The reason for the change x(0-512 characters)
     """
+
     # noqa: E501
     target_id: Optional[str]
     user_id: Optional[Snowflake]
@@ -261,6 +265,7 @@ class AuditLog(APIObject):
     threads: List[:class:`~pincer.objects.guild.channel.Channel`]
         list of threads found in the audit log
     """
+
     # noqa: E501
     webhooks: List[Webhook]
     users: List[User]
diff --git a/pincer/objects/guild/ban.py b/pincer/objects/guild/ban.py
index dac1801e..1a489ca6 100644
--- a/pincer/objects/guild/ban.py
+++ b/pincer/objects/guild/ban.py
@@ -23,5 +23,6 @@ class Ban(APIObject):
     user: :class:`~pincer.objects.user.user.User`
         The banned user
     """
+
     reason: Optional[str]
     user: User
diff --git a/pincer/objects/guild/channel.py b/pincer/objects/guild/channel.py
index 10bc7e81..e9bf362e 100644
--- a/pincer/objects/guild/channel.py
+++ b/pincer/objects/guild/channel.py
@@ -362,8 +362,7 @@ def get_pinned_messages(self) -> APIDataGen[UserMessage]:
             An iterator of pinned messages.
         """
         return APIDataGen(
-            UserMessage,
-            self._http.get(f"channels/{self.id}/pins")
+            UserMessage, self._http.get(f"channels/{self.id}/pins")
         )
 
     async def pin_message(
@@ -372,7 +371,7 @@ async def pin_message(
         """|coro|
         Pin a message in a channel. Requires the ``MANAGE_MESSAGES`` permission.
         The maximum number of pinned messages is ``50``.
-        
+
         Parameters
         ----------
         reason: Optional[:class:`str`]
@@ -388,7 +387,7 @@ async def unpin_message(
     ):
         """|coro|
         Unpin a message in a channel. Requires the ``MANAGE_MESSAGES`` permission.
-                
+
         Parameters
         ----------
         reason: Optional[:class:`str`]
@@ -541,8 +540,7 @@ def get_webhooks(self) -> APIDataGen[Webhook]:
         AsyncGenerator[:class:`~.pincer.objects.guild.webhook.Webhook`, None]
         """
         return APIDataGen(
-            Webhook,
-            self._http.get(f"channels/{self.id}/webhooks")
+            Webhook, self._http.get(f"channels/{self.id}/webhooks")
         )
 
     def get_invites(self) -> APIDataGen[Invite]:
@@ -555,10 +553,7 @@ def get_invites(self) -> APIDataGen[Invite]:
         AsyncIterator[:class:`~pincer.objects.guild.invite.Invite`]
             Invites iterator.
         """
-        return APIDataGen(
-            Invite,
-            self._http.get(f"channels/{self.id}/invites")
-        )
+        return APIDataGen(Invite, self._http.get(f"channels/{self.id}/invites"))
 
     async def create_invite(
         self,
@@ -794,7 +789,8 @@ async def fetch_message(self, message_id: int) -> UserMessage:
         )
 
     async def history(
-        self, limit: int = 50,
+        self,
+        limit: int = 50,
         before: Optional[Union[int, Snowflake]] = None,
         after: Optional[Union[int, Snowflake]] = None,
         around: Optional[Union[int, Snowflake]] = None,
@@ -820,19 +816,19 @@ async def history(
         """
 
         if limit is None:
-            limit = float('inf')
+            limit = float("inf")
 
         while limit > 0:
             retrieve = min(limit, 100)
 
             raw_messages = await self._http.get(
-                f'/channels/{self.id}/messages',
+                f"/channels/{self.id}/messages",
                 params={
-                    'limit': retrieve,
-                    'before': before,
-                    'after': after,
-                    'around': around,
-                }
+                    "limit": retrieve,
+                    "before": before,
+                    "after": after,
+                    "around": around,
+                },
             )
 
             if not raw_messages:
@@ -841,7 +837,7 @@ async def history(
             for _message in raw_messages:
                 yield UserMessage.from_dict(_message)
 
-            before = raw_messages[-1]['id']
+            before = raw_messages[-1]["id"]
             limit -= retrieve
 
 
@@ -1116,8 +1112,7 @@ def list_members(self) -> APIDataGen[ThreadMember]:
             An iterator of thread members.
         """
         return APIDataGen(
-            ThreadMember,
-            self._http.get(f"channels/{self.id}/thread-members")
+            ThreadMember, self._http.get(f"channels/{self.id}/thread-members")
         )
 
 
diff --git a/pincer/objects/guild/features.py b/pincer/objects/guild/features.py
index 27ceadec..a0874738 100644
--- a/pincer/objects/guild/features.py
+++ b/pincer/objects/guild/features.py
@@ -56,6 +56,7 @@ class GuildFeature(Enum):
     THREADS_ENABLED : str
         Guild can have threads enabled.
     """
+
     ANIMATED_ICON = "ANIMATED_ICON"
     BANNER = "BANNER"
     COMMERCE = "COMMERCE"
@@ -83,4 +84,3 @@ class GuildFeature(Enum):
     ANIMATED_BANNER = "ANIMATED_BANNER"
     MEMBER_PROFILES = "MEMBER_PROFILES"
     ENABLED_DISCOVERABLE_BEFORE = "ENABLED_DISCOVERABLE_BEFORE"
-
diff --git a/pincer/objects/guild/followed_channel.py b/pincer/objects/guild/followed_channel.py
index 7f2ad9d6..d26e3c01 100644
--- a/pincer/objects/guild/followed_channel.py
+++ b/pincer/objects/guild/followed_channel.py
@@ -23,5 +23,6 @@ class FollowedChannel(APIObject, ChannelProperty):
     webhook_id: :class:`~pincer.utils.snowflake.Snowflake`
         Created target webhook id
     """
+
     channel_id: Snowflake
     webhook_id: Snowflake
diff --git a/pincer/objects/guild/guild.py b/pincer/objects/guild/guild.py
index d0370999..dad77847 100644
--- a/pincer/objects/guild/guild.py
+++ b/pincer/objects/guild/guild.py
@@ -646,8 +646,8 @@ def list_guild_members(
             GuildMember,
             self._http.get(
                 f"guilds/{self.id}/members",
-                params={"limit": limit, "after": after}
-            )
+                params={"limit": limit, "after": after},
+            ),
         )
 
     def search_guild_members(
@@ -675,7 +675,7 @@ def search_guild_members(
             self._http.get(
                 f"guilds/{self.id}/members/search",
                 params={"query": query, "limit": limit},
-            )
+            ),
         )
 
     @overload
@@ -767,7 +767,7 @@ async def add_guild_member_role(
         reason : Optional[:class:`str`]
             audit log reason |default| :data:`None`
         """
-        data = await self._http.put(
+        await self._http.put(
             f"guilds/{self.id}/members/{user_id}/roles/{role_id}",
             headers={"X-Audit-Log-Reason": reason},
         )
@@ -844,9 +844,7 @@ async def ban(
         )
 
     async def kick(
-        self,
-        member: Union[int, GuildMember],
-        reason: Optional[str] = None
+        self, member: Union[int, GuildMember], reason: Optional[str] = None
     ):
         """|coro|
         Kicks a guild member.
@@ -878,9 +876,7 @@ def get_roles(self) -> APIDataGen[Role]:
             An async generator of Role objects.
         """
 
-        return APIDataGen(
-            Role, self._http.get(f"guilds/{self.id}/roles")
-        )
+        return APIDataGen(Role, self._http.get(f"guilds/{self.id}/roles"))
 
     @overload
     async def create_role(
@@ -963,11 +959,12 @@ def edit_role_position(
             An async generator of all the guild's role objects.
         """
         return APIDataGen(
-            Role, self._http.patch(
+            Role,
+            self._http.patch(
                 f"guilds/{self.id}/roles",
                 data={"id": id, "position": position},
                 headers={"X-Audit-Log-Reason": reason},
-            )
+            ),
         )
 
     @overload
@@ -1058,10 +1055,7 @@ def get_bans(self) -> APIDataGen[Ban]:
             An async generator of Ban objects.
         """
 
-        return APIDataGen(
-            Ban,
-            self._http.get(f"guilds/{self.id}/bans")
-        )
+        return APIDataGen(Ban, self._http.get(f"guilds/{self.id}/bans"))
 
     async def get_ban(self, id: Snowflake) -> Ban:
         """|coro|
@@ -1279,8 +1273,7 @@ def get_voice_regions(self) -> APIDataGen[VoiceRegion]:
         """
 
         return APIDataGen(
-            VoiceRegion,
-            self._http.get(f"guilds/{self.id}/regions")
+            VoiceRegion, self._http.get(f"guilds/{self.id}/regions")
         )
 
     def get_invites(self) -> APIDataGen[Invite]:
@@ -1294,10 +1287,7 @@ def get_invites(self) -> APIDataGen[Invite]:
             An async generator of invites.
         """
 
-        return APIDataGen(
-            Invite,
-            self._http.get(f"guilds/{self.id}/invites")
-        )
+        return APIDataGen(Invite, self._http.get(f"guilds/{self.id}/invites"))
 
     async def get_invite(self, code: str) -> Invite:
         """|coro|
@@ -1328,8 +1318,7 @@ def get_integrations(self) -> APIDataGen[Integration]:
         """
 
         return APIDataGen(
-            Integration,
-            self._http.get(f"guilds/{self.id}/integrations")
+            Integration, self._http.get(f"guilds/{self.id}/integrations")
         )
 
     async def delete_integration(
@@ -1604,10 +1593,7 @@ def get_emojis(self) -> APIDataGen[Emoji]:
         :class:`~pincer.objects.guild.emoji.Emoji`
             The emoji object.
         """
-        return APIDataGen(
-            Emoji,
-            self._http.get(f"guilds/{self.id}/emojis")
-        )
+        return APIDataGen(Emoji, self._http.get(f"guilds/{self.id}/emojis"))
 
     async def get_emoji(self, id: Snowflake) -> Emoji:
         """|coro|
@@ -1732,8 +1718,7 @@ def get_templates(self) -> APIDataGen[GuildTemplate]:
         """
 
         return APIDataGen(
-            GuildTemplate,
-            self._http.get(f"guilds/{self.id}/templates")
+            GuildTemplate, self._http.get(f"guilds/{self.id}/templates")
         )
 
     async def create_template(
@@ -1846,10 +1831,7 @@ def list_stickers(self) -> APIDataGen[Sticker]:
             a sticker for the current guild
         """
 
-        return APIDataGen(
-            Sticker,
-            self._http.get(f"guild/{self.id}/stickers")
-        )
+        return APIDataGen(Sticker, self._http.get(f"guild/{self.id}/stickers"))
 
     async def get_sticker(self, _id: Snowflake) -> Sticker:
         """|coro|
@@ -1940,10 +1922,7 @@ def get_webhooks(self) -> APIDataGen[Webhook]:
             The guild webhook object.
         """
 
-        return APIDataGen(
-            Webhook,
-            self._http.get(f"guilds/{self.id}/webhooks")
-        )
+        return APIDataGen(Webhook, self._http.get(f"guilds/{self.id}/webhooks"))
 
     def get_scheduled_events(
         self, with_user_count: bool = False
@@ -1967,7 +1946,7 @@ def get_scheduled_events(
             self._http.get(
                 f"guilds/{self.id}/scheduled-events",
                 param={"with_user_count": with_user_count},
-            )
+            ),
         )
 
     async def create_scheduled_event(
@@ -2019,10 +1998,7 @@ async def create_scheduled_event(
         if scheduled_start_time < datetime.now():
             raise ValueError("An event cannot be created in the past")
 
-        if (
-            scheduled_end_time
-            and scheduled_end_time < scheduled_start_time
-        ):
+        if scheduled_end_time and scheduled_end_time < scheduled_start_time:
             raise ValueError("An event cannot start before it ends")
 
         data = await self._http.post(
@@ -2124,10 +2100,7 @@ async def modify_scheduled_event(
             if scheduled_start_time < datetime.now():
                 raise ValueError("An event cannot be created in the past")
 
-            if (
-                scheduled_end_time
-                and scheduled_end_time < scheduled_start_time
-            ):
+            if scheduled_end_time and scheduled_end_time < scheduled_start_time:
                 raise ValueError("An event cannot start before it ends")
 
         kwargs: Dict[str, str] = remove_none(
@@ -2195,19 +2168,21 @@ def get_guild_scheduled_event_users(
         :class:`~pincer.objects.guild.scheduled_event.GuildScheduledEventUser`
             The scheduled event user object.
         """
-        params = remove_none({
-            "limit": limit,
-            "with_member": with_member,
-            "before": before,
-            "after": after,
-        })
+        params = remove_none(
+            {
+                "limit": limit,
+                "with_member": with_member,
+                "before": before,
+                "after": after,
+            }
+        )
 
         return APIDataGen(
             GuildScheduledEventUser,
             self._http.get(
                 f"guilds/{self.id}/scheduled-events/{_id}/users",
                 params=params,
-            )
+            ),
         )
 
     @classmethod
diff --git a/pincer/objects/guild/overwrite.py b/pincer/objects/guild/overwrite.py
index b8b4cf60..cb62e4b7 100644
--- a/pincer/objects/guild/overwrite.py
+++ b/pincer/objects/guild/overwrite.py
@@ -28,6 +28,7 @@ class Overwrite(APIObject):
     deny: :class:`str`
         Permission bit set
     """
+
     id: Snowflake
     type: int
     allow: str
@@ -36,4 +37,4 @@ class Overwrite(APIObject):
     @property
     def permissions(self) -> Permissions:
         """Returns the permissions for this overwrite"""
-        return Permissions.from_ints(int(self.allow), int(self.deny))
\ No newline at end of file
+        return Permissions.from_ints(int(self.allow), int(self.deny))
diff --git a/pincer/objects/guild/permissions.py b/pincer/objects/guild/permissions.py
index d8185ab2..d1e0dd28 100644
--- a/pincer/objects/guild/permissions.py
+++ b/pincer/objects/guild/permissions.py
@@ -12,6 +12,7 @@ class PermissionEnum(IntFlag):
     """
     Represents the permissions for a guild.
     """
+
     CREATE_INSTANT_INVITE = 1 << 0
     KICK_MEMBERS = 1 << 1
     BAN_MEMBERS = 1 << 2
diff --git a/pincer/objects/guild/role.py b/pincer/objects/guild/role.py
index a7b8adbe..3b0a600a 100644
--- a/pincer/objects/guild/role.py
+++ b/pincer/objects/guild/role.py
@@ -30,6 +30,7 @@ class RoleTags(APIObject):
     premium_subscriber: APINullable[:class:`bool`]
         Whether this is the guild's premium subscriber role or not.
     """
+
     bot_id: APINullable[Snowflake] = MISSING
     integration_id: APINullable[Snowflake] = MISSING
     premium_subscriber: APINullable[bool] = MISSING
@@ -65,6 +66,7 @@ class Role(APIObject):
     tags: :class:`~pincer.objects.guild.role.RoleTags`
         The tags this role has
     """
+
     color: Color
     hoist: bool
     id: Snowflake
@@ -98,5 +100,5 @@ async def from_id(cls, client, guild_id: int, role_id: int) -> Role:
         roles: list = await client.http.get(f"/guilds/{guild_id}/roles")
 
         for role in roles:
-            if int(role['id']) == role_id:
+            if int(role["id"]) == role_id:
                 return cls.from_dict(role)
diff --git a/pincer/objects/guild/scheduled_events.py b/pincer/objects/guild/scheduled_events.py
index d4172875..398cf396 100644
--- a/pincer/objects/guild/scheduled_events.py
+++ b/pincer/objects/guild/scheduled_events.py
@@ -33,6 +33,7 @@ class EventStatus(IntEnum):
     COMPLETED: int
         The event is completed.
     """
+
     SCHEDULED = 1
     ACTIVE = 2
     COMPLETED = 3
@@ -52,6 +53,7 @@ class GuildScheduledEventEntityType(IntEnum):
     EXTERNAL: int
         The event is scheduled for an external resource.
     """
+
     STAGE_INSTANCE = 1
     VOICE = 2
     EXTERNAL = 3
@@ -96,6 +98,7 @@ class ScheduledEvent(APIObject):
     user_count: APINullable[:class:`int`]
         The number of users who have joined the scheduled event
     """
+
     id: Snowflake
     name: str
     guild_id: Snowflake
@@ -127,8 +130,9 @@ class GuildScheduledEventUser(APIObject):
     user : :class:`~pincer.objects.user.user.User`
         user which subscribed to an event
     member : APINullable[:class:`~pincer.objects.guild.member.GuildMember`]
-        	guild member data for this user for the guild which this event belongs to, if any
+                guild member data for this user for the guild which this event belongs to, if any
     """
+
     guild_scheduled_event_id: Snowflake
     user: User
     member: APINullable[GuildMember] = MISSING
diff --git a/pincer/objects/guild/template.py b/pincer/objects/guild/template.py
index ed852b82..7c7ef9db 100644
--- a/pincer/objects/guild/template.py
+++ b/pincer/objects/guild/template.py
@@ -47,6 +47,7 @@ class GuildTemplate(APIObject):
     is_dirty: Optional[:class:`bool`]
         whether the template has unsynced changes
     """
+
     code: str
     name: str
     description: Optional[str]
diff --git a/pincer/objects/guild/thread.py b/pincer/objects/guild/thread.py
index 3d138222..3e84caf3 100644
--- a/pincer/objects/guild/thread.py
+++ b/pincer/objects/guild/thread.py
@@ -37,6 +37,7 @@ class ThreadMetadata(APIObject):
         Whether non-moderators can add other non-moderators to a thread;
         only available on private threads
     """
+
     archived: bool
     auto_archive_duration: int
     archive_timestamp: Timestamp
@@ -60,6 +61,7 @@ class ThreadMember(APIObject):
     user_id: APINullable[:class:`~pincer.utils.snowflake.Snowflake`]
         Id of the user
     """
+
     join_timestamp: Timestamp
     flags: int
 
diff --git a/pincer/objects/guild/welcome_screen.py b/pincer/objects/guild/welcome_screen.py
index 65898e1b..4176c675 100644
--- a/pincer/objects/guild/welcome_screen.py
+++ b/pincer/objects/guild/welcome_screen.py
@@ -31,6 +31,7 @@ class WelcomeScreenChannel(APIObject, ChannelProperty):
         The emoji name if custom, the unicode character if standard,
         or null if no emoji is set
     """
+
     channel_id: Snowflake
     description: str
 
@@ -49,6 +50,7 @@ class WelcomeScreen(APIObject):
     welcome_channels: Optional[:class:`str`]
         The channels shown in the welcome screen, up to 5
     """  # noqa: E501
+
     welcome_channels: List[WelcomeScreenChannel]
 
     description: Optional[str] = None
diff --git a/pincer/objects/guild/widget.py b/pincer/objects/guild/widget.py
index c3240f55..1435518b 100644
--- a/pincer/objects/guild/widget.py
+++ b/pincer/objects/guild/widget.py
@@ -25,5 +25,6 @@ class GuildWidget(APIObject):
     channel_id: Optional[:class:`~pincer.utils.snowflake.Snowflake`]
         The widget channel id
     """
+
     enabled: bool
     channel_id: Optional[Snowflake]
diff --git a/pincer/objects/message/__init__.py b/pincer/objects/message/__init__.py
index 58fa97d2..df05095d 100644
--- a/pincer/objects/message/__init__.py
+++ b/pincer/objects/message/__init__.py
@@ -5,8 +5,14 @@
 from .component import MessageComponent, ComponentType
 from .context import MessageContext
 from .embed import (
-    Embed, EmbedField, EmbedImage, EmbedAuthor, EmbedProvider, EmbedThumbnail,
-    EmbedVideo, EmbedFooter
+    Embed,
+    EmbedField,
+    EmbedImage,
+    EmbedAuthor,
+    EmbedProvider,
+    EmbedThumbnail,
+    EmbedVideo,
+    EmbedFooter,
 )
 from .emoji import Emoji
 from .file import File
@@ -14,19 +20,50 @@
 from .reaction import Reaction
 from .reference import MessageReference
 from .sticker import (
-    StickerType, StickerFormatType, Sticker, StickerItem, StickerPack
+    StickerType,
+    StickerFormatType,
+    Sticker,
+    StickerItem,
+    StickerPack,
 )
 from .user_message import (
-    MessageActivityType, MessageFlags, MessageType, MessageActivity,
-    AllowedMentionTypes, UserMessage, AllowedMentions
+    MessageActivityType,
+    MessageFlags,
+    MessageType,
+    MessageActivity,
+    AllowedMentionTypes,
+    UserMessage,
+    AllowedMentions,
 )
 
 __all__ = (
-    "AllowedMentionTypes", "AllowedMentions", "Attachment",
-    "ComponentType", "Embed", "EmbedAuthor", "EmbedField", "EmbedFooter",
-    "EmbedImage", "EmbedProvider", "EmbedThumbnail", "EmbedVideo", "Emoji",
-    "File", "Message", "MessageActivity", "MessageActivityType",
-    "MessageComponent", "MessageContext", "MessageFlags", "MessageReference",
-    "MessageType", "Reaction", "Sticker", "StickerFormatType", "StickerItem",
-    "StickerPack", "StickerType", "UserMessage"
+    "AllowedMentionTypes",
+    "AllowedMentions",
+    "Attachment",
+    "ComponentType",
+    "Embed",
+    "EmbedAuthor",
+    "EmbedField",
+    "EmbedFooter",
+    "EmbedImage",
+    "EmbedProvider",
+    "EmbedThumbnail",
+    "EmbedVideo",
+    "Emoji",
+    "File",
+    "Message",
+    "MessageActivity",
+    "MessageActivityType",
+    "MessageComponent",
+    "MessageContext",
+    "MessageFlags",
+    "MessageReference",
+    "MessageType",
+    "Reaction",
+    "Sticker",
+    "StickerFormatType",
+    "StickerItem",
+    "StickerPack",
+    "StickerType",
+    "UserMessage",
 )
diff --git a/pincer/objects/message/attachment.py b/pincer/objects/message/attachment.py
index b7044b94..f309c80b 100644
--- a/pincer/objects/message/attachment.py
+++ b/pincer/objects/message/attachment.py
@@ -39,6 +39,7 @@ class Attachment(APIObject):
     width: APINullable[Optional[:class:`int`]]
         Width of file (if image)
     """
+
     id: Snowflake
     filename: str
     size: int
diff --git a/pincer/objects/message/component.py b/pincer/objects/message/component.py
index 32112313..fc1a3128 100644
--- a/pincer/objects/message/component.py
+++ b/pincer/objects/message/component.py
@@ -32,6 +32,7 @@ class ComponentType(IntEnum):
     SELECT_MENU : int
         A select menu. Must be inside an action row.
     """
+
     ACTION_ROW = 1
     BUTTON = 2
     SELECT_MENU = 3
@@ -73,6 +74,7 @@ class MessageComponent(APIObject):
     components: APINullable[List[:class:`~pincer.objects.message.component.MessageComponent`]]
         A list of child components
     """  # noqa: E501
+
     type: int
 
     options: List[SelectOption] = MISSING
diff --git a/pincer/objects/message/context.py b/pincer/objects/message/context.py
index 985840dd..1dab2f7d 100644
--- a/pincer/objects/message/context.py
+++ b/pincer/objects/message/context.py
@@ -40,6 +40,7 @@ class MessageContext:
         The ID of the channel the interaction was invoked in.
         Can be None if it wasn't invoked in a channel.
     """  # noqa: E501
+
     _client: Client
 
     author: Union[GuildMember, User]
diff --git a/pincer/objects/message/embed.py b/pincer/objects/message/embed.py
index 5d73a833..1781f7f0 100644
--- a/pincer/objects/message/embed.py
+++ b/pincer/objects/message/embed.py
@@ -91,6 +91,7 @@ class EmbedAuthor:
     proxy_icon_url: APINullable[:class:`str`]
         A proxied url of the author icon
     """
+
     icon_url: APINullable[str] = MISSING
     name: APINullable[str] = MISSING
     proxy_icon_url: APINullable[str] = MISSING
@@ -139,6 +140,7 @@ class EmbedProvider:
     url: APINullable[:class:`str`]
         Url of the provider
     """
+
     name: APINullable[str] = MISSING
     url: APINullable[str] = MISSING
 
@@ -183,6 +185,7 @@ class EmbedVideo:
     width: APINullable[:class:`int`]
         Width of the video
     """
+
     height: APINullable[int] = MISSING
     url: APINullable[str] = MISSING
     proxy_url: APINullable[str] = MISSING
@@ -215,9 +218,7 @@ class EmbedFooter:
 
     def __post_init__(self):
         if _field_size(self.text) > 2048:
-            raise EmbedFieldError.from_desc(
-                "Footer text", 2048, len(self.text)
-            )
+            raise EmbedFieldError.from_desc("Footer text", 2048, len(self.text))
 
 
 @dataclass(repr=False)
@@ -248,9 +249,7 @@ class EmbedField:
 
     def __post_init__(self):
         if _field_size(self.name) > 256:
-            raise EmbedFieldError.from_desc(
-                "Field name", 256, len(self.name)
-            )
+            raise EmbedFieldError.from_desc("Field name", 256, len(self.name))
 
         if _field_size(self.value) > 1024:
             raise EmbedFieldError.from_desc(
@@ -293,6 +292,7 @@ class Embed(APIObject):
     type: APINullable[:class:`int`]
         type of message
     """
+
     # noqa: E501
 
     title: APINullable[str] = MISSING
@@ -311,9 +311,7 @@ class Embed(APIObject):
 
     def __post_init__(self):
         if _field_size(self.title) > 256:
-            raise EmbedFieldError.from_desc(
-                "Embed title", 256, len(self.title)
-            )
+            raise EmbedFieldError.from_desc("Embed title", 256, len(self.title))
 
         if _field_size(self.description) > 4096:
             raise EmbedFieldError.from_desc(
@@ -321,9 +319,7 @@ def __post_init__(self):
             )
 
         if len(self.fields) > 25:
-            raise EmbedFieldError.from_desc(
-                "Embed field", 25, len(self.fields)
-            )
+            raise EmbedFieldError.from_desc("Embed field", 25, len(self.fields))
 
     def set_timestamp(self, time: datetime) -> Embed:
         """Discord uses iso format for time stamps.
@@ -344,11 +340,11 @@ def set_timestamp(self, time: datetime) -> Embed:
         return self
 
     def set_author(
-            self,
-            icon_url: APINullable[str] = MISSING,
-            name: APINullable[str] = MISSING,
-            proxy_icon_url: APINullable[str] = MISSING,
-            url: APINullable[str] = MISSING
+        self,
+        icon_url: APINullable[str] = MISSING,
+        name: APINullable[str] = MISSING,
+        proxy_icon_url: APINullable[str] = MISSING,
+        url: APINullable[str] = MISSING,
     ) -> Embed:
         """Set the author message for the embed. This is the top
         field of the embed.
@@ -372,20 +368,17 @@ def set_author(
         """
 
         self.author = EmbedAuthor(
-            icon_url=icon_url,
-            name=name,
-            proxy_icon_url=proxy_icon_url,
-            url=url
+            icon_url=icon_url, name=name, proxy_icon_url=proxy_icon_url, url=url
         )
 
         return self
 
     def set_image(
-            self,
-            url: APINullable[str] = MISSING,
-            proxy_url: APINullable[str] = MISSING,
-            height: APINullable[int] = MISSING,
-            width: APINullable[int] = MISSING
+        self,
+        url: APINullable[str] = MISSING,
+        proxy_url: APINullable[str] = MISSING,
+        height: APINullable[int] = MISSING,
+        width: APINullable[int] = MISSING,
     ) -> Embed:
         """Sets an image for your embed.
 
@@ -406,20 +399,17 @@ def set_image(
             The new embed object.
         """
         self.image = EmbedImage(
-            height=height,
-            url=url,
-            proxy_url=proxy_url,
-            width=width
+            height=height, url=url, proxy_url=proxy_url, width=width
         )
 
         return self
 
     def set_thumbnail(
-            self,
-            height: APINullable[int] = MISSING,
-            url: APINullable[str] = MISSING,
-            proxy_url: APINullable[str] = MISSING,
-            width: APINullable[int] = MISSING
+        self,
+        height: APINullable[int] = MISSING,
+        url: APINullable[str] = MISSING,
+        proxy_url: APINullable[str] = MISSING,
+        width: APINullable[int] = MISSING,
     ) -> Embed:  # ? it's normally smaller in the corner?
         """Sets the thumbnail of the embed.
         This image is bigger than the ``image`` property.
@@ -439,19 +429,16 @@ def set_thumbnail(
             The new embed object.
         """
         self.thumbnail = EmbedThumbnail(
-            height=height,
-            url=url,
-            proxy_url=proxy_url,
-            width=width
+            height=height, url=url, proxy_url=proxy_url, width=width
         )
 
         return self
 
     def set_footer(
-            self,
-            text: str,
-            icon_url: APINullable[str] = MISSING,
-            proxy_icon_url: APINullable[str] = MISSING
+        self,
+        text: str,
+        icon_url: APINullable[str] = MISSING,
+        proxy_icon_url: APINullable[str] = MISSING,
     ) -> Embed:
         """
         Sets the embed footer. This is at the bottom of your embed.
@@ -471,18 +458,13 @@ def set_footer(
             The new embed object.
         """
         self.footer = EmbedFooter(
-            text=text,
-            icon_url=icon_url,
-            proxy_icon_url=proxy_icon_url
+            text=text, icon_url=icon_url, proxy_icon_url=proxy_icon_url
         )
 
         return self
 
     def add_field(
-            self,
-            name: str,
-            value: str,
-            inline: APINullable[bool] = MISSING
+        self, name: str, value: str, inline: APINullable[bool] = MISSING
     ) -> Embed:
         """Adds a field to the embed.
         An embed can contain up to 25 fields.
@@ -501,11 +483,7 @@ def add_field(
         EmbedFieldError:
             Raised when there are more than 25 fields in the embed
         """
-        _field = EmbedField(
-            name=name,
-            value=value,
-            inline=inline
-        )
+        _field = EmbedField(name=name, value=value, inline=inline)
 
         if len(self.fields) > 25:
             raise EmbedFieldError.from_desc(
@@ -517,12 +495,12 @@ def add_field(
         return self
 
     def add_fields(
-            self,
-            field_list: Union[Dict[Any, Any], Iterable[Iterable[Any, Any]]],
-            checks: Optional[Callable[[Any], Any]] = bool,
-            map_title: Optional[Callable[[Any], str]] = str,
-            map_values: Optional[Callable[[Any], str]] = str,
-            inline: bool = True
+        self,
+        field_list: Union[Dict[Any, Any], Iterable[Iterable[Any, Any]]],
+        checks: Optional[Callable[[Any], Any]] = bool,
+        map_title: Optional[Callable[[Any], str]] = str,
+        map_values: Optional[Callable[[Any], str]] = str,
+        inline: bool = True,
     ) -> Embed:
         """Add multiple fields from a list,
         dict or generator of fields with possible mapping.
@@ -564,9 +542,7 @@ def add_fields(
 
             if checks(val):
                 self.add_field(
-                    name=map_title(field_name),
-                    value=val,
-                    inline=inline
+                    name=map_title(field_name), value=val, inline=inline
                 )
 
         return self
diff --git a/pincer/objects/message/file.py b/pincer/objects/message/file.py
index 72d6b254..fefe2331 100644
--- a/pincer/objects/message/file.py
+++ b/pincer/objects/message/file.py
@@ -124,16 +124,16 @@ def from_file(cls, filepath: str, filename: str = None) -> File:
         return cls(
             content=file,
             image_format=_get_file_extension(filename),
-            filename=filename or os.path.basename(filepath)
+            filename=filename or os.path.basename(filepath),
         )
 
     @classmethod
     def from_pillow_image(
-            cls,
-            img: IMAGE_TYPE,
-            filename: Optional[str] = None,
-            image_format: Optional[str] = None,
-            **kwargs
+        cls,
+        img: IMAGE_TYPE,
+        filename: Optional[str] = None,
+        image_format: Optional[str] = None,
+        **kwargs,
     ) -> File:
         """Creates a file object from a PIL image
         Supports GIF, PNG, JPEG, and WEBP.
@@ -178,9 +178,7 @@ def from_pillow_image(
         img_bytes = img_byte_arr.getvalue()
 
         return cls(
-            content=img_bytes,
-            image_format=image_format,
-            filename=filename
+            content=img_bytes, image_format=image_format, filename=filename
         )
 
     @property
@@ -194,11 +192,11 @@ def uri(self) -> str:
         """  # noqa: E501
         if self.image_format not in {"jpeg", "png", "gif"}:
             raise ImageEncodingError(
-                "Only image types \"jpeg\", \"png\", and \"gif\" can be sent in"
+                'Only image types "jpeg", "png", and "gif" can be sent in'
                 " an Image URI"
             )
 
-        encoded_bytes = b64encode(self.content).decode('ascii')
+        encoded_bytes = b64encode(self.content).decode("ascii")
 
         return f"data:image/{self.image_format};base64,{encoded_bytes}"
 
diff --git a/pincer/objects/message/message.py b/pincer/objects/message/message.py
index b0563602..eb25170c 100644
--- a/pincer/objects/message/message.py
+++ b/pincer/objects/message/message.py
@@ -83,10 +83,12 @@ def __post_init__(self):
             if isinstance(value, File):
                 attachment.append(value)
             elif PILLOW_IMPORT and isinstance(value, Image):
-                attachment.append(File.from_pillow_image(
-                    value,
-                    f"image{count}.png",
-                ))
+                attachment.append(
+                    File.from_pillow_image(
+                        value,
+                        f"image{count}.png",
+                    )
+                )
             elif isinstance(value, str):
                 attachment.append(File.from_file(value))
             else:
@@ -107,8 +109,7 @@ def isempty(self) -> bool:
     def to_dict(self):
 
         allowed_mentions = (
-            self.allowed_mentions.to_dict()
-            if self.allowed_mentions else {}
+            self.allowed_mentions.to_dict() if self.allowed_mentions else {}
         )
 
         # Attachments aren't serialized
@@ -117,24 +118,25 @@ def to_dict(self):
             "content": self.content,
             "tts": self.tts,
             "flags": self.flags,
-            "embeds": [
-                embed.to_dict() for embed in self.embeds
-            ] if self.embeds is not None else None,
+            "embeds": [embed.to_dict() for embed in self.embeds]
+            if self.embeds is not None
+            else None,
             "allowed_mentions": allowed_mentions,
             "components": [
                 components.to_dict() for components in self.components
-            ] if self.components is not None else None
+            ]
+            if self.components is not None
+            else None,
         }
 
         # IDE does not recognise return type of filter properly.
         # noinspection PyTypeChecker
-        return dict(filter(
-            lambda kv: kv[1] is not None,
-            resp.items()
-        ))
+        return dict(filter(lambda kv: kv[1] is not None, resp.items()))
 
     def serialize(
-        self, message_type: Optional[CallbackType] = None, allow_empty: bool = False
+        self,
+        message_type: Optional[CallbackType] = None,
+        allow_empty: bool = False,
     ) -> Tuple[str, Union[Payload, Dict]]:
         """
         Parameters
@@ -159,10 +161,7 @@ def serialize(
 
         if message_type is not None:
             json_data = json_payload
-            json_payload = {
-                "data": json_data,
-                "type": message_type
-            }
+            json_payload = {"data": json_data, "type": message_type}
 
         if not self.attachments:
             return "application/json", json_payload
diff --git a/pincer/objects/message/reaction.py b/pincer/objects/message/reaction.py
index 66fdf782..4016c393 100644
--- a/pincer/objects/message/reaction.py
+++ b/pincer/objects/message/reaction.py
@@ -25,6 +25,7 @@ class Reaction(APIObject):
     emoji: :class:`~pincer.objects.message.emoji.Emoji`
         Emoji information
     """
+
     count: int
     me: bool
     emoji: Emoji
diff --git a/pincer/objects/message/reference.py b/pincer/objects/message/reference.py
index 7f065c1e..c191207e 100644
--- a/pincer/objects/message/reference.py
+++ b/pincer/objects/message/reference.py
@@ -31,6 +31,7 @@ class MessageReference(APIObject, ChannelProperty, GuildProperty):
         exist instead of sending as a normal (non-reply) message,
         default true
     """
+
     message_id: APINullable[Snowflake] = MISSING
     channel_id: APINullable[Snowflake] = MISSING
     guild_id: APINullable[Snowflake] = MISSING
diff --git a/pincer/objects/message/user_message.py b/pincer/objects/message/user_message.py
index cde75fc7..04ee2fb4 100644
--- a/pincer/objects/message/user_message.py
+++ b/pincer/objects/message/user_message.py
@@ -496,7 +496,7 @@ def get_reactions(
             self._http.get(
                 f"/channels/{self.channel_id}/messages/{self.id}/reactions/{emoji}",
                 params={"after": after, "limit": limit},
-            )
+            ),
         )
 
     async def remove_all_reactions(self):
diff --git a/pincer/objects/user/__init__.py b/pincer/objects/user/__init__.py
index aa8d8560..f369588d 100644
--- a/pincer/objects/user/__init__.py
+++ b/pincer/objects/user/__init__.py
@@ -3,15 +3,23 @@
 
 from .connection import Connection
 from .integration import (
-    IntegrationExpireBehavior, IntegrationApplication,
-    Integration, IntegrationAccount
+    IntegrationExpireBehavior,
+    IntegrationApplication,
+    Integration,
+    IntegrationAccount,
 )
 from .user import User, PremiumTypes, VisibilityType
 from .voice_state import VoiceState
 
 
 __all__ = (
-    "Connection", "Integration", "IntegrationAccount",
-    "IntegrationApplication", "IntegrationExpireBehavior", "PremiumTypes",
-    "User", "VisibilityType", "VoiceState"
+    "Connection",
+    "Integration",
+    "IntegrationAccount",
+    "IntegrationApplication",
+    "IntegrationExpireBehavior",
+    "PremiumTypes",
+    "User",
+    "VisibilityType",
+    "VoiceState",
 )
diff --git a/pincer/objects/user/connection.py b/pincer/objects/user/connection.py
index 0cc91ae5..a6f7fe59 100644
--- a/pincer/objects/user/connection.py
+++ b/pincer/objects/user/connection.py
@@ -42,6 +42,7 @@ class Connection(APIObject):
     integrations: APINullable[List[:class:`~pincer.objects.user.integration.Integration`]]
         An array of partial server integrations
     """
+
     # noqa: E501
 
     id: str
diff --git a/pincer/objects/user/integration.py b/pincer/objects/user/integration.py
index e20e98df..07d849ef 100644
--- a/pincer/objects/user/integration.py
+++ b/pincer/objects/user/integration.py
@@ -27,6 +27,7 @@ class IntegrationExpireBehavior(IntEnum):
     KICK:
         Kick on expire.
     """
+
     REMOVE_ROLE = 0
     KICK = 1
 
@@ -42,6 +43,7 @@ class IntegrationAccount(APIObject):
     name: :class:`str`
         Name of the account
     """
+
     id: str
     name: str
 
@@ -65,6 +67,7 @@ class IntegrationApplication(APIObject):
     bot: APINullable[:class:`~pincer.objects.user.user.User`]
         The bot associated with this application
     """
+
     id: Snowflake
     name: str
     icon: Optional[str]
@@ -111,6 +114,7 @@ class Integration(APIObject):
     application: APINullable[:class:`~pincer.objects.user.integration.IntegrationApplication`]
         The bot/OAuth2 application for discord integrations
     """
+
     # noqa: E501
 
     id: Snowflake
diff --git a/pincer/objects/user/voice_state.py b/pincer/objects/user/voice_state.py
index eb1ecbc4..95d611c1 100644
--- a/pincer/objects/user/voice_state.py
+++ b/pincer/objects/user/voice_state.py
@@ -49,6 +49,7 @@ class VoiceState(APIObject, ChannelProperty, GuildProperty):
     self_stream: APINullable[:class:`bool`]
         Whether this user is streaming using "Go Live"
     """
+
     # noqa: E501
 
     user_id: Snowflake
diff --git a/pincer/objects/voice/__init__.py b/pincer/objects/voice/__init__.py
index be254f5e..fd2226ee 100644
--- a/pincer/objects/voice/__init__.py
+++ b/pincer/objects/voice/__init__.py
@@ -4,6 +4,4 @@
 from .region import VoiceRegion
 
 
-__all__ = (
-    "VoiceRegion"
-)
+__all__ = "VoiceRegion"
diff --git a/pincer/objects/voice/region.py b/pincer/objects/voice/region.py
index ccf5e5de..4fa4b919 100644
--- a/pincer/objects/voice/region.py
+++ b/pincer/objects/voice/region.py
@@ -28,6 +28,7 @@ class VoiceRegion(APIObject):
         Whether this is a custom voice region
         (used for events/etc.)
     """
+
     id: str
     name: str
     vip: bool
diff --git a/pincer/utils/__init__.py b/pincer/utils/__init__.py
index d1f4e2e6..a1723b5f 100644
--- a/pincer/utils/__init__.py
+++ b/pincer/utils/__init__.py
@@ -24,10 +24,28 @@
 )
 
 __all__ = (
-    "APINullable", "APIObject", "ChannelProperty", "CheckFunction",
-    "Color", "Coro", "EventMgr", "GuildProperty", "MISSING", "MissingType",
-    "Snowflake", "Task", "TaskScheduler", "Timestamp", "calculate_shard_id",
-    "chdir", "choice_value_types", "get_index", "get_params",
-    "get_signature_and_params", "remove_none", "replace", "should_pass_cls",
-    "should_pass_ctx"
+    "APINullable",
+    "APIObject",
+    "ChannelProperty",
+    "CheckFunction",
+    "Color",
+    "Coro",
+    "EventMgr",
+    "GuildProperty",
+    "MISSING",
+    "MissingType",
+    "Snowflake",
+    "Task",
+    "TaskScheduler",
+    "Timestamp",
+    "calculate_shard_id",
+    "chdir",
+    "choice_value_types",
+    "get_index",
+    "get_params",
+    "get_signature_and_params",
+    "remove_none",
+    "replace",
+    "should_pass_cls",
+    "should_pass_ctx",
 )
diff --git a/pincer/utils/api_data.py b/pincer/utils/api_data.py
index 0262d92a..29be29ef 100644
--- a/pincer/utils/api_data.py
+++ b/pincer/utils/api_data.py
@@ -10,18 +10,17 @@
 if TYPE_CHECKING:
     from typing import Any, Coroutine, List, Type, Generator, AsyncIterator
 
-T = TypeVar('T')
+T = TypeVar("T")
 
 
 class APIDataGen(Generic[T]):
-
     def __init__(
-        self,
-        factory: Type[T],
-        request_func: Coroutine[Any, None, Any]
+        self, factory: Type[T], request_func: Coroutine[Any, None, Any]
     ):
 
-        self.fac = factory if isinstance(factory, APIObject) else factory.from_dict
+        self.fac = (
+            factory if isinstance(factory, APIObject) else factory.from_dict
+        )
         self.request_func = request_func
 
     async def __async(self) -> List[T]:
diff --git a/pincer/utils/color.py b/pincer/utils/color.py
index 69480022..c4b48773 100644
--- a/pincer/utils/color.py
+++ b/pincer/utils/color.py
@@ -48,7 +48,7 @@ def __init__(self, c: Union[str, int]) -> None:
         if any(digit not in string.hexdigits for digit in c):
             raise ValueError("Illegal hex digit character.")
 
-        self.r, self.g, self.b = (int(c[n:n + 2], 16) for n in (0, 2, 4))
+        self.r, self.g, self.b = (int(c[n : n + 2], 16) for n in (0, 2, 4))
 
     def __eq__(self, other):
         return self.r == other.r and self.g == other.g and self.b == other.b
diff --git a/pincer/utils/convert_message.py b/pincer/utils/convert_message.py
index 413ec502..0295f431 100644
--- a/pincer/utils/convert_message.py
+++ b/pincer/utils/convert_message.py
@@ -43,7 +43,11 @@ def convert_message(client: Client, message: MessageConvertable) -> Message:
     :class:`~pincer.objects.message.message.Message`
         The message object to be sent
     """
-    if message and isinstance(message, Iterable) and not isinstance(message, str):
+    if (
+        message
+        and isinstance(message, Iterable)
+        and not isinstance(message, str)
+    ):
         kwargs = defaultdict(list)
         for item in message:
             list_to_message_dict(item, kwargs)
@@ -57,8 +61,7 @@ def convert_message(client: Client, message: MessageConvertable) -> Message:
             Message(message)
             if message
             else Message(
-                client.received_message,
-                flags=InteractionFlags.EPHEMERAL
+                client.received_message, flags=InteractionFlags.EPHEMERAL
             )
         )
     return message
diff --git a/pincer/utils/extraction.py b/pincer/utils/extraction.py
index 53411103..b4929058 100644
--- a/pincer/utils/extraction.py
+++ b/pincer/utils/extraction.py
@@ -8,14 +8,13 @@
 
 class GetItem(Protocol):
     """Represents a class which implements the __getitem__ property."""
+
     def __getitem__(self, key: int) -> Any:
         return ...
 
 
 def get_index(
-        collection: GetItem,
-        index: int,
-        fallback: Optional[T] = None
+    collection: GetItem, index: int, fallback: Optional[T] = None
 ) -> Optional[T]:
     """Gets an item from a collection through index.
     Allows you to provide a fallback for if that index is out of bounds.
diff --git a/pincer/utils/insertion.py b/pincer/utils/insertion.py
index d877efbe..73a47bdf 100644
--- a/pincer/utils/insertion.py
+++ b/pincer/utils/insertion.py
@@ -68,7 +68,4 @@ def should_pass_ctx(sig: Mapping[str, Parameter], params: List[str]) -> bool:
         TypeCache()
         annotation = eval(annotation, TypeCache.cache, globals())
 
-    return (
-        annotation == MessageContext
-        or params[0] == "ctx"
-    )
+    return annotation == MessageContext or params[0] == "ctx"
diff --git a/pincer/utils/replace.py b/pincer/utils/replace.py
index d51d6c8d..ac9cae65 100644
--- a/pincer/utils/replace.py
+++ b/pincer/utils/replace.py
@@ -7,7 +7,4 @@
 def replace(
     func: Callable[[Any], bool], iter_: Iterable[T], new_item: T
 ) -> List[T]:
-    return [
-        item if func(item) else new_item
-        for item in iter_
-    ]
+    return [item if func(item) else new_item for item in iter_]
diff --git a/pincer/utils/snowflake.py b/pincer/utils/snowflake.py
index c25f8fd9..9435dc7b 100644
--- a/pincer/utils/snowflake.py
+++ b/pincer/utils/snowflake.py
@@ -16,6 +16,7 @@ class Snowflake(int):
     they are always returned as strings in the HTTP API
     to prevent integer overflows in some languages.
     """
+
     _MAX_VALUE: int = 9223372036854775807
     _MIN_VALUE: int = 0
 
@@ -37,7 +38,7 @@ def __init__(self, _):
     def __factory__(cls, string: str) -> Snowflake:
         # TODO: fix docs
         """
-        
+
         Parameters
         ----------
         string
diff --git a/pincer/utils/tasks.py b/pincer/utils/tasks.py
index 5c555e4a..0e69ee2e 100644
--- a/pincer/utils/tasks.py
+++ b/pincer/utils/tasks.py
@@ -12,8 +12,10 @@
 from . import __package__
 from .insertion import should_pass_cls
 from ..exceptions import (
-    TaskAlreadyRunning, TaskCancelError, TaskInvalidDelay,
-    TaskIsNotCoroutine
+    TaskAlreadyRunning,
+    TaskCancelError,
+    TaskInvalidDelay,
+    TaskIsNotCoroutine,
 )
 
 if TYPE_CHECKING:
@@ -41,7 +43,7 @@ def loop(
         minutes=0,
         seconds=0,
         milliseconds=0,
-        microseconds=0
+        microseconds=0,
     ) -> Callable[[Coro], Task]:
         """A decorator to create a task that repeat the given amount of t
         :Example usage:
@@ -91,11 +93,12 @@ async def my_task(self):
         TaskInvalidDelay:
             The delay is 0 or negative.
         """
+
         def decorator(func: Coro) -> Task:
             if not iscoroutinefunction(func):
                 raise TaskIsNotCoroutine(
-                    f'Task `{func.__name__}` is not a coroutine, '
-                    'which is required for tasks.'
+                    f"Task `{func.__name__}` is not a coroutine, "
+                    "which is required for tasks."
                 )
 
             delay = timedelta(
@@ -105,13 +108,13 @@ def decorator(func: Coro) -> Task:
                 minutes=minutes,
                 seconds=seconds,
                 microseconds=microseconds,
-                milliseconds=milliseconds
+                milliseconds=milliseconds,
             ).total_seconds()
 
             if delay <= 0:
                 raise TaskInvalidDelay(
-                    f'Task `{func.__name__}` has a delay of {delay} seconds, '
-                    'which is invalid. Delay must be greater than zero.'
+                    f"Task `{func.__name__}` has a delay of {delay} seconds, "
+                    "which is invalid. Delay must be greater than zero."
                 )
 
             return Task(self, func, delay)
@@ -171,7 +174,7 @@ def __del__(self):
             # Did the user forgot to call task.start() ?
             _log.warning(
                 "Task `%s` was not scheduled. Did you forget to start it ?",
-                self.coro.__name__
+                self.coro.__name__,
             )
 
     @property
@@ -190,7 +193,7 @@ def start(self):
         """
         if self.running:
             raise TaskAlreadyRunning(
-                f'Task `{self.coro.__name__}` is already running.', self
+                f"Task `{self.coro.__name__}` is already running.", self
             )
 
         self._scheduler.register(self)
@@ -199,7 +202,7 @@ def cancel(self):
         """Cancel the task."""
         if not self.running:
             raise TaskCancelError(
-                f'Task `{self.coro.__name__}` is not running.', self
+                f"Task `{self.coro.__name__}` is not running.", self
             )
 
         self._handle.cancel()
diff --git a/pincer/utils/timestamp.py b/pincer/utils/timestamp.py
index df6d07f2..cafc87d7 100644
--- a/pincer/utils/timestamp.py
+++ b/pincer/utils/timestamp.py
@@ -24,6 +24,7 @@ class Timestamp:
     ----------
     time: Union[:class:`str`, :class:`int`, :class:`float`, :class:`datetime.datetime`]
     """
+
     # noqa: E501
 
     def __init__(self, time: Optional[TS] = None):
diff --git a/pincer/utils/types.py b/pincer/utils/types.py
index 113111fe..6fcaad79 100644
--- a/pincer/utils/types.py
+++ b/pincer/utils/types.py
@@ -29,7 +29,9 @@ def __hash__(self) -> int:
 
 T = TypeVar("T")
 
-JSONSerializable = TypeVar("JSONSerializable", str, int, float, list, dict, bool, None)
+JSONSerializable = TypeVar(
+    "JSONSerializable", str, int, float, list, dict, bool, None
+)
 
 
 # Represents a value which is optionally returned from the API
@@ -51,10 +53,9 @@ class Singleton(type):
 
     def __call__(cls, *args, **kwargs):
         if cls not in cls._instances:
-            cls._instances[cls] = super(
-                Singleton,
-                cls
-            ).__call__(*args, **kwargs)
+            cls._instances[cls] = super(Singleton, cls).__call__(
+                *args, **kwargs
+            )
         return cls._instances[cls]
 
 


Test patch:
diff --git a/tests/core/test_dispatch.py b/tests/core/test_dispatch.py
index 834bd3f8..557d6a2c 100644
--- a/tests/core/test_dispatch.py
+++ b/tests/core/test_dispatch.py
@@ -6,10 +6,7 @@
 
 class TestDispatch:
     op = 123
-    data = {
-        "foo": "bar",
-        "bar": "foo"
-    }
+    data = {"foo": "bar", "bar": "foo"}
     seq = 456
     event_name = "test_event"
 
diff --git a/tests/objects/guild/test_guild.py b/tests/objects/guild/test_guild.py
index 5c4219ba..630675b9 100644
--- a/tests/objects/guild/test_guild.py
+++ b/tests/objects/guild/test_guild.py
@@ -4,66 +4,67 @@
 from pincer.objects import Guild, Emoji, Channel, Role
 
 FAKE_GUILD = {
-    'id': '0',
-    'name': 'test-server',
-    'features': [],
-    'emojis': [
-        {'name': 'test-emoji',
-         'roles': [],
-         'id': '0',
-         'require_colons': True,
-         'managed': False,
-         'animated': False,
-         'available': True
-         }
+    "id": "0",
+    "name": "test-server",
+    "features": [],
+    "emojis": [
+        {
+            "name": "test-emoji",
+            "roles": [],
+            "id": "0",
+            "require_colons": True,
+            "managed": False,
+            "animated": False,
+            "available": True,
+        }
     ],
-    'stickers': [],
-    'owner_id': '0',
-    'region': 'us-east',
-    'afk_timeout': 300,
-    'system_channel_id': '0',
-    'widget_enabled': False,
-    'widget_channel_id': '0',
-    'verification_level': 0,
-    'roles': [
-        {'id': '0',
-         'name': '@everyone',
-         'permissions': '0',
-         'position': 0,
-         'color': 0,
-         'hoist': False,
-         'managed': False,
-         'mentionable': False,
-         }
+    "stickers": [],
+    "owner_id": "0",
+    "region": "us-east",
+    "afk_timeout": 300,
+    "system_channel_id": "0",
+    "widget_enabled": False,
+    "widget_channel_id": "0",
+    "verification_level": 0,
+    "roles": [
+        {
+            "id": "0",
+            "name": "@everyone",
+            "permissions": "0",
+            "position": 0,
+            "color": 0,
+            "hoist": False,
+            "managed": False,
+            "mentionable": False,
+        }
+    ],
+    "default_message_notifications": 0,
+    "mfa_level": 0,
+    "explicit_content_filter": 0,
+    "max_members": 250000,
+    "max_video_channel_users": 25,
+    "premium_tier": 0,
+    "premium_subscription_count": 0,
+    "system_channel_flags": 8,
+    "preferred_locale": "en-US",
+    "premium_progress_bar_enabled": False,
+    "nsfw": False,
+    "nsfw_level": 0,
+    "channels": [
+        {
+            "id": "0",
+            "type": 4,
+            "name": "Text Channels",
+            "position": 0,
+            "guild_id": "0",
+            "permission_overwrites": [],
+            "nsfw": False,
+        },
     ],
-    'default_message_notifications': 0,
-    'mfa_level': 0,
-    'explicit_content_filter': 0,
-    'max_members': 250000,
-    'max_video_channel_users': 25,
-    'premium_tier': 0,
-    'premium_subscription_count': 0,
-    'system_channel_flags': 8,
-    'preferred_locale': 'en-US',
-    'premium_progress_bar_enabled': False,
-    'nsfw': False,
-    'nsfw_level': 0,
-    'channels':
-    [
-        {'id': '0',
-         'type': 4,
-         'name': 'Text Channels',
-         'position': 0,
-         'guild_id': '0',
-         'permission_overwrites': [],
-         'nsfw': False
-         },
-    ]
 }
 
 
 class TestChannel:
-
     @staticmethod
     def test_get():
 
@@ -81,7 +82,7 @@ def test_get():
                     require_colons=True,
                     managed=False,
                     animated=False,
-                    available=True
+                    available=True,
                 )
             ],
             stickers=[],
@@ -124,7 +125,7 @@ def test_get():
                     position=0,
                     guild_id=0,
                     permission_overwrites=[],
-                    nsfw=False
+                    nsfw=False,
                 )
-            ]
+            ],
         )
diff --git a/tests/objects/message/__init__.py b/tests/objects/message/__init__.py
index 808d6a03..b68454de 100644
--- a/tests/objects/message/__init__.py
+++ b/tests/objects/message/__init__.py
@@ -4,21 +4,25 @@
 from pincer import __version__
 from pincer.objects import Embed
 
-print(Embed(
-    title=f"Pincer - {__version__}",
-    description=(
-        "🚀 An asynchronous python API wrapper meant to replace"
-        " discord.py\n> Snappy discord api wrapper written "
-        "with aiohttp & websockets"
+print(
+    Embed(
+        title=f"Pincer - {__version__}",
+        description=(
+            "🚀 An asynchronous python API wrapper meant to replace"
+            " discord.py\n> Snappy discord api wrapper written "
+            "with aiohttp & websockets"
+        ),
     )
-).add_field(
-    name="**Github Repository**",
-    value="> https://github.com/Pincer-org/Pincer"
-).set_thumbnail(
-    url="https://pincer.dev/img/icon.png"
-).set_image(
-    url=(
-        "https://repository-images.githubusercontent.com"
-        "/400871418/045ebf39-7c6e-4c3a-b744-0c3122374203"
+    .add_field(
+        name="**Github Repository**",
+        value="> https://github.com/Pincer-org/Pincer",
     )
-).to_dict())
+    .set_thumbnail(url="https://pincer.dev/img/icon.png")
+    .set_image(
+        url=(
+            "https://repository-images.githubusercontent.com"
+            "/400871418/045ebf39-7c6e-4c3a-b744-0c3122374203"
+        )
+    )
+    .to_dict()
+)
diff --git a/tests/objects/message/test_embeds.py b/tests/objects/message/test_embeds.py
index 00b5c118..d5e921a5 100644
--- a/tests/objects/message/test_embeds.py
+++ b/tests/objects/message/test_embeds.py
@@ -4,45 +4,46 @@
 from pincer.objects.message import Embed
 
 DICT = {
-    'title': 'Pincer - 0.6.4',
-    'description': (
-        '🚀 An asynchronous python API wrapper meant '
-        'to replace discord.py\n> Snappy discord api '
-        'wrapper written with aiohttp & websockets'
+    "title": "Pincer - 0.6.4",
+    "description": (
+        "🚀 An asynchronous python API wrapper meant "
+        "to replace discord.py\n> Snappy discord api "
+        "wrapper written with aiohttp & websockets"
     ),
-    'fields': [
+    "fields": [
         {
-            'name': '**Github Repository**',
-            'value': '> https://github.com/Pincer-org/Pincer'
+            "name": "**Github Repository**",
+            "value": "> https://github.com/Pincer-org/Pincer",
         }
     ],
-    'image': {
-        'url': (
-            'https://repository-images.githubusercontent.com/'
-            '400871418/045ebf39-7c6e-4c3a-b744-0c3122374203'
+    "image": {
+        "url": (
+            "https://repository-images.githubusercontent.com/"
+            "400871418/045ebf39-7c6e-4c3a-b744-0c3122374203"
         )
     },
-    'thumbnail': {
-        'url': 'https://pincer.dev/img/icon.png'
-    }
+    "thumbnail": {"url": "https://pincer.dev/img/icon.png"},
 }
 
-EMBED = Embed(
-    title="Pincer - 0.6.4",
-    description=(
-        "🚀 An asynchronous python API wrapper meant to replace"
-        " discord.py\n> Snappy discord api wrapper written "
-        "with aiohttp & websockets"
+EMBED = (
+    Embed(
+        title="Pincer - 0.6.4",
+        description=(
+            "🚀 An asynchronous python API wrapper meant to replace"
+            " discord.py\n> Snappy discord api wrapper written "
+            "with aiohttp & websockets"
+        ),
     )
-).add_field(
-    name="**Github Repository**",
-    value="> https://github.com/Pincer-org/Pincer"
-).set_thumbnail(
-    url="https://pincer.dev/img/icon.png"
-).set_image(
-    url=(
-        "https://repository-images.githubusercontent.com"
-        "/400871418/045ebf39-7c6e-4c3a-b744-0c3122374203"
+    .add_field(
+        name="**Github Repository**",
+        value="> https://github.com/Pincer-org/Pincer",
+    )
+    .set_thumbnail(url="https://pincer.dev/img/icon.png")
+    .set_image(
+        url=(
+            "https://repository-images.githubusercontent.com"
+            "/400871418/045ebf39-7c6e-4c3a-b744-0c3122374203"
+        )
     )
 )
 
@@ -52,7 +53,6 @@ def has_key_vals(actual, required):
 
 
 class TestDispatch:
-
     def test_embed_to_dict(self):
         """
         Tests whether or not the dispatch class its string conversion
@@ -61,7 +61,4 @@ def test_embed_to_dict(self):
         assert has_key_vals(EMBED.to_dict(), DICT)
 
     def test_embed_from_dict(self):
-        assert has_key_vals(
-            Embed.from_dict(DICT).to_dict(),
-            DICT
-        )
+        assert has_key_vals(Embed.from_dict(DICT).to_dict(), DICT)
diff --git a/tests/utils/test_color.py b/tests/utils/test_color.py
index 0a737d49..a3c4a4ba 100644
--- a/tests/utils/test_color.py
+++ b/tests/utils/test_color.py
@@ -6,14 +6,13 @@
 
 
 class TestSnowflake:
-
     @staticmethod
     def test_conversion():
         c = Color("#aabb01")
         assert c.r == 170
         assert c.g == 187
         assert c.b == 1
-        assert c.hex == 'aabb01'
+        assert c.hex == "aabb01"
 
     @staticmethod
     def test_invalids():
diff --git a/tests/utils/test_convertion.py b/tests/utils/test_convertion.py
index 7c5b94cf..e7867114 100644
--- a/tests/utils/test_convertion.py
+++ b/tests/utils/test_convertion.py
@@ -5,8 +5,7 @@
 
 
 class TestSnowflake:
-
     def test_remove_none(self):
         assert remove_none([None, 1]) == [1]
         assert remove_none({None, 1}) == {1}
-        assert remove_none({'a': 1, 'b': None}) == {'a': 1}
+        assert remove_none({"a": 1, "b": None}) == {"a": 1}
diff --git a/tests/utils/test_snowflake.py b/tests/utils/test_snowflake.py
index 84504379..122b19d5 100644
--- a/tests/utils/test_snowflake.py
+++ b/tests/utils/test_snowflake.py
@@ -7,7 +7,6 @@
 
 
 class TestSnowflake:
-
     def test_boundaries(self):
         with pytest.raises(ValueError):
             Snowflake(9223372036854775808)