info.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import discord.ext.commands as discord_cmds
  2. from typing import List, Optional
  3. import myanimebot.utils as utils
  4. import myanimebot.globals as globals
  5. import myanimebot.commands.converters as converters
  6. def build_info_cmd_message(users, server, channels, role, filters : List[utils.Service]) -> str:
  7. ''' Build the corresponding message for the info command '''
  8. registered_channel = globals.client.get_channel(int(channels[0]["channel"]))
  9. # Store users
  10. mal_users = []
  11. anilist_users = []
  12. for user in users:
  13. # If user is part of the server, add it to the message
  14. if str(server.id) in user['servers'].split(','):
  15. try:
  16. user_service = utils.Service.from_str(user["service"])
  17. if user_service == utils.Service.MAL:
  18. mal_users.append(user[globals.DB_USER_NAME])
  19. elif user_service == utils.Service.ANILIST:
  20. anilist_users.append(user[globals.DB_USER_NAME])
  21. except NotImplementedError:
  22. pass # Nothing to do here
  23. if not mal_users and not anilist_users:
  24. return "No users registered on this server. Try to add one."
  25. else:
  26. message = 'Registered user(s) on **{}**\n\n'.format(server)
  27. if mal_users: # If not empty
  28. # Don't print if there is filters and MAL is not in them
  29. if not filters or (filters and utils.Service.MAL in filters):
  30. message += '**MyAnimeList** users:\n'
  31. message += '```{}```\n'.format(', '.join(mal_users))
  32. if anilist_users: # If not empty
  33. # Don't print if there is filters and MAL is not in them
  34. if not filters or (filters and utils.Service.ANILIST in filters):
  35. message += '**AniList** users:\n'
  36. message += '```{}```\n'.format(', '.join(anilist_users))
  37. message += 'Assigned channel : **{}**'.format(registered_channel)
  38. if role is not None:
  39. message += '\nAllowed role: **{}**'.format(role)
  40. return message
  41. def get_service_filters_list(filters : str) -> List[utils.Service]:
  42. ''' Creates and returns a service filter list from a comma-separated string '''
  43. if filters is None: return []
  44. filters_list = []
  45. for filter in filters.split(','):
  46. try:
  47. filters_list.append(utils.Service.from_str(filter))
  48. except NotImplementedError:
  49. pass # Ignore incorrect filter
  50. return filters_list
  51. @discord_cmds.command(name="info")
  52. async def info_cmd(ctx, filters : Optional[get_service_filters_list]):
  53. ''' Processes the command "info" and sends a message '''
  54. server = ctx.guild
  55. if utils.is_server_in_db(server.id) == False:
  56. await ctx.send("The server **{}** is not in our database.".format(server))
  57. else:
  58. users = utils.get_users()
  59. channels = utils.get_channels(server.id)
  60. role = utils.get_allowed_role(server.id)
  61. if channels is None:
  62. await ctx.send("No channel assigned for this bot on this server.")
  63. else:
  64. await ctx.send(build_info_cmd_message(users, server, channels, utils.get_role_name(role, server), filters))
  65. @info_cmd.error
  66. async def info_cmd_error(ctx, error):
  67. ''' Processes errors from info cmd '''
  68. # Should not happen
  69. if isinstance(error, discord_cmds.ConversionError):
  70. globals.logger.error('[info_cmd] An error occured when trying to convert {} to List[Service] filters: {}'.format(error.original, error))