Fixed autocompletes #150
This commit is contained in:
		@@ -1,5 +1,7 @@
 | 
			
		||||
from abc import ABC, abstractmethod
 | 
			
		||||
from typing import Callable
 | 
			
		||||
 | 
			
		||||
from cpl_query.extension import List
 | 
			
		||||
from discord.ext.commands import Context
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -25,3 +27,6 @@ class ClientUtilsServiceABC(ABC):
 | 
			
		||||
 | 
			
		||||
    @abstractmethod
 | 
			
		||||
    async def presence_game(self, t_key: str): pass
 | 
			
		||||
 | 
			
		||||
    @abstractmethod
 | 
			
		||||
    def get_auto_complete_list(self, _l: List, current: str, select: Callable = None) -> List: pass
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,14 @@
 | 
			
		||||
from typing import Callable
 | 
			
		||||
 | 
			
		||||
import discord
 | 
			
		||||
from cpl_core.configuration import ConfigurationABC
 | 
			
		||||
from cpl_core.database.context import DatabaseContextABC
 | 
			
		||||
from cpl_core.logging import LoggerABC
 | 
			
		||||
 | 
			
		||||
from cpl_discord.service import DiscordBotServiceABC
 | 
			
		||||
from cpl_query.extension import List
 | 
			
		||||
from cpl_translation import TranslatePipe
 | 
			
		||||
from discord import app_commands
 | 
			
		||||
from discord.ext.commands import Context
 | 
			
		||||
 | 
			
		||||
from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC
 | 
			
		||||
@@ -81,3 +85,12 @@ class ClientUtilsService(ClientUtilsServiceABC):
 | 
			
		||||
        name = self._t.transform(t_key).format(bot.__version__)
 | 
			
		||||
        await self._bot.change_presence(activity=discord.Game(name=name))
 | 
			
		||||
        self._logger.info(__name__, f'Set presence {name}')
 | 
			
		||||
 | 
			
		||||
    def get_auto_complete_list(self, _l: List, current: str, select: Callable = None) -> List:
 | 
			
		||||
        if current != '':
 | 
			
		||||
            if select is None:
 | 
			
		||||
                select = lambda x: x
 | 
			
		||||
 | 
			
		||||
            _l = _l.skip(_l.select(select).index_of(current))
 | 
			
		||||
 | 
			
		||||
        return _l.take(25)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
from typing import List as TList, Optional
 | 
			
		||||
from typing import List as TList, Optional, Any
 | 
			
		||||
 | 
			
		||||
import discord
 | 
			
		||||
from cpl_core.database.context import DatabaseContextABC
 | 
			
		||||
@@ -50,6 +50,11 @@ class AutoRoleGroup(DiscordCommandABC):
 | 
			
		||||
 | 
			
		||||
        self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}')
 | 
			
		||||
 | 
			
		||||
    async def _auto_role_auto_complete(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)
 | 
			
		||||
        return [app_commands.Choice(name=auto_role, value=auto_role) for auto_role in self._client_utils.get_auto_complete_list(auto_roles, current)]
 | 
			
		||||
 | 
			
		||||
    @commands.hybrid_group(name="auto-role")
 | 
			
		||||
    @commands.guild_only()
 | 
			
		||||
    async def auto_role(self, ctx: Context):
 | 
			
		||||
@@ -155,9 +160,7 @@ class AutoRoleGroup(DiscordCommandABC):
 | 
			
		||||
 | 
			
		||||
    @remove.autocomplete('auto_role')
 | 
			
		||||
    async def remove_autocomplete(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)
 | 
			
		||||
        return [app_commands.Choice(name=auto_role, value=auto_role) for auto_role in auto_roles]
 | 
			
		||||
        return await self._auto_role_auto_complete(interaction, current)
 | 
			
		||||
 | 
			
		||||
    @auto_role.group()
 | 
			
		||||
    @commands.guild_only()
 | 
			
		||||
@@ -198,9 +201,7 @@ class AutoRoleGroup(DiscordCommandABC):
 | 
			
		||||
 | 
			
		||||
    @list.autocomplete('auto_role')
 | 
			
		||||
    async def list_autocomplete(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)
 | 
			
		||||
        return [app_commands.Choice(name=auto_role, value=auto_role) for auto_role in auto_roles]
 | 
			
		||||
        return await self._auto_role_auto_complete(interaction, current)
 | 
			
		||||
 | 
			
		||||
    @rule.command()
 | 
			
		||||
    @commands.guild_only()
 | 
			
		||||
@@ -255,19 +256,17 @@ class AutoRoleGroup(DiscordCommandABC):
 | 
			
		||||
 | 
			
		||||
    @add.autocomplete('auto_role')
 | 
			
		||||
    async def add_autocomplete(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)
 | 
			
		||||
        return [app_commands.Choice(name=auto_role, value=auto_role) for auto_role in auto_roles]
 | 
			
		||||
        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]]:
 | 
			
		||||
        emojis = interaction.guild.emojis
 | 
			
		||||
        return [app_commands.Choice(name=emoji.name, value=emoji.name) for emoji in emojis]
 | 
			
		||||
        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)]
 | 
			
		||||
 | 
			
		||||
    @add.autocomplete('role_id')
 | 
			
		||||
    async def rule_add_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
 | 
			
		||||
        roles = interaction.guild.roles
 | 
			
		||||
        return [app_commands.Choice(name=role.name, value=str(role.id)) for role in roles]
 | 
			
		||||
        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)]
 | 
			
		||||
 | 
			
		||||
    @rule.command()
 | 
			
		||||
    @commands.guild_only()
 | 
			
		||||
@@ -294,4 +293,10 @@ class AutoRoleGroup(DiscordCommandABC):
 | 
			
		||||
        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))
 | 
			
		||||
        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 rules]
 | 
			
		||||
        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)
 | 
			
		||||
        ]
 | 
			
		||||
 
 | 
			
		||||
@@ -93,6 +93,11 @@ class LevelGroup(DiscordCommandABC):
 | 
			
		||||
            self._logger.error(__name__, f'Level seeding failed', e)
 | 
			
		||||
            await self._message_service.send_channel_message(channel, 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)
 | 
			
		||||
        return [app_commands.Choice(name=level, value=level) for level in self._client_utils.get_auto_complete_list(levels, current)]
 | 
			
		||||
 | 
			
		||||
    @commands.hybrid_group()
 | 
			
		||||
    @commands.guild_only()
 | 
			
		||||
    async def level(self, ctx: Context):
 | 
			
		||||
@@ -240,9 +245,7 @@ class LevelGroup(DiscordCommandABC):
 | 
			
		||||
 | 
			
		||||
    @edit.autocomplete('level')
 | 
			
		||||
    async def edit_autocomplete(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)
 | 
			
		||||
        return [app_commands.Choice(name=level, value=level) for level in levels]
 | 
			
		||||
        return await self._level_auto_complete(interaction, current)
 | 
			
		||||
 | 
			
		||||
    @edit.autocomplete('color')
 | 
			
		||||
    async def edit_color_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
 | 
			
		||||
@@ -283,9 +286,7 @@ class LevelGroup(DiscordCommandABC):
 | 
			
		||||
 | 
			
		||||
    @remove.autocomplete('level')
 | 
			
		||||
    async def remove_autocomplete(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)
 | 
			
		||||
        return [app_commands.Choice(name=level, value=level) for level in levels]
 | 
			
		||||
        return await self._level_auto_complete(interaction, current)
 | 
			
		||||
 | 
			
		||||
    @level.command()
 | 
			
		||||
    @commands.guild_only()
 | 
			
		||||
@@ -392,6 +393,4 @@ class LevelGroup(DiscordCommandABC):
 | 
			
		||||
 | 
			
		||||
    @set.autocomplete('level')
 | 
			
		||||
    async def set_autocomplete(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)
 | 
			
		||||
        return [app_commands.Choice(name=level, value=level) for level in levels]
 | 
			
		||||
        return await self._level_auto_complete(interaction, current)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user