· 6 years ago · Sep 03, 2019, 04:24 PM
1# MODULES
2
3import os
4import random
5import typing
6import discord
7import asyncio
8import sqlite3
9import requests
10import keepalive
11from discord.ext import commands, tasks
12from discord.ext.commands import has_permissions, MissingPermissions
13
14
15# SETTING UP
16
17burp = commands.Bot(command_prefix='>')
18token = os.getenv("token")
19self.auto_status.start()
20burp.help_command = None
21
22
23conn = sqlite3.connect('servers.db')
24db = conn.cursor()
25
26
27# CREATING DB
28
29db.execute("""CREATE TABLE IF NOT EXISTS servers (
30 server_name TEXT,
31 server_owner TEXT,
32 server_id INTEGER,
33 welcome_channel INTEGER,
34 leave_channel INTEGER,
35 logs_channel INTEGER,
36 reports_channel INTEGER
37 )""")
38
39
40# MAIN CODE
41
42
43# ON READY
44
45@burp.event
46async def on_ready():
47 print("The bot is ready.")
48 db.execute("SELECT * FROM servers")
49 print(db.fetchall())
50 conn.commit()
51 while not burp.is_closed():
52
53 await asyncio.sleep(30)
54
55
56# PASSIVE ACTIONS
57
58
59# AUTOMATIC STATUS CHANGER
60
61@tasks.loop(seconds=30.0)
62async def auto_status():
63 await burp.change_presence(status=discord.Status('idle'), activity=discord.Activity(type=discord.ActivityType.watching, name='people burp'))
64 await burp.change_presence(status=discord.Status('idle'), activity=discord.Activity(type=discord.ActivityType.watching, name='>help and https://burpbot.glitch.me'))
65
66
67# WHEN BURP JOINS A SERVER
68
69@burp.event
70async def on_guild_join(guild):
71 db.execute('''SELECT server_id FROM servers WHERE server_id=?''', (guild.id,))
72 exists = db.fetchall()
73 if not exists:
74 db.execute(
75 "INSERT INTO servers VALUES (?, ?, ?, ?, ?, ?, ?)", (guild.name, guild.owner.name, guild.id, 0, 0, 0, 0))
76 db.execute("SELECT * FROM servers")
77 print(db.fetchall())
78 else:
79 print("Server already in database.")
80
81 conn.commit()
82
83 server_join_embed = discord.Embed(title="Thanks for inviting me!", description="In a moment, I'll create a separate\
84 file for your server in my database and then, I'll work perfectly in your server! If you need help, feel free to join our support server\
85 - https://discord.gg/uqt3RGN", color=0x27EA27)
86 await guild.owner.send(embed=server_join_embed)
87
88
89# ON MEMBER-JOIN
90
91@burp.event
92async def on_member_join(member):
93 db.execute('''SELECT * FROM servers''')
94 # print(db.fetchall())
95 db.execute('''SELECT welcome_channel FROM servers WHERE server_id=?''', (member.guild.id,))
96 welcome_channel_id = db.fetchone()
97 welcome_channel_id = welcome_channel_id[0]
98 if welcome_channel_id == 0:
99 return
100 else:
101 welcome_embed = discord.Embed(title='', color=0x27EA27)
102 welcome_embed.set_author(name=member.name, icon_url=member.avatar_url)
103 welcome_embed.set_footer(text=f'{member.name} has joined {member.guild}.')
104 # print(type(welcome_channel_id))
105 await burp.get_channel(welcome_channel_id).send(embed=welcome_embed)
106
107
108# ON MEMBER-LEAVE
109
110@burp.event
111async def on_member_remove(member):
112 db.execute('''SELECT * FROM servers''')
113 # print(db.fetchall())
114 db.execute('''SELECT leave_channel FROM servers WHERE server_id=?''', (member.guild.id,))
115 leave_channel_id = db.fetchone()
116 leave_channel_id = leave_channel_id[0]
117 if leave_channel_id == 0:
118 return
119 else:
120 leave_embed = discord.Embed(title='', color=0xFF0000)
121 leave_embed.set_author(name=member.name, icon_url=member.avatar_url)
122 leave_embed.set_footer(text=f'{member.name} has left {member.guild}.')
123 # print(type(leave_channel_id))
124 await burp.get_channel(leave_channel_id).send(embed=leave_embed)
125
126
127# CONFIG COMMANDS
128
129
130# CONFIG WELCOME CHANNEL
131
132@burp.command()
133async def set_welcome_channel(ctx, channel: discord.TextChannel):
134 db.execute('''UPDATE servers SET welcome_channel = ? WHERE server_id = ?''', (int(channel.id), ctx.guild.id))
135 db.execute('''SELECT * FROM servers where server_id=?''', (ctx.guild.id,))
136 # print(db.fetchone())
137 conn.commit()
138
139 confirm_welcome_embed = discord.Embed(title='', color=0x27EA27)
140 confirm_welcome_embed.set_author(name="Configured welcome messages channel.")
141 confirm_welcome_embed.set_footer(text=f'Successfully set the welcome messages channel to - #{channel.name}')
142 await ctx.send(embed=confirm_welcome_embed)
143
144
145# CONFIG LEAVE CHANNEL
146
147@burp.command()
148async def set_leave_channel(ctx, channel: discord.TextChannel):
149 db.execute('''UPDATE servers SET leave_channel = ? WHERE server_id = ?''', (int(channel.id), ctx.guild.id))
150 db.execute('''SELECT * FROM servers where server_id=?''', (ctx.guild.id,))
151 # print(db.fetchone())
152 conn.commit()
153
154 confirm_leave_embed = discord.Embed(title='', color=0x27EA27)
155 confirm_leave_embed.set_author(name="Configured leave messages channel.")
156 confirm_leave_embed.set_footer(text=f'Successfully set the leave messages channel to - #{channel.name}')
157 await ctx.send(embed=confirm_leave_embed)
158
159
160# UTILITY COMMANDS
161
162
163# LIST SERVERS BOT IS IN
164
165@burp.command()
166async def servers(ctx):
167 await ctx.send(f"Burp is on {str(len(burp.guilds))} servers!")
168
169
170# HELP COMMAND
171
172@burp.command(aliases=['help'])
173async def commands(ctx):
174 help_embed = discord.Embed(title='Burp Station - 911', description="Here is a li-BURP list of commands you can \
175 use. The default prefix is '>', enjoy!", color=0x234572)
176 help_embed.add_field(name="Utility", value="``help``, ``suggest``, ``serverinfo``, ``ping``")
177 help_embed.add_field(name="Moderation", value="``purge``, ``mute``, ``kick``, ``ban``, ``unban``")
178 help_embed.add_field(name="Fun", value="``8ball``, ``quote``, ``dog``, ``cat``, ``google``, ``define``")
179 help_embed.add_field(name="Config", value="``set_welcome_channel``, ``set_leave_channel``")
180 help_embed.set_footer(text="Burp Station - 911, DO NOT PRANK CALL!")
181 await ctx.send(embed=help_embed)
182
183
184# SUGGEST COMMAND
185
186@burp.command()
187async def suggest(ctx, *, suggestion):
188 suggestion_embed = discord.Embed(title='New Suggestion', description=suggestion, color=0x1e85ca)
189 suggestion_embed.set_author(name=" ", icon_url=ctx.message.author.avatar_url)
190 await ctx.send(embed=suggestion_embed)
191
192
193# SERVER-INFO COMMAND
194
195@burp.command(aliases=['serverinfo'])
196async def server_info(ctx):
197 online_users = 0
198 bot_users = 0
199 for user in ctx.guild.members:
200 if user.status != discord.Status.offline:
201 online_users += 1
202 if user.bot == True:
203 bot_users += 1
204 server_info_embed = discord.Embed(title='', color=0x1e85ca)
205 server_info_embed.set_author(name=ctx.guild.name, icon_url=ctx.guild.icon_url)
206 server_info_embed.add_field(
207 name="Owner", value=str(ctx.guild.owner))
208 server_info_embed.add_field(
209 name="Region", value=str(ctx.guild.region.name.upper()))
210 server_info_embed.add_field(
211 name="Categories", value=str(len(ctx.guild.categories)))
212 server_info_embed.add_field(
213 name="Text Channels", value=str(len(ctx.guild.channels)))
214 server_info_embed.add_field(
215 name="Voice Channels", value=str(len(ctx.guild.voice_channels)))
216 server_info_embed.add_field(
217 name="Custom Emojis", value=str(len(ctx.guild.emojis)))
218 server_info_embed.add_field(
219 name="Roles", value=str(len(ctx.guild.roles)))
220 server_info_embed.add_field(
221 name="Members", value=str(ctx.guild.member_count))
222 server_info_embed.add_field(
223 name="Humans", value=str(len(ctx.guild.members) - bot_users))
224 server_info_embed.add_field(
225 name="Bots", value=str(bot_users))
226 server_info_embed.add_field(
227 name="Online", value=str(online_users))
228 server_info_embed.add_field(
229 name="Offline", value=str(len(ctx.guild.members) - online_users))
230 server_info_embed.set_footer(
231 text=f"Server ID: {ctx.guild.id} | Server Created on {ctx.guild.created_at.date()}")
232 await ctx.send(embed=server_info_embed)
233
234
235# PING COMMAND
236
237@burp.command()
238async def ping(ctx):
239 ping_embed = discord.Embed(title='My Latency', color=0x27EA27)
240 ping_embed.set_footer(text=f'{round(burp.latency * 1000)}ms')
241 await ctx.send(embed=ping_embed)
242
243
244# FUN COMMANDS
245
246
247# 8BALL COMMAND
248
249@burp.command(aliases=['8ball'])
250async def _8ball(ctx, *, question):
251 responses = ["It is certain.",
252 "It is decidedly so.",
253 "Without a doubt.",
254 "Yes - definitely.",
255 "You may rely on it.",
256 "As I see it, yes.",
257 "Most likely.",
258 "Outlook good.",
259 "Yes.",
260 "Signs point to yes.",
261 "Reply hazy, try again.",
262 "Ask again later.",
263 "Better not tell you now.",
264 "Cannot predict now.",
265 "Concentrate and ask again.",
266 "Don't count on it.",
267 "My reply is no.",
268 "My sources say no.",
269 "Outlook not so good.",
270 "Very doubtful."]
271 _8ball_embed = discord.Embed(title=f'{question}', color=0x000000)
272 _8ball_embed.set_footer(text=random.choice(responses))
273 await ctx.send(embed=_8ball_embed)
274
275
276# DOG COMMAND
277
278@burp.command(aliases=['dogpic'])
279async def dog(ctx):
280 page = requests.get('https://dog.ceo/api/breeds/image/random').json()
281 dog_pic = page['message']
282 dog_pic_embed = discord.Embed(title=':dog: Woof!', color=0x1e85ca)
283 dog_pic_embed.set_image(url=dog_pic)
284 dog_pic_embed.set_footer(text="Cute woofies, thanks to https://dog.ceo/")
285 await ctx.send(embed=dog_pic_embed)
286
287
288# CAT COMMAND
289
290@burp.command(aliases=['catpic'])
291async def cat(ctx):
292 json_cat = requests.get('https://api.thecatapi.com/v1/images/search').json()
293 cat_info = json_cat[0]
294 cat_pic = cat_info['url']
295 cat_pic_embed = discord.Embed(title=':cat: Meow!', color=0x1e85ca)
296 cat_pic_embed.set_image(url=cat_pic)
297 cat_pic_embed.set_footer(text="Cute meows, thanks to https://thecatapi.com/")
298 await ctx.send(embed=cat_pic_embed)
299
300
301# SAY COMMAND
302
303@burp.command()
304async def say(ctx, message, delete='delete'):
305 if delete == 'delete':
306 await ctx.message.delete()
307 await ctx.send(message)
308 else:
309 await ctx.send(message)
310
311
312# GOOGLE COMMAND
313
314@burp.command(aliases=['search', 'g'])
315async def google(ctx, *, search):
316 search_q = search.replace(' ', '%20')
317 await ctx.send("https://www.google.com/search?q=" + search_q)
318
319
320# DICTIONARY COMMAND
321
322@burp.command(aliases=['dict', 'meaning', 'define'])
323async def dictionary(ctx, *, word):
324 app_id = "e3efcd3b"
325 app_key = "c557f6321d7303b6904f180a271b9a36"
326 language = "en-gb"
327 url = "https://od-api.oxforddictionaries.com:443/api/v2/entries/" + language + "/" + word
328 dictdata = requests.get(url, headers={'app_id': app_id, 'app_key': app_key}).json()
329 updated_word = dictdata['id']
330 word_definition = dictdata['results'][0]['lexicalEntries'][0]['entries'][0]['senses'][0]['definitions'][0]
331 word_embed = discord.Embed(title='Burp-ictionary', color=0x1e85ca)
332 word_embed.add_field(name="Word", value="%s" % updated_word)
333 word_embed.add_field(name="Definition", value="%s" % word_definition)
334 word_embed.set_footer(text="Your pocket burping dictionary, thanks to https://developer.oxforddictionaries.com/")
335 await ctx.send(embed=word_embed)
336
337
338# QUOTE COMMAND
339
340@burp.command()
341async def quote(ctx):
342 url = "https://api.quotable.io/random"
343 quote_dictionary = requests.get(url).json()
344 quote = quote_dictionary['content']
345 quote_author = quote_dictionary['author']
346 quote_embed = discord.Embed(title=quote, description=f"- {quote_author}", color=0x1e85ca)
347 quote_embed.set_footer(text="Motivating quotes thanks to https://github.com/lukePeavey/quotable")
348 await ctx.send(embed=quote_embed)
349
350
351# MODERATION COMMANDS
352
353
354# CLEAR COMMAND
355
356@burp.command(aliases=['purge'])
357@has_permissions(manage_messages=True)
358async def clear(ctx, amount=0):
359 if amount == 0:
360 await ctx.send("Please enter how many messages you want to delete.")
361 else:
362 await ctx.channel.purge(limit=amount + 1)
363
364
365@clear.error
366async def clear_error(error, ctx):
367 if isinstance(error, MissingPermissions):
368 await ctx.send_message("You do not have the permissions to do that!")
369
370
371# KICK COMMAND
372
373@burp.command()
374@has_permissions(kick_members=True)
375async def kick(ctx, member: discord.Member, *, reason=None):
376 await member.kick(reason=reason)
377 kick_embed = discord.Embed(title=f'{member.name.capitalize()} kicked!', color=0xFF0000)
378 kick_embed.set_footer(text=f'Reason - {reason}')
379 await ctx.send(embed=kick_embed)
380
381
382@kick.error
383async def kick_error(error, ctx):
384 if isinstance(error, MissingPermissions):
385 await ctx.send_message("You do not have the permissions to do that!")
386
387
388# BAN PEOPLE IN THE SERVER COMMAND
389
390@burp.command()
391@has_permissions(ban_members=True)
392async def ban(ctx, member: typing.Union[discord.Member, int], *, reason=None):
393 if type(member) == discord.Member:
394 await member.ban(reason=reason)
395 else:
396 banned_users = await ctx.guild.bans()
397 for banned_member in banned_users:
398 user = banned_member.user
399 if user.id == member:
400 await ctx.send(f"<@{member}> is already banned.")
401 return
402 await ctx.message.guild.ban(discord.Object(id=member))
403 ban_embed = discord.Embed(title=f'Member banned!', color=0xFF0000)
404 ban_embed.add_field(name=f"User", value=f"<@{member}>")
405 ban_embed.set_footer(text=f'was banned for {reason}')
406 await ctx.send(embed=ban_embed)
407
408
409@ban.error
410async def ban_error(error, ctx):
411 if isinstance(error, MissingPermissions):
412 await ctx.send_message("You do not have permissions to do that!")
413
414
415# UNBAN COMMANDS
416
417@burp.command()
418@has_permissions(ban_members=True)
419async def unban(ctx, *, member):
420 banned_users = await ctx.guild.bans()
421 member_name, member_discriminator = member.split('#')[0], member.split('#')[1]
422 for banned_member in banned_users:
423 user = banned_member.user
424 if (user.name and user.discriminator) == (member_name and member_discriminator):
425 await ctx.guild.unban(user)
426 unban_embed = discord.Embed(title=f'{member_name.capitalize()} unbanned!', color=0x27EA27)
427 await ctx.send(embed=unban_embed)
428 return
429
430
431@unban.error
432async def unban_error(error, ctx):
433 if isinstance(error, MissingPermissions):
434 await ctx.send_message("You do not have permissions to do that!")
435
436
437# TOKEN AND RUNNING
438
439
440keepalive.keepalive()
441burp.run(token)