You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
5.1KB

  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.DEBUG)
  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 = True # 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="Rewriting Moi for v{}".format(load_config.version), type=0)
  46. await bot.change_presence(game=game)
  47. print("Game Changed")
  48. @bot.event
  49. async def on_server_join(server):
  50. server_config.servers = server_config.load_config()
  51. server_config.servers[server.id] = server_config.servers_template["example"]
  52. server_config.update_config(server_config.servers)
  53. @bot.event
  54. async def on_server_remove(server):
  55. server_config.servers = server_config.load_config()
  56. server_config.servers.pop(server.id)
  57. server_config.update_config(server_config.servers)
  58. @bot.event
  59. async def on_message(message):
  60. # TODO: Check for words for reactions
  61. if blacklisted(message.author):
  62. return
  63. return await bot.process_commands(message)
  64. # Error Handling, thanks for Der Eddy who did most of this stuff. <3
  65. @bot.event
  66. async def on_error(event, *args, **kwargs):
  67. if bot.dev:
  68. traceback.print_exc()
  69. else:
  70. embed = discord.Embed(title=':x: Event Error', colour=0xe74c3c) #Red
  71. embed.add_field(name='Event', value=event)
  72. embed.description = '```py\n%s\n```' % traceback.format_exc()
  73. embed.timestamp = datetime.datetime.utcnow()
  74. try:
  75. await bot.send_message(bot.owner, embed=embed)
  76. except:
  77. pass
  78. @bot.event
  79. async def on_command_error(error, ctx):
  80. if isinstance(error, commands.NoPrivateMessage):
  81. await bot.send_message(ctx.message.author, "This command cannot be used in private messages.")
  82. elif isinstance(error, commands.DisabledCommand):
  83. await bot.send_message(ctx.message.channel, content="This command is disabled.")
  84. elif isinstance(error, commands.CheckFailure):
  85. await bot.send_message(ctx.message.channel, content="You do not have permission to do this. Back off, thot!")
  86. elif isinstance(error, json.JSONDecodeError): # For the NSFW cogs requests because error exception doesn't work in commands because of this here.
  87. await bot.send_message(ctx.message.channel, content="That didn't return anything")
  88. elif isinstance(error, commands.CommandInvokeError):
  89. if bot.dev:
  90. raise error
  91. else:
  92. embed = discord.Embed(title=':x: Command Error', colour=0x992d22) #Dark Red
  93. embed.add_field(name='Error', value=str(error))
  94. embed.add_field(name='Server', value=ctx.message.server)
  95. embed.add_field(name='Channel', value=ctx.message.channel)
  96. embed.add_field(name='User', value=ctx.message.author)
  97. embed.add_field(name='Message', value=ctx.message.clean_content)
  98. embed.timestamp = datetime.datetime.utcnow()
  99. try:
  100. await bot.send_message(load_config.owner, embed=embed)
  101. except:
  102. raise error
  103. #else:
  104. # if bot.dev:
  105. # raise error
  106. @bot.command(pass_context=True)
  107. async def about(ctx):
  108. """
  109. Outputs info about RoxBot, showing uptime, what settings where set in prefs.ini and credits.
  110. """
  111. user = await bot.get_user_info(load_config.owner)
  112. ownername = user.name + "#" + user.discriminator
  113. em = discord.Embed(title="About Roxbot", colour=load_config.embedcolour, description=load_config.description)
  114. em.set_thumbnail(url=bot.user.avatar_url)
  115. em.add_field(name="Command Prefix", value=load_config.command_prefix)
  116. em.add_field(name="Owner", value=ownername)
  117. em.add_field(name="Owner ID", value=load_config.owner)
  118. em.add_field(name="Bot Version", value=load_config.version)
  119. em.add_field(name="Author", value=load_config.author)
  120. em.set_footer(text="RoxBot is licensed under the MIT License")
  121. # Do time calc late in the command so that the time returned is closest to when the message is received
  122. uptimeflo = time.time() - start_time
  123. uptime = str(datetime.timedelta(seconds=uptimeflo))
  124. em.add_field(name="Current Uptime", value=str(uptime.split(".")[0]))
  125. return await bot.say(embed=em)
  126. if not os.path.isfile("settings/preferences.ini"):
  127. print("PREFERENCE FILE MISSING. Something has gone wrong. Please make sure there is a file called 'preferences.ini' in the settings folder")
  128. else:
  129. bot.run(load_config.token)