Formatted files with black

This commit is contained in:
2023-01-13 23:54:06 +01:00
parent e2b2fb5abb
commit ea266cc5be
141 changed files with 741 additions and 1886 deletions

View File

@@ -20,14 +20,10 @@ class AutoRoleModule(ModuleABC):
def __init__(self, dc: DiscordCollectionABC):
ModuleABC.__init__(self, dc, FeatureFlagsEnum.auto_role_module)
def configure_configuration(
self, config: ConfigurationABC, env: ApplicationEnvironmentABC
):
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
pass
def configure_services(
self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC
):
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_transient(AutoRoleReactionHandler)
# commands
self._dc.add_command(AutoRoleGroup)

View File

@@ -53,14 +53,10 @@ class AutoRoleGroup(DiscordCommandABC):
self, interaction: discord.Interaction, current: str
) -> TList[app_commands.Choice[str]]:
server = self._servers.get_server_by_discord_id(interaction.guild.id)
auto_roles = self._auto_roles.get_auto_roles_by_server_id(
server.server_id
).select(lambda x: x.auto_role_id)
auto_roles = self._auto_roles.get_auto_roles_by_server_id(server.server_id).select(lambda x: x.auto_role_id)
return [
app_commands.Choice(name=auto_role, value=auto_role)
for auto_role in self._client_utils.get_auto_complete_list(
auto_roles, current
)
for auto_role in self._client_utils.get_auto_complete_list(auto_roles, current)
]
@commands.hybrid_group(name="auto-role")
@@ -86,9 +82,7 @@ class AutoRoleGroup(DiscordCommandABC):
server = self._servers.get_server_by_discord_id(ctx.guild.id)
auto_roles = self._auto_roles.get_auto_roles_by_server_id(server.server_id)
if auto_roles.count() < 1:
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.auto_role.error.nothing_found")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.auto_role.error.nothing_found"))
self._logger.trace(__name__, f"Finished command auto-role list")
return
@@ -116,9 +110,7 @@ class AutoRoleGroup(DiscordCommandABC):
@CommandChecks.check_is_ready()
@CommandChecks.check_is_member_moderator()
async def add(self, ctx: Context, channel: discord.TextChannel, message_id: str):
self._logger.debug(
__name__, f"Received command auto-role add {ctx} {message_id}"
)
self._logger.debug(__name__, f"Received command auto-role add {ctx} {message_id}")
message = (
List(
@@ -129,56 +121,38 @@ class AutoRoleGroup(DiscordCommandABC):
.single_or_default()
)
if message is None:
self._logger.debug(
__name__, f"Message with id {message_id} not found in {channel.name}"
)
self._logger.debug(__name__, f"Message with id {message_id} not found in {channel.name}")
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.auto_role.add.error.not_found").format(
message_id, channel.mention
),
self._t.transform("modules.auto_role.add.error.not_found").format(message_id, channel.mention),
)
self._logger.trace(__name__, f"Finished command auto-role add")
return
if self._auto_roles.find_auto_role_by_message_id(int(message_id)) is not None:
self._logger.debug(
__name__, f"auto-role for message {message_id} already exists"
)
self._logger.debug(__name__, f"auto-role for message {message_id} already exists")
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.auto_role.add.error.already_exists").format(
message_id
),
self._t.transform("modules.auto_role.add.error.already_exists").format(message_id),
)
self._logger.trace(__name__, f"Finished command auto-role add")
return
server_id = self._servers.get_server_by_discord_id(ctx.guild.id).server_id
self._auto_roles.add_auto_role(
AutoRole(server_id, int(channel.id), int(message_id))
)
self._auto_roles.add_auto_role(AutoRole(server_id, int(channel.id), int(message_id)))
self._db_context.save_changes()
self._logger.info(
__name__, f"Saved auto-role for message {message_id} at server {server_id}"
)
self._logger.info(__name__, f"Saved auto-role for message {message_id} at server {server_id}")
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.auto_role.add.success").format(message_id)
)
self._logger.trace(__name__, f"Finished command auto-role add")
@add.autocomplete("message_id")
async def add_autocomplete(
self, interaction: discord.Interaction, current: str
) -> TList[app_commands.Choice[str]]:
channel = discord.utils.get(
interaction.guild.text_channels, id=interaction.channel_id
)
async def add_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
channel = discord.utils.get(interaction.guild.text_channels, id=interaction.channel_id)
try:
channel_from_data = interaction.data["options"][0]["options"][0]["value"]
found_channel = discord.utils.get(
interaction.guild.text_channels, id=int(channel_from_data)
)
found_channel = discord.utils.get(interaction.guild.text_channels, id=int(channel_from_data))
if found_channel is not None:
channel = found_channel
finally:
@@ -186,9 +160,7 @@ class AutoRoleGroup(DiscordCommandABC):
messages = [message async for message in channel.history(limit=10)]
return [
app_commands.Choice(
name=f"{message.author}@{message.created_at}", value=str(message.id)
)
app_commands.Choice(name=f"{message.author}@{message.created_at}", value=str(message.id))
for message in messages
if current in str(message.id)
]
@@ -198,25 +170,19 @@ class AutoRoleGroup(DiscordCommandABC):
@CommandChecks.check_is_ready()
@CommandChecks.check_is_member_moderator()
async def remove(self, ctx: Context, auto_role: int):
self._logger.debug(
__name__, f"Received command auto-role remove {ctx} {auto_role}"
)
self._logger.debug(__name__, f"Received command auto-role remove {ctx} {auto_role}")
auto_role_from_db = self._auto_roles.find_auto_role_by_id(auto_role)
if auto_role_from_db is None:
self._logger.debug(__name__, f"auto-role {auto_role} not found")
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.auto_role.remove.error.not_found").format(
auto_role
),
self._t.transform("modules.auto_role.remove.error.not_found").format(auto_role),
)
self._logger.trace(__name__, f"Finished command auto-role remove")
return
for rule in self._auto_roles.get_auto_role_rules_by_auto_role_id(
auto_role_from_db.auto_role_id
):
for rule in self._auto_roles.get_auto_role_rules_by_auto_role_id(auto_role_from_db.auto_role_id):
self._auto_roles.delete_auto_role_rule(rule)
self._logger.info(__name__, f"Removed auto-role rule {rule.role_id}")
@@ -296,20 +262,14 @@ class AutoRoleGroup(DiscordCommandABC):
@CommandChecks.check_is_ready()
@CommandChecks.check_is_member_moderator()
async def add(self, ctx: Context, auto_role: int, emoji_name: str, role_id: str):
self._logger.debug(
__name__, f"Received command auto-role add {ctx} {auto_role}"
)
self._logger.debug(__name__, f"Received command auto-role add {ctx} {auto_role}")
emoji = discord.utils.get(self._bot.emojis, name=emoji_name)
if emoji is None:
self._logger.debug(
__name__, f"auto-role rule add emoji {emoji_name} not found"
)
self._logger.debug(__name__, f"auto-role rule add emoji {emoji_name} not found")
await self._message_service.send_ctx_msg(
ctx,
self._t.transform(
"modules.auto_role.rule.add.error.emoji_not_found"
).format(emoji_name, auto_role),
self._t.transform("modules.auto_role.rule.add.error.emoji_not_found").format(emoji_name, auto_role),
)
self._logger.trace(__name__, f"Finished command auto-role add")
return
@@ -319,9 +279,7 @@ class AutoRoleGroup(DiscordCommandABC):
self._logger.debug(__name__, f"auto-role rule add role {role_id} not found")
await self._message_service.send_ctx_msg(
ctx,
self._t.transform(
"modules.auto_role.rule.add.error.role_not_found"
).format(role_id, auto_role),
self._t.transform("modules.auto_role.rule.add.error.role_not_found").format(role_id, auto_role),
)
self._logger.trace(__name__, f"Finished command auto-role add")
return
@@ -330,9 +288,7 @@ class AutoRoleGroup(DiscordCommandABC):
if auto_role_from_db is None:
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.auto_role.remove.error.not_found").format(
auto_role
),
self._t.transform("modules.auto_role.remove.error.not_found").format(auto_role),
)
self._logger.trace(__name__, f"Finished command auto-role rule add")
return
@@ -345,16 +301,12 @@ class AutoRoleGroup(DiscordCommandABC):
):
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.auto_role.add.error.already_exists").format(
auto_role
),
self._t.transform("modules.auto_role.add.error.already_exists").format(auto_role),
)
self._logger.trace(__name__, f"Finished command auto-role rule add")
return
self._auto_roles.add_auto_role_rule(
AutoRoleRule(auto_role, emoji_name, int(role_id))
)
self._auto_roles.add_auto_role_rule(AutoRoleRule(auto_role, emoji_name, int(role_id)))
self._db_context.save_changes()
rule = (
self._auto_roles.get_auto_role_rules_by_auto_role_id(auto_role)
@@ -365,11 +317,7 @@ class AutoRoleGroup(DiscordCommandABC):
guild: Guild = self._bot.guilds.where(lambda g: g == ctx.guild).single()
channel = guild.get_channel(auto_role_from_db.discord_channel_id)
message = await channel.fetch_message(auto_role_from_db.discord_message_id)
emoji = (
List(discord.Emoji, guild.emojis)
.where(lambda x: x.name == rule.emoji_name)
.single()
)
emoji = List(discord.Emoji, guild.emojis).where(lambda x: x.name == rule.emoji_name).single()
if emoji is None:
self._logger.debug(__name__, f"Emoji {rule.emoji_name} not found")
@@ -388,28 +336,20 @@ class AutoRoleGroup(DiscordCommandABC):
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.auto_role.rule.add.success").format(
emoji, role.mention, auto_role
),
self._t.transform("modules.auto_role.rule.add.success").format(emoji, role.mention, auto_role),
)
self._logger.trace(__name__, f"Finished command auto-role rule add")
@add.autocomplete("auto_role")
async def add_autocomplete(
self, interaction: discord.Interaction, current: str
) -> TList[app_commands.Choice[str]]:
async def add_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
return await self._auto_role_auto_complete(interaction, current)
@add.autocomplete("emoji_name")
async def add_autocomplete(
self, interaction: discord.Interaction, current: str
) -> TList[app_commands.Choice[str]]:
async def add_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
emojis = List(discord.Emoji, interaction.guild.emojis)
return [
app_commands.Choice(name=emoji.name, value=emoji.name)
for emoji in self._client_utils.get_auto_complete_list(
emojis, current, lambda e: e.name
)
for emoji in self._client_utils.get_auto_complete_list(emojis, current, lambda e: e.name)
]
@add.autocomplete("role_id")
@@ -419,9 +359,7 @@ class AutoRoleGroup(DiscordCommandABC):
roles = List(discord.Role, interaction.guild.roles)
return [
app_commands.Choice(name=role.name, value=str(role.id))
for role in self._client_utils.get_auto_complete_list(
roles, current, lambda r: r.name
)
for role in self._client_utils.get_auto_complete_list(roles, current, lambda r: r.name)
]
@rule.command()
@@ -429,18 +367,14 @@ class AutoRoleGroup(DiscordCommandABC):
@CommandChecks.check_is_ready()
@CommandChecks.check_is_member_moderator()
async def remove(self, ctx: Context, auto_role_rule: int):
self._logger.debug(
__name__, f"Received command auto-role remove {ctx} {auto_role_rule}"
)
self._logger.debug(__name__, f"Received command auto-role remove {ctx} {auto_role_rule}")
auto_role_from_db = self._auto_roles.get_auto_role_rule_by_id(auto_role_rule)
if auto_role_from_db is None:
self._logger.debug(__name__, f"auto-role rule {auto_role_rule} not found")
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.auto_role.remove.error.not_found").format(
auto_role_rule
),
self._t.transform("modules.auto_role.remove.error.not_found").format(auto_role_rule),
)
self._logger.trace(__name__, f"Finished command auto-role rule remove")
return
@@ -450,9 +384,7 @@ class AutoRoleGroup(DiscordCommandABC):
self._logger.info(__name__, f"Removed auto-role rule {auto_role_rule}")
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.auto_role.rule.remove.success").format(
auto_role_rule
),
self._t.transform("modules.auto_role.rule.remove.success").format(auto_role_rule),
)
self._logger.trace(__name__, f"Finished command auto-role remove")
@@ -461,18 +393,12 @@ class AutoRoleGroup(DiscordCommandABC):
self, interaction: discord.Interaction, current: str
) -> TList[app_commands.Choice[str]]:
server = self._servers.get_server_by_discord_id(interaction.guild.id)
auto_roles = self._auto_roles.get_auto_roles_by_server_id(
server.server_id
).select(lambda x: x.auto_role_id)
rules = auto_roles.select_many(
lambda ar: self._auto_roles.get_auto_role_rules_by_auto_role_id(ar)
)
auto_roles = self._auto_roles.get_auto_roles_by_server_id(server.server_id).select(lambda x: x.auto_role_id)
rules = auto_roles.select_many(lambda ar: self._auto_roles.get_auto_role_rules_by_auto_role_id(ar))
return [
app_commands.Choice(
name=f"{rule.auto_role_rule_id} {rule.emoji_name} {interaction.guild.get_role(int(rule.role_id))}",
value=rule.auto_role_rule_id,
)
for rule in self._client_utils.get_auto_complete_list(
rules, current, lambda r: r.auto_role_rule_id
)
for rule in self._client_utils.get_auto_complete_list(rules, current, lambda r: r.auto_role_rule_id)
]

View File

@@ -23,9 +23,7 @@ class AutoRoleReactionHandler:
self._servers = servers
self._auto_roles = auto_roles
self._message_ids = self._auto_roles.get_auto_roles().select(
lambda x: x.discord_message_id
)
self._message_ids = self._auto_roles.get_auto_roles().select(lambda x: x.discord_message_id)
self._roles = self._auto_roles.get_auto_roles()
async def handle(self, payload: RawReactionActionEvent, r_type=None) -> None:
@@ -37,9 +35,7 @@ class AutoRoleReactionHandler:
guild = self._bot.get_guild(payload.guild_id)
user = guild.get_member(payload.user_id)
if user is None:
self._logger.warn(
__name__, f"User {payload.user_id} in {guild.name} not found - skipping"
)
self._logger.warn(__name__, f"User {payload.user_id} in {guild.name} not found - skipping")
return
if user.bot:
@@ -54,9 +50,7 @@ class AutoRoleReactionHandler:
self._logger.debug(__name__, f"auto-role for message not found - skipping")
return
rules: List[
AutoRoleRule
] = self._auto_roles.get_auto_role_rules_by_auto_role_id(auto_role.auto_role_id)
rules: List[AutoRoleRule] = self._auto_roles.get_auto_role_rules_by_auto_role_id(auto_role.auto_role_id)
if rules.count() == 0:
self._logger.debug(__name__, f"auto-role rules not found - skipping")
return

View File

@@ -37,14 +37,10 @@ class BaseModule(ModuleABC):
def __init__(self, dc: DiscordCollectionABC):
ModuleABC.__init__(self, dc, FeatureFlagsEnum.base_module)
def configure_configuration(
self, config: ConfigurationABC, env: ApplicationEnvironmentABC
):
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
pass
def configure_services(
self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC
):
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_transient(BaseHelperABC, BaseHelperService)
services.add_transient(BaseReactionHandler)
# commands
@@ -59,22 +55,12 @@ class BaseModule(ModuleABC):
self._dc.add_command(UserGroup)
# events
self._dc.add_event(DiscordEventTypesEnum.on_command.value, BaseOnCommandEvent)
self._dc.add_event(
DiscordEventTypesEnum.on_command_error.value, BaseOnCommandErrorEvent
)
self._dc.add_event(
DiscordEventTypesEnum.on_member_join.value, BaseOnMemberJoinEvent
)
self._dc.add_event(
DiscordEventTypesEnum.on_member_remove.value, BaseOnMemberRemoveEvent
)
self._dc.add_event(DiscordEventTypesEnum.on_command_error.value, BaseOnCommandErrorEvent)
self._dc.add_event(DiscordEventTypesEnum.on_member_join.value, BaseOnMemberJoinEvent)
self._dc.add_event(DiscordEventTypesEnum.on_member_remove.value, BaseOnMemberRemoveEvent)
self._dc.add_event(DiscordEventTypesEnum.on_message.value, BaseOnMessageEvent)
self._dc.add_event(
DiscordEventTypesEnum.on_message_delete.value, BaseOnMessageDeleteEvent
)
self._dc.add_event(
DiscordEventTypesEnum.on_raw_reaction_add.value, BaseOnRawReactionAddEvent
)
self._dc.add_event(DiscordEventTypesEnum.on_message_delete.value, BaseOnMessageDeleteEvent)
self._dc.add_event(DiscordEventTypesEnum.on_raw_reaction_add.value, BaseOnRawReactionAddEvent)
self._dc.add_event(
DiscordEventTypesEnum.on_raw_reaction_remove.value,
BaseOnRawReactionRemoveEvent,

View File

@@ -39,9 +39,7 @@ class AFKCommand(DiscordCommandABC):
@CommandChecks.check_is_ready()
async def afk(self, ctx: Context):
self._logger.debug(__name__, f"Received command afk {ctx}")
settings: BaseServerSettings = self._config.get_configuration(
f"BaseServerSettings_{ctx.guild.id}"
)
settings: BaseServerSettings = self._config.get_configuration(f"BaseServerSettings_{ctx.guild.id}")
if ctx.author.voice is None or ctx.author.voice.channel is None:
await self._message_service.send_ctx_msg(
@@ -52,9 +50,7 @@ class AFKCommand(DiscordCommandABC):
return
self._bot.loop.create_task(
self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.base.afk_command_move_message")
)
self._message_service.send_ctx_msg(ctx, self._t.transform("modules.base.afk_command_move_message"))
)
channel: VoiceChannel = ctx.guild.get_channel(settings.afk_command_channel_id)
try:
@@ -66,8 +62,6 @@ class AFKCommand(DiscordCommandABC):
f"Cannot move user {ctx.author.id} to channel {ctx.channel.id}",
e,
)
await self._message_service.send_ctx_msg(
ctx, self._t.transform("common.no_permission_message")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("common.no_permission_message"))
self._logger.trace(__name__, f"Finished afk command")

View File

@@ -39,9 +39,7 @@ class HelpCommand(DiscordCommandABC):
@CommandChecks.check_is_ready()
async def help(self, ctx: Context, persistent_flag: str = None):
self._logger.debug(__name__, f"Received command help {ctx}:{persistent_flag}")
settings: BaseServerSettings = self._config.get_configuration(
f"BaseServerSettings_{ctx.guild.id}"
)
settings: BaseServerSettings = self._config.get_configuration(f"BaseServerSettings_{ctx.guild.id}")
is_persistent = persistent_flag == "--stay"
await self._message_service.send_ctx_msg(
ctx,
@@ -52,8 +50,6 @@ class HelpCommand(DiscordCommandABC):
self._logger.trace(__name__, f"Finished help command")
@help.autocomplete("persistent_flag")
async def help_autocomplete(
self, interaction: discord.Interaction, current: str
) -> List[app_commands.Choice[str]]:
async def help_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
flags = ["--stay"]
return [app_commands.Choice(name=key, value=key) for key in flags]

View File

@@ -55,10 +55,7 @@ class InfoCommand(DiscordCommandABC):
)
start_time = self._config.get_configuration("Bot_StartTime")
ontime = round(
(
datetime.now() - datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S.%f")
).total_seconds()
/ 3600,
(datetime.now() - datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S.%f")).total_seconds() / 3600,
2,
)
embed.add_field(

View File

@@ -56,9 +56,7 @@ class MassMoveCommand(DiscordCommandABC):
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.base.mass_move.moved").format(
channel_from.mention, channel_to.mention
),
self._t.transform("modules.base.mass_move.moved").format(channel_from.mention, channel_to.mention),
)
self._logger.trace(__name__, f"Finished mass-move command")

View File

@@ -59,16 +59,10 @@ class PingCommand(DiscordCommandABC):
color=int("ef9d0d", 16),
)
server = self._servers.get_server_by_discord_id(ctx.guild.id)
settings: BaseServerSettings = self._base_helper.get_config(
server.discord_server_id
)
settings: BaseServerSettings = self._base_helper.get_config(server.discord_server_id)
for server in settings.ping_urls:
embed.add_field(
name=server, value=f"{self._get_ping(server)} ms", inline=False
)
embed.add_field(name=server, value=f"{self._get_ping(server)} ms", inline=False)
await self._message_service.send_ctx_msg(ctx, embed)
else:
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.base.pong")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.base.pong"))
self._logger.trace(__name__, f"Finished ping command")

View File

@@ -34,9 +34,7 @@ class PresenceCommand(DiscordCommandABC):
if text == "":
await self._bot.change_presence(activity=None)
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.base.presence.removed")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.base.presence.removed"))
return
if len(text) > 128:
@@ -46,8 +44,6 @@ class PresenceCommand(DiscordCommandABC):
return
await self._bot.change_presence(activity=discord.Game(name=text))
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.base.presence.changed")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.base.presence.changed"))
self._logger.trace(__name__, f"Finished presence command")

View File

@@ -41,20 +41,14 @@ class PurgeCommand(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def purge(self, ctx: Context):
self._logger.debug(__name__, f"Received command purge {ctx}")
server_settings: ServerSettings = self._config.get_configuration(
f"ServerSettings_{ctx.guild.id}"
)
server_settings: ServerSettings = self._config.get_configuration(f"ServerSettings_{ctx.guild.id}")
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.moderator.purge_message")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.moderator.purge_message"))
await asyncio.sleep(server_settings.message_delete_timer)
try:
await ctx.channel.purge()
except Exception as e:
self._logger.error(__name__, f"Cannot purge channel {ctx.channel.id}", e)
await self._message_service.send_ctx_msg(
ctx, self._t.transform("common.bot_has_no_permission_message")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("common.bot_has_no_permission_message"))
self._logger.trace(__name__, f"Finished purge command")

View File

@@ -81,9 +81,7 @@ class UserGroup(DiscordCommandABC):
member = ctx.author
server = self._servers.find_server_by_discord_id(ctx.guild.id)
user = self._users.find_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
if atr == "xp":
if is_remove:
@@ -104,9 +102,7 @@ class UserGroup(DiscordCommandABC):
type = "add" if not is_remove else "remove"
await self._message_service.send_interaction_msg(
ctx.interaction,
self._t.transform(f"modules.base.user.{type}.{atr.lower()}").format(
atr, value, member.mention
),
self._t.transform(f"modules.base.user.{type}.{atr.lower()}").format(atr, value, member.mention),
)
@commands.hybrid_group()
@@ -117,41 +113,25 @@ class UserGroup(DiscordCommandABC):
@user.command()
@commands.guild_only()
@CommandChecks.check_is_ready()
async def info(
self, ctx: Context, member: Optional[discord.Member] = None, *, wait: int = None
):
self._logger.debug(
__name__, f"Received command user-info {ctx}:{member},{wait}"
)
async def info(self, ctx: Context, member: Optional[discord.Member] = None, *, wait: int = None):
self._logger.debug(__name__, f"Received command user-info {ctx}:{member},{wait}")
is_mod = self._permissions.is_member_moderator(ctx.author)
if member is not None and not is_mod:
await self._message_service.send_ctx_msg(
ctx, self._t.transform("common.no_permission_message")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("common.no_permission_message"))
return
if member is None or not isinstance(member, discord.Member):
member = ctx.author
server = self._servers.find_server_by_discord_id(ctx.guild.id)
user = self._users.find_user_by_discord_id_and_server_id(
member.id, server.server_id
)
joins = self._user_joined_servers.get_user_joined_servers_by_user_id(
user.user_id
)
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
joins = self._user_joined_servers.get_user_joined_servers_by_user_id(user.user_id)
embed = discord.Embed(
title=member.name, description=member.name, color=int("ef9d0d", 16)
)
embed = discord.Embed(title=member.name, description=member.name, color=int("ef9d0d", 16))
embed.add_field(
name=self._t.transform("modules.base.user.atr.id"), value=member.id
)
embed.add_field(
name=self._t.transform("modules.base.user.atr.name"), value=member.name
)
embed.add_field(name=self._t.transform("modules.base.user.atr.id"), value=member.id)
embed.add_field(name=self._t.transform("modules.base.user.atr.name"), value=member.name)
embed.add_field(
name=self._t.transform("modules.base.user.atr.discord_join"),
value=self._date.transform(member.created_at),
@@ -162,9 +142,7 @@ class UserGroup(DiscordCommandABC):
value=self._date.transform(member.joined_at),
inline=False,
)
embed.add_field(
name=self._t.transform("modules.base.user.atr.xp"), value=str(user.xp)
)
embed.add_field(name=self._t.transform("modules.base.user.atr.xp"), value=str(user.xp))
embed.add_field(
name=self._t.transform("modules.base.user.atr.ontime"),
value=str(self._client_utils.get_ontime_for_user(user)),
@@ -210,9 +188,7 @@ class UserGroup(DiscordCommandABC):
)
# send to interaction because of sensitive data
await self._message_service.send_interaction_msg(
ctx.interaction, embed, wait_before_delete=wait
)
await self._message_service.send_interaction_msg(ctx.interaction, embed, wait_before_delete=wait)
self._logger.trace(__name__, f"Finished user-info command")
@user.command()
@@ -223,18 +199,14 @@ class UserGroup(DiscordCommandABC):
is_mod = self._permissions.is_member_moderator(ctx.author)
if member is not None and not is_mod:
await self._message_service.send_ctx_msg(
ctx, self._t.transform("common.no_permission_message")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("common.no_permission_message"))
return
if member is None or not isinstance(member, discord.Member):
member = ctx.author
server = self._servers.find_server_by_discord_id(ctx.guild.id)
user = self._users.find_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
if atr == "xp":
value = str(user.xp)
@@ -251,43 +223,31 @@ class UserGroup(DiscordCommandABC):
await self._message_service.send_interaction_msg(
ctx.interaction,
self._t.transform(f"modules.base.user.get.{atr.lower()}").format(
member.mention, value
),
self._t.transform(f"modules.base.user.get.{atr.lower()}").format(member.mention, value),
)
@get.autocomplete("atr")
async def get_autocomplete(
self, interaction: discord.Interaction, current: str
) -> List[app_commands.Choice[str]]:
return [
app_commands.Choice(name=value, value=key) for key, value in self._atr_list
]
async def get_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
return [app_commands.Choice(name=value, value=key) for key, value in self._atr_list]
@user.command()
@commands.guild_only()
@CommandChecks.check_is_ready()
@CommandChecks.check_is_member_moderator()
async def set(
self, ctx: Context, atr: str, value: int, member: discord.Member = None
):
async def set(self, ctx: Context, atr: str, value: int, member: discord.Member = None):
self._logger.debug(__name__, f"Received command user-set {atr} {ctx}:{member}")
if member is None or not isinstance(member, discord.Member):
member = ctx.author
server = self._servers.find_server_by_discord_id(ctx.guild.id)
user = self._users.find_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
if atr == "xp":
try:
user.xp = value
except TypeError as te:
self._logger.error(
__name__, f"String value couldn't be converted to int", te
)
self._logger.error(__name__, f"String value couldn't be converted to int", te)
await self._message_service.send_interaction_msg(
ctx.interaction,
self._t.transform("modules.base.user.set.error.type_error"),
@@ -307,15 +267,11 @@ class UserGroup(DiscordCommandABC):
await self._message_service.send_interaction_msg(
ctx.interaction,
self._t.transform(f"modules.base.user.set.{atr.lower()}").format(
member.mention, value
),
self._t.transform(f"modules.base.user.set.{atr.lower()}").format(member.mention, value),
)
@set.autocomplete("atr")
async def set_autocomplete(
self, interaction: discord.Interaction, current: str
) -> List[app_commands.Choice[str]]:
async def set_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
atr_list = [("xp", self._atr_dict["xp"])]
return [app_commands.Choice(name=value, value=key) for key, value in atr_list]
@@ -323,18 +279,12 @@ class UserGroup(DiscordCommandABC):
@commands.guild_only()
@CommandChecks.check_is_ready()
@CommandChecks.check_is_member_moderator()
async def add(
self, ctx: Context, atr: str, value: int, member: discord.Member = None
):
self._logger.debug(
__name__, f"Received command user-add {atr}-={value} {ctx}:{member}"
)
async def add(self, ctx: Context, atr: str, value: int, member: discord.Member = None):
self._logger.debug(__name__, f"Received command user-add {atr}-={value} {ctx}:{member}")
await self._handle_atr_calc(ctx, atr, value, member)
@add.autocomplete("atr")
async def set_autocomplete(
self, interaction: discord.Interaction, current: str
) -> List[app_commands.Choice[str]]:
async def set_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
atr_list = [("xp", self._atr_dict["xp"])]
return [app_commands.Choice(name=value, value=key) for key, value in atr_list]
@@ -342,18 +292,12 @@ class UserGroup(DiscordCommandABC):
@commands.guild_only()
@CommandChecks.check_is_ready()
@CommandChecks.check_is_member_moderator()
async def remove(
self, ctx: Context, atr: str, value: int, member: discord.Member = None
):
self._logger.debug(
__name__, f"Received command user-remove {atr}-={value} {ctx}:{member}"
)
async def remove(self, ctx: Context, atr: str, value: int, member: discord.Member = None):
self._logger.debug(__name__, f"Received command user-remove {atr}-={value} {ctx}:{member}")
await self._handle_atr_calc(ctx, atr, value, member, is_remove=True)
@remove.autocomplete("atr")
async def set_autocomplete(
self, interaction: discord.Interaction, current: str
) -> List[app_commands.Choice[str]]:
async def set_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
atr_list = [("xp", self._atr_dict["xp"])]
return [app_commands.Choice(name=value, value=key) for key, value in atr_list]
@@ -362,17 +306,13 @@ class UserGroup(DiscordCommandABC):
@CommandChecks.check_is_ready()
@CommandChecks.check_is_member_moderator()
async def reset(self, ctx: Context, atr: str, member: discord.Member = None):
self._logger.debug(
__name__, f"Received command user-reset {atr} {ctx}:{member}"
)
self._logger.debug(__name__, f"Received command user-reset {atr} {ctx}:{member}")
if member is None or not isinstance(member, discord.Member):
member = ctx.author
server = self._servers.find_server_by_discord_id(ctx.guild.id)
user = self._users.find_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
if atr == "xp":
user.xp = 0
@@ -381,9 +321,7 @@ class UserGroup(DiscordCommandABC):
await self._level.check_level(member)
elif atr == "ontime":
self._user_joined_voice_channel.delete_user_joined_voice_channel_by_user_id(
user.user_id
)
self._user_joined_voice_channel.delete_user_joined_voice_channel_by_user_id(user.user_id)
self._db.save_changes()
else:
@@ -395,15 +333,11 @@ class UserGroup(DiscordCommandABC):
await self._message_service.send_interaction_msg(
ctx.interaction,
self._t.transform(f"modules.base.user.reset.{atr.lower()}").format(
atr, member.mention
),
self._t.transform(f"modules.base.user.reset.{atr.lower()}").format(atr, member.mention),
)
@reset.autocomplete("atr")
async def reset_autocomplete(
self, interaction: discord.Interaction, current: str
) -> List[app_commands.Choice[str]]:
return [
app_commands.Choice(name=value, value=key) for key, value in self._atr_list
]
return [app_commands.Choice(name=value, value=key) for key, value in self._atr_list]

View File

@@ -81,9 +81,5 @@ class BaseServerSettings(ConfigurationModelABC):
for url in settings["PingURLs"]:
self._ping_urls.append(url)
except Exception as e:
Console.error(
f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings"
)
Console.error(
f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}"
)
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -27,9 +27,5 @@ class BaseSettings(ConfigurationModelABC):
servers.append(st)
self._servers = servers
except Exception as e:
Console.error(
f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings"
)
Console.error(
f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}"
)
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -169,9 +169,7 @@ class BaseOnCommandErrorEvent(OnCommandErrorABC):
)
elif isinstance(error, commands.NotOwner):
await self._messenger.send_ctx_msg(
ctx, self._t.transform("common.errors.not_owner"), without_tracking=True
)
await self._messenger.send_ctx_msg(ctx, self._t.transform("common.errors.not_owner"), without_tracking=True)
elif isinstance(error, commands.MissingPermissions):
await self._messenger.send_ctx_msg(
@@ -263,19 +261,13 @@ class BaseOnCommandErrorEvent(OnCommandErrorABC):
self._t.transform("common.errors.command_error"),
without_tracking=True,
)
message = self._t.transform(
"modules.base.technician_command_error_message"
).format(
message = self._t.transform("modules.base.technician_command_error_message").format(
ctx.command,
ctx.author,
error,
datetime.datetime.now().strftime(
self._time_format_settings.date_time_format
),
datetime.datetime.now().strftime(self._time_format_settings.date_time_format),
uid,
)
for t in self._bot_settings.technicians:
member = self._bot.get_user(t)
await self._messenger.send_dm_message(
message, member, without_tracking=True
)
await self._messenger.send_dm_message(message, member, without_tracking=True)

View File

@@ -52,9 +52,7 @@ class BaseOnCommandEvent(OnCommandABC):
self._clients.append_received_command_count(self._bot.user.id, g_id, 1)
self._db.save_changes()
except Exception as e:
self._logger.error(
__name__, f"Cannot edit client {self._bot.user.id}@{g_id}", e
)
self._logger.error(__name__, f"Cannot edit client {self._bot.user.id}@{g_id}", e)
def _handle_message_for_xp(self, message: discord.Message):
dc_user_id = message.author.id
@@ -66,9 +64,7 @@ class BaseOnCommandEvent(OnCommandABC):
user: Optional[User] = None
try:
user = self._users.get_user_by_discord_id_and_server_id(
dc_user_id, server.server_id
)
user = self._users.get_user_by_discord_id_and_server_id(dc_user_id, server.server_id)
except Exception as e:
self._logger.error(__name__, f"Cannot get user {dc_user_id}", e)
return
@@ -83,15 +79,11 @@ class BaseOnCommandEvent(OnCommandABC):
self._users.update_user(user)
self._db.save_changes()
self._logger.debug(
__name__, f"User {user} sent message. xp: from {old_xp} to {user.xp}"
)
self._logger.debug(__name__, f"User {user} sent message. xp: from {old_xp} to {user.xp}")
async def on_command(self, ctx: Context):
self._logger.debug(__name__, f"Module {type(self)} started")
self._logger.info(
__name__, f"Received command: {ctx.command} from {ctx.channel}"
)
self._logger.info(__name__, f"Received command: {ctx.command} from {ctx.channel}")
if ctx is None or ctx.guild is None:
return
self._append_received_command_count(ctx.guild.id)

View File

@@ -63,9 +63,7 @@ class BaseOnMemberJoinEvent(OnMemberJoinABC):
except Exception as e:
self._logger.error(__name__, f"Cannot get user {member.id}", e)
async def _add_if_not_exists_user_async(
self, member: Union[discord.User, discord.Member]
):
async def _add_if_not_exists_user_async(self, member: Union[discord.User, discord.Member]):
self._logger.debug(__name__, f"Check if user exists {member}")
settings: BaseServerSettings = self._base_helper.get_config(member.guild.id)
await self._messenger.send_dm_message(
@@ -75,41 +73,29 @@ class BaseOnMemberJoinEvent(OnMemberJoinABC):
for admin in self._permission_service.get_admins(member.guild.id):
await self._messenger.send_dm_message(
self._t.transform("modules.base.welcome_message_for_team").format(
member.mention
),
self._t.transform("modules.base.welcome_message_for_team").format(member.mention),
admin,
)
for moderator in self._permission_service.get_moderators(member.guild.id):
await self._messenger.send_dm_message(
self._t.transform("modules.base.welcome_message_for_team").format(
member.mention
),
self._t.transform("modules.base.welcome_message_for_team").format(member.mention),
moderator,
)
try:
server = self._servers.get_server_by_discord_id(member.guild.id)
user = self._users.find_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
if user is not None:
self._user_joins.add_user_joined_server(
UserJoinedServer(user, datetime.now())
)
self._user_joins.add_user_joined_server(UserJoinedServer(user, datetime.now()))
self._db.save_changes()
return
self._logger.debug(__name__, f"Add user: {member.id}")
self._users.add_user(User(member.id, 0, server))
self._db.save_changes()
user = self._users.get_user_by_discord_id_and_server_id(
member.id, server.server_id
)
self._user_joins.add_user_joined_server(
UserJoinedServer(user, datetime.now())
)
user = self._users.get_user_by_discord_id_and_server_id(member.id, server.server_id)
self._user_joins.add_user_joined_server(UserJoinedServer(user, datetime.now()))
self._db.save_changes()
except Exception as e:
self._logger.error(__name__, f"Cannot get user {member.id}", e)

View File

@@ -42,23 +42,17 @@ class BaseOnMemberRemoveEvent(OnMemberRemoveABC):
async def _remove_user(self, member: Union[discord.User, discord.Member]):
self._logger.debug(__name__, f"Remove user {member}")
settings: BaseServerSettings = self._base_helper.get_config(member.guild.id)
await self._messenger.send_dm_message(
self._t.transform("modules.base.goodbye_message"), member
)
await self._messenger.send_dm_message(self._t.transform("modules.base.goodbye_message"), member)
try:
server = self._servers.get_server_by_discord_id(member.guild.id)
user = self._users.find_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
if user is None:
self._logger.error(__name__, f"Cannot find user {member}")
return
join = self._user_joins.get_active_user_joined_server_by_user_id(
user.user_id
)
join = self._user_joins.get_active_user_joined_server_by_user_id(user.user_id)
join.leaved_on = datetime.now()
self._user_joins.update_user_joined_server(join)
self._db.save_changes()

View File

@@ -40,9 +40,7 @@ class BaseOnMessageDeleteEvent(OnMessageDeleteABC):
self._clients.append_deleted_message_count(self._bot.user.id, g_id, 1)
self._db.save_changes()
except Exception as e:
self._logger.error(
__name__, f"Cannot edit client {self._bot.user.id}@{g_id}", e
)
self._logger.error(__name__, f"Cannot edit client {self._bot.user.id}@{g_id}", e)
def _handle_message_delete(self, message: discord.Message):
dc_user_id = message.author.id
@@ -54,9 +52,7 @@ class BaseOnMessageDeleteEvent(OnMessageDeleteABC):
user: Optional[User] = None
try:
user = self._users.find_user_by_discord_id_and_server_id(
dc_user_id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(dc_user_id, server.server_id)
except Exception as e:
self._logger.error(__name__, f"Cannot get user {dc_user_id}", e)
return
@@ -81,9 +77,7 @@ class BaseOnMessageDeleteEvent(OnMessageDeleteABC):
if message is None or message.guild is None:
return
self._logger.info(
__name__, f"Received message: {LogMessageHelper.get_log_string(message)}"
)
self._logger.info(__name__, f"Received message: {LogMessageHelper.get_log_string(message)}")
self._append_deleted_message_count(message.guild.id)
if not message.author.bot:

View File

@@ -45,9 +45,7 @@ class BaseOnMessageEvent(OnMessageABC):
self._clients.append_received_message_count(self._bot.user.id, g_id, 1)
self._db.save_changes()
except Exception as e:
self._logger.error(
__name__, f"Cannot edit client {self._bot.user.id}@{g_id}", e
)
self._logger.error(__name__, f"Cannot edit client {self._bot.user.id}@{g_id}", e)
def _handle_message_for_xp(self, message: discord.Message):
dc_user_id = message.author.id
@@ -59,9 +57,7 @@ class BaseOnMessageEvent(OnMessageABC):
user: Optional[User] = None
try:
user = self._users.find_user_by_discord_id_and_server_id(
dc_user_id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(dc_user_id, server.server_id)
except Exception as e:
self._logger.error(__name__, f"Cannot get user {dc_user_id}", e)
return
@@ -81,9 +77,7 @@ class BaseOnMessageEvent(OnMessageABC):
self._users.update_user(user)
self._db.save_changes()
self._logger.debug(
__name__, f"User {user} sent message. xp: from {old_xp} to {user.xp}"
)
self._logger.debug(__name__, f"User {user} sent message. xp: from {old_xp} to {user.xp}")
@EventChecks.check_is_ready()
async def on_message(self, message: discord.Message):
@@ -91,9 +85,7 @@ class BaseOnMessageEvent(OnMessageABC):
if message is None or message.guild is None:
return
self._logger.info(
__name__, f"Received message: {LogMessageHelper.get_log_string(message)}"
)
self._logger.info(__name__, f"Received message: {LogMessageHelper.get_log_string(message)}")
self._append_received_message_count(message.guild.id)
if not message.author.bot:

View File

@@ -51,14 +51,10 @@ class BaseOnVoiceStateUpdateEvent(OnVoiceStateUpdateABC):
self._logger.info(__name__, f"Module {type(self)} loaded")
def _update_voice_state(
self, joined: bool, dc_user_id: int, dc_channel_id: int, server: Server
):
def _update_voice_state(self, joined: bool, dc_user_id: int, dc_channel_id: int, server: Server):
user: Optional[User] = None
try:
user = self._users.get_user_by_discord_id_and_server_id(
dc_user_id, server.server_id
)
user = self._users.get_user_by_discord_id_and_server_id(dc_user_id, server.server_id)
except Exception as e:
self._logger.error(__name__, f"Cannot get user {dc_user_id}", e)
return
@@ -74,13 +70,9 @@ class BaseOnVoiceStateUpdateEvent(OnVoiceStateUpdateABC):
self._db.save_changes()
return
settings: BaseServerSettings = self._base_helper.get_config(
server.discord_server_id
)
settings: BaseServerSettings = self._base_helper.get_config(server.discord_server_id)
join = self._user_joins_vc.get_active_user_joined_voice_channel_by_user_id(
user.user_id
)
join = self._user_joins_vc.get_active_user_joined_voice_channel_by_user_id(user.user_id)
join.leaved_on = datetime.now()
# ontime as hours
@@ -136,36 +128,18 @@ class BaseOnVoiceStateUpdateEvent(OnVoiceStateUpdateABC):
# channel to channel
elif before.channel is not None and after.channel is not None:
# joined
if (
before.channel.id in settings.afk_channel_ids
and after.channel.id not in settings.afk_channel_ids
):
self._logger.trace(
__name__, f"User {member.id} joined {after.channel}"
)
if before.channel.id in settings.afk_channel_ids and after.channel.id not in settings.afk_channel_ids:
self._logger.trace(__name__, f"User {member.id} joined {after.channel}")
self._update_voice_state(True, member.id, after.channel.id, server)
# left
elif (
after.channel.id in settings.afk_channel_ids
and before.channel.id not in settings.afk_channel_ids
):
self._logger.trace(
__name__, f"User {member.id} left {before.channel}"
)
self._update_voice_state(
False, member.id, before.channel.id, server
)
elif after.channel.id in settings.afk_channel_ids and before.channel.id not in settings.afk_channel_ids:
self._logger.trace(__name__, f"User {member.id} left {before.channel}")
self._update_voice_state(False, member.id, before.channel.id, server)
else:
self._logger.trace(
__name__, f"User {member.id} switched to {after.channel}"
)
self._update_voice_state(
False, member.id, before.channel.id, server
)
self._logger.trace(__name__, f"User {member.id} switched to {after.channel}")
self._update_voice_state(False, member.id, before.channel.id, server)
self._update_voice_state(True, member.id, after.channel.id, server)
except Exception as e:
self._logger.error(
__name__, f"Cannot handle voice state for user {member.id}", e
)
self._logger.error(__name__, f"Cannot handle voice state for user {member.id}", e)

View File

@@ -43,9 +43,7 @@ class BaseOnVoiceStateUpdateEventHelpChannel(OnVoiceStateUpdateABC):
):
self._logger.debug(__name__, f"Module {type(self)} started")
server = self._servers.get_server_by_discord_id(member.guild.id)
settings: BaseServerSettings = self._base_helper.get_config(
server.discord_server_id
)
settings: BaseServerSettings = self._base_helper.get_config(server.discord_server_id)
if after.channel is None or after.channel.id != settings.help_voice_channel_id:
return
@@ -55,9 +53,7 @@ class BaseOnVoiceStateUpdateEventHelpChannel(OnVoiceStateUpdateABC):
]
for a in mods:
await self._message_service.send_dm_message(
self._t.transform(
"modules.base.member_joined_help_voice_channel"
).format(member.mention),
self._t.transform("modules.base.member_joined_help_voice_channel").format(member.mention),
a,
)

View File

@@ -38,9 +38,7 @@ class BaseReactionHandler:
guild = self._bot.get_guild(payload.guild_id)
member = guild.get_member(payload.user_id)
if member is None:
self._logger.warn(
__name__, f"User {payload.user_id} in {guild.name} not found - skipping"
)
self._logger.warn(__name__, f"User {payload.user_id} in {guild.name} not found - skipping")
return
try:
@@ -55,12 +53,8 @@ class BaseReactionHandler:
f"{log_msg} to message {LogMessageHelper.get_log_string(message)}",
)
except Exception as e:
self._logger.error(
__name__, f"Getting message for reaction logging failed", e
)
self._logger.info(
__name__, f"{log_msg} to message {payload.message_id}"
)
self._logger.error(__name__, f"Getting message for reaction logging failed", e)
self._logger.info(__name__, f"{log_msg} to message {payload.message_id}")
except Exception as e:
self._logger.error(__name__, f"Reaction logging failed", e)
@@ -68,9 +62,7 @@ class BaseReactionHandler:
return
server = self._servers.get_server_by_discord_id(guild.id)
user = self._users.get_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.get_user_by_discord_id_and_server_id(member.id, server.server_id)
settings: BaseServerSettings = self._base_helper.get_config(guild.id)
if r_type == "add":

View File

@@ -14,9 +14,7 @@ class BootLogExtension(ApplicationExtensionABC):
pass
async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
feature_flags: FeatureFlagsSettings = config.get_configuration(
FeatureFlagsSettings
)
feature_flags: FeatureFlagsSettings = config.get_configuration(FeatureFlagsSettings)
if not feature_flags.get_flag(FeatureFlagsEnum.boot_log_module):
return
logger: LoggerABC = services.get_service(LoggerABC)

View File

@@ -13,14 +13,10 @@ class BootLogModule(ModuleABC):
def __init__(self, dc: DiscordCollectionABC):
ModuleABC.__init__(self, dc, FeatureFlagsEnum.boot_log_module)
def configure_configuration(
self, config: ConfigurationABC, env: ApplicationEnvironmentABC
):
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
pass
def configure_services(
self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC
):
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
# commands
# events
self._dc.add_event(DiscordEventTypesEnum.on_ready.value, BootLogOnReadyEvent)

View File

@@ -38,10 +38,7 @@ class BootLogOnReadyEvent(OnReadyABC):
try:
start_time = self._config.get_configuration("Bot_StartTime")
init_time = round(
(
datetime.now()
- datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S.%f")
).total_seconds(),
(datetime.now() - datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S.%f")).total_seconds(),
2,
)
self._config.add_configuration("InitTime", str(init_time))
@@ -52,9 +49,7 @@ class BootLogOnReadyEvent(OnReadyABC):
# print error if initialisation took way too long
elif init_time >= 90:
self._logger.error(
__name__, "It takes far too long to start the bot!!!"
)
self._logger.error(__name__, "It takes far too long to start the bot!!!")
except Exception as e:
self._logger.error(__name__, "Init time calculation failed", e)
return
@@ -63,22 +58,14 @@ class BootLogOnReadyEvent(OnReadyABC):
g: guild = g
self._logger.debug(__name__, f"Server detected: {g.id}")
server_settings: ServerSettings = self._config.get_configuration(
f"ServerSettings_{g.id}"
)
server_settings: ServerSettings = self._config.get_configuration(f"ServerSettings_{g.id}")
if server_settings is None:
self._logger.error(
__name__, f"BootLog settings for server {g.id} not found!"
)
self._logger.error(__name__, f"BootLog settings for server {g.id} not found!")
return
module_settings: BootLogServerSettings = self._config.get_configuration(
f"BootLogServerSettings_{g.id}"
)
module_settings: BootLogServerSettings = self._config.get_configuration(f"BootLogServerSettings_{g.id}")
if module_settings is None:
self._logger.error(
__name__, f"Config {type(self).__name__}_{g.id} not found!"
)
self._logger.error(__name__, f"Config {type(self).__name__}_{g.id} not found!")
return
await self._message_service.send_channel_message(

View File

@@ -24,9 +24,5 @@ class BootLogServerSettings(ConfigurationModelABC):
self._id = int(settings["Id"])
self._login_message_channel_id = int(settings["LoginMessageChannelId"])
except Exception as e:
Console.error(
f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings"
)
Console.error(
f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}"
)
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -29,9 +29,5 @@ class BootLogSettings(ConfigurationModelABC):
servers.append(st)
self._servers = servers
except Exception as e:
Console.error(
f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings"
)
Console.error(
f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}"
)
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -17,9 +17,7 @@ class DatabaseExtension(ApplicationExtensionABC):
pass
async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
feature_flags: FeatureFlagsSettings = config.get_configuration(
FeatureFlagsSettings
)
feature_flags: FeatureFlagsSettings = config.get_configuration(FeatureFlagsSettings)
if not feature_flags.get_flag(FeatureFlagsEnum.data_module):
return
logger: LoggerABC = services.get_service(DatabaseLogger)

View File

@@ -13,14 +13,10 @@ class DatabaseModule(ModuleABC):
def __init__(self, dc: DiscordCollectionABC):
ModuleABC.__init__(self, dc, FeatureFlagsEnum.database_module)
def configure_configuration(
self, config: ConfigurationABC, env: ApplicationEnvironmentABC
):
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
pass
def configure_services(
self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC
):
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
# commands
# events
self._dc.add_event(DiscordEventTypesEnum.on_ready.value, DatabaseOnReadyEvent)

View File

@@ -64,40 +64,29 @@ class DatabaseOnReadyEvent(OnReadyABC):
try:
start_time = self._config.get_configuration("Database_StartTime")
init_time = round(
(
datetime.now()
- datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S.%f")
).total_seconds(),
(datetime.now() - datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S.%f")).total_seconds(),
2,
)
self._config.add_configuration("Database_InitTime", str(init_time))
self._logger.debug(__name__, f"Database Init time: {init_time}s")
# print warning if initialisation took too long
if init_time >= 30:
self._logger.warn(
__name__, "It takes too long to prepare the database!"
)
self._logger.warn(__name__, "It takes too long to prepare the database!")
# print error if initialisation took way too long
elif init_time >= 90:
self._logger.error(
__name__, "It takes far too long to prepare the database!!!"
)
self._logger.error(__name__, "It takes far too long to prepare the database!!!")
except Exception as e: #
self._logger.error(__name__, "Database init time calculation failed", e)
return
def _check_known_users(self):
self._logger.debug(
__name__, f"Start checking KnownUsers table, {len(self._bot.users)}"
)
self._logger.debug(__name__, f"Start checking KnownUsers table, {len(self._bot.users)}")
for u in self._bot.users:
u: discord.User = u
try:
if u.bot:
self._logger.trace(
__name__, f"User {u.id} is ignored, because its a bot"
)
self._logger.trace(__name__, f"User {u.id} is ignored, because its a bot")
continue
user = self._known_users.find_user_by_discord_id(u.id)
@@ -150,9 +139,7 @@ class DatabaseOnReadyEvent(OnReadyABC):
try:
server: Server = self._servers.find_server_by_discord_id(g.id)
if server is None:
self._logger.fatal(
__name__, f"Server not found in database: {g.id}"
)
self._logger.fatal(__name__, f"Server not found in database: {g.id}")
client = self._clients.find_client_by_server_id(server.server_id)
if client is not None:
@@ -163,9 +150,7 @@ class DatabaseOnReadyEvent(OnReadyABC):
f"Client for server {g.id} not found in database: {self._bot.user.id}",
)
self._logger.debug(__name__, f"Add client: {self._bot.user.id}")
self._clients.add_client(
Client(self._bot.user.id, 0, 0, 0, 0, 0, server)
)
self._clients.add_client(Client(self._bot.user.id, 0, 0, 0, 0, 0, server))
self._db_context.save_changes()
client = self._clients.find_client_by_server_id(server.server_id)
@@ -191,21 +176,15 @@ class DatabaseOnReadyEvent(OnReadyABC):
try:
server = self._servers.find_server_by_discord_id(g.id)
if server is None:
self._logger.fatal(
__name__, f"Server not found in database: {g.id}"
)
self._logger.fatal(__name__, f"Server not found in database: {g.id}")
for u in g.members:
u: Union[discord.Member, discord.User] = u
if u.bot:
self._logger.trace(
__name__, f"User {u.id} is ignored, because its a bot"
)
self._logger.trace(__name__, f"User {u.id} is ignored, because its a bot")
continue
user = self._users.find_user_by_discord_id_and_server_id(
u.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(u.id, server.server_id)
if user is not None:
continue
@@ -229,30 +208,20 @@ class DatabaseOnReadyEvent(OnReadyABC):
server = self._servers.find_server_by_discord_id(guild.id)
if server is None:
self._logger.fatal(
__name__, f"Server not found in database: {guild.id}"
)
self._logger.fatal(__name__, f"Server not found in database: {guild.id}")
try:
for u in guild.members:
u: discord.User = u
if u.bot:
self._logger.trace(
__name__, f"User {u.id} is ignored, because its a bot"
)
self._logger.trace(__name__, f"User {u.id} is ignored, because its a bot")
continue
user = self._users.find_user_by_discord_id_and_server_id(
u.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(u.id, server.server_id)
if user is None:
self._logger.fatal(
__name__, f"User not found in database: {u.id}"
)
self._logger.fatal(__name__, f"User not found in database: {u.id}")
join = self._user_joins.find_active_user_joined_server_by_user_id(
user.user_id
)
join = self._user_joins.find_active_user_joined_server_by_user_id(user.user_id)
if join is not None:
continue
@@ -305,29 +274,19 @@ class DatabaseOnReadyEvent(OnReadyABC):
server = self._servers.find_server_by_discord_id(guild.id)
if server is None:
self._logger.fatal(
__name__, f"Server not found in database: {guild.id}"
)
self._logger.fatal(__name__, f"Server not found in database: {guild.id}")
try:
for member in guild.members:
if member.bot:
self._logger.trace(
__name__, f"User {member.id} is ignored, because its a bot"
)
self._logger.trace(__name__, f"User {member.id} is ignored, because its a bot")
continue
user = self._users.find_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
if user is None:
self._logger.fatal(
__name__, f"User not found in database: {member.id}"
)
self._logger.fatal(__name__, f"User not found in database: {member.id}")
joins = self._user_joins_vc.find_active_user_joined_voice_channels_by_user_id(
user.user_id
)
joins = self._user_joins_vc.find_active_user_joined_voice_channels_by_user_id(user.user_id)
if joins is None or len(joins) == 0:
continue
@@ -337,16 +296,12 @@ class DatabaseOnReadyEvent(OnReadyABC):
f"Active UserJoinedVoiceChannel found in database: {guild.id}:{member.id}@{join.joined_on}",
)
join.leaved_on = datetime.now()
settings: BaseServerSettings = self._config.get_configuration(
f"BaseServerSettings_{guild.id}"
)
settings: BaseServerSettings = self._config.get_configuration(f"BaseServerSettings_{guild.id}")
if (
(join.leaved_on - join.joined_on).total_seconds() / 60 / 60
) > settings.max_voice_state_hours:
join.leaved_on = join.joined_on + timedelta(
hours=settings.max_voice_state_hours
)
join.leaved_on = join.joined_on + timedelta(hours=settings.max_voice_state_hours)
self._user_joins_vc.update_user_joined_voice_channel(join)
# todo: maybe add XP
@@ -354,25 +309,17 @@ class DatabaseOnReadyEvent(OnReadyABC):
for member in guild.members:
if member.bot:
self._logger.trace(
__name__, f"User {member.id} is ignored, because its a bot"
)
self._logger.trace(__name__, f"User {member.id} is ignored, because its a bot")
continue
if member.voice is None:
continue
user = self._users.find_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
if user is None:
self._logger.fatal(
__name__, f"User not found in database: {member.id}"
)
self._logger.fatal(__name__, f"User not found in database: {member.id}")
join = UserJoinedVoiceChannel(
user, member.voice.channel.id, datetime.now()
)
join = UserJoinedVoiceChannel(user, member.voice.channel.id, datetime.now())
self._user_joins_vc.add_user_joined_voice_channel(join)
self._db_context.save_changes()
self._logger.warn(__name__, f"VS {member.voice}")

View File

@@ -102,17 +102,13 @@ class LevelGroup(DiscordCommandABC):
except Exception as e:
self._logger.error(__name__, f"Level seeding failed", e)
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.level.seeding_failed")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.level.seeding_failed"))
async def _level_auto_complete(
self, interaction: discord.Interaction, current: str
) -> TList[app_commands.Choice[str]]:
server = self._servers.get_server_by_discord_id(interaction.guild.id)
levels = self._levels.get_levels_by_server_id(server.server_id).select(
lambda l: l.name
)
levels = self._levels.get_levels_by_server_id(server.server_id).select(lambda l: l.name)
return [
app_commands.Choice(name=level, value=level)
for level in self._client_utils.get_auto_complete_list(levels, current)
@@ -136,9 +132,7 @@ class LevelGroup(DiscordCommandABC):
server = self._servers.get_server_by_discord_id(ctx.guild.id)
levels = self._levels.get_levels_by_server_id(server.server_id)
if levels.count() < 1:
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.level.error.nothing_found")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.level.error.nothing_found"))
self._logger.trace(__name__, f"Finished command level list")
return
@@ -160,9 +154,7 @@ class LevelGroup(DiscordCommandABC):
value=level_name,
inline=True,
)
embed.add_field(
name=self._t.transform("modules.level.list.min_xp"), value=xp, inline=True
)
embed.add_field(name=self._t.transform("modules.level.list.min_xp"), value=xp, inline=True)
embed.add_field(
name=self._t.transform("modules.level.list.permission_int"),
value=permissions,
@@ -175,9 +167,7 @@ class LevelGroup(DiscordCommandABC):
@commands.guild_only()
@CommandChecks.check_is_ready()
@CommandChecks.check_is_member_admin()
async def create(
self, ctx: Context, name: str, color: str, min_xp: int, permissions: int
):
async def create(self, ctx: Context, name: str, color: str, min_xp: int, permissions: int):
self._logger.debug(__name__, f"Received command level create {ctx}")
try:
@@ -203,26 +193,19 @@ class LevelGroup(DiscordCommandABC):
self._logger.debug(__name__, f"Level with name {level.name} already exists")
await self._message_service.send_ctx_msg(
ctx,
self._t.transform(
"modules.level.error.level_with_name_already_exists"
).format(level.name),
self._t.transform("modules.level.error.level_with_name_already_exists").format(level.name),
)
elif (
levels.where(lambda l: l.min_xp == level.min_xp).first_or_default()
is not None
):
elif levels.where(lambda l: l.min_xp == level.min_xp).first_or_default() is not None:
self._logger.debug(
__name__,
f"Level with min_xp {level.min_xp} already exists {level.name}",
)
found_level = levels.where(
lambda l: l.min_xp == level.min_xp
).first_or_default()
found_level = levels.where(lambda l: l.min_xp == level.min_xp).first_or_default()
await self._message_service.send_ctx_msg(
ctx,
self._t.transform(
"modules.level.error.level_with_xp_already_exists"
).format(found_level.name, found_level.min_xp),
self._t.transform("modules.level.error.level_with_xp_already_exists").format(
found_level.name, found_level.min_xp
),
)
else:
try:
@@ -241,9 +224,7 @@ class LevelGroup(DiscordCommandABC):
else:
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.level.create.created").format(
name, permissions
),
self._t.transform("modules.level.create.created").format(name, permissions),
)
await self._seed_levels(ctx)
@@ -280,9 +261,7 @@ class LevelGroup(DiscordCommandABC):
server = self._servers.get_server_by_discord_id(ctx.guild.id)
level_from_db = (
self._levels.get_levels_by_server_id(server.server_id)
.where(lambda l: l.name == level)
.single_or_default()
self._levels.get_levels_by_server_id(server.server_id).where(lambda l: l.name == level).single_or_default()
)
if level_from_db is None:
await self._message_service.send_ctx_msg(
@@ -316,13 +295,9 @@ class LevelGroup(DiscordCommandABC):
except Exception as e:
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.level.edit.permission_invalid").format(
permissions
),
)
self._logger.error(
__name__, f"Error parsing permissions {permissions}", e
self._t.transform("modules.level.edit.permission_invalid").format(permissions),
)
self._logger.error(__name__, f"Error parsing permissions {permissions}", e)
return
try:
@@ -344,9 +319,7 @@ class LevelGroup(DiscordCommandABC):
e,
)
else:
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.level.edit.edited").format(level)
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.level.edit.edited").format(level))
await self._seed_levels(ctx)
self._logger.trace(__name__, f"Finished command level edit")
@@ -380,9 +353,7 @@ class LevelGroup(DiscordCommandABC):
server = self._servers.get_server_by_discord_id(ctx.guild.id)
level_from_db = (
self._levels.get_levels_by_server_id(server.server_id)
.where(lambda l: l.name == level)
.first_or_default()
self._levels.get_levels_by_server_id(server.server_id).where(lambda l: l.name == level).first_or_default()
)
if level_from_db is None:
self._logger.debug(__name__, f"level {level} not found")
@@ -397,9 +368,7 @@ class LevelGroup(DiscordCommandABC):
self._levels.delete_level(level_from_db)
self._db.save_changes()
guild: Guild = self._bot.guilds.where(lambda g: g == ctx.guild).single()
role: Role = guild.roles.where(
lambda r: r.name == level
).single_or_default()
role: Role = guild.roles.where(lambda r: r.name == level).single_or_default()
if role is not None:
await role.delete()
self._logger.info(__name__, f"Removed level {level}")
@@ -430,20 +399,14 @@ class LevelGroup(DiscordCommandABC):
return
server = self._servers.get_server_by_discord_id(ctx.guild.id)
user = self._users.get_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.get_user_by_discord_id_and_server_id(member.id, server.server_id)
level = self._level_service.get_level(user)
levels = self._levels.get_levels_by_server_id(server.server_id).order_by(
lambda l: l.min_xp
)
levels = self._levels.get_levels_by_server_id(server.server_id).order_by(lambda l: l.min_xp)
if level == levels.first():
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.level.down.already_first").format(
member.mention
),
self._t.transform("modules.level.down.already_first").format(member.mention),
)
self._logger.trace(__name__, f"Finished command level down")
return
@@ -455,15 +418,11 @@ class LevelGroup(DiscordCommandABC):
self._db.save_changes()
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.level.down.success").format(
member.mention, new_level.name
),
self._t.transform("modules.level.down.success").format(member.mention, new_level.name),
)
await self._level_service.set_level(user)
except Exception as e:
self._logger.error(
__name__, f"Cannot level down {member.name} with level {level.name}", e
)
self._logger.error(__name__, f"Cannot level down {member.name} with level {level.name}", e)
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.level.down.failed").format(member.mention),
@@ -482,20 +441,14 @@ class LevelGroup(DiscordCommandABC):
return
server = self._servers.get_server_by_discord_id(ctx.guild.id)
user = self._users.get_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.get_user_by_discord_id_and_server_id(member.id, server.server_id)
level = self._level_service.get_level(user)
levels = self._levels.get_levels_by_server_id(server.server_id).order_by(
lambda l: l.min_xp
)
levels = self._levels.get_levels_by_server_id(server.server_id).order_by(lambda l: l.min_xp)
if level.name == levels.last().name:
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.level.up.already_last").format(
member.mention
),
self._t.transform("modules.level.up.already_last").format(member.mention),
)
self._logger.trace(__name__, f"Finished command level up")
return
@@ -507,15 +460,11 @@ class LevelGroup(DiscordCommandABC):
self._db.save_changes()
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.level.up.success").format(
member.mention, new_level.name
),
self._t.transform("modules.level.up.success").format(member.mention, new_level.name),
)
await self._level_service.set_level(user)
except Exception as e:
self._logger.error(
__name__, f"Cannot level up {member.name} with level {level.name}", e
)
self._logger.error(__name__, f"Cannot level up {member.name} with level {level.name}", e)
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.level.up.failed").format(member.mention)
)
@@ -533,14 +482,10 @@ class LevelGroup(DiscordCommandABC):
return
server = self._servers.get_server_by_discord_id(ctx.guild.id)
user = self._users.get_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.get_user_by_discord_id_and_server_id(member.id, server.server_id)
current_level = self._level_service.get_level(user)
new_level = (
self._levels.get_levels_by_server_id(server.server_id)
.where(lambda l: l.name == level)
.single_or_default()
self._levels.get_levels_by_server_id(server.server_id).where(lambda l: l.name == level).single_or_default()
)
if new_level is None:
@@ -553,9 +498,7 @@ class LevelGroup(DiscordCommandABC):
if current_level.name == level:
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.level.set.already_level").format(
member.mention, level
),
self._t.transform("modules.level.set.already_level").format(member.mention, level),
)
self._logger.trace(__name__, f"Finished command level set")
return
@@ -566,15 +509,11 @@ class LevelGroup(DiscordCommandABC):
self._db.save_changes()
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.level.set.success").format(
member.mention, new_level.name
),
self._t.transform("modules.level.set.success").format(member.mention, new_level.name),
)
await self._level_service.set_level(user)
except Exception as e:
self._logger.error(
__name__, f"Cannot set level {level} for {member.name}", e
)
self._logger.error(__name__, f"Cannot set level {level} for {member.name}", e)
await self._message_service.send_ctx_msg(
ctx,
self._t.transform("modules.level.set.failed").format(member.mention),
@@ -583,9 +522,7 @@ class LevelGroup(DiscordCommandABC):
self._logger.trace(__name__, f"Finished command level set")
@set.autocomplete("level")
async def set_autocomplete(
self, interaction: discord.Interaction, current: str
) -> TList[app_commands.Choice[str]]:
async def set_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
return await self._level_auto_complete(interaction, current)
@level.command()

View File

@@ -36,9 +36,5 @@ class DefaultLevelSettings(ConfigurationModelABC):
)
)
except Exception as e:
Console.error(
f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings"
)
Console.error(
f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}"
)
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -22,13 +22,7 @@ class LevelServerSettings(ConfigurationModelABC):
def from_dict(self, settings: dict):
try:
self._id = int(settings["Id"])
self._changed_level_notification_channel = int(
settings["ChangedLevelNotificationChannelId"]
)
self._changed_level_notification_channel = int(settings["ChangedLevelNotificationChannelId"])
except Exception as e:
Console.error(
f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings"
)
Console.error(
f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}"
)
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -27,9 +27,5 @@ class LevelSettings(ConfigurationModelABC):
servers.append(st)
self._servers = servers
except Exception as e:
Console.error(
f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings"
)
Console.error(
f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}"
)
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -22,17 +22,13 @@ class LevelModule(ModuleABC):
def __init__(self, dc: DiscordCollectionABC):
ModuleABC.__init__(self, dc, FeatureFlagsEnum.level_module)
def configure_configuration(
self, config: ConfigurationABC, env: ApplicationEnvironmentABC
):
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
cwd = env.working_directory
env.set_working_directory(os.path.dirname(os.path.realpath(__file__)))
config.add_json_file(f"default-level.json", optional=False)
env.set_working_directory(cwd)
def configure_services(
self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC
):
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_transient(LevelSeeder)
services.add_transient(LevelService)
@@ -45,6 +41,4 @@ class LevelModule(ModuleABC):
DiscordEventTypesEnum.on_voice_state_update.value,
LevelOnVoiceStateUpdateEvent,
)
self._dc.add_event(
DiscordEventTypesEnum.on_member_join.value, LevelOnMemberJoinEvent
)
self._dc.add_event(DiscordEventTypesEnum.on_member_join.value, LevelOnMemberJoinEvent)

View File

@@ -37,10 +37,7 @@ class LevelSeeder(DataSeederABC):
async def _create_level(self, level: Level, guild: Guild, server: Server):
level.server = server
try:
if (
guild.roles.where(lambda r: r.name == level.name).first_or_default()
is None
):
if guild.roles.where(lambda r: r.name == level.name).first_or_default() is None:
await guild.create_role(
name=level.name,
colour=Colour(int(level.color, 16)),
@@ -51,11 +48,7 @@ class LevelSeeder(DataSeederABC):
self._logger.debug(__name__, f"Created role {level.name}")
levels = self._levels.find_levels_by_server_id(server.server_id)
if (
levels is None
or levels.where(lambda l: l.name == level.name).first_or_default()
is None
):
if levels is None or levels.where(lambda l: l.name == level.name).first_or_default() is None:
self._levels.add_level(level)
self._logger.debug(__name__, f"Saved level {level.name}")
except discord.errors.Forbidden as e:
@@ -69,12 +62,7 @@ class LevelSeeder(DataSeederABC):
# create levels
for guild in self._bot.guilds:
created_default = False
if (
guild.roles.where(
lambda r: r.name == self._level_header
).first_or_default()
is None
):
if guild.roles.where(lambda r: r.name == self._level_header).first_or_default() is None:
await guild.create_role(name=self._level_header)
server = self._servers.find_server_by_discord_id(guild.id)
@@ -100,20 +88,13 @@ class LevelSeeder(DataSeederABC):
continue
levels = levels.order_by_descending(lambda l: l.min_xp)
position_above_levels = (
guild.roles.where(lambda r: r.name == self._level_header)
.single()
.position
)
position_above_levels = guild.roles.where(lambda r: r.name == self._level_header).single().position
for role in guild.roles.order_by_descending(lambda r: r.position):
if levels.where(lambda l: l.name == role.name).count() == 0:
continue
new_position = position_above_levels - (
levels.index_of(
levels.where(lambda l: l.name == role.name).single()
)
+ 1
levels.index_of(levels.where(lambda l: l.name == role.name).single()) + 1
)
if new_position <= 0:
new_position = 1
@@ -124,9 +105,7 @@ class LevelSeeder(DataSeederABC):
)
await role.edit(position=new_position)
except Exception as e:
self._logger.error(
__name__, f"Cannot change position of {role.name}", e
)
self._logger.error(__name__, f"Cannot change position of {role.name}", e)
for m in guild.members:
await self._level.check_level(m)

View File

@@ -42,9 +42,7 @@ class LevelService:
def get_level(self, user: User) -> Level:
levels_by_server = self._levels.get_levels_by_server_id(user.server.server_id)
levels = levels_by_server.order_by(lambda l: l.min_xp).where(
lambda l: user.xp >= l.min_xp
)
levels = levels_by_server.order_by(lambda l: l.min_xp).where(lambda l: user.xp >= l.min_xp)
if levels.count() == 0:
return levels_by_server.order_by(lambda l: l.min_xp).last()
@@ -52,12 +50,8 @@ class LevelService:
return levels.last()
async def set_level(self, user: User):
level_names = self._levels.get_levels_by_server_id(
user.server.server_id
).select(lambda l: l.name)
guild: Guild = self._bot.guilds.where(
lambda g: g.id == user.server.discord_server_id
).single()
level_names = self._levels.get_levels_by_server_id(user.server.server_id).select(lambda l: l.name)
guild: Guild = self._bot.guilds.where(lambda g: g.id == user.server.discord_server_id).single()
member: Member = guild.members.where(lambda m: m.id == user.discord_id).single()
level = self.get_level(user)
@@ -70,37 +64,23 @@ class LevelService:
continue
try:
self._logger.debug(
__name__, f"Try to remove role {role.name} from {member.name}"
)
self._logger.debug(__name__, f"Try to remove role {role.name} from {member.name}")
await member.remove_roles(role)
self._logger.info(
__name__, f"Removed role {role.name} from {member.name}"
)
self._logger.info(__name__, f"Removed role {role.name} from {member.name}")
except Exception as e:
self._logger.error(
__name__, f"Removing role {role.name} from {member.name} failed!", e
)
self._logger.error(__name__, f"Removing role {role.name} from {member.name} failed!", e)
try:
self._logger.debug(
__name__, f"Try to add role {level_role.name} to {member.name}"
)
self._logger.debug(__name__, f"Try to add role {level_role.name} to {member.name}")
await member.add_roles(level_role)
self._logger.info(__name__, f"Add role {level_role.name} to {member.name}")
except Exception as e:
self._logger.error(
__name__, f"Adding role {level_role.name} to {member.name} failed!", e
)
self._logger.error(__name__, f"Adding role {level_role.name} to {member.name} failed!", e)
level_settings: LevelServerSettings = self._config.get_configuration(
f"LevelServerSettings_{guild.id}"
)
level_settings: LevelServerSettings = self._config.get_configuration(f"LevelServerSettings_{guild.id}")
await self._message_service.send_channel_message(
self._bot.get_channel(level_settings.changed_level_notification_channel),
self._t.transform("modules.level.new_level_message").format(
member.mention, level.name
),
self._t.transform("modules.level.new_level_message").format(member.mention, level.name),
is_persistent=True,
)
@@ -109,13 +89,9 @@ class LevelService:
return
server = self._servers.get_server_by_discord_id(member.guild.id)
user = self._users.find_user_by_discord_id_and_server_id(
member.id, server.server_id
)
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
if user is None:
self._logger.warn(
__name__, f"User not found {member.guild.name}@{member.name}"
)
self._logger.warn(__name__, f"User not found {member.guild.name}@{member.name}")
return
await self.set_level(user)

View File

@@ -33,9 +33,5 @@ class PermissionServerSettings(ConfigurationModelABC):
for index in settings["ModeratorRoleIds"]:
self._moderator_roles.append(int(index))
except Exception as e:
Console.error(
f"[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings"
)
Console.error(
f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}"
)
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -29,9 +29,5 @@ class PermissionSettings(ConfigurationModelABC):
servers.append(st)
self._servers = servers
except Exception as e:
Console.error(
f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings"
)
Console.error(
f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}"
)
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -18,18 +18,12 @@ class PermissionModule(ModuleABC):
def __init__(self, dc: DiscordCollectionABC):
ModuleABC.__init__(self, dc, FeatureFlagsEnum.permission_module)
def configure_configuration(
self, config: ConfigurationABC, env: ApplicationEnvironmentABC
):
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
pass
def configure_services(
self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC
):
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_singleton(PermissionServiceABC, PermissionService)
# commands
# events
self._dc.add_event(DiscordEventTypesEnum.on_ready.value, PermissionOnReadyEvent)
self._dc.add_event(
DiscordEventTypesEnum.on_member_update.value, PermissionOnMemberUpdateEvent
)
self._dc.add_event(DiscordEventTypesEnum.on_member_update.value, PermissionOnMemberUpdateEvent)

View File

@@ -45,9 +45,7 @@ class PermissionService(PermissionServiceABC):
continue
self._technicians.append(technician)
settings: PermissionServerSettings = self._config.get_configuration(
f"PermissionServerSettings_{guild.id}"
)
settings: PermissionServerSettings = self._config.get_configuration(f"PermissionServerSettings_{guild.id}")
if settings is None:
self._logger.error(__name__, "Permission settings not found")
return
@@ -128,9 +126,7 @@ class PermissionService(PermissionServiceABC):
return self._technicians
def is_member_admin(self, member: discord.Member) -> bool:
return (
member.guild.id in self._admins and member in self._admins[member.guild.id]
)
return member.guild.id in self._admins and member in self._admins[member.guild.id]
def is_member_moderator(self, member: discord.Member) -> bool:
return (

View File

@@ -69,9 +69,7 @@ class StatsGroup(DiscordCommandABC):
stats = self._stats.get_statistics_by_server_id(server.server_id)
if stats.count() == 0:
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.stats.list.nothing_found")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.stats.list.nothing_found"))
return
statistics = ""
@@ -122,14 +120,10 @@ class StatsGroup(DiscordCommandABC):
value += f"\n{row[i]}"
embed.add_field(name=header, value=value, inline=True)
await self._message_service.send_ctx_msg(
ctx, embed, wait_before_delete=wait
)
await self._message_service.send_ctx_msg(ctx, embed, wait_before_delete=wait)
except Exception as e:
self._logger.error(__name__, f"Cannot view statistic {name}", e)
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.stats.view.failed")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.stats.view.failed"))
self._logger.trace(__name__, f"Finished stats view command")
@@ -140,9 +134,7 @@ class StatsGroup(DiscordCommandABC):
server = self._servers.get_server_by_discord_id(interaction.guild.id)
stats = self._stats.get_statistics_by_server_id(server.server_id)
return [
app_commands.Choice(
name=f"{statistic.name}: {statistic.description}", value=statistic.name
)
app_commands.Choice(name=f"{statistic.name}: {statistic.description}", value=statistic.name)
for statistic in stats
]
@@ -197,9 +189,7 @@ class StatsGroup(DiscordCommandABC):
await ctx.interaction.response.send_modal(form)
except Exception as e:
self._logger.error(__name__, f"Cannot edit statistic {name}", e)
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.stats.edit.failed")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.stats.edit.failed"))
@edit.autocomplete("name")
async def edit_autocomplete(
@@ -208,9 +198,7 @@ class StatsGroup(DiscordCommandABC):
server = self._servers.get_server_by_discord_id(interaction.guild.id)
stats = self._stats.get_statistics_by_server_id(server.server_id)
return [
app_commands.Choice(
name=f"{statistic.name}: {statistic.description}", value=statistic.name
)
app_commands.Choice(name=f"{statistic.name}: {statistic.description}", value=statistic.name)
for statistic in stats
]
@@ -226,15 +214,11 @@ class StatsGroup(DiscordCommandABC):
statistic = self._stats.get_statistic_by_name(name, server.server_id)
self._stats.delete_statistic(statistic)
self._db.save_changes()
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.stats.remove.success")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.stats.remove.success"))
self._logger.trace(__name__, f"Finished stats remove command")
except Exception as e:
self._logger.error(__name__, f"Cannot remove statistic {name}", e)
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.stats.remove.failed")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.stats.remove.failed"))
@remove.autocomplete("name")
async def edit_autocomplete(
@@ -243,8 +227,6 @@ class StatsGroup(DiscordCommandABC):
server = self._servers.get_server_by_discord_id(interaction.guild.id)
stats = self._stats.get_statistics_by_server_id(server.server_id)
return [
app_commands.Choice(
name=f"{statistic.name}: {statistic.description}", value=statistic.name
)
app_commands.Choice(name=f"{statistic.name}: {statistic.description}", value=statistic.name)
for statistic in stats
]

View File

@@ -49,34 +49,22 @@ class StatisticService:
self._bot = bot
async def execute(self, code: str, server: Server) -> StatisticResult:
guild = self._bot.guilds.where(
lambda g: g.id == server.discord_server_id
).single()
guild = self._bot.guilds.where(lambda g: g.id == server.discord_server_id).single()
return await self.get_data(
code,
self._auto_roles.get_auto_roles().where(
lambda x: x.server.server_id == server.server_id
),
self._clients.get_clients().where(
lambda x: x.server.server_id == server.server_id
),
self._auto_roles.get_auto_roles().where(lambda x: x.server.server_id == server.server_id),
self._clients.get_clients().where(lambda x: x.server.server_id == server.server_id),
self._known_users.get_users(),
self._levels.get_levels().where(
lambda x: x.server.server_id == server.server_id
),
self._servers.get_servers().where(
lambda x: x.server_id == server.server_id
),
self._levels.get_levels().where(lambda x: x.server.server_id == server.server_id),
self._servers.get_servers().where(lambda x: x.server_id == server.server_id),
self._user_joined_servers.get_user_joined_servers().where(
lambda x: x.user.server.server_id == server.server_id
),
self._user_joined_voice_channel.get_user_joined_voice_channels().where(
lambda x: x.user.server.server_id == server.server_id
),
self._users.get_users().where(
lambda x: x.server.server_id == server.server_id
),
self._users.get_users().where(lambda x: x.server.server_id == server.server_id),
guild,
)

View File

@@ -13,14 +13,10 @@ class StatsModule(ModuleABC):
def __init__(self, dc: DiscordCollectionABC):
ModuleABC.__init__(self, dc, FeatureFlagsEnum.stats_module)
def configure_configuration(
self, config: ConfigurationABC, env: ApplicationEnvironmentABC
):
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
pass
def configure_services(
self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC
):
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_transient(StatisticService)
# commands
self._dc.add_command(StatsGroup)

View File

@@ -98,10 +98,7 @@ class LogCommand(DiscordCommandABC):
continue
split_filename = file.split(".")
if (
f".{split_filename[len(split_filename) - 1]}"
not in file_extensions
):
if f".{split_filename[len(split_filename) - 1]}" not in file_extensions:
continue
files.append(os.path.join(r, file))

View File

@@ -49,9 +49,7 @@ class RestartCommand(DiscordCommandABC):
self._config.add_configuration("IS_RESTART", "true")
await self._client_utils.presence_game("common.presence.restart")
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.technician.restart_message")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.technician.restart_message"))
await asyncio.sleep(self._settings.wait_for_restart)
await self._bot.stop_async()

View File

@@ -49,9 +49,7 @@ class ShutdownCommand(DiscordCommandABC):
self._logger.debug(__name__, f"Received command shutdown {ctx}")
await self._client_utils.presence_game("common.presence.shutdown")
await self._message_service.send_ctx_msg(
ctx, self._t.transform("modules.technician.shutdown_message")
)
await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.technician.shutdown_message"))
await asyncio.sleep(self._settings.wait_for_shutdown)
await self._bot.stop_async()

View File

@@ -16,14 +16,10 @@ class TechnicianModule(ModuleABC):
def __init__(self, dc: DiscordCollectionABC):
ModuleABC.__init__(self, dc, FeatureFlagsEnum.base_module)
def configure_configuration(
self, config: ConfigurationABC, env: ApplicationEnvironmentABC
):
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
pass
def configure_services(
self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC
):
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_transient(BaseHelperABC, BaseHelperService)
# commands
self._dc.add_command(RestartCommand)