浏览代码

Switching to Ruff, addressing warnings

tags/2.0.0
Rocketsoup 1 个月前
父节点
当前提交
59749c5c2c

+ 15
- 15
rocketbot/bot.py 查看文件

24
 		self.__first_ready = True
24
 		self.__first_ready = True
25
 
25
 
26
 	async def on_command_error(self, context: commands.Context, exception: BaseException) -> None:
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
 		dump_stacktrace(exception)
28
 		dump_stacktrace(exception)
29
 		if context.guild is None or \
29
 		if context.guild is None or \
30
 				context.message.channel is None or \
30
 				context.message.channel is None or \
54
 			if not self.__commands_set_up:
54
 			if not self.__commands_set_up:
55
 				await self.__set_up_commands()
55
 				await self.__set_up_commands()
56
 			bot_log(None, None, 'Bot done initializing')
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
 			print('----------------------------------------------------------')
58
 			print('----------------------------------------------------------')
59
 
59
 
60
 	async def __set_up_commands(self):
60
 	async def __set_up_commands(self):
90
 	rocketbot = Rocketbot(intents=intents)
90
 	rocketbot = Rocketbot(intents=intents)
91
 __create_bot()
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
 async def start_bot():
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
 	bot_log(None, None, 'Bot initializing...')
107
 	bot_log(None, None, 'Bot initializing...')
108
 
108
 
109
 	# Core
109
 	# Core

+ 2
- 2
rocketbot/botmessage.py 查看文件

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

+ 3
- 3
rocketbot/cogs/autokickcog.py 查看文件

5
 from discord.ext.commands import Cog
5
 from discord.ext.commands import Cog
6
 from discord.ext.tasks import Loop
6
 from discord.ext.tasks import Loop
7
 
7
 
8
-from config import CONFIG
9
 from rocketbot.cogs.basecog import BaseCog, BotMessage, CogSetting
8
 from rocketbot.cogs.basecog import BaseCog, BotMessage, CogSetting
10
 from rocketbot.collections import AgeBoundDict
9
 from rocketbot.collections import AgeBoundDict
11
 from rocketbot.storage import Storage
10
 from rocketbot.storage import Storage
12
 
11
 
12
+
13
 class AutoKickContext:
13
 class AutoKickContext:
14
 	"""
14
 	"""
15
 	Data about a join raid.
15
 	Data about a join raid.
123
 		else:
123
 		else:
124
 			context.record_kick(datetime.now())
124
 			context.record_kick(datetime.now())
125
 		max_kick_count: int = self.get_guild_setting(guild, self.SETTING_BAN_COUNT)
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
 		if max_kick_count > 0 and context.kick_count > max_kick_count:
128
 		if max_kick_count > 0 and context.kick_count > max_kick_count:
129
 			await member.ban(reason=f'Rocketbot: Ban after {context.kick_count} joins',
129
 			await member.ban(reason=f'Rocketbot: Ban after {context.kick_count} joins',
130
 				delete_message_days=0)
130
 				delete_message_days=0)

+ 14
- 8
rocketbot/cogs/bangcommandcog.py 查看文件

1
 import re
1
 import re
2
 from typing import Optional, TypedDict
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
 from discord.ext.commands import Cog
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
 from config import CONFIG
9
 from config import CONFIG
10
 from rocketbot.bot import Rocketbot
10
 from rocketbot.bot import Rocketbot
11
 from rocketbot.cogs.basecog import BaseCog
11
 from rocketbot.cogs.basecog import BaseCog
12
 from rocketbot.cogsetting import CogSetting
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
 _CURRENT_DATA_VERSION = 1
21
 _CURRENT_DATA_VERSION = 1
17
 _MAX_CONTENT_LENGTH = 2000
22
 _MAX_CONTENT_LENGTH = 2000
305
 		mod_only_input: Select = self.mod_only_label.component
310
 		mod_only_input: Select = self.mod_only_label.component
306
 		name_input.default = name
311
 		name_input.default = name
307
 		content_input.default = content
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
 	async def on_submit(self, interaction: Interaction) -> None:
317
 	async def on_submit(self, interaction: Interaction) -> None:
312
 		# noinspection PyTypeChecker
318
 		# noinspection PyTypeChecker
337
 				f'{CONFIG["failure_emoji"]} Save failed',
343
 				f'{CONFIG["failure_emoji"]} Save failed',
338
 				ephemeral=True,
344
 				ephemeral=True,
339
 			)
345
 			)
340
-		except:
346
+		except BaseException:
341
 			pass
347
 			pass

+ 9
- 1
rocketbot/cogs/basecog.py 查看文件

5
 from typing import Optional
5
 from typing import Optional
6
 
6
 
7
 import discord
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
 from discord.abc import GuildChannel
16
 from discord.abc import GuildChannel
10
 from discord.app_commands import AppCommandError
17
 from discord.app_commands import AppCommandError
11
 from discord.app_commands.errors import CommandInvokeError
18
 from discord.app_commands.errors import CommandInvokeError
19
 from rocketbot.storage import Storage
26
 from rocketbot.storage import Storage
20
 from rocketbot.utils import bot_log, dump_stacktrace
27
 from rocketbot.utils import bot_log, dump_stacktrace
21
 
28
 
29
+
22
 class WarningContext:
30
 class WarningContext:
23
 	def __init__(self, member: Member, warn_time: datetime):
31
 	def __init__(self, member: Member, warn_time: datetime):
24
 		self.member = member
32
 		self.member = member

+ 3
- 3
rocketbot/cogs/configcog.py 查看文件

1
 """
1
 """
2
 Cog handling general configuration for a guild.
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
 from discord.app_commands import Group
7
 from discord.app_commands import Group
8
 from discord.ext.commands import Bot
8
 from discord.ext.commands import Bot
9
 
9
 
10
 from config import CONFIG
10
 from config import CONFIG
11
-from rocketbot.storage import ConfigKey, Storage
12
 from rocketbot.cogs.basecog import BaseCog
11
 from rocketbot.cogs.basecog import BaseCog
12
+from rocketbot.storage import ConfigKey, Storage
13
 from rocketbot.utils import MOD_PERMISSIONS
13
 from rocketbot.utils import MOD_PERMISSIONS
14
 
14
 
15
 
15
 

+ 3
- 2
rocketbot/cogs/crosspostcog.py 查看文件

5
 from datetime import datetime, timedelta
5
 from datetime import datetime, timedelta
6
 from typing import Optional
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
 from discord.ext.commands import Cog
10
 from discord.ext.commands import Cog
10
 
11
 
11
 from config import CONFIG
12
 from config import CONFIG
12
 from rocketbot.cogs.basecog import BaseCog, BotMessage, BotMessageReaction, CogSetting
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
 from rocketbot.storage import Storage
15
 from rocketbot.storage import Storage
15
 from rocketbot.utils import str_from_timedelta
16
 from rocketbot.utils import str_from_timedelta
16
 
17
 

+ 2
- 3
rocketbot/cogs/gamescog.py 查看文件

1
 import math
1
 import math
2
 import random
2
 import random
3
-from time import perf_counter
4
 
3
 
5
 from discord import Interaction, UnfurledMediaItem
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
 from rocketbot.bot import Rocketbot
8
 from rocketbot.bot import Rocketbot
10
 from rocketbot.cogs.basecog import BaseCog
9
 from rocketbot.cogs.basecog import BaseCog

+ 3
- 2
rocketbot/cogs/generalcog.py 查看文件

5
 from typing import Optional
5
 from typing import Optional
6
 
6
 
7
 from discord import Interaction, Message, User
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
 from discord.errors import DiscordException
9
 from discord.errors import DiscordException
10
 from discord.ext.commands import Cog
10
 from discord.ext.commands import Cog
11
 
11
 
12
 from config import CONFIG
12
 from config import CONFIG
13
 from rocketbot.bot import Rocketbot
13
 from rocketbot.bot import Rocketbot
14
 from rocketbot.cogs.basecog import BaseCog, BotMessage
14
 from rocketbot.cogs.basecog import BaseCog, BotMessage
15
-from rocketbot.utils import describe_timedelta, TimeDeltaTransformer
16
 from rocketbot.storage import ConfigKey, Storage
15
 from rocketbot.storage import ConfigKey, Storage
16
+from rocketbot.utils import TimeDeltaTransformer, describe_timedelta
17
+
17
 
18
 
18
 class GeneralCog(BaseCog, name='General'):
19
 class GeneralCog(BaseCog, name='General'):
19
 	"""
20
 	"""

+ 16
- 9
rocketbot/cogs/helpcog.py 查看文件

1
 """Provides help commands for getting info on using other commands and configuration."""
1
 """Provides help commands for getting info on using other commands and configuration."""
2
 import re
2
 import re
3
 import time
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
 from config import CONFIG
16
 from config import CONFIG
10
 from rocketbot.bot import Rocketbot
17
 from rocketbot.bot import Rocketbot
11
 from rocketbot.cogs.basecog import BaseCog
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
 from rocketbot.utils import MOD_PERMISSIONS, dump_stacktrace
20
 from rocketbot.utils import MOD_PERMISSIONS, dump_stacktrace
14
 
21
 
15
 HelpTopic = Union[Command, Group, BaseCog]
22
 HelpTopic = Union[Command, Group, BaseCog]
272
 			   (len(cog_tuple[1].settings) > 0)
279
 			   (len(cog_tuple[1].settings) > 0)
273
 		]
280
 		]
274
 
281
 
275
-		text = f'## :information_source: Help'
282
+		text = '## :information_source: Help'
276
 		if len(all_commands) + len(all_cog_tuples) == 0:
283
 		if len(all_commands) + len(all_cog_tuples) == 0:
277
 			text = 'Nothing available for your permissions!'
284
 			text = 'Nothing available for your permissions!'
278
 
285
 
344
 		if addendum is not None:
351
 		if addendum is not None:
345
 			text += addendum + '\n\n'
352
 			text += addendum + '\n\n'
346
 		if command_or_group.parent:
353
 		if command_or_group.parent:
347
-			text += f'## :information_source: Subcommand Help'
354
+			text += '## :information_source: Subcommand Help'
348
 			text += f'\n`/{command_or_group.parent.name} {command_or_group.name}`'
355
 			text += f'\n`/{command_or_group.parent.name} {command_or_group.name}`'
349
 		else:
356
 		else:
350
-			text += f'## :information_source: Command Help'
357
+			text += '## :information_source: Command Help'
351
 			if isinstance(command_or_group, Group):
358
 			if isinstance(command_or_group, Group):
352
 				text += f'\n`/{command_or_group.name} subcommand_name`'
359
 				text += f'\n`/{command_or_group.name} subcommand_name`'
353
 			else:
360
 			else:
385
 		await self.__send_paged_help(interaction, text)
392
 		await self.__send_paged_help(interaction, text)
386
 
393
 
387
 	async def __send_cog_help(self, interaction: Interaction, cog: BaseCog) -> None:
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
 		text += f'\n**{cog.qualified_name}** module'
396
 		text += f'\n**{cog.qualified_name}** module'
390
 		if cog.short_description is not None:
397
 		if cog.short_description is not None:
391
 			text += f'\n\n{cog.short_description}'
398
 			text += f'\n\n{cog.short_description}'

+ 2
- 0
rocketbot/cogs/joinraidcog.py 查看文件

3
 """
3
 """
4
 import weakref
4
 import weakref
5
 from datetime import datetime, timedelta
5
 from datetime import datetime, timedelta
6
+
6
 from discord import Guild, Member
7
 from discord import Guild, Member
7
 from discord.ext.commands import Cog
8
 from discord.ext.commands import Cog
8
 
9
 
11
 from rocketbot.collections import AgeBoundList
12
 from rocketbot.collections import AgeBoundList
12
 from rocketbot.storage import Storage
13
 from rocketbot.storage import Storage
13
 
14
 
15
+
14
 class JoinRaidContext:
16
 class JoinRaidContext:
15
 	"""
17
 	"""
16
 	Data about a join raid.
18
 	Data about a join raid.

+ 20
- 5
rocketbot/cogs/logcog.py 查看文件

1
 """
1
 """
2
 Cog for detecting large numbers of guild joins in a short period of time.
2
 Cog for detecting large numbers of guild joins in a short period of time.
3
 """
3
 """
4
+import difflib
5
+import re
4
 from collections.abc import Sequence
6
 from collections.abc import Sequence
5
 from datetime import datetime, timedelta, timezone
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
 from discord.abc import GuildChannel
26
 from discord.abc import GuildChannel
9
 from discord.ext import tasks
27
 from discord.ext import tasks
10
 from discord.ext.commands import Cog
28
 from discord.ext.commands import Cog
11
 from discord.utils import escape_markdown
29
 from discord.utils import escape_markdown
12
-from typing import Optional, Tuple, Union, Callable
13
-import difflib
14
-import re
15
 
30
 
16
 from rocketbot.cogs.basecog import BaseCog, BotMessage, CogSetting
31
 from rocketbot.cogs.basecog import BaseCog, BotMessage, CogSetting
17
 from rocketbot.storage import Storage
32
 from rocketbot.storage import Storage

+ 9
- 4
rocketbot/cogs/patterncog.py 查看文件

6
 from datetime import datetime
6
 from datetime import datetime
7
 from typing import Optional
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
 from discord.app_commands import Choice, Group, autocomplete
11
 from discord.app_commands import Choice, Group, autocomplete
11
 from discord.ext.commands import Cog
12
 from discord.ext.commands import Cog
12
 
13
 
14
 from rocketbot.bot import Rocketbot
15
 from rocketbot.bot import Rocketbot
15
 from rocketbot.cogs.basecog import BaseCog, BotMessage, BotMessageReaction
16
 from rocketbot.cogs.basecog import BaseCog, BotMessage, BotMessageReaction
16
 from rocketbot.cogsetting import CogSetting
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
 from rocketbot.storage import Storage
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
 class PatternContext:
28
 class PatternContext:

+ 10
- 8
rocketbot/cogs/urlspamcog.py 查看文件

5
 from datetime import timedelta
5
 from datetime import timedelta
6
 from typing import Literal
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
 from discord.ext.commands import Cog
10
 from discord.ext.commands import Cog
10
 from discord.utils import escape_markdown
11
 from discord.utils import escape_markdown
11
 
12
 
13
 from rocketbot.cogs.basecog import BaseCog, BotMessage, BotMessageReaction, CogSetting
14
 from rocketbot.cogs.basecog import BaseCog, BotMessage, BotMessageReaction, CogSetting
14
 from rocketbot.utils import describe_timedelta
15
 from rocketbot.utils import describe_timedelta
15
 
16
 
17
+
16
 class URLSpamContext:
18
 class URLSpamContext:
17
 	"""
19
 	"""
18
 	Data about a suspected spam message containing a URL.
20
 	Data about a suspected spam message containing a URL.
178
 				await message.delete()
180
 				await message.delete()
179
 		elif 'chatwarn' in action:
181
 		elif 'chatwarn' in action:
180
 			if 'delete' in action:
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
 			else:
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
 			await message.reply(response, mention_author=False)
186
 			await message.reply(response, mention_author=False)
185
 			if 'delete' in action:
187
 			if 'delete' in action:
186
 				await message.delete()
188
 				await message.delete()
187
 		elif action == 'delete':
189
 		elif action == 'delete':
188
-			mod_text += f'\n\nDeleting message'
190
+			mod_text += '\n\nDeleting message'
189
 			bm = BotMessage(message.guild, mod_text, BotMessage.TYPE_INFO, suppress_embeds=True)
191
 			bm = BotMessage(message.guild, mod_text, BotMessage.TYPE_INFO, suppress_embeds=True)
190
 			await self.post_message(bm)
192
 			await self.post_message(bm)
191
 			await message.delete()
193
 			await message.delete()
192
 		elif action == 'kick':
194
 		elif action == 'kick':
193
-			mod_text += f'\n\nUser kicked'
195
+			mod_text += '\n\nUser kicked'
194
 			bm = BotMessage(message.guild, mod_text, BotMessage.TYPE_MOD_WARNING, suppress_embeds=True)
196
 			bm = BotMessage(message.guild, mod_text, BotMessage.TYPE_MOD_WARNING, suppress_embeds=True)
195
 			await self.post_message(bm)
197
 			await self.post_message(bm)
196
 			await message.delete()
198
 			await message.delete()
197
 			await message.author.kick(
199
 			await message.author.kick(
198
-				reason=f'Rocketbot: User posted a deceptive link')
200
+				reason='Rocketbot: User posted a deceptive link')
199
 		elif action == 'ban':
201
 		elif action == 'ban':
200
-			mod_text += f'\n\nUser banned'
202
+			mod_text += '\n\nUser banned'
201
 			bm = BotMessage(message.guild, mod_text, BotMessage.TYPE_MOD_WARNING, suppress_embeds=True)
203
 			bm = BotMessage(message.guild, mod_text, BotMessage.TYPE_MOD_WARNING, suppress_embeds=True)
202
 			await self.post_message(bm)
204
 			await self.post_message(bm)
203
 			await message.author.ban(
205
 			await message.author.ban(
204
-				reason=f'Rocketbot: User posted a deceptive link',
206
+				reason='Rocketbot: User posted a deceptive link',
205
 				delete_message_days=1)
207
 				delete_message_days=1)
206
 
208
 
207
 	def contains_deceptive_links(self, content: str) -> bool:
209
 	def contains_deceptive_links(self, content: str) -> bool:

+ 1
- 1
rocketbot/cogs/usernamecog.py 查看文件

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

+ 28
- 28
rocketbot/cogsetting.py 查看文件

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

+ 1
- 1
rocketbot/collections.py 查看文件

3
 """
3
 """
4
 
4
 
5
 from abc import ABCMeta, abstractmethod
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
 # Abstract collections
8
 # Abstract collections
9
 
9
 

+ 9
- 4
rocketbot/pattern.py 查看文件

5
 import re
5
 import re
6
 from abc import ABCMeta, abstractmethod
6
 from abc import ABCMeta, abstractmethod
7
 from datetime import datetime, timezone
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
 from discord.ext.commands import Context
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
 PatternField = Literal['content.markdown', 'content', 'content.plain', 'author', 'author.id', 'author.joinage', 'author.name', 'lastmatched']
21
 PatternField = Literal['content.markdown', 'content', 'content.plain', 'author', 'author.id', 'author.joinage', 'author.name', 'lastmatched']
17
 PatternComparisonOperator = Literal['==', '!=', '<', '>', '<=', '>=', 'contains', '!contains', 'matches', '!matches', 'containsword', '!containsword']
22
 PatternComparisonOperator = Literal['==', '!=', '<', '>', '<=', '>=', 'contains', '!contains', 'matches', '!matches', 'containsword', '!containsword']

+ 2
- 1
rocketbot/storage.py 查看文件

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

+ 4
- 6
rocketbot/utils.py 查看文件

8
 from typing import Any, Optional, Type, Union
8
 from typing import Any, Optional, Type, Union
9
 
9
 
10
 import discord
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
 def dump_stacktrace(e: BaseException) -> None:
16
 def dump_stacktrace(e: BaseException) -> None:
15
 	print(e, file=sys.stderr)
17
 	print(e, file=sys.stderr)
181
 
183
 
182
 MOD_PERMISSIONS: Permissions = Permissions(Permissions.manage_messages.flag)
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
 class TimeDeltaTransformer(Transformer):
186
 class TimeDeltaTransformer(Transformer):
189
 	async def transform(self, interaction: Interaction, value: Any) -> timedelta:
187
 	async def transform(self, interaction: Interaction, value: Any) -> timedelta:
190
 		try:
188
 		try:

正在加载...
取消
保存