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

180 lines
6.1 KiB
Python

import asyncio
import datetime
import random
import discord
from decouple import config
from discord import Embed, Colour, DMChannel
from discord.ext import commands
from discord.ext.commands import is_owner
import settings
# Getting the Bot token from Environment Variables
API_TOKEN = config('DISCORD_TOKEN')
# Bot Initiation
client = commands.Bot( # Create a new bot
command_prefix="~", # Set the prefix
description='Ensō~Chan!', # Set a description for the bot
owner_id=154840866496839680) # Your unique User ID
(anime, helps, fun) = settings.extensions()
complete_list = anime + helps + fun
# Calls the cogs from the settings.py file and loads them
if __name__ == '__main__':
for ext in complete_list:
client.load_extension(ext)
# Bot Status on Discord
@client.event
async def on_ready():
# Tells me that the bot is ready and logged in
print('Bot is ready.')
# Sets the bots status on discord for everyone to view
await client.change_presence(activity=discord.Game(name="Feeling Pretty Good :))"))
# Bot ~Ping command in milliseconds
@client.command(name="ping", aliases=["Ping"])
@is_owner()
async def ping(ctx):
# Send the latency of the bot (ms)
await ctx.send(f'Pong! {round(client.latency * 1000)}ms')
# Bot event for new member joining, sending an embed introducing them to the server
@client.event
async def on_member_join(member):
# Set the channel id to "newpeople"
new_people = client.get_channel(669771571337887765)
# Set the enso server icon and the welcoming gif
server_icon = "https://media.discordapp.net/attachments/683490529862090814/715010931620446269/image1.jpg?width=658&height=658"
welcome_gif = "https://cdn.discordapp.com/attachments/714671068941647933/717144047252275270/f4d7de6463d3ada02058a094fd6917ac.gif"
# Set up embed for the #newpeople channel
embed = Embed(title="\n**Welcome To Ensō!**",
colour=Colour(0x30e419),
timestamp=datetime.datetime.utcnow())
embed.set_thumbnail(url=server_icon)
embed.set_image(url=welcome_gif)
embed.add_field(
name="\u200b",
value=f"Hello {member.mention}! We hope you enjoy your stay in this server! ",
inline=False)
embed.add_field(
name="\u200b",
value=f"Be sure to check out our <#669815048658747392> channel to read the rules and <#683490529862090814> channel to get caught up with any changes! ",
inline=False)
embed.add_field(
name="\u200b",
value=f"Last but not least, feel free to go into <#669775971297132556> to introduce yourself!",
inline=False)
# Send embed to #newpeople
await new_people.send(embed=embed)
# Allows the bot to echo the dm's that it receives
@client.event
async def on_message(message):
# Making sure that the bot doesn't reply to itself
if message.author == client.user:
return
# Get the mod-mail channel
channel = client.get_channel(728083016290926623)
if isinstance(message.channel, DMChannel):
if len(message.content) < 50:
await message.channel.send("Your message should be at least 50 characters in length.")
else:
# member = discord.guild.get_member(message.author.id)
embed = Embed(title="**Modmail**",
colour=Colour(random.choice(settings.colour_list)),
timestamp=datetime.datetime.utcnow())
embed.set_thumbnail(url=message.author.avatar_url)
fields = [("Member", message.author.name, False),
("Message", message.content, False)]
for name, value, inline in fields:
embed.add_field(name=name, value=value, inline=inline)
await channel.send(embed=embed)
await message.channel.send("**Message relayed to Staff! Thank you for your input!**")
await client.process_commands(message)
# Bot Event for handling all errors within discord.commands
@client.event
async def on_command_error(ctx, args2):
# if the user did not specify an user
if isinstance(args2, commands.MissingRequiredArgument):
await on_command_missing_user(ctx)
# if the user has spammed a command and invoked a cooldown
elif isinstance(args2, commands.CommandOnCooldown):
await on_command_cooldown(ctx, args2)
# if the user does not the correct permissions to call a command
elif isinstance(args2, commands.CheckFailure):
await on_command_permission(ctx)
# Async def for handling cooldown error/permission errors
async def on_command_cooldown(ctx, error):
# Send an error message to the user telling them that the command is on cooldown
message = await ctx.send(f'That command is on cooldown. Try again in {error.retry_after:,.2f} seconds.')
# Let the User read the message for 2.5 seconds
await asyncio.sleep(2.5)
# Delete the message
await message.delete()
# Async def for handling permission errors
async def on_command_permission(ctx):
# Send an error message to the user saying that they don't have permission to use this command
message = await ctx.send("Uh oh! You don't have permission to use this command!")
# Let the user read the message for 2.5 seconds
await asyncio.sleep(2.5)
# Delete the message
await message.delete()
async def on_command_missing_user(ctx):
# Send an error message to the user saying that an argument is missing
message = await ctx.send("Uh oh! Couldn't find anyone to mention! Try again!")
# Let the user read the message for 2.5 seconds
await asyncio.sleep(2.5)
# Delete the message
await message.delete()
# Run the bot, allowing it to come online
try:
client.run(API_TOKEN)
except discord.errors.LoginFailure as e:
print("Login unsuccessful.")
"""
def write_to_dm_file(time, author, content):
with open('images/logs/dm-logs.txt', mode='a') as dm_logs_file:
dm_logs_file.write(f"{time}: {author}: {content}")
# File Writing Variables
time = message.created_at
msg_time = time.strftime('%Y-%m-%dT%H:%M:%S')
msg_author = message.author
msg_content = message.content
"""