Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

155 lines
5.0KB

  1. #!/usr/env python
  2. import time
  3. import logging
  4. import os.path
  5. import datetime
  6. import traceback
  7. import json
  8. import discord
  9. from discord.ext import commands
  10. import load_config
  11. from config.server_config import ServerConfig
  12. start_time = time.time()
  13. # Sets up Logging that discord.py does on its own
  14. logger = logging.getLogger('discord')
  15. logger.setLevel(logging.INFO)
  16. handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w')
  17. handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))
  18. logger.addHandler(handler)
  19. server_config = ServerConfig()
  20. bot = commands.Bot(command_prefix=load_config.command_prefix, description=load_config.description)
  21. bot.dev = False # For debugging
  22. bot.owner = load_config.owner
  23. def blacklisted(user):
  24. with open("config/blacklist.txt", "r") as fp:
  25. for line in fp.readlines():
  26. if user.id+"\n" == line:
  27. return True
  28. return False
  29. @bot.event
  30. async def on_ready():
  31. server_config.error_check(bot.servers)
  32. print("Discord.py version: " + discord.__version__)
  33. print("Client logged in\n")
  34. bot.owner = load_config.owner
  35. print("Cogs Loaded:")
  36. for cog in load_config.cogslist:
  37. bot.load_extension(cog)
  38. print(cog)
  39. print("")
  40. print("Servers I am currently in:")
  41. for server in bot.servers:
  42. print(server)
  43. print("")
  44. # Testing Code
  45. game = discord.Game(name="v{}".format(load_config.version), type=0)
  46. await bot.change_presence(game=game)
  47. @bot.event
  48. async def on_server_join(server):
  49. server_config.servers = server_config.load_config()
  50. server_config.servers[server.id] = server_config.servers_template["example"]
  51. server_config.update_config(server_config.servers)
  52. @bot.event
  53. async def on_server_remove(server):
  54. server_config.servers = server_config.load_config()
  55. server_config.servers.pop(server.id)
  56. server_config.update_config(server_config.servers)
  57. @bot.event
  58. async def on_message(message):
  59. # TODO: Check for words for reactions
  60. if blacklisted(message.author):
  61. return
  62. return await bot.process_commands(message)
  63. # Error Handling, thanks for Der Eddy who did most of this stuff. <3
  64. @bot.event
  65. async def on_error(event, *args, **kwargs):
  66. if bot.dev:
  67. traceback.print_exc()
  68. else:
  69. embed = discord.Embed(title=':x: Event Error', colour=0xe74c3c) #Red
  70. embed.add_field(name='Event', value=event)
  71. embed.description = '```py\n%s\n```' % traceback.format_exc()
  72. embed.timestamp = datetime.datetime.utcnow()
  73. try:
  74. await bot.send_message(bot.owner, embed=embed)
  75. except:
  76. pass
  77. @bot.event
  78. async def on_command_error(error, ctx):
  79. if isinstance(error, commands.NoPrivateMessage):
  80. await bot.send_message(ctx.message.author, "This command cannot be used in private messages.")
  81. elif isinstance(error, commands.DisabledCommand):
  82. await bot.send_message(ctx.message.channel, content="This command is disabled.")
  83. elif isinstance(error, commands.CheckFailure):
  84. await bot.send_message(ctx.message.channel, content="You do not have permission to do this. Back off, thot!")
  85. elif isinstance(error, json.JSONDecodeError): # For the NSFW cogs requests because error exception doesn't work in commands because of this here.
  86. await bot.send_message(ctx.message.channel, content="That didn't return anything")
  87. elif isinstance(error, commands.CommandInvokeError):
  88. if bot.dev:
  89. raise error
  90. else:
  91. embed = discord.Embed(title=':x: Command Error', colour=0x992d22) #Dark Red
  92. embed.add_field(name='Error', value=str(error))
  93. embed.add_field(name='Server', value=ctx.message.server)
  94. embed.add_field(name='Channel', value=ctx.message.channel)
  95. embed.add_field(name='User', value=ctx.message.author)
  96. embed.add_field(name='Message', value=ctx.message.clean_content)
  97. embed.timestamp = datetime.datetime.utcnow()
  98. try:
  99. await bot.send_message(load_config.owner, embed=embed)
  100. except:
  101. raise error
  102. #else:
  103. # if bot.dev:
  104. # raise error
  105. @bot.command(pass_context=True)
  106. async def about(ctx):
  107. """
  108. Outputs info about RoxBot, showing uptime, what settings where set in prefs.ini and credits.
  109. """
  110. user = await bot.get_user_info(load_config.owner)
  111. ownername = user.name + "#" + user.discriminator
  112. em = discord.Embed(title="About Roxbot", colour=load_config.embedcolour, description=load_config.description)
  113. em.set_thumbnail(url=bot.user.avatar_url)
  114. em.add_field(name="Command Prefix", value=load_config.command_prefix)
  115. em.add_field(name="Owner", value=ownername)
  116. em.add_field(name="Owner ID", value=load_config.owner)
  117. em.add_field(name="Bot Version", value=load_config.version)
  118. em.add_field(name="Author", value=load_config.author)
  119. em.set_footer(text="RoxBot is licensed under the MIT License")
  120. # Do time calc late in the command so that the time returned is closest to when the message is received
  121. uptimeflo = time.time() - start_time
  122. uptime = str(datetime.timedelta(seconds=uptimeflo))
  123. em.add_field(name="Current Uptime", value=str(uptime.split(".")[0]))
  124. return await bot.say(embed=em)
  125. if not os.path.isfile("settings/preferences.ini"):
  126. print("PREFERENCE FILE MISSING. Something has gone wrong. Please make sure there is a file called 'preferences.ini' in the settings folder")
  127. else:
  128. bot.run(load_config.token)