aboutsummaryrefslogtreecommitdiff
path: root/cogs/admin.py
blob: 3cb7ff86da008414adb17d5796c1b4b0fb6b5278 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
from discord.ext import commands
import discord
import asyncio
import subprocess
import json
import git
import os

class Admin(commands.Cog):
	def __init__(self, bot):
		self.bot = bot

	async def is_mod(ctx):
		return ctx.author.guild_permissions.manage_channels
		
	@commands.command(aliases=['deleteEverything'], hidden=True)
	@commands.check(is_mod)
	async def purge(self, ctx, password):
		if password == "MaxCantBeTrusted":
			async for msg in ctx.channel.history():
				await msg.delete()

	@commands.command(aliases=['quit'], hidden=True)
	@commands.check(is_mod)
	async def forceexit(self, ctx, password):
		if password == "abort":
			ctx.message.delete()
			exit()

	@commands.command()
	@commands.check(is_mod)
	async def pull(self, ctx):
		g = git.cmd.Git(os.getcwd())
		await ctx.send(f"Probably pulled.\n```bash\n{g.pull()}```")

	@commands.command(aliases=['addcommand', 'newcommand'])
	@commands.check(is_mod)
	async def setcommand(self, ctx, command, *, message):
		self.bot.custom_commands[ctx.prefix + command] = message
		with open('custom_commands.json', 'w') as f:
			json.dump(self.bot.custom_commands, f, indent=4)

		await ctx.send(f"Set message for command {command}")

	@commands.command(aliases=['deletecommand'])
	@commands.check(is_mod)
	async def removecommand(self, ctx, command):
		del self.bot.custom_commands[ctx.prefix + command]
		with open('custom_commands.json', 'w') as f:
			json.dump(self.bot.custom_commands, f, indent=4)

		await ctx.send(f"Removed command {command}")
			
	
	@commands.check(is_mod)
	@commands.command(name='reload', hidden=True, usage='<extension>')
	async def _reload(self, ctx, ext):
		"""Reloads an extension"""
		try:
			self.bot.reload_extension(f'cogs.{ext}')
			await ctx.send(f'The extension {ext} was realoaded!') # Oceanlight told me too
		except commands.ExtensionNotFound:
			await ctx.send(f'The extension {ext} doesn\'t exist.')
		except commands.ExtensionNotLoaded:
			await ctx.send(f'The extension {ext} is not loaded! (use {ctx.prefix}load)')
		except commands.NoEntryPointError:
			await ctx.send(f'The extension {ext} doesn\'t have an entry point (try adding the setup function) ')
		except commands.ExtensionFailed:
			await ctx.send(f'Some unknown error happened while trying to reload extension {ext} (check logs)')
			self.bot.logger.exception(f'Failed to reload extension {ext}:')
			
	@commands.check(is_mod)
	@commands.command(name='load', hidden=True, usage='<extension>')
	async def _load(self, ctx, ext):
		"""Loads an extension"""
		try:
			self.bot.load_extension(f'cogs.{ext}')
			await ctx.send(f'The extension {ext} was loaded!')
		except commands.ExtensionNotFound:
			await ctx.send(f'The extension {ext} doesn\'t exist!')
		except commands.ExtensionAlreadyLoaded:
			await ctx.send(f'The extension {ext} is already loaded.')
		except commands.NoEntryPointError:
			await ctx.send(f'The extension {ext} doesn\'t have an entry point (try adding the setup function)')
		except commands.ExtensionFailed:
			await ctx.send(f'Some unknown error happened while trying to reload extension {ext} (check logs)')
			self.bot.logger.exception(f'Failed to reload extension {ext}:')

	@commands.check(is_mod)
	@commands.command(name='unload', hidden=True, usage='<extension>')
	async def _unload(self, ctx, ext):
		"""Loads an extension"""
		try:
			self.bot.unload_extension(f'cogs.{ext}')
			await ctx.send(f'The extension {ext} was unloaded!')
		except commands.ExtensionNotFound:
			await ctx.send(f'The extension {ext} doesn\'t exist!')
		except commands.NoEntryPointError:
			await ctx.send(f'The extension {ext} doesn\'t have an entry point (try adding the setup function)')
		except commands.ExtensionFailed:
			await ctx.send(f'Some unknown error happened while trying to reload extension {ext} (check logs)')
			self.bot.logger.exception(f'Failed to unload extension {ext}:')

	"""
	@commands.command()
	@commands.check(is_mod)
	async def connect(self, ctx):
		await ctx.author.voice.channel.connect()
		await ctx.send(f"Joined channel {ctx.author.voice.channel.name}")

	@commands.command()
	@commands.check(is_mod)
	async def disconnect(self, ctx):
		await ctx.voice_client.disconnect()
		await ctx.send(f"Left channel {ctx.author.voice.channel.name}")
	"""

	@commands.command()
	@commands.check(is_mod)
	async def clear(self, ctx, number):
		await ctx.message.channel.purge(limit=int(number)+1, check=None, before=None, after=None, around=None, oldest_first=False, bulk=True)

	@commands.check(is_mod)
	@commands.command()
	async def mute(self, ctx, members: commands.Greedy[discord.Member]=False,
					   mute_minutes: int = 0,
					   *, reason: str = "absolutely no reason"):
		"""Mass mute members with an optional mute_minutes parameter to time it"""

		if not members:
			await ctx.send("You need to name someone to mute")
			return
		elif type(members)=="str":
			members = self.bot.get_user(int(user))

		#muted_role = discord.utils.find(ctx.guild.roles, name="Muted")
		muted_role = ctx.guild.get_role(707707894694412371)
		for member in members:
			if self.bot.user == member: # what good is a muted bot?
				embed = discord.Embed(title = "You can't mute me, I'm an almighty bot")
				await ctx.send(embed = embed)
				continue
			await member.add_roles(muted_role, reason = reason)
			await ctx.send("{0.mention} has been muted by {1.mention} for *{2}*".format(member, ctx.author, reason))

		if mute_minutes > 0:
			await asyncio.sleep(mute_minutes * 60)
			for member in members:
				await member.remove_roles(muted_role, reason = "time's up ")

	@commands.check(is_mod)
	@commands.command()
	async def unmute(self, ctx, members: commands.Greedy[discord.Member]):
		if not members:
			await ctx.send("You need to name someone to unmute")
			return
		elif type(members)=="str":
			members = self.bot.get_user(int(user))

		muted_role = ctx.guild.get_role(707707894694412371)
		for i in members:
			await i.remove_roles(muted_role)
			await ctx.send("{0.mention} has been unmuted by {1.mention}".format(i, ctx.author))

	@commands.command()
	@commands.check(is_mod)
	async def logs(self, ctx, *, password):
		if password == "beep boop":
			await ctx.message.delete()
			file = discord.File("discord.log")
			await ctx.send(file=file)

	@commands.command(aliases=['ban'], hidden=True)
	@commands.check(is_mod)
	async def blacklist(self, ctx, members: commands.Greedy[discord.Member]=None):
		if not members:
			await ctx.send("You need to name someone to blacklist")
			return
		elif type(members)=="str":
			members = self.bot.get_user(int(user))

		with open('blacklist.json', 'w') as f:
			for i in members:
				if i.id in self.bot.blacklist:
					self.bot.blacklist.remove(i.id)
					json.dump(self.bot.blacklist, f, indent=4)
					await ctx.send(f"{i} has been un-blacklisted.")
				else:
					self.bot.blacklist.append(i.id)
					json.dump(self.bot.blacklist, f, indent=4)
					await ctx.send(f"{i} has been blacklisted.")


def setup(bot):
	bot.add_cog(Admin(bot))