forked from sh-edraft.de/sh_discord_bot
		
	Added user get command #21
This commit is contained in:
		| @@ -160,20 +160,27 @@ | ||||
|         "removed": "Presence wurde entfernt.", | ||||
|         "max_char_count_exceeded": "Der Text darf nicht mehr als 128 Zeichen lang sein!" | ||||
|       }, | ||||
|       "user_info": { | ||||
|         "fields": { | ||||
|           "id": "Id", | ||||
|           "name": "Name", | ||||
|           "discord_join": "Discord beigetreten am", | ||||
|           "last_join": "Server beigetreten am", | ||||
|           "xp": "XP", | ||||
|           "ontime": "Ontime", | ||||
|           "roles": "Rollen", | ||||
|           "joins": "Beitritte", | ||||
|           "lefts": "Abgänge", | ||||
|           "warnings": "Verwarnungen" | ||||
|       "user": { | ||||
|         "info": { | ||||
|           "fields": { | ||||
|             "id": "Id", | ||||
|             "name": "Name", | ||||
|             "discord_join": "Discord beigetreten am", | ||||
|             "last_join": "Server beigetreten am", | ||||
|             "xp": "XP", | ||||
|             "ontime": "Ontime", | ||||
|             "roles": "Rollen", | ||||
|             "joins": "Beitritte", | ||||
|             "lefts": "Abgänge", | ||||
|             "warnings": "Verwarnungen" | ||||
|           }, | ||||
|           "footer": "" | ||||
|         }, | ||||
|         "footer": "" | ||||
|         "get": { | ||||
|           "atr_not_found": "Das Attribut {} konnte nicht gefunden werden :(", | ||||
|           "xp": "{} hat {} xp", | ||||
|           "ontime": "{} war insgesamt {} Stunden aktiv in einem Sprachkanal" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "boot_log": { | ||||
|   | ||||
| @@ -1,10 +1,11 @@ | ||||
| from typing import Optional | ||||
| from typing import Optional, List | ||||
|  | ||||
| import discord | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_discord.command import DiscordCommandABC | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
| from cpl_translation import TranslatePipe | ||||
| from discord import app_commands | ||||
| from discord.ext import commands | ||||
| from discord.ext.commands import Context | ||||
|  | ||||
| @@ -83,26 +84,28 @@ class UserGroup(DiscordCommandABC): | ||||
|             color=int('ef9d0d', 16) | ||||
|         ) | ||||
|  | ||||
|         ujvs = self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.user_id) | ||||
|         ontime = ujvs.sum(lambda join: round((join.leaved_on - join.joined_on).total_seconds() / 3600, 2)) | ||||
|         ontime = self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.user_id).sum( | ||||
|             lambda join: round((join.leaved_on - join.joined_on).total_seconds() / 3600, 2)) | ||||
|  | ||||
|         embed.add_field(name=self._t.transform('modules.base.user_info.fields.id'), value=member.id) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user_info.fields.name'), value=member.name) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user_info.fields.discord_join'), value=self._date.transform(member.created_at), inline=False) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user_info.fields.last_join'), value=self._date.transform(member.joined_at), inline=False) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user_info.fields.xp'), value=str(user.xp)) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user_info.fields.ontime'), value=str(ontime)) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user.info.fields.id'), value=member.id) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user.info.fields.name'), value=member.name) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user.info.fields.discord_join'), | ||||
|                         value=self._date.transform(member.created_at), inline=False) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user.info.fields.last_join'), | ||||
|                         value=self._date.transform(member.joined_at), inline=False) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user.info.fields.xp'), value=str(user.xp)) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user.info.fields.ontime'), value=str(ontime)) | ||||
|  | ||||
|         roles = '' | ||||
|         for role in member.roles: | ||||
|             roles += f'{role.name}\n' | ||||
|         embed.add_field(name=self._t.transform('modules.base.user_info.fields.roles'), value=roles, inline=False) | ||||
|         embed.add_field(name=self._t.transform('modules.base.user.info.fields.roles'), value=roles, inline=False) | ||||
|  | ||||
|         if is_mod or member == ctx.author: | ||||
|             joins_string = '' | ||||
|             for join in joins: | ||||
|                 joins_string += f'{self._date.transform(join.joined_on)}\n' | ||||
|             embed.add_field(name=self._t.transform('modules.base.user_info.fields.joins'), value=joins_string) | ||||
|             embed.add_field(name=self._t.transform('modules.base.user.info.fields.joins'), value=joins_string) | ||||
|  | ||||
|         if is_mod or member == ctx.author: | ||||
|             lefts_string = '' | ||||
| @@ -113,11 +116,53 @@ class UserGroup(DiscordCommandABC): | ||||
|                     continue | ||||
|                 lefts_string += f'{self._date.transform(join.leaved_on)}\n' | ||||
|  | ||||
|             embed.add_field(name=self._t.transform('modules.base.user_info.fields.lefts'), value=lefts_string) | ||||
|             embed.add_field(name=self._t.transform('modules.base.user.info.fields.lefts'), value=lefts_string) | ||||
|  | ||||
|         if is_mod or member == ctx.author: | ||||
|             embed.add_field(name=self._t.transform('modules.base.user_info.fields.warnings'), value=self._t.transform('common.not_implemented_yet'), inline=False) | ||||
|             embed.add_field(name=self._t.transform('modules.base.user.info.fields.warnings'), | ||||
|                             value=self._t.transform('common.not_implemented_yet'), inline=False) | ||||
|  | ||||
|         # send to interaction because of sensitive data | ||||
|         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() | ||||
|     @commands.guild_only() | ||||
|     @CommandChecks.check_is_ready() | ||||
|     async def get(self, ctx: Context, atr: str, member: discord.Member = None): | ||||
|         self._logger.debug(__name__, f'Received command user-info {ctx}:{member}') | ||||
|  | ||||
|         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')) | ||||
|             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) | ||||
|  | ||||
|         match atr: | ||||
|             case 'xp': | ||||
|                 value = str(user.xp) | ||||
|              | ||||
|             case 'ontime': | ||||
|                 value = str( | ||||
|                     self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.user_id) | ||||
|                     .sum(lambda join: round((join.leaved_on - join.joined_on).total_seconds() / 3600, 2)) | ||||
|                 ) | ||||
|  | ||||
|             case other: | ||||
|                 await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.get.atr_not_found').format(atr)) | ||||
|                 return | ||||
|  | ||||
|         await self._message_service.send_interaction_msg( | ||||
|             ctx.interaction, | ||||
|             self._t.transform(f'modules.base.user.get.{atr}').format(member.mention, value) | ||||
|         ) | ||||
|  | ||||
|     @get.autocomplete('atr') | ||||
|     async def get_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]: | ||||
|         atr_list = ['xp', 'ontime'] | ||||
|         return [app_commands.Choice(name=atr, value=atr) for atr in atr_list] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user