Przeglądaj źródła

Switching to Ruff, addressing warnings

tags/2.0.0
Rocketsoup 1 miesiąc temu
rodzic
commit
59749c5c2c

+ 15
- 15
rocketbot/bot.py Wyświetl plik

@@ -24,7 +24,7 @@ class Rocketbot(commands.Bot):
24 24
 		self.__first_ready = True
25 25
 
26 26
 	async def on_command_error(self, context: commands.Context, exception: BaseException) -> None:
27
-		bot_log(None, None, f'Command error')
27
+		bot_log(None, None, 'Command error')
28 28
 		dump_stacktrace(exception)
29 29
 		if context.guild is None or \
30 30
 				context.message.channel is None or \
@@ -54,7 +54,7 @@ class Rocketbot(commands.Bot):
54 54
 			if not self.__commands_set_up:
55 55
 				await self.__set_up_commands()
56 56
 			bot_log(None, None, 'Bot done initializing')
57
-			bot_log(None, None, f"Type /help in Discord for available commands.")
57
+			bot_log(None, None, "Type /help in Discord for available commands.")
58 58
 			print('----------------------------------------------------------')
59 59
 
60 60
 	async def __set_up_commands(self):
@@ -90,20 +90,20 @@ def __create_bot():
90 90
 	rocketbot = Rocketbot(intents=intents)
91 91
 __create_bot()
92 92
 
93
-from rocketbot.cogs.autokickcog import AutoKickCog
94
-from rocketbot.cogs.bangcommandcog import BangCommandCog
95
-from rocketbot.cogs.configcog import ConfigCog
96
-from rocketbot.cogs.crosspostcog import CrossPostCog
97
-from rocketbot.cogs.gamescog import GamesCog
98
-from rocketbot.cogs.generalcog import GeneralCog
99
-from rocketbot.cogs.helpcog import HelpCog
100
-from rocketbot.cogs.joinraidcog import JoinRaidCog
101
-from rocketbot.cogs.logcog import LoggingCog
102
-from rocketbot.cogs.patterncog import PatternCog
103
-from rocketbot.cogs.urlspamcog import URLSpamCog
104
-from rocketbot.cogs.usernamecog import UsernamePatternCog
105
-
106 93
 async def start_bot():
94
+	from rocketbot.cogs.autokickcog import AutoKickCog
95
+	from rocketbot.cogs.bangcommandcog import BangCommandCog
96
+	from rocketbot.cogs.configcog import ConfigCog
97
+	from rocketbot.cogs.crosspostcog import CrossPostCog
98
+	from rocketbot.cogs.gamescog import GamesCog
99
+	from rocketbot.cogs.generalcog import GeneralCog
100
+	from rocketbot.cogs.helpcog import HelpCog
101
+	from rocketbot.cogs.joinraidcog import JoinRaidCog
102
+	from rocketbot.cogs.logcog import LoggingCog
103
+	from rocketbot.cogs.patterncog import PatternCog
104
+	from rocketbot.cogs.urlspamcog import URLSpamCog
105
+	from rocketbot.cogs.usernamecog import UsernamePatternCog
106
+
107 107
 	bot_log(None, None, 'Bot initializing...')
108 108
 
109 109
 	# Core

+ 2
- 2
rocketbot/botmessage.py Wyświetl plik

@@ -2,9 +2,8 @@
2 2
 Classes for crafting messages from the bot. Content can change as information
3 3
 changes, and mods can perform actions on the message via emoji reactions.
4 4
 """
5
-from typing import Any, Optional, Union
6
-
7 5
 from datetime import datetime
6
+from typing import Any, Optional, Union
8 7
 
9 8
 from discord import Guild, Message, PartialEmoji, TextChannel
10 9
 
@@ -12,6 +11,7 @@ from config import CONFIG
12 11
 from rocketbot.storage import ConfigKey, Storage
13 12
 from rocketbot.utils import bot_log
14 13
 
14
+
15 15
 class BotMessageReaction:
16 16
 	"""
17 17
 	A possible reaction to a bot message that will trigger an action. The list

+ 3
- 3
rocketbot/cogs/autokickcog.py Wyświetl plik

@@ -5,11 +5,11 @@ from discord.ext import tasks
5 5
 from discord.ext.commands import Cog
6 6
 from discord.ext.tasks import Loop
7 7
 
8
-from config import CONFIG
9 8
 from rocketbot.cogs.basecog import BaseCog, BotMessage, CogSetting
10 9
 from rocketbot.collections import AgeBoundDict
11 10
 from rocketbot.storage import Storage
12 11
 
12
+
13 13
 class AutoKickContext:
14 14
 	"""
15 15
 	Data about a join raid.
@@ -123,8 +123,8 @@ class AutoKickCog(BaseCog, name='Auto Kick'):
123 123
 		else:
124 124
 			context.record_kick(datetime.now())
125 125
 		max_kick_count: int = self.get_guild_setting(guild, self.SETTING_BAN_COUNT)
126
-		disable_help = f'To disable this feature: `/disable autokick`.'
127
-		ban_help = f'To configure ban threshold: `/set autokick_bancount #` (0 to disable)'
126
+		disable_help = 'To disable this feature: `/disable autokick`.'
127
+		ban_help = 'To configure ban threshold: `/set autokick_bancount #` (0 to disable)'
128 128
 		if max_kick_count > 0 and context.kick_count > max_kick_count:
129 129
 			await member.ban(reason=f'Rocketbot: Ban after {context.kick_count} joins',
130 130
 				delete_message_days=0)

+ 14
- 8
rocketbot/cogs/bangcommandcog.py Wyświetl plik

@@ -1,17 +1,22 @@
1 1
 import re
2 2
 from typing import Optional, TypedDict
3 3
 
4
-from discord import Interaction, Guild, Message, TextChannel, SelectOption, TextStyle
5
-from discord.app_commands import Group, Choice, autocomplete
4
+from discord import Guild, Interaction, Message, SelectOption, TextChannel, TextStyle
5
+from discord.app_commands import Choice, Group, autocomplete
6 6
 from discord.ext.commands import Cog
7
-from discord.ui import Modal, Label, Select, TextInput
7
+from discord.ui import Label, Modal, Select, TextInput
8 8
 
9 9
 from config import CONFIG
10 10
 from rocketbot.bot import Rocketbot
11 11
 from rocketbot.cogs.basecog import BaseCog
12 12
 from rocketbot.cogsetting import CogSetting
13
-from rocketbot.ui.pagedcontent import PAGE_BREAK, update_paged_content, paginate
14
-from rocketbot.utils import MOD_PERMISSIONS, blockquote_markdown, indent_markdown, dump_stacktrace
13
+from rocketbot.ui.pagedcontent import PAGE_BREAK, paginate, update_paged_content
14
+from rocketbot.utils import (
15
+	MOD_PERMISSIONS,
16
+	blockquote_markdown,
17
+	dump_stacktrace,
18
+	indent_markdown,
19
+)
15 20
 
16 21
 _CURRENT_DATA_VERSION = 1
17 22
 _MAX_CONTENT_LENGTH = 2000
@@ -305,8 +310,9 @@ class _EditModal(Modal, title='Edit Command'):
305 310
 		mod_only_input: Select = self.mod_only_label.component
306 311
 		name_input.default = name
307 312
 		content_input.default = content
308
-		mod_only_input.options[0].default = mod_only != True
309
-		mod_only_input.options[1].default = mod_only == True
313
+		resolved_mod_only = mod_only if mod_only is not None else False
314
+		mod_only_input.options[0].default = not resolved_mod_only
315
+		mod_only_input.options[1].default = resolved_mod_only
310 316
 
311 317
 	async def on_submit(self, interaction: Interaction) -> None:
312 318
 		# noinspection PyTypeChecker
@@ -337,5 +343,5 @@ class _EditModal(Modal, title='Edit Command'):
337 343
 				f'{CONFIG["failure_emoji"]} Save failed',
338 344
 				ephemeral=True,
339 345
 			)
340
-		except:
346
+		except BaseException:
341 347
 			pass

+ 9
- 1
rocketbot/cogs/basecog.py Wyświetl plik

@@ -5,7 +5,14 @@ from datetime import datetime, timedelta, timezone
5 5
 from typing import Optional
6 6
 
7 7
 import discord
8
-from discord import Guild, Interaction, Member, Message, RawReactionActionEvent, TextChannel
8
+from discord import (
9
+	Guild,
10
+	Interaction,
11
+	Member,
12
+	Message,
13
+	RawReactionActionEvent,
14
+	TextChannel,
15
+)
9 16
 from discord.abc import GuildChannel
10 17
 from discord.app_commands import AppCommandError
11 18
 from discord.app_commands.errors import CommandInvokeError
@@ -19,6 +26,7 @@ from rocketbot.collections import AgeBoundDict
19 26
 from rocketbot.storage import Storage
20 27
 from rocketbot.utils import bot_log, dump_stacktrace
21 28
 
29
+
22 30
 class WarningContext:
23 31
 	def __init__(self, member: Member, warn_time: datetime):
24 32
 		self.member = member

+ 3
- 3
rocketbot/cogs/configcog.py Wyświetl plik

@@ -1,15 +1,15 @@
1 1
 """
2 2
 Cog handling general configuration for a guild.
3 3
 """
4
-from typing import Union, Optional
4
+from typing import Optional, Union
5 5
 
6
-from discord import Guild, Permissions, TextChannel, Interaction, Role, User
6
+from discord import Guild, Interaction, Role, TextChannel, User
7 7
 from discord.app_commands import Group
8 8
 from discord.ext.commands import Bot
9 9
 
10 10
 from config import CONFIG
11
-from rocketbot.storage import ConfigKey, Storage
12 11
 from rocketbot.cogs.basecog import BaseCog
12
+from rocketbot.storage import ConfigKey, Storage
13 13
 from rocketbot.utils import MOD_PERMISSIONS
14 14
 
15 15
 

+ 3
- 2
rocketbot/cogs/crosspostcog.py Wyświetl plik

@@ -5,12 +5,13 @@ import re
5 5
 from datetime import datetime, timedelta
6 6
 from typing import Optional
7 7
 
8
-from discord import Member, Message, utils as discordutils, TextChannel
8
+from discord import Member, Message, TextChannel
9
+from discord import utils as discordutils
9 10
 from discord.ext.commands import Cog
10 11
 
11 12
 from config import CONFIG
12 13
 from rocketbot.cogs.basecog import BaseCog, BotMessage, BotMessageReaction, CogSetting
13
-from rocketbot.collections import AgeBoundList, AgeBoundDict
14
+from rocketbot.collections import AgeBoundDict, AgeBoundList
14 15
 from rocketbot.storage import Storage
15 16
 from rocketbot.utils import str_from_timedelta
16 17
 

+ 2
- 3
rocketbot/cogs/gamescog.py Wyświetl plik

@@ -1,10 +1,9 @@
1 1
 import math
2 2
 import random
3
-from time import perf_counter
4 3
 
5 4
 from discord import Interaction, UnfurledMediaItem
6
-from discord.app_commands import command, Range, guild_only
7
-from discord.ui import LayoutView, Section, TextDisplay, Thumbnail, Container
5
+from discord.app_commands import Range, command, guild_only
6
+from discord.ui import Container, LayoutView, Section, TextDisplay, Thumbnail
8 7
 
9 8
 from rocketbot.bot import Rocketbot
10 9
 from rocketbot.cogs.basecog import BaseCog

+ 3
- 2
rocketbot/cogs/generalcog.py Wyświetl plik

@@ -5,15 +5,16 @@ from datetime import datetime, timedelta, timezone
5 5
 from typing import Optional
6 6
 
7 7
 from discord import Interaction, Message, User
8
-from discord.app_commands import command, default_permissions, guild_only, Transform
8
+from discord.app_commands import Transform, command, default_permissions, guild_only
9 9
 from discord.errors import DiscordException
10 10
 from discord.ext.commands import Cog
11 11
 
12 12
 from config import CONFIG
13 13
 from rocketbot.bot import Rocketbot
14 14
 from rocketbot.cogs.basecog import BaseCog, BotMessage
15
-from rocketbot.utils import describe_timedelta, TimeDeltaTransformer
16 15
 from rocketbot.storage import ConfigKey, Storage
16
+from rocketbot.utils import TimeDeltaTransformer, describe_timedelta
17
+
17 18
 
18 19
 class GeneralCog(BaseCog, name='General'):
19 20
 	"""

+ 16
- 9
rocketbot/cogs/helpcog.py Wyświetl plik

@@ -1,15 +1,22 @@
1 1
 """Provides help commands for getting info on using other commands and configuration."""
2 2
 import re
3 3
 import time
4
-from typing import Union, Optional, TypedDict
5
-
6
-from discord import Interaction, Permissions, AppCommandType
7
-from discord.app_commands import Group, Command, autocomplete, guild_only, command, Choice
4
+from typing import Optional, TypedDict, Union
5
+
6
+from discord import AppCommandType, Interaction, Permissions
7
+from discord.app_commands import (
8
+	Choice,
9
+	Command,
10
+	Group,
11
+	autocomplete,
12
+	command,
13
+	guild_only,
14
+)
8 15
 
9 16
 from config import CONFIG
10 17
 from rocketbot.bot import Rocketbot
11 18
 from rocketbot.cogs.basecog import BaseCog
12
-from rocketbot.ui.pagedcontent import update_paged_content, paginate
19
+from rocketbot.ui.pagedcontent import paginate, update_paged_content
13 20
 from rocketbot.utils import MOD_PERMISSIONS, dump_stacktrace
14 21
 
15 22
 HelpTopic = Union[Command, Group, BaseCog]
@@ -272,7 +279,7 @@ class HelpCog(BaseCog, name='Help'):
272 279
 			   (len(cog_tuple[1].settings) > 0)
273 280
 		]
274 281
 
275
-		text = f'## :information_source: Help'
282
+		text = '## :information_source: Help'
276 283
 		if len(all_commands) + len(all_cog_tuples) == 0:
277 284
 			text = 'Nothing available for your permissions!'
278 285
 
@@ -344,10 +351,10 @@ class HelpCog(BaseCog, name='Help'):
344 351
 		if addendum is not None:
345 352
 			text += addendum + '\n\n'
346 353
 		if command_or_group.parent:
347
-			text += f'## :information_source: Subcommand Help'
354
+			text += '## :information_source: Subcommand Help'
348 355
 			text += f'\n`/{command_or_group.parent.name} {command_or_group.name}`'
349 356
 		else:
350
-			text += f'## :information_source: Command Help'
357
+			text += '## :information_source: Command Help'
351 358
 			if isinstance(command_or_group, Group):
352 359
 				text += f'\n`/{command_or_group.name} subcommand_name`'
353 360
 			else:
@@ -385,7 +392,7 @@ class HelpCog(BaseCog, name='Help'):
385 392
 		await self.__send_paged_help(interaction, text)
386 393
 
387 394
 	async def __send_cog_help(self, interaction: Interaction, cog: BaseCog) -> None:
388
-		text = f'## :information_source: Module Help'
395
+		text = '## :information_source: Module Help'
389 396
 		text += f'\n**{cog.qualified_name}** module'
390 397
 		if cog.short_description is not None:
391 398
 			text += f'\n\n{cog.short_description}'

+ 2
- 0
rocketbot/cogs/joinraidcog.py Wyświetl plik

@@ -3,6 +3,7 @@ Cog for detecting large numbers of guild joins in a short period of time.
3 3
 """
4 4
 import weakref
5 5
 from datetime import datetime, timedelta
6
+
6 7
 from discord import Guild, Member
7 8
 from discord.ext.commands import Cog
8 9
 
@@ -11,6 +12,7 @@ from rocketbot.cogs.basecog import BaseCog, BotMessage, BotMessageReaction, CogS
11 12
 from rocketbot.collections import AgeBoundList
12 13
 from rocketbot.storage import Storage
13 14
 
15
+
14 16
 class JoinRaidContext:
15 17
 	"""
16 18
 	Data about a join raid.

+ 20
- 5
rocketbot/cogs/logcog.py Wyświetl plik

@@ -1,17 +1,32 @@
1 1
 """
2 2
 Cog for detecting large numbers of guild joins in a short period of time.
3 3
 """
4
+import difflib
5
+import re
4 6
 from collections.abc import Sequence
5 7
 from datetime import datetime, timedelta, timezone
6
-
7
-from discord import AuditLogAction, AuditLogEntry, Emoji, Guild, GuildSticker, Invite, Member, Message, RawBulkMessageDeleteEvent, RawMessageDeleteEvent, RawMessageUpdateEvent, Role, Thread, User
8
+from typing import Callable, Optional, Tuple, Union
9
+
10
+from discord import (
11
+	AuditLogAction,
12
+	AuditLogEntry,
13
+	Emoji,
14
+	Guild,
15
+	GuildSticker,
16
+	Invite,
17
+	Member,
18
+	Message,
19
+	RawBulkMessageDeleteEvent,
20
+	RawMessageDeleteEvent,
21
+	RawMessageUpdateEvent,
22
+	Role,
23
+	Thread,
24
+	User,
25
+)
8 26
 from discord.abc import GuildChannel
9 27
 from discord.ext import tasks
10 28
 from discord.ext.commands import Cog
11 29
 from discord.utils import escape_markdown
12
-from typing import Optional, Tuple, Union, Callable
13
-import difflib
14
-import re
15 30
 
16 31
 from rocketbot.cogs.basecog import BaseCog, BotMessage, CogSetting
17 32
 from rocketbot.storage import Storage

+ 9
- 4
rocketbot/cogs/patterncog.py Wyświetl plik

@@ -6,7 +6,8 @@ import re
6 6
 from datetime import datetime
7 7
 from typing import Optional
8 8
 
9
-from discord import Guild, Member, Message, utils as discordutils, Interaction
9
+from discord import Guild, Interaction, Member, Message
10
+from discord import utils as discordutils
10 11
 from discord.app_commands import Choice, Group, autocomplete
11 12
 from discord.ext.commands import Cog
12 13
 
@@ -14,10 +15,14 @@ from config import CONFIG
14 15
 from rocketbot.bot import Rocketbot
15 16
 from rocketbot.cogs.basecog import BaseCog, BotMessage, BotMessageReaction
16 17
 from rocketbot.cogsetting import CogSetting
17
-from rocketbot.pattern import PatternCompiler, PatternDeprecationError, \
18
-	PatternError, PatternStatement
18
+from rocketbot.pattern import (
19
+	PatternCompiler,
20
+	PatternDeprecationError,
21
+	PatternError,
22
+	PatternStatement,
23
+)
19 24
 from rocketbot.storage import Storage
20
-from rocketbot.utils import dump_stacktrace, MOD_PERMISSIONS
25
+from rocketbot.utils import MOD_PERMISSIONS, dump_stacktrace
21 26
 
22 27
 
23 28
 class PatternContext:

+ 10
- 8
rocketbot/cogs/urlspamcog.py Wyświetl plik

@@ -5,7 +5,8 @@ import re
5 5
 from datetime import timedelta
6 6
 from typing import Literal
7 7
 
8
-from discord import Member, Message, utils as discordutils
8
+from discord import Member, Message
9
+from discord import utils as discordutils
9 10
 from discord.ext.commands import Cog
10 11
 from discord.utils import escape_markdown
11 12
 
@@ -13,6 +14,7 @@ from config import CONFIG
13 14
 from rocketbot.cogs.basecog import BaseCog, BotMessage, BotMessageReaction, CogSetting
14 15
 from rocketbot.utils import describe_timedelta
15 16
 
17
+
16 18
 class URLSpamContext:
17 19
 	"""
18 20
 	Data about a suspected spam message containing a URL.
@@ -178,30 +180,30 @@ class URLSpamCog(BaseCog, name='URL Spam'):
178 180
 				await message.delete()
179 181
 		elif 'chatwarn' in action:
180 182
 			if 'delete' in action:
181
-				response = f':warning: Links with deceptive labels are prohibited :warning:'
183
+				response = ':warning: Links with deceptive labels are prohibited :warning:'
182 184
 			else:
183
-				response = f':warning: Message contains a deceptively labeled link! Click carefully. :warning:'
185
+				response = ':warning: Message contains a deceptively labeled link! Click carefully. :warning:'
184 186
 			await message.reply(response, mention_author=False)
185 187
 			if 'delete' in action:
186 188
 				await message.delete()
187 189
 		elif action == 'delete':
188
-			mod_text += f'\n\nDeleting message'
190
+			mod_text += '\n\nDeleting message'
189 191
 			bm = BotMessage(message.guild, mod_text, BotMessage.TYPE_INFO, suppress_embeds=True)
190 192
 			await self.post_message(bm)
191 193
 			await message.delete()
192 194
 		elif action == 'kick':
193
-			mod_text += f'\n\nUser kicked'
195
+			mod_text += '\n\nUser kicked'
194 196
 			bm = BotMessage(message.guild, mod_text, BotMessage.TYPE_MOD_WARNING, suppress_embeds=True)
195 197
 			await self.post_message(bm)
196 198
 			await message.delete()
197 199
 			await message.author.kick(
198
-				reason=f'Rocketbot: User posted a deceptive link')
200
+				reason='Rocketbot: User posted a deceptive link')
199 201
 		elif action == 'ban':
200
-			mod_text += f'\n\nUser banned'
202
+			mod_text += '\n\nUser banned'
201 203
 			bm = BotMessage(message.guild, mod_text, BotMessage.TYPE_MOD_WARNING, suppress_embeds=True)
202 204
 			await self.post_message(bm)
203 205
 			await message.author.ban(
204
-				reason=f'Rocketbot: User posted a deceptive link',
206
+				reason='Rocketbot: User posted a deceptive link',
205 207
 				delete_message_days=1)
206 208
 
207 209
 	def contains_deceptive_links(self, content: str) -> bool:

+ 1
- 1
rocketbot/cogs/usernamecog.py Wyświetl plik

@@ -3,7 +3,7 @@ Cog for detecting username patterns.
3 3
 """
4 4
 from typing import Optional
5 5
 
6
-from discord import Guild, Member, Permissions, Interaction
6
+from discord import Guild, Interaction, Member
7 7
 from discord.app_commands import Group
8 8
 from discord.ext.commands import Cog
9 9
 

+ 28
- 28
rocketbot/cogsetting.py Wyświetl plik

@@ -1,18 +1,29 @@
1 1
 """
2 2
 A guild configuration setting available for editing via bot commands.
3 3
 """
4
+
4 5
 from datetime import timedelta
5
-from typing import Any, Optional, Type, Literal, Union
6
+from typing import TYPE_CHECKING, Any, Literal, Optional, Type, Union
6 7
 
7 8
 from discord import Interaction, Permissions
8 9
 from discord.app_commands import Range, Transform, describe
9
-from discord.app_commands.commands import Command, Group, CommandCallback, rename
10
+from discord.app_commands.commands import Command, CommandCallback, Group, rename
10 11
 from discord.ext.commands import Bot
11 12
 
12 13
 from config import CONFIG
13 14
 from rocketbot.storage import Storage
14
-from rocketbot.utils import bot_log, TimeDeltaTransformer, MOD_PERMISSIONS, dump_stacktrace, str_from_timedelta
15
+from rocketbot.utils import (
16
+	MOD_PERMISSIONS,
17
+	TimeDeltaTransformer,
18
+	bot_log,
19
+	dump_stacktrace,
20
+	str_from_timedelta,
21
+)
15 22
 
23
+if TYPE_CHECKING:
24
+	from rocketbot.cogs.basecog import BaseCog
25
+else:
26
+	BaseCog = 'BaseCog'
16 27
 
17 28
 def describe_type(datatype: Type) -> str:
18 29
 	if datatype is int:
@@ -104,7 +115,7 @@ class CogSetting:
104 115
 			allowed_values = '`' + ('`, `'.join(self.enum_values)) + '`'
105 116
 			raise ValueError(f'`{self.name}` must be one of {allowed_values}')
106 117
 
107
-	def set_up(self, cog: 'BaseCog') -> None:
118
+	def set_up(self, cog: BaseCog) -> None:
108 119
 		"""
109 120
 		Sets up getter and setter commands for this setting. This should
110 121
 		usually only be called by BaseCog.
@@ -139,7 +150,7 @@ class CogSetting:
139 150
 			return 'true' if native_value else 'false'
140 151
 		return f'{native_value}'
141 152
 
142
-	def __make_getter_command(self, cog: 'BaseCog') -> Command:
153
+	def __make_getter_command(self, cog: BaseCog) -> Command:
143 154
 		setting: CogSetting = self
144 155
 		setting_name = setting.name
145 156
 		if cog.config_prefix is not None:
@@ -149,7 +160,7 @@ class CogSetting:
149 160
 			value = setting.to_native_value(Storage.get_config_value(interaction.guild, key))
150 161
 			cog.log(interaction.guild, f'{interaction.user.name} used /get setting_name')
151 162
 			if value is None:
152
-				value = setting.to_native_value(cog.get_cog_default(setting.name))
163
+				value = setting.default_value
153 164
 				await interaction.response.send_message(
154 165
 					f'{CONFIG["info_emoji"]} `{setting_name}` is using default of `{CogSetting.native_value_to_str(value)}`',
155 166
 					ephemeral=True
@@ -174,7 +185,7 @@ class CogSetting:
174 185
 		)
175 186
 		return command
176 187
 
177
-	def __make_setter_command(self, cog: 'BaseCog') -> Command:
188
+	def __make_setter_command(self, cog: BaseCog) -> Command:
178 189
 		setting: CogSetting = self
179 190
 		setting_name = setting.name
180 191
 		if cog.config_prefix is not None:
@@ -198,37 +209,29 @@ class CogSetting:
198 209
 			await cog.on_setting_updated(interaction.guild, setting)
199 210
 
200 211
 		setter: CommandCallback = setter_general
212
+		field_description: str = self.brief
201 213
 		if self.datatype is int:
202 214
 			if self.min_value is not None or self.max_value is not None:
203 215
 				r_min = self.min_value
204 216
 				r_max = self.max_value
205
-				@rename(new_value=self.name)
206
-				@describe(new_value=self.brief)
207 217
 				async def setter_range(interaction: Interaction, new_value: Range[int, r_min, r_max]) -> None:
208 218
 					await setter_general(interaction, new_value)
209 219
 				setter = setter_range
210 220
 			else:
211
-				@rename(new_value=self.name)
212
-				@describe(new_value=self.brief)
213 221
 				async def setter_int(interaction: Interaction, new_value: int) -> None:
214 222
 					await setter_general(interaction, new_value)
215 223
 				setter = setter_int
216 224
 		elif self.datatype is float:
217
-			@rename(new_value=self.name)
218
-			@describe(new_value=self.brief)
219 225
 			async def setter_float(interaction: Interaction, new_value: float) -> None:
220 226
 				await setter_general(interaction, new_value)
221 227
 			setter = setter_float
222 228
 		elif self.datatype is timedelta:
223
-			@rename(new_value=self.name)
224
-			@describe(new_value=f'{self.brief} (e.g. 30s, 5m, 1h30s, 7d)')
229
+			field_description += ' (e.g. 30s, 5m, 1h30s, 7d)'
225 230
 			async def setter_timedelta(interaction: Interaction, new_value: Transform[timedelta, TimeDeltaTransformer]) -> None:
226 231
 				await setter_general(interaction, new_value)
227 232
 			setter = setter_timedelta
228 233
 		elif getattr(self.datatype, '__origin__', None) == Literal:
229 234
 			dt = self.datatype
230
-			@rename(new_value=self.name)
231
-			@describe(new_value=self.brief)
232 235
 			async def setter_enum(interaction: Interaction, new_value: dt) -> None:
233 236
 				await setter_general(interaction, new_value)
234 237
 			setter = setter_enum
@@ -236,19 +239,16 @@ class CogSetting:
236 239
 			if self.enum_values is not None:
237 240
 				raise ValueError('Type for a setting with enum values should be typing.Literal')
238 241
 			else:
239
-				@rename(new_value=self.name)
240
-				@describe(new_value=self.brief)
241 242
 				async def setter_str(interaction: Interaction, new_value: str) -> None:
242 243
 					await setter_general(interaction, new_value)
243 244
 				setter = setter_str
244 245
 		elif self.datatype is bool:
245
-			@rename(new_value=self.name)
246
-			@describe(new_value=self.brief)
247 246
 			async def setter_bool(interaction: Interaction, new_value: bool) -> None:
248 247
 				await setter_general(interaction, new_value)
249 248
 			setter = setter_bool
250 249
 		elif self.datatype is not None:
251 250
 			raise ValueError(f'Invalid type {self.datatype}')
251
+		setter = describe(new_value=field_description)(rename(new_value=self.name)(setter))
252 252
 
253 253
 		bot_log(None, cog.__class__, f"Creating command: /set {setting_name} <{describe_type(self.datatype)}>")
254 254
 		command = Command(
@@ -264,7 +264,7 @@ class CogSetting:
264 264
 		)
265 265
 		return command
266 266
 
267
-	def __make_enable_command(self, cog: 'BaseCog') -> Command:
267
+	def __make_enable_command(self, cog: BaseCog) -> Command:
268 268
 		setting: CogSetting = self
269 269
 		async def enabler(interaction: Interaction) -> None:
270 270
 			key = f'{cog.__class__.__name__}.{setting.name}'
@@ -290,7 +290,7 @@ class CogSetting:
290 290
 		)
291 291
 		return command
292 292
 
293
-	def __make_disable_command(self, cog: 'BaseCog') -> Command:
293
+	def __make_disable_command(self, cog: BaseCog) -> Command:
294 294
 		setting: CogSetting = self
295 295
 		async def disabler(interaction: Interaction) -> None:
296 296
 			key = f'{cog.__class__.__name__}.{setting.name}'
@@ -322,7 +322,7 @@ class CogSetting:
322 322
 	__disable_group: Group
323 323
 
324 324
 	@classmethod
325
-	def set_up_all(cls, cog: 'BaseCog', bot: Bot, settings: list['CogSetting']) -> None:
325
+	def set_up_all(cls, cog: BaseCog, bot: Bot, settings: list['CogSetting']) -> None:
326 326
 		"""
327 327
 		Sets up editing commands for a list of CogSettings and adds them to a
328 328
 		cog. If the cog has a command Group, commands will be added to it.
@@ -336,7 +336,7 @@ class CogSetting:
336 336
 
337 337
 	@classmethod
338 338
 	def __set_up_base_commands(cls, bot: Bot) -> None:
339
-		if getattr(cls, f'_CogSetting__set_group', None) is not None:
339
+		if getattr(cls, '_CogSetting__set_group', None) is not None:
340 340
 			return
341 341
 		cls.__set_group = Group(
342 342
 			name='set',
@@ -383,8 +383,8 @@ class CogSetting:
383 383
 		bot.tree.add_command(cls.__enable_group)
384 384
 		bot.tree.add_command(cls.__disable_group)
385 385
 
386
-		from rocketbot.cogs.basecog import BaseCog
387 386
 		async def show_all(interaction: Interaction) -> None:
387
+			from rocketbot.cogs.basecog import BaseCog
388 388
 			try:
389 389
 				bot_log(interaction.guild, None, f'{interaction.user.name} used /get all')
390 390
 				guild = interaction.guild
@@ -406,9 +406,9 @@ class CogSetting:
406 406
 					for setting in sorted(bcog.settings, key=lambda s: (s.name != 'enabled', s.name)):
407 407
 						key = f'{bcog.__class__.__name__}.{setting.name}'
408 408
 						value = setting.to_native_value(Storage.get_config_value(guild, key))
409
-						deflt = setting.to_native_value(bcog.get_cog_default(setting.name))
409
+						deflt = setting.default_value
410 410
 						if setting.name == 'enabled':
411
-							text += f'\n- Module is '
411
+							text += '\n- Module is '
412 412
 							if value is not None:
413 413
 								text += '**' + ('enabled' if value else 'disabled') + '**'
414 414
 							else:

+ 1
- 1
rocketbot/collections.py Wyświetl plik

@@ -3,7 +3,7 @@ Subclasses of list, set, and dict with special behaviors.
3 3
 """
4 4
 
5 5
 from abc import ABCMeta, abstractmethod
6
-from typing import Callable, Generic, TypeVar, Optional
6
+from typing import Callable, Generic, Optional, TypeVar
7 7
 
8 8
 # Abstract collections
9 9
 

+ 9
- 4
rocketbot/pattern.py Wyświetl plik

@@ -5,13 +5,18 @@ to take on them.
5 5
 import re
6 6
 from abc import ABCMeta, abstractmethod
7 7
 from datetime import datetime, timezone
8
-from typing import Any, Union, Literal
8
+from typing import Any, Literal, Union
9 9
 
10
-from discord import Message, utils as discordutils
10
+from discord import Message
11
+from discord import utils as discordutils
11 12
 from discord.ext.commands import Context
12 13
 
13
-from rocketbot.utils import is_user_id, str_from_quoted_str, timedelta_from_str, \
14
-	user_id_from_mention
14
+from rocketbot.utils import (
15
+	is_user_id,
16
+	str_from_quoted_str,
17
+	timedelta_from_str,
18
+	user_id_from_mention,
19
+)
15 20
 
16 21
 PatternField = Literal['content.markdown', 'content', 'content.plain', 'author', 'author.id', 'author.joinage', 'author.name', 'lastmatched']
17 22
 PatternComparisonOperator = Literal['==', '!=', '<', '>', '<=', '>=', 'contains', '!contains', 'matches', '!matches', 'containsword', '!containsword']

+ 2
- 1
rocketbot/storage.py Wyświetl plik

@@ -2,9 +2,10 @@
2 2
 Handles storage of persisted and non-persisted data for the bot.
3 3
 """
4 4
 import json
5
-from datetime import datetime, timezone, timedelta
5
+from datetime import datetime, timedelta, timezone
6 6
 from os.path import exists
7 7
 from typing import Any, Optional
8
+
8 9
 from discord import Guild
9 10
 
10 11
 from config import CONFIG

+ 4
- 6
rocketbot/utils.py Wyświetl plik

@@ -8,8 +8,10 @@ from datetime import datetime, timedelta
8 8
 from typing import Any, Optional, Type, Union
9 9
 
10 10
 import discord
11
-from discord import Guild, Permissions
12
-from discord.ext.commands import Cog
11
+from discord import Guild, Interaction, Permissions
12
+from discord.app_commands import Transformer
13
+from discord.ext.commands import BadArgument, Cog
14
+
13 15
 
14 16
 def dump_stacktrace(e: BaseException) -> None:
15 17
 	print(e, file=sys.stderr)
@@ -181,10 +183,6 @@ def indent_markdown(markdown: str) -> str:
181 183
 
182 184
 MOD_PERMISSIONS: Permissions = Permissions(Permissions.manage_messages.flag)
183 185
 
184
-from discord import Interaction
185
-from discord.app_commands import Transformer
186
-from discord.ext.commands import BadArgument
187
-
188 186
 class TimeDeltaTransformer(Transformer):
189 187
 	async def transform(self, interaction: Interaction, value: Any) -> timedelta:
190 188
 		try:

Ładowanie…
Anuluj
Zapisz