Skip to content

Commit c54e2f2

Browse files
Merge main into 479-auto-slow-mode
2 parents b124e9b + 8e0c245 commit c54e2f2

7 files changed

Lines changed: 38 additions & 34 deletions

File tree

cogs/committee_actions_tracking.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,9 +556,9 @@ async def action_all_committee(
556556
async def list_user_actions( # NOTE: Committee role check is not present because non-committee can have actions, and need to be able to list their own actions.
557557
self,
558558
ctx: "TeXBotApplicationContext",
559-
action_member_id: None | str,
559+
action_member_id: "None | str",
560560
ping: bool, # noqa: FBT001
561-
status: None | str,
561+
status: "None | str",
562562
) -> None:
563563
"""
564564
Definition and callback of the "/list" command.

cogs/everest.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ async def autocomplete_get_course_years(
9393
name="course-type",
9494
description="The type of your university course.",
9595
input_type=str,
96-
choices=( # NOTE: Display name is stored in the enum's value.
96+
choices={ # NOTE: Display name is stored in the enum's value.
9797
discord.OptionChoice(name=course_type.value, value=course_type.name)
9898
for course_type in _CourseTypes
99-
),
99+
},
100100
required=True,
101101
parameter_name="raw_course_type",
102102
)
@@ -113,10 +113,10 @@ async def autocomplete_get_course_years(
113113
description="The percentage of the module that the assignment is worth.",
114114
input_type=float,
115115
autocomplete=discord.utils.basic_autocomplete( # NOTE: Pycord documents that they accept any iterable, testing shows that they only accept lists (generators do not work correctly).
116-
[
116+
{
117117
discord.OptionChoice(name=f"{percentage * 5:.1f}%", value=percentage * 5)
118118
for percentage in range(1, 21)
119-
]
119+
}
120120
),
121121
required=True,
122122
parameter_name="percentage_of_module",

config.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
"""
77

88
import abc
9+
import datetime
910
import functools
1011
import importlib
1112
import json
1213
import logging
1314
import os
1415
import re
1516
from collections.abc import Iterable, Mapping
16-
from datetime import timedelta
1717
from pathlib import Path
1818
from typing import TYPE_CHECKING, final
1919

@@ -570,7 +570,7 @@ def _setup_auto_su_platform_access_cookie_checking_interval(cls) -> None:
570570
}
571571

572572
if (
573-
timedelta(
573+
datetime.timedelta(
574574
**raw_timedelta_auto_su_platform_access_cookie_checking_interval
575575
).total_seconds()
576576
<= 3
@@ -624,7 +624,9 @@ def _setup_send_introduction_reminders_delay(cls) -> None:
624624
.replace(" ", ""),
625625
)
626626

627-
raw_timedelta_send_introduction_reminders_delay: timedelta = timedelta()
627+
raw_timedelta_send_introduction_reminders_delay: datetime.timedelta = (
628+
datetime.timedelta()
629+
)
628630

629631
if cls._settings["SEND_INTRODUCTION_REMINDERS"]:
630632
if not raw_send_introduction_reminders_delay:
@@ -636,15 +638,15 @@ def _setup_send_introduction_reminders_delay(cls) -> None:
636638
INVALID_SEND_INTRODUCTION_REMINDERS_DELAY_MESSAGE
637639
)
638640

639-
raw_timedelta_send_introduction_reminders_delay = timedelta(
641+
raw_timedelta_send_introduction_reminders_delay = datetime.timedelta(
640642
**{
641643
key: float(value)
642644
for key, value in raw_send_introduction_reminders_delay.groupdict().items()
643645
if value
644646
}
645647
)
646648

647-
if raw_timedelta_send_introduction_reminders_delay < timedelta(days=1):
649+
if raw_timedelta_send_introduction_reminders_delay < datetime.timedelta(days=1):
648650
TOO_SMALL_SEND_INTRODUCTION_REMINDERS_DELAY_MESSAGE: Final[str] = (
649651
"SEND_INTRODUCTION_REMINDERS_DELAY must be longer than or equal to 1 day."
650652
)
@@ -694,7 +696,7 @@ def _setup_send_introduction_reminders_interval(cls) -> None:
694696
}
695697

696698
if (
697-
timedelta(
699+
datetime.timedelta(
698700
**raw_timedelta_details_send_introduction_reminders_interval
699701
).total_seconds()
700702
<= 3
@@ -741,7 +743,7 @@ def _setup_send_get_roles_reminders_delay(cls) -> None:
741743
.replace(" ", ""),
742744
)
743745

744-
raw_timedelta_send_get_roles_reminders_delay: timedelta = timedelta()
746+
raw_timedelta_send_get_roles_reminders_delay: datetime.timedelta = datetime.timedelta()
745747

746748
if cls._settings["SEND_GET_ROLES_REMINDERS"]:
747749
if not raw_send_get_roles_reminders_delay:
@@ -751,15 +753,15 @@ def _setup_send_get_roles_reminders_delay(cls) -> None:
751753
)
752754
raise ImproperlyConfiguredError(INVALID_SEND_GET_ROLES_REMINDERS_DELAY_MESSAGE)
753755

754-
raw_timedelta_send_get_roles_reminders_delay = timedelta(
756+
raw_timedelta_send_get_roles_reminders_delay = datetime.timedelta(
755757
**{
756758
key: float(value)
757759
for key, value in raw_send_get_roles_reminders_delay.groupdict().items()
758760
if value
759761
}
760762
)
761763

762-
if raw_timedelta_send_get_roles_reminders_delay < timedelta(days=1):
764+
if raw_timedelta_send_get_roles_reminders_delay < datetime.timedelta(days=1):
763765
TOO_SMALL_SEND_GET_ROLES_REMINDERS_DELAY_MESSAGE: Final[str] = (
764766
"SEND_GET_ROLES_REMINDERS_DELAY must be longer than or equal to 1 day."
765767
)
@@ -831,7 +833,7 @@ def _setup_statistics_days(cls) -> None:
831833
)
832834
raise ImproperlyConfiguredError(TOO_SMALL_STATISTICS_DAYS_MESSAGE)
833835

834-
cls._settings["STATISTICS_DAYS"] = timedelta(days=raw_statistics_days)
836+
cls._settings["STATISTICS_DAYS"] = datetime.timedelta(days=raw_statistics_days)
835837

836838
@classmethod
837839
def _setup_statistics_roles(cls) -> None:

main.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,8 @@
2424
with SuppressTraceback():
2525
config.run_setup()
2626

27-
intents: discord.Intents = discord.Intents.default()
28-
intents.members = True
29-
3027
bot: TeXBot = TeXBot(
31-
intents=intents
28+
intents=discord.Intents.default() | discord.Intents.members
3229
) # NOTE: See https://github.com/CSSUoB/TeX-Bot-Py-V2/issues/261
3330

3431
bot.load_extension("cogs")
@@ -37,10 +34,7 @@
3734
def _run_bot() -> "NoReturn": # NOTE: See https://github.com/CSSUoB/TeX-Bot-Py-V2/issues/261
3835
bot.run(settings["DISCORD_BOT_TOKEN"])
3936

40-
if bot.EXIT_WAS_DUE_TO_KILL_COMMAND:
41-
raise SystemExit(0)
42-
43-
raise SystemExit(1)
37+
raise SystemExit(0 if bot.EXIT_WAS_DUE_TO_KILL_COMMAND else 1)
4438

4539

4640
if __name__ == "__main__":

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ banned-aliases = { "regex" = [
170170
], "matplotlib.pyplot" = [
171171
"plt",
172172
] }
173-
banned-from = ["abc", "re", "regex"]
173+
banned-from = ["abc", "date", "datetime", "re", "regex"]
174174

175175
[tool.ruff.lint.flake8-self]
176176
extend-ignore-names = ["_base_manager", "_default_manager", "_get_wrap_line_width", "_meta"]

stubs/discord/commands/options.pyi

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from collections.abc import Awaitable, Callable, Iterable, Sequence
1+
from collections.abc import Awaitable, Callable, Sequence
2+
from collections.abc import Set as AbstractSet
23
from typing import overload, override
34

45
from discord.commands.context import AutocompleteContext
@@ -19,15 +20,18 @@ def option[**P, **Q, T, T_context: AutocompleteContext](
1920
input_type: type[T],
2021
required: bool = ...,
2122
default: T = ...,
22-
choices: Iterable[OptionChoice] | Iterable[str] | Iterable[int] | Iterable[float] = ...,
23+
choices: AbstractSet[OptionChoice]
24+
| AbstractSet[str]
25+
| AbstractSet[int]
26+
| AbstractSet[float] = ...,
2327
parameter_name: str = ...,
2428
autocomplete: Callable[
2529
[T_context],
26-
Awaitable[Iterable[OptionChoice] | Iterable[str]],
30+
Awaitable[AbstractSet[OptionChoice] | AbstractSet[str]],
2731
]
2832
| Callable[
2933
[T_context],
30-
Awaitable[Iterable[OptionChoice] | Iterable[str] | Iterable[int]],
34+
Awaitable[AbstractSet[OptionChoice] | AbstractSet[str] | AbstractSet[int]],
3135
] = ...,
3236
) -> Callable[[Callable[P, Awaitable[None]]], Callable[Q, Awaitable[None]]]: ...
3337
@overload
@@ -38,14 +42,17 @@ def option[**P, **Q, T_context: AutocompleteContext](
3842
input_type: type[str],
3943
parameter_name: str = ...,
4044
default: str = ...,
41-
choices: Iterable[OptionChoice] | Iterable[str] | Iterable[int] | Iterable[float] = ...,
45+
choices: AbstractSet[OptionChoice]
46+
| AbstractSet[str]
47+
| AbstractSet[int]
48+
| AbstractSet[float] = ...,
4249
autocomplete: Callable[
4350
[T_context],
44-
Awaitable[Iterable[OptionChoice] | Iterable[str]],
51+
Awaitable[AbstractSet[OptionChoice] | AbstractSet[str]],
4552
]
4653
| Callable[
4754
[T_context],
48-
Awaitable[Iterable[OptionChoice] | Iterable[str] | Iterable[int]],
55+
Awaitable[AbstractSet[OptionChoice] | AbstractSet[str] | AbstractSet[int]],
4956
] = ...,
5057
required: bool = ...,
5158
min_length: int = ...,

stubs/discord/utils.pyi

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import datetime
22
from collections.abc import Awaitable, Callable, Iterable, Sequence
3+
from collections.abc import Set as AbstractSet
34
from typing import Literal
45

56
from discord.abc import Snowflake
@@ -16,8 +17,8 @@ __all__: Sequence[str] = (
1617
"utcnow",
1718
)
1819

19-
type Values = Iterable[OptionChoice] | Iterable[str]
20-
type ValuesWithInt = Values | Iterable[int]
20+
type Values = AbstractSet[OptionChoice] | AbstractSet[str]
21+
type ValuesWithInt = Values | AbstractSet[int]
2122
type AllValuesWithInt = ValuesWithInt | Awaitable[ValuesWithInt]
2223

2324
def basic_autocomplete[T_context: AutocompleteContext](

0 commit comments

Comments
 (0)