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.

402 lines
15KB

  1. import os
  2. import sys
  3. import aiohttp
  4. import asyncio
  5. import checks
  6. import load_config
  7. from config.server_config import ServerConfig
  8. import discord
  9. from discord.ext.commands import bot, group, is_owner, bot_has_permissions
  10. class Settings:
  11. """
  12. Settings is a mix of settings and admin stuff for the bot. OWNER OR ADMIN ONLY.
  13. """
  14. def __init__(self, bot_client):
  15. self.bot = bot_client
  16. self.con = ServerConfig()
  17. self.serverconfig = self.con.servers
  18. def get_channel(self, ctx, channel):
  19. if ctx.message.channel_mentions:
  20. return ctx.message.channel_mentions[0]
  21. else:
  22. return self.bot.get_channel(channel)
  23. @bot.command()
  24. @checks.is_owner_or_admin()
  25. async def blacklist(self, ctx, option):
  26. """
  27. Add or remove users to the blacklist. Blacklisted users are forbidden from using bot commands.
  28. Usage:
  29. ;blacklist [add|+ OR remove|-] @user#0000
  30. OWNER OR ADMIN ONLY
  31. """
  32. blacklist_amount = 0
  33. mentions = ctx.message.mentions
  34. if not mentions:
  35. return await ctx.send("You didn't mention anyone")
  36. if option not in ['+', '-', 'add', 'remove']:
  37. return await ctx.send('Invalid option "%s" specified, use +, -, add, or remove' % option, expire_in=20)
  38. for user in mentions:
  39. if user.id == load_config.owner:
  40. print("[Commands:Blacklist] The owner cannot be blacklisted.")
  41. await ctx.send("The owner cannot be blacklisted.")
  42. mentions.remove(user)
  43. if option in ['+', 'add']:
  44. with open("config/blacklist.txt", "r") as fp:
  45. for user in mentions:
  46. for line in fp.readlines():
  47. if user.id + "\n" in line:
  48. mentions.remove(user)
  49. with open("config/blacklist.txt", "a+") as fp:
  50. lines = fp.readlines()
  51. for user in mentions:
  52. if user.id not in lines:
  53. fp.write("{}\n".format(user.id))
  54. blacklist_amount += 1
  55. return await ctx.send('{} user(s) have been added to the blacklist'.format(blacklist_amount))
  56. elif option in ['-', 'remove']:
  57. with open("config/blacklist.txt", "r") as fp:
  58. lines = fp.readlines()
  59. with open("config/blacklist.txt", "w") as fp:
  60. for user in mentions:
  61. for line in lines:
  62. if user.id + "\n" != line:
  63. fp.write(line)
  64. else:
  65. fp.write("")
  66. blacklist_amount += 1
  67. return await ctx.send('{} user(s) have been removed from the blacklist'.format(blacklist_amount))
  68. @bot.command(aliases=["setavatar"])
  69. @is_owner()
  70. async def changeavatar(self, ctx, url=None):
  71. """
  72. Changes the bot's avatar. Can't be a gif.
  73. Usage:
  74. ;changeavatar [url]
  75. Attaching a file and leaving the url parameter blank also works.
  76. """
  77. avaimg = 'avaimg'
  78. if ctx.message.attachments:
  79. await ctx.message.attachments[0].save(avaimg)
  80. else:
  81. thing = url.strip('<>')
  82. async with aiohttp.ClientSession() as session:
  83. async with session.get(thing) as img:
  84. with open(avaimg, 'wb') as f:
  85. f.write(await img.read())
  86. with open(avaimg, 'rb') as f:
  87. await self.bot.user.edit(avatar=f.read())
  88. os.remove(avaimg)
  89. asyncio.sleep(2)
  90. return await ctx.send(":ok_hand:")
  91. @bot.command(aliases=["nick", "nickname"])
  92. @is_owner()
  93. @bot_has_permissions(change_nickname=True)
  94. async def changenickname(self, ctx, *, nick):
  95. """Changes the bot's nickname in the guild.
  96. Usage:
  97. ;nickname [nickname]"""
  98. await self.bot.change_nickname(ctx.message.server.me, nick)
  99. return await ctx.send(":thumbsup:")
  100. @bot.command(aliases=["activity"])
  101. @is_owner()
  102. async def changeactivity(self, ctx, *, game: str):
  103. """Changes the "playing" status of the bot.
  104. Usage:
  105. ;changeactivity` [game]"""
  106. if game.lower() == "none":
  107. game= None
  108. else:
  109. game = discord.Game(game)
  110. await self.bot.change_presence(activity=game)
  111. return await ctx.send(":ok_hand: Activity set to {}".format(str(game)))
  112. @bot.command(aliases=["status"])
  113. @is_owner()
  114. async def changestatus(self, ctx, status: str):
  115. """Changes the status of the bot.
  116. Usage:
  117. ;changesatus [game]"""
  118. status = status.lower()
  119. if status == 'offline' or status == 'invisible':
  120. discordStatus = discord.Status.invisible
  121. elif status == 'idle':
  122. discordStatus = discord.Status.idle
  123. elif status == 'dnd':
  124. discordStatus = discord.Status.dnd
  125. else:
  126. discordStatus = discord.Status.online
  127. await self.bot.change_presence(status=discordStatus)
  128. await ctx.send("**:ok:** Status set to {}".format(discordStatus))
  129. @bot.command()
  130. @is_owner()
  131. async def restart(self):
  132. """Restarts the bot."""
  133. await self.bot.logout()
  134. return os.execl(sys.executable, sys.executable, *sys.argv)
  135. @bot.command()
  136. @is_owner()
  137. async def shutdown(self):
  138. """Shuts down the bot."""
  139. await self.bot.logout()
  140. return exit(0)
  141. @bot.command()
  142. @checks.is_owner_or_admin()
  143. async def printsettings(self, ctx):
  144. "OWNER OR ADMIN ONLY: Prints the servers config file."
  145. self.serverconfig = self.con.load_config()
  146. config = self.serverconfig[str(ctx.message.guild.id)]
  147. em = discord.Embed(colour=0xDEADBF)
  148. em.set_author(name="{} settings for {}.".format(self.bot.user.name, ctx.message.guild.name), icon_url=self.bot.user.avatar_url)
  149. for settings in config:
  150. if settings != "custom_commands" and settings != "warnings":
  151. settingcontent = ""
  152. for x in config[settings].items():
  153. settingcontent += str(x).strip("()") + "\n"
  154. em.add_field(name=settings, value=settingcontent, inline=False)
  155. elif settings == "custom_commands":
  156. em.add_field(name="custom_commands", value="For Custom Commands, use the custom list command.", inline=False)
  157. return await ctx.send(embed=em)
  158. @group()
  159. @checks.is_admin_or_mod()
  160. async def settings(self, ctx):
  161. if ctx.invoked_subcommand is None:
  162. return await ctx.send('Missing Argument')
  163. self.serverconfig = self.con.load_config()
  164. self.guild_id = str(ctx.message.guild.id)
  165. @settings.command(aliases=["sa"])
  166. async def selfassign(self, ctx, selection, *, changes = None):
  167. """Edits settings for self assign cog.
  168. Options:
  169. enable/disable: Enable/disables the cog.
  170. addrole/removerole: adds or removes a role that can be self assigned in the server.
  171. """
  172. selection = selection.lower()
  173. role = discord.utils.find(lambda u: u.name == changes, ctx.message.guild.roles)
  174. if selection == "enable":
  175. self.serverconfig[self.guild_id]["self_assign"]["enabled"] = 1
  176. await ctx.send("'self_assign' was enabled!")
  177. elif selection == "disable":
  178. self.serverconfig[self.guild_id]["self_assign"]["enabled"] = 0
  179. await ctx.send("'self_assign' was disabled :cry:")
  180. elif selection == "addrole":
  181. if role.id in self.serverconfig[ctx.message.guild.id]["self_assign"]["roles"]:
  182. return await ctx.send("{} is already a self-assignable role.".format(role.name),
  183. delete_after=self.con.delete_after)
  184. self.serverconfig[ctx.message.guild.id]["self_assign"]["roles"].append(role.id)
  185. await ctx.send('Role "{}" added'.format(str(role)))
  186. elif selection == "removerole":
  187. if role.id in self.serverconfig[ctx.message.guild.id]["self_assign"]["roles"]:
  188. self.serverconfig[ctx.message.guild.id]["self_assign"]["roles"].remove(role.id)
  189. self.con.update_config(self.serverconfig)
  190. await ctx.send('"{}" has been removed from the self-assignable roles.'.format(str(role)))
  191. else:
  192. return await ctx.send("That role was not in the list.")
  193. else:
  194. return await ctx.send("No valid option given.")
  195. return self.con.update_config(self.serverconfig)
  196. @settings.command(aliases=["jl"])
  197. async def joinleave(self, ctx, selection, *, changes = None):
  198. """Edits settings for joinleave cog.
  199. Options:
  200. enable/disable: Enable/disables parts of the cog. Needs to specify which part.
  201. Example:
  202. ;settings joinleave enable greets|goodbyes
  203. welcomechannel/goodbyeschannel: Sets the channels for either option. Must be a ID or mention.
  204. custommessage: specifies a custom message for the greet messages.
  205. """
  206. selection = selection.lower()
  207. if selection == "enable":
  208. if changes == "greets":
  209. self.serverconfig[self.guild_id]["greets"]["enabled"] = 1
  210. await ctx.send("'greets' was enabled!")
  211. elif changes == "goodbyes":
  212. self.serverconfig[self.guild_id]["goodbyes"]["enabled"] = 1
  213. await ctx.send("'goodbyes' was enabled!")
  214. elif selection == "disable":
  215. if changes == "greets":
  216. self.serverconfig[self.guild_id]["greets"]["enabled"] = 0
  217. await ctx.send("'greets' was disabled :cry:")
  218. elif changes == "goodbyes":
  219. self.serverconfig[self.guild_id]["goodbyes"]["enabled"] = 0
  220. await ctx.send("'goodbyes' was disabled :cry:")
  221. elif selection == "welcomechannel":
  222. channel = self.get_channel(ctx, changes)
  223. self.serverconfig[ctx.message.guild.id]["greets"]["welcome-channel"] = channel.id
  224. await ctx.send("{} has been set as the welcome channel!".format(channel.mention))
  225. elif selection == "goodbyeschannel":
  226. channel = self.get_channel(ctx, changes)
  227. self.serverconfig[ctx.message.guild.id]["goodbyes"]["goodbye-channel"] = channel.id
  228. await ctx.send("{} has been set as the goodbye channel!".format(channel.mention))
  229. elif selection == "custommessage":
  230. self.serverconfig[ctx.message.guild.id]["greets"]["custom-message"] = changes
  231. await ctx.send("Custom message set to '{}'".format(changes))
  232. else:
  233. return await ctx.send("No valid option given.")
  234. return self.con.update_config(self.serverconfig)
  235. @settings.command()
  236. async def twitch(self, ctx, selection, *, changes = None):
  237. """Edits settings for self assign cog.
  238. Options:
  239. enable/disable: Enable/disables the cog.
  240. channel: Sets the channel to shill in.
  241. """
  242. selection = selection.lower()
  243. if selection == "enable":
  244. self.serverconfig[ctx.guild.id]["twitch"]["enabled"] = 1
  245. await ctx.send("'twitch' was enabled!")
  246. elif selection == "disable":
  247. self.serverconfig[ctx.guild.id]["twitch"]["enabled"] = 0
  248. await ctx.send("'twitch' was disabled :cry:")
  249. elif selection == "channel":
  250. channel = self.get_channel(ctx, changes)
  251. self.serverconfig[ctx.guild.id]["twitch"]["channel"] = channel.id
  252. await ctx.send("{} has been set as the twitch shilling channel!".format(channel.mention))
  253. # Is lacking whitelist options. Might be added or might be depreciated.
  254. # Turns out this is handled in the cog and I don't think it needs changing but may be confusing.
  255. else:
  256. return await ctx.send("No valid option given.")
  257. return self.con.update_config(self.serverconfig)
  258. @settings.command(aliases=["perms"])
  259. async def permrole(self, ctx, selection, *, changes = None):
  260. """Edits settings for permission roles.
  261. Options:
  262. addadmin/removeadmin: Adds/Removes admin role.
  263. addmod/removemod: Adds/Removes mod role.
  264. Example:
  265. ;settings permrole addadmin Admin
  266. """
  267. selection = selection.lower()
  268. role = discord.utils.find(lambda u: u.name == changes, ctx.message.guild.roles)
  269. if selection == "addadmin":
  270. if role.id not in self.serverconfig[ctx.message.guild.id]["perm_roles"]["admin"]:
  271. self.serverconfig[ctx.message.guild.id]["perm_roles"]["admin"].append(role.id)
  272. await ctx.send("'{}' has been added to the Admin role list.".format(role.name))
  273. else:
  274. return await ctx.send("'{}' is already in the list.".format(role.name))
  275. elif selection == "addmod":
  276. if role.id not in self.serverconfig[ctx.message.guild.id]["perm_roles"]["mod"]:
  277. self.serverconfig[ctx.message.guild.id]["perm_roles"]["mod"].append(role.id)
  278. await ctx.send("'{}' has been added to the Mod role list.".format(role.name))
  279. else:
  280. return await ctx.send("'{}' is already in the list.".format(role.name))
  281. elif selection == "removeadmin":
  282. try:
  283. self.serverconfig[ctx.message.guild.id]["perm_roles"]["admin"].remove(role.id)
  284. await ctx.send("'{}' has been removed from the Admin role list.".format(role.name))
  285. except ValueError:
  286. return await ctx.send("That role was not in the list.")
  287. elif selection == "removemod":
  288. try:
  289. self.serverconfig[ctx.message.guild.id]["perm_roles"]["mod"].remove(role.id)
  290. await ctx.send("'{}' has been removed from the Mod role list.".format(role.name))
  291. except ValueError:
  292. return await ctx.send("That role was not in the list.")
  293. else:
  294. return await ctx.send("No valid option given.")
  295. return self.con.update_config(self.serverconfig)
  296. @settings.command()
  297. async def gss(self, ctx, selection, *, changes = None):
  298. """Custom Cog for the GaySoundsShitposts Discord Server."""
  299. selection = selection.lower()
  300. if selection == "loggingchannel":
  301. channel = self.get_channel(ctx, changes)
  302. self.serverconfig[ctx.message.guild.id]["gss"]["log_channel"] = channel.id
  303. await ctx.send("Logging Channel set to '{}'".format(channel.name))
  304. elif selection == "requireddays":
  305. self.serverconfig[ctx.message.guild.id]["gss"]["required_days"] = int(changes)
  306. await ctx.send("Required days set to '{}'".format(str(changes)))
  307. elif selection == "requiredscore":
  308. self.serverconfig[ctx.message.guild.id]["gss"]["required_score"] = int(changes)
  309. await ctx.send("Required score set to '{}'".format(str(changes)))
  310. else:
  311. return await ctx.send("No valid option given.")
  312. return self.con.update_config(self.serverconfig)
  313. @settings.command()
  314. async def nsfw(self, ctx, selection, *, changes = None):
  315. """Edits settings for the nsfw cog and other nsfw commands.
  316. If nsfw is enabled and nsfw channels are added, the bot will only allow nsfw commands in the specified channels.
  317. Options:
  318. enable/disable: Enable/disables nsfw commands.
  319. addchannel/removechannel: Adds/Removes a nsfw channel.
  320. Example:
  321. ;settings nsfw addchannel #nsfw_stuff
  322. """
  323. selection = selection.lower()
  324. if selection == "enable":
  325. self.serverconfig[self.guild_id]["nsfw"]["enabled"] = 1
  326. await ctx.send("'nsfw' was enabled!")
  327. elif selection == "disable":
  328. self.serverconfig[self.guild_id]["nsfw"]["enabled"] = 0
  329. await ctx.send("'nsfw' was disabled :cry:")
  330. elif selection == "addchannel":
  331. channel = self.get_channel(ctx, changes)
  332. if channel.id not in self.serverconfig[ctx.message.guild.id]["nsfw"]["channels"]:
  333. self.serverconfig[ctx.message.guild.id]["nsfw"]["channels"].append(channel.id)
  334. await ctx.send("'{}' has been added to the nsfw channel list.".format(channel.name))
  335. else:
  336. return await ctx.send("'{}' is already in the list.".format(channel.name))
  337. elif selection == "removechannel":
  338. channel = self.get_channel(ctx, changes)
  339. try:
  340. self.serverconfig[ctx.message.guild.id]["nsfw"]["channels"].remove(channel.id)
  341. await ctx.send("'{}' has been removed from the nsfw channel list.".format(channel.name))
  342. except ValueError:
  343. return await ctx.send("That role was not in the list.")
  344. else:
  345. return await ctx.send("No valid option given.")
  346. return self.con.update_config(self.serverconfig)
  347. @checks.is_admin_or_mod()
  348. @bot.command()
  349. async def serverisanal(self, ctx):
  350. """Tells the bot where the server is anal or not.
  351. This only changes if roxbot can do the suck and spank commands outside of the specified nsfw channels."""
  352. self.serverconfig = self.con.load_config()
  353. is_anal = self.serverconfig[ctx.message.guild.id]["is_anal"]["y/n"]
  354. if is_anal == 0:
  355. self.serverconfig[ctx.message.guild.id]["is_anal"]["y/n"] = 1
  356. self.con.update_config(self.serverconfig)
  357. return await ctx.send("I now know this server is anal")
  358. else:
  359. self.serverconfig[ctx.message.guild.id]["is_anal"]["y/n"] = 0
  360. self.con.update_config(self.serverconfig)
  361. return await ctx.send("I now know this server is NOT anal")
  362. def setup(bot_client):
  363. bot_client.add_cog(Settings(bot_client))