From 2b8e2345f9c59513cbdbe0caf620237f4a91ef1d Mon Sep 17 00:00:00 2001 From: rzmk Date: Sun, 1 Aug 2021 14:24:02 -0400 Subject: [PATCH] First official build of bot! Co-authored-by: iakrules <64628083+iakrules@noreply.github.com> --- .gitignore | 6 +- README.md | 72 +++- bot.py | 82 ++--- cogs/{music/musicCog.py => audio/audioCog.py} | 323 +++++++++--------- cogs/info/calendarCog.py | 115 +++---- cogs/info/infoCog.py | 30 ++ cogs/info/pingCog.py | 32 +- cogs/info/serverCog.py | 35 ++ cogs/info/userCog.py | 44 +++ cogs/inventory/inventoryCog.py | 122 +++---- cogs/moderation/embedCog.py | 64 ++++ cogs/moderation/moderationCog.py | 62 ++-- cogs/moderation/pruneCog.py | 18 + cogs/owner/loaderCog.py | 23 ++ cogs/owner/sayCog.py | 18 + cogs/owner/statusCog.py | 29 ++ images/Bot-Example.png | Bin 0 -> 35658 bytes images/GitHub-Banner.png | Bin 0 -> 46489 bytes images/icons/discord.svg | 1 + images/icons/facebook-alt.svg | 37 ++ images/icons/facebook.svg | 39 +++ images/icons/github.svg | 44 +++ images/icons/instagram.svg | 57 ++++ images/icons/link.svg | 25 ++ images/icons/linked-in-alt.svg | 42 +++ images/icons/linked-in.svg | 3 + images/icons/mail.svg | 25 ++ images/icons/reddit.svg | 54 +++ images/icons/twitch.svg | 21 ++ images/icons/twitter-alt.svg | 37 ++ images/icons/twitter.svg | 43 +++ images/icons/youtube.svg | 44 +++ 32 files changed, 1164 insertions(+), 383 deletions(-) rename cogs/{music/musicCog.py => audio/audioCog.py} (90%) create mode 100644 cogs/info/infoCog.py create mode 100644 cogs/info/serverCog.py create mode 100644 cogs/info/userCog.py create mode 100644 cogs/moderation/embedCog.py create mode 100644 cogs/moderation/pruneCog.py create mode 100644 cogs/owner/loaderCog.py create mode 100644 cogs/owner/sayCog.py create mode 100644 cogs/owner/statusCog.py create mode 100644 images/Bot-Example.png create mode 100644 images/GitHub-Banner.png create mode 100644 images/icons/discord.svg create mode 100644 images/icons/facebook-alt.svg create mode 100644 images/icons/facebook.svg create mode 100644 images/icons/github.svg create mode 100644 images/icons/instagram.svg create mode 100644 images/icons/link.svg create mode 100644 images/icons/linked-in-alt.svg create mode 100644 images/icons/linked-in.svg create mode 100644 images/icons/mail.svg create mode 100644 images/icons/reddit.svg create mode 100644 images/icons/twitch.svg create mode 100644 images/icons/twitter-alt.svg create mode 100644 images/icons/twitter.svg create mode 100644 images/icons/youtube.svg diff --git a/.gitignore b/.gitignore index 62bf56b..0b40e9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -.env -env -__pycache__ +.env +env +__pycache__ song.mp3 \ No newline at end of file diff --git a/README.md b/README.md index d5ea99b..11b1a75 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,68 @@ -# Duckster -A fun and all-purpose bot made in Python. - -Founded by [@iakrules](https://github.com/iakrules) and [@rzmk](https://github.com/rzmk). \ No newline at end of file +

+ +

+ +
+ + + + + + + + +
+ +--- + +# Rutgers Esports Discord Bot + +The official **Rutgers Esports Bot** on Discord for handling all internal operations. + +Built as a modular multi-purpose utility bot, with custom features such as creating embeds, moderation commands, and more. + +## Table of Contents + +- [About The Project](#about-the-project) +- [Tools & Technologies](#tools-and-technologies) +- [Contributing](#contributing) +- [Contributors](#contributors) + +## About The Project + +[![Bot Example](./images/Bot-Example.png)](https://discord.gg/RutgersEsports) + +Rutgers Esports Bot is developed for ease of use with utility commands and features for gaming communities, clubs, and organizations. + +- **Community** - Members can easily access informative commands about their user/server, and also details about Rutgers Esports such as upcoming events. +- **Moderation** - Built-in moderation commands are automatically provided and limited to server members with specific permissions. +- **Executive Board** - Restricted features providing convenient automation and information to serve board members spanning all departments. + +## Tools and Technologies + +- [Discord.py](https://discordpy.readthedocs.io/en/stable/) - Modern async/await API wrapper for Discord. +- [Heroku](https://www.heroku.com/) - Hosting and deployment cloud platform. +- [Firestore DB](https://firebase.google.com/) - Realtime NoSQL database for managing our inventory. +- [Google Calendar API](https://developers.google.com/calendar) - For instant reports of upcoming calendar events. + +## Contributing + +There's plenty of ways to contribute! +Here's a few suggestions to help: + +1. Star the project. +2. Find and report [issues](https://github.com/rutgersesports/discord-bot/issues). +3. Submit [PRs](https://github.com/rutgersesports/discord-bot/pulls) to help solve issues or add features. +4. Send feature requests [our Discord](https://discord.gg/RutgersEsports)! + +We'll be creating a contributing guide/wiki in the near future. + +For now, Rutgers Esports Technology Department officers will be maintaining the bot. [Click here to apply.](https://bit.ly/join-reebo) + +## Contributors + +This project exists thanks to all the people who contribute! + + + + diff --git a/bot.py b/bot.py index c3587cc..ba4569d 100644 --- a/bot.py +++ b/bot.py @@ -1,47 +1,35 @@ -# Import all required packages and variables -import os -import discord -from discord.ext import commands -from dotenv import load_dotenv - -load_dotenv() - -TOKEN = os.environ.get("TOKEN") -client = commands.Bot(command_prefix='d!') - -# Bot initialized -@client.event -async def on_ready(): - print(f'{client.user.name} is ready.') - await client.change_presence(activity=discord.Streaming(name="duck pictures.", url="https://www.youtube.com/watch?v=dQw4w9WgXcQ")) - -@commands.is_owner() -@client.command() -async def load(ctx, extension): - """Loads a cog""" - client.load_extension(f'cogs.{extension}') - -@commands.is_owner() -@client.command() -async def unload(ctx, extension): - """Unloads a cog""" - client.unload_extension(f'cogs.{extension}') - -# Cogs -for filename in os.listdir('./cogs/info'): - if filename.endswith('.py'): - client.load_extension(f'cogs.info.{filename[:-3]}') - -for filename in os.listdir('./cogs/moderation'): - if filename.endswith('.py'): - client.load_extension(f'cogs.moderation.{filename[:-3]}') - -for filename in os.listdir('./cogs/music'): - if filename.endswith('.py'): - client.load_extension(f'cogs.music.{filename[:-3]}') - -for filename in os.listdir('./cogs/inventory'): - if filename.endswith('.py'): - client.load_extension(f'cogs.inventory.{filename[:-3]}') - -client.run(TOKEN) \ No newline at end of file +# Import all required packages and variables +import os +import discord +from discord.ext import commands +from dotenv import load_dotenv + +load_dotenv() + +intents = discord.Intents().all() + +TOKEN = os.environ.get("TOKEN") +bot = commands.Bot(command_prefix='.', intents=intents) + +# Bot initialized +@bot.event +async def on_ready(): + print(f'{bot.user.name} is ready.') + await bot.change_presence(activity=discord.Streaming(name="Use .help to learn more!", url="https://linktr.ee/RutgersEsports")) + +class CustomHelpCommand(commands.MinimalHelpCommand): + async def send_pages(self): + destination = self.get_destination() + for page in self.paginator.pages: + embed = discord.Embed(description=page, color=0xC94949) + await destination.send(embed=embed) + +bot.help_command = CustomHelpCommand() + +# Cogs +for group in os.listdir('./cogs'): + for cog in os.listdir(f'./cogs/{group}'): + if cog.endswith('.py'): + bot.load_extension(f'cogs.{group}.{cog[:-3]}') + +bot.run(TOKEN) \ No newline at end of file diff --git a/cogs/music/musicCog.py b/cogs/audio/audioCog.py similarity index 90% rename from cogs/music/musicCog.py rename to cogs/audio/audioCog.py index 8be0488..848c250 100644 --- a/cogs/music/musicCog.py +++ b/cogs/audio/audioCog.py @@ -1,162 +1,161 @@ -import asyncio -import discord -from discord.ext import commands -import youtube_dl -import os - -ffmpeg_options = { - 'options': '-vn' -} - -ytdl_format_options = { - 'format': 'bestaudio/best', - 'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s', - 'restrictfilenames': True, - 'noplaylist': True, - 'nocheckcertificate': True, - 'ignoreerrors': False, - 'logtostderr': False, - 'quiet': True, - 'no_warnings': True, - 'default_search': 'auto', - 'source_address': '0.0.0.0' # bind to ipv4 since ipv6 addresses cause issues sometimes -} - -ytdl = youtube_dl.YoutubeDL(ytdl_format_options) - -class YTDLSource(discord.PCMVolumeTransformer): - def __init__(self, source, *, data, volume=0.5): - super().__init__(source, volume) - - self.data = data - - self.title = data.get('title') - self.url = data.get('url') - - @classmethod - async def from_url(cls, url, *, loop=None, stream=False): - loop = loop or asyncio.get_event_loop() - data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=not stream)) - - if 'entries' in data: - # take first item from a playlist - data = data['entries'][0] - - filename = data['url'] if stream else ytdl.prepare_filename(data) - return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data) - -class MusicCog(commands.Cog): - - def __init__(self, client): - self.client = client - - # Commands - - @commands.command() - async def play(self, ctx, url): - """Streams from a url""" - - if ctx.author.voice is None: - return await ctx.send("You're not connected to a voice channel.") - - try: - channel = ctx.author.voice.channel - await channel.connect() - except: - pass - async with ctx.typing(): - player = await YTDLSource.from_url(url, loop=self.client.loop, stream=True) - ctx.voice_client.play(player, after=lambda e: print(f'Player error: {e}') if e else None) - await ctx.send(f'Now playing: {player.title}') - - @play.error - async def play_error(self, ctx, error): - if isinstance(error, commands.MissingRequiredArgument): - voice = ctx.voice_client - if voice != None and voice.is_paused(): - voice.resume() - else: - await ctx.send("Missing URL!") - - @commands.command(aliases=['disconnect, dc']) - async def leave(self, ctx): - """Disconnects bot from the voice channel""" - - if ctx.author.voice is None: - return await ctx.send("You're not connected to a voice channel.") - - voice = ctx.voice_client - if voice is not None: - if voice.is_connected(): - await voice.disconnect() - else: - await ctx.send("The bot is not connected to a voice channel.") - - @commands.command() - async def volume(self, ctx, volume: int): - """Changes the player's volume""" - - if ctx.author.voice is None: - return await ctx.send("You're not connected to a voice channel.") - - if ctx.voice_client is None: - return await ctx.send("Not connected to a voice channel.") - - ctx.voice_client.source.volume = volume / 100 - await ctx.send(f"Changed volume to {volume}%") - - @commands.command() - async def pause(self, ctx): - """Pauses audio""" - - if ctx.author.voice is None: - return await ctx.send("You're not connected to a voice channel.") - - voice = ctx.voice_client - if voice.is_playing(): - voice.pause() - else: - await ctx.send("Currently no audio is playing.") - - @commands.command() - async def resume(self, ctx): - """Resumes currently paused audio""" - - if ctx.author.voice is None: - return await ctx.send("You're not connected to a voice channel.") - - voice = ctx.voice_client - if voice.is_paused(): - voice.resume() - else: - await ctx.send("The audio is not paused.") - - @commands.command() - async def stop(self, ctx): - """Stops and disconnects the bot from voice""" - - if ctx.author.voice is None: - return await ctx.send("You're not connected to a voice channel.") - - voice = ctx.voice_client - if voice: - voice.stop() - - @commands.command(aliases=['join']) - async def connect(self, ctx): - """Connects bot to currently connected voice channel""" - - if ctx.author.voice is None: - return await ctx.send("You're not connected to a voice channel.") - - channel = ctx.author.voice.channel - try: - await channel.connect() - except: - voice = ctx.voice_client - if voice.is_connected() and voice.channel != channel: - await voice.disconnect() - await channel.connect() - -def setup(client): - client.add_cog(MusicCog(client)) \ No newline at end of file +import asyncio +import discord +from discord.ext import commands +import youtube_dl +import os + +ffmpeg_options = { + 'options': '-vn' +} + +ytdl_format_options = { + 'format': 'bestaudio/best', + 'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s', + 'restrictfilenames': True, + 'noplaylist': True, + 'nocheckcertificate': True, + 'ignoreerrors': False, + 'logtostderr': False, + 'quiet': True, + 'no_warnings': True, + 'default_search': 'auto', + 'source_address': '0.0.0.0' # Bind to ipv4 since ipv6 addresses cause issues sometimes +} + +ytdl = youtube_dl.YoutubeDL(ytdl_format_options) + +class YTDLSource(discord.PCMVolumeTransformer): + def __init__(self, source, *, data, volume=0.5): + super().__init__(source, volume) + + self.data = data + + self.title = data.get('title') + self.url = data.get('url') + + @classmethod + async def from_url(cls, url, *, loop=None, stream=False): + loop = loop or asyncio.get_event_loop() + data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=not stream)) + + if 'entries' in data: + # Take first item from a playlist + data = data['entries'][0] + + filename = data['url'] if stream else ytdl.prepare_filename(data) + return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data) + +class AudioCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command() + async def play(self, ctx, url): + """Streams from a url""" + + if ctx.author.voice is None: + return await ctx.send("You're not connected to a voice channel.") + + try: + channel = ctx.author.voice.channel + await channel.connect() + except: + pass + async with ctx.typing(): + player = await YTDLSource.from_url(url, loop=self.bot.loop, stream=True) + ctx.voice_client.play(player, after=lambda e: print(f'Player error: {e}') if e else None) + await ctx.send(f'Now playing: {player.title}') + + @play.error + async def play_error(self, ctx, error): + if isinstance(error, commands.MissingRequiredArgument): + voice = ctx.voice_client + if voice != None and voice.is_paused(): + voice.resume() + else: + await ctx.send("Missing URL!") + + @commands.command(aliases=['disconnect, dc']) + async def leave(self, ctx): + """Disconnects bot from the voice channel""" + + if ctx.author.voice is None: + return await ctx.send("You're not connected to a voice channel.") + + voice = ctx.voice_client + if voice is not None: + if voice.is_connected(): + await voice.disconnect() + else: + await ctx.send("The bot is not connected to a voice channel.") + + @commands.command() + async def volume(self, ctx, volume: int): + """Changes the player's volume""" + + if ctx.author.voice is None: + return await ctx.send("You're not connected to a voice channel.") + + if ctx.voice_client is None: + return await ctx.send("Not connected to a voice channel.") + + ctx.voice_client.source.volume = volume / 100 + await ctx.send(f"Changed volume to {volume}%") + + @commands.command() + async def pause(self, ctx): + """Pauses audio""" + + if ctx.author.voice is None: + return await ctx.send("You're not connected to a voice channel.") + + voice = ctx.voice_client + if voice.is_playing(): + voice.pause() + else: + await ctx.send("Currently no audio is playing.") + + @commands.command() + async def resume(self, ctx): + """Resumes currently paused audio""" + + if ctx.author.voice is None: + return await ctx.send("You're not connected to a voice channel.") + + voice = ctx.voice_client + if voice.is_paused(): + voice.resume() + else: + await ctx.send("The audio is not paused.") + + @commands.command() + async def stop(self, ctx): + """Stops and disconnects the bot from voice""" + + if ctx.author.voice is None: + return await ctx.send("You're not connected to a voice channel.") + + voice = ctx.voice_client + if voice: + voice.stop() + + @commands.command(aliases=['join']) + async def connect(self, ctx): + """Connects bot to currently connected voice channel""" + + if ctx.author.voice is None: + return await ctx.send("You're not connected to a voice channel.") + + channel = ctx.author.voice.channel + try: + await channel.connect() + except: + voice = ctx.voice_client + if voice.is_connected() and voice.channel != channel: + await voice.disconnect() + await channel.connect() + +def setup(bot): + bot.add_cog(AudioCog(bot)) \ No newline at end of file diff --git a/cogs/info/calendarCog.py b/cogs/info/calendarCog.py index 3f47268..f04489d 100644 --- a/cogs/info/calendarCog.py +++ b/cogs/info/calendarCog.py @@ -1,59 +1,56 @@ -import os -import discord -import DiscordUtils -import datetime -from dateutil.parser import parse -import requests -from discord.ext import commands - -class CalendarCog(commands.Cog): - - def __init__(self, client): - self.client = client - - # Commands - @commands.command() - async def events(self, ctx): - """Gets all upcoming events from Google Calendar""" - # Check if environment variable exists - if not os.environ.get("GOOGLE_CALENDAR_ENDPOINT"): - return await ctx.send("No Google Calendar endpoint specified!") - - # Get upcoming events data from calendar - current_time = datetime.datetime.utcnow() - formatted_time = current_time.isoformat("T") + "Z" - calendar = os.environ.get("GOOGLE_CALENDAR_ENDPOINT") + "&timeMin=" + formatted_time - data = requests.get(calendar).json() - - # Check if there are any events - if not data["items"]: - return await ctx.send("There are no upcoming events!") - - # Get all upcoming events as a list - list_of_events = data["items"] - embeds = [] - - for event in list_of_events: - # Create data set - title = event["summary"] - start_time = event["start"]["dateTime"] - description = "No description." - if "description" in event: - description = event["description"] - formatted_start_time = datetime.datetime.strftime(parse(start_time), format="%B %d, %Y") - - # Create embed for single event and add to embeds list - embed = discord.Embed(color=ctx.author.color, title=title, description=description) - embed.add_field(name="Starts On", value=formatted_start_time, inline=True) - embeds.append(embed) - - # Create paginator - paginator = DiscordUtils.Pagination.CustomEmbedPaginator(ctx) - paginator.add_reaction('⏮️', "first") - paginator.add_reaction('⏪', "back") - paginator.add_reaction('⏩', "next") - paginator.add_reaction('⏭️', "last") - await paginator.run(embeds) - -def setup(client): - client.add_cog(CalendarCog(client)) \ No newline at end of file +import os +import discord +import DiscordUtils +import datetime +from dateutil.parser import parse +import requests +from discord.ext import commands + +class CalendarCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command() + async def events(self, ctx): + """Gets all upcoming events from Google Calendar""" + # Check if environment variable exists + if not os.environ.get("GOOGLE_CALENDAR_ENDPOINT"): + return await ctx.send("No Google Calendar endpoint specified!") + + # Get upcoming events data from calendar + current_time = datetime.datetime.utcnow() + formatted_time = current_time.isoformat("T") + "Z" + calendar = os.environ.get("GOOGLE_CALENDAR_ENDPOINT") + "&timeMin=" + formatted_time + data = requests.get(calendar).json() + + # Check if there are any events + if not data["items"]: + return await ctx.send("There are no upcoming events!") + + # Get all upcoming events as a list + list_of_events = data["items"] + embeds = [] + + for event in list_of_events: + # Create data set + title = event["summary"] + start_time = event["start"]["dateTime"] + description = event["description"] if "description" in event else "No description." + formatted_start_time = datetime.datetime.strftime(parse(start_time), format="%B %d, %Y") + # Create embed for single event and add to embeds list + embed = discord.Embed(color=ctx.author.color, title=title, description=description) + embed.add_field(name="Starts On", value=formatted_start_time, inline=True) + embeds.append(embed) + + # Create paginator + paginator = DiscordUtils.Pagination.CustomEmbedPaginator(ctx) + paginator.add_reaction('⏮️', "first") + paginator.add_reaction('⏪', "back") + paginator.add_reaction('⏩', "next") + paginator.add_reaction('⏭️', "last") + await paginator.run(embeds) + +def setup(bot): + bot.add_cog(CalendarCog(bot)) \ No newline at end of file diff --git a/cogs/info/infoCog.py b/cogs/info/infoCog.py new file mode 100644 index 0000000..67e7bcf --- /dev/null +++ b/cogs/info/infoCog.py @@ -0,0 +1,30 @@ +import discord +from discord.ext import commands + +class InfoCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command(aliases=['botinfo']) + async def info(self, ctx): + embed = discord.Embed( + title=f"Rutgers Esports Bot <:RutgersEsports:608498339192766505>", + description=( + f'Rutgers Esports Bot is the official Discord bot\n' + 'for handling all internal Rutgers Esports operations.\n\n' + '🔗 Check out Rutgers Esports ' + '[here](https://linktr.ee/RutgersEsports).\n' + '🤖 To add this bot to your server use ' + '[this link](https://bit.ly/rutgers-esports-bot).\n' + "⭐ Star our repo on GitHub [here](https://github.com/rutgersesports/discord-bot)." + ), + color=0xC94949 + ) + embed.set_thumbnail(url=ctx.bot.user.avatar_url) + + await ctx.send(embed=embed) + +def setup(bot): + bot.add_cog(InfoCog(bot)) \ No newline at end of file diff --git a/cogs/info/pingCog.py b/cogs/info/pingCog.py index fdf5c33..246220b 100644 --- a/cogs/info/pingCog.py +++ b/cogs/info/pingCog.py @@ -1,16 +1,16 @@ -import discord -from discord.ext import commands - -class PingCog(commands.Cog): - - def __init__(self, client): - self.client = client - - # Commands - @commands.command(aliases=['latency']) - async def ping(self, ctx): - """Returns the bot client latency""" - await ctx.send(f'Pong! {round(self.client.latency * 1000)}ms') - -def setup(client): - client.add_cog(PingCog(client)) \ No newline at end of file +import discord +from discord.ext import commands + +class PingCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command(aliases=['latency']) + async def ping(self, ctx): + """Returns the bot bot latency""" + await ctx.send(f'Pong! {round(self.bot.latency * 1000)}ms') + +def setup(bot): + bot.add_cog(PingCog(bot)) \ No newline at end of file diff --git a/cogs/info/serverCog.py b/cogs/info/serverCog.py new file mode 100644 index 0000000..54e1ef1 --- /dev/null +++ b/cogs/info/serverCog.py @@ -0,0 +1,35 @@ +import discord +from discord.ext import commands + +class ServerCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command(aliases=['server', 'sinfo']) + async def serverinfo(self, ctx): + """Get information about the current server""" + guild = ctx.guild + + roles = str(len(guild.roles)) + emojis = str(len(guild.emojis)) + vchannels = str(len(guild.voice_channels)) + tchannels = str(len(guild.text_channels)) + + embed = discord.Embed(title='Server info', description=guild.name, color=ctx.guild.get_member(ctx.bot.user.id).color) + embed.set_thumbnail(url=guild.icon_url) + embed.add_field(name='ID', value=guild.id, inline=True) + embed.add_field(name='Owner', value=guild.owner, inline=True) + embed.add_field(name='Members', value=guild.member_count, inline=True) + embed.add_field(name='Text channels', value=tchannels, inline=True) + embed.add_field(name='Voice channels', value=vchannels, inline=True) + embed.add_field(name='Created on', value=guild.created_at.strftime('%B %d, %Y'), inline=True) + embed.add_field(name='Region', value=guild.region, inline=True) + embed.add_field(name='Roles', value=roles, inline=True) + embed.add_field(name='Verification', value=guild.verification_level, inline=True) + + await ctx.send(embed=embed) + +def setup(bot): + bot.add_cog(ServerCog(bot)) \ No newline at end of file diff --git a/cogs/info/userCog.py b/cogs/info/userCog.py new file mode 100644 index 0000000..4f1af81 --- /dev/null +++ b/cogs/info/userCog.py @@ -0,0 +1,44 @@ +import discord +from discord.ext import commands + +class UserCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command(aliases=['whois']) + async def userinfo(self, ctx, member: discord.Member = None): + """Get information about a given user""" + # Gather data + member = ctx.author if not member else member + roles = [role for role in member.roles] + default_role = discord.utils.get(member.guild.roles, name='@everyone') + role_mentions = [f'{role.mention}' for role in sorted(member.roles, key=lambda x: x.position, reverse=True) if role != default_role] + all_perms = [x for x in dir(ctx.channel.permissions_for(member))] + permissions = [] + for perm in all_perms: + perm_name = perm + if getattr(ctx.channel.permissions_for(member), perm_name) is True: + permissions.append(perm_name.title().replace("_", " ").replace("Tts", "TTS")) + + # Create embed + embed = discord.Embed(description = member.mention, color = member.color, timestamp = ctx.message.created_at) + + embed.set_author(name = member, icon_url = member.avatar_url) + embed.set_thumbnail(url = member.avatar_url) + embed.set_footer(text = member.id) + + embed.add_field(name = 'Joined', value = member.joined_at.strftime('%a, %d %B %Y, %I:%M %p UTC'), inline=True) + embed.add_field(name = 'Registered', value = member.created_at.strftime('%a, %d %B %Y, %I:%M %p UTC'), inline=True) + + embed.add_field(name=f'Roles [{len(roles)}]', value=", ".join(role_mentions)+f', {default_role}', inline=False) + embed.add_field(name=f'Permissions [{len(permissions)}]', value=", ".join(permissions), inline=False) + + + embed.add_field(name='Nickname', value=member.nick if hasattr(member, 'nick') else 'None', inline=True) + + await ctx.send(embed = embed) + +def setup(bot): + bot.add_cog(UserCog(bot)) \ No newline at end of file diff --git a/cogs/inventory/inventoryCog.py b/cogs/inventory/inventoryCog.py index 239c0d7..d9f0dad 100644 --- a/cogs/inventory/inventoryCog.py +++ b/cogs/inventory/inventoryCog.py @@ -1,61 +1,61 @@ -import os -import discord -import DiscordUtils -import asyncio -from google.cloud import firestore -from discord.ext import commands -from dotenv import load_dotenv - -load_dotenv() - -class InventoryCog(commands.Cog): - - def __init__(self, client): - self.client = client - # Commands - - # Get a single item from inventory - @commands.command(aliases=['inv']) - @commands.is_owner() - async def inventory(self, ctx, arg1): - """Get a single item from the inventory database""" - - # Make single input embed - def single_embed(item, id): - embed = discord.Embed(title=item["item_name"], description=id) - if item["item_type"] != "": embed.add_field(name="Item Type", value=item["item_type"], inline=True) - if item["color"] != "": embed.add_field(name="Color", value=item["color"], inline=True) - if item["brand"] != "": embed.add_field(name="Brand", value=item["brand"], inline=True) - if item["model"] != "": embed.add_field(name="Model", value=item["model"], inline=True) - if item["size"] != "": embed.add_field(name="Size", value=item["size"], inline=True) - if item["quantity"] != "": embed.add_field(name="Quantity", value=item["quantity"], inline=True) - if item["box"] != "": embed.add_field(name="Box", value=item["box"], inline=True) - return embed - - # Connect to Firestore DB inventory collection and get the item arg1 as doc - if "INVENTORY_PROJECT_ID" in os.environ and "GOOGLE_APPLICATION_CREDENTIALS" in os.environ: - try: - db = firestore.AsyncClient(project=os.environ.get("INVENTORY_PROJECT_ID")) - inventory_ref = db.collection("inventory").document(arg1) - doc = await inventory_ref.get() - - if doc.exists: - await ctx.send(embed=single_embed(doc.to_dict(), doc.id)) - else: - await ctx.send("That ID doesn't exist!") - except: - await ctx.send("The DB connection is not working.") - elif "INVENTORY_PROJECT_ID" not in os.environ and "GOOGLE_APPLICATION_CREDENTIALS" in os.environ: - await ctx.send("Inventory Project ID not found!") - elif "GOOGLE_APPLICATION_CREDENTIALS" not in os.environ: - await ctx.send("GAPP Credentials not found!") - - @inventory.error - async def inventory_error(self, ctx, error): - if isinstance(error, commands.MissingRequiredArgument): - await ctx.send("Missing required argument! (e.g. d!inventory __10000__)") - if isinstance(error, commands.NotOwner): - await ctx.send("You do not have permissions to run this command.") - -def setup(client): - client.add_cog(InventoryCog(client)) \ No newline at end of file +import os +import discord +import DiscordUtils +import asyncio +from google.cloud import firestore +from discord.ext import commands +from dotenv import load_dotenv + +load_dotenv() + +class InventoryCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + # Get a single item from inventory + @commands.command(aliases=['inv']) + @commands.is_owner() + async def inventory(self, ctx, arg1): + """Get a single item from the inventory database""" + + # Make single input embed + def single_embed(item, id): + embed = discord.Embed(title=item["item_name"], description=id) + if item["item_type"] != "": embed.add_field(name="Item Type", value=item["item_type"], inline=True) + if item["color"] != "": embed.add_field(name="Color", value=item["color"], inline=True) + if item["brand"] != "": embed.add_field(name="Brand", value=item["brand"], inline=True) + if item["model"] != "": embed.add_field(name="Model", value=item["model"], inline=True) + if item["size"] != "": embed.add_field(name="Size", value=item["size"], inline=True) + if item["quantity"] != "": embed.add_field(name="Quantity", value=item["quantity"], inline=True) + if item["box"] != "": embed.add_field(name="Box", value=item["box"], inline=True) + return embed + + # Connect to Firestore DB inventory collection and get the item arg1 as doc + if "INVENTORY_PROJECT_ID" in os.environ and "GOOGLE_APPLICATION_CREDENTIALS" in os.environ: + try: + db = firestore.AsyncClient(project=os.environ.get("INVENTORY_PROJECT_ID")) + inventory_ref = db.collection("inventory").document(arg1) + doc = await inventory_ref.get() + + if doc.exists: + await ctx.send(embed=single_embed(doc.to_dict(), doc.id)) + else: + await ctx.send("That ID doesn't exist!") + except: + await ctx.send("The DB connection is not working.") + elif "INVENTORY_PROJECT_ID" not in os.environ and "GOOGLE_APPLICATION_CREDENTIALS" in os.environ: + await ctx.send("Inventory Project ID not found!") + elif "GOOGLE_APPLICATION_CREDENTIALS" not in os.environ: + await ctx.send("GAPP Credentials not found!") + + @inventory.error + async def inventory_error(self, ctx, error): + if isinstance(error, commands.MissingRequiredArgument): + await ctx.send("Missing required argument! (e.g. d!inventory __10000__)") + if isinstance(error, commands.NotOwner): + await ctx.send("You do not have permissions to run this command.") + +def setup(bot): + bot.add_cog(InventoryCog(bot)) \ No newline at end of file diff --git a/cogs/moderation/embedCog.py b/cogs/moderation/embedCog.py new file mode 100644 index 0000000..dfd370a --- /dev/null +++ b/cogs/moderation/embedCog.py @@ -0,0 +1,64 @@ +import discord +from discord.ext import commands + +class EmbedCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command() + async def embed(self, ctx, *, data): + """Produces a customizable embed""" + # Split arguments into a list + data = data.split("%%") + + # Set default channel to current channel where command is used + channel = ctx.channel + + # Remove [''] surrounding possible channel argument input (slice value to just channel ID) + possible_channel = data[0].rstrip()[2:-1] + + # Set channel if channel argument is given + try: + channel = await commands.TextChannelConverter().convert(ctx, possible_channel) + data.pop(0) + except Exception as e: + pass + + # Check if user has permission to send in given channel + if not ctx.guild.get_member(ctx.author.id).permissions_in(channel).send_messages: + return await ctx.send(f"You don't have permission to send messages to {channel.mention}!") + + + # Add possible empty list values to deter IndexError for embed + data += [""] * (3-len(data)) + + # Create and send embed + embed = discord.Embed( + title=f"{data[0]}", + description=f"{data[1]}", + color=ctx.guild.get_member(ctx.bot.user.id).color + ) + embed.set_footer( + text=f"{data[2]}" + ) + await channel.send(embed=embed) + + @embed.error + async def embed_error(self, ctx, error): + await ctx.send( + "Type the command in the following format:```.embed #channel_name %% title %% description %% footer```" + ) + embed = discord.Embed( + title="Title", + description="Description", + color=ctx.guild.get_member(ctx.bot.user.id).color + ) + embed.set_footer( + text="Footer" + ) + await ctx.send(embed=embed) + +def setup(bot): + bot.add_cog(EmbedCog(bot)) \ No newline at end of file diff --git a/cogs/moderation/moderationCog.py b/cogs/moderation/moderationCog.py index a769e5c..2eed918 100644 --- a/cogs/moderation/moderationCog.py +++ b/cogs/moderation/moderationCog.py @@ -1,31 +1,31 @@ -import discord -from discord.ext import commands - -class ModerationCog(commands.Cog): - - def __init__(self, client): - self.client = client - - # Commands - @commands.command() - @commands.has_permissions(kick_members = True) - async def kick(self, ctx, member : commands.MemberConverter, *, reason="No reason provided."): - """Kick a user from the server""" - try: - await member.kick(reason=reason) - await ctx.send(member.mention + " has been kicked.") - except: - await ctx.send(f"Unable to kick {member.mention}.\nIs {member.mention} at the same role level or higher than {self.client.user.name}?") - - @commands.command() - @commands.has_permissions(ban_members = True) - async def ban(self, ctx, member : commands.MemberConverter, *, reason="No reason provided."): - """Ban a user from the server""" - try: - await member.ban(reason=reason) - await ctx.send(member.mention + " has been banned.") - except: - await ctx.send(f"Unable to ban {member.mention}.\nIs {member.mention} at the same role level or higher than {self.client.user.name}?") - -def setup(client): - client.add_cog(ModerationCog(client)) \ No newline at end of file +import discord +from discord.ext import commands + +class ModerationCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command() + @commands.has_permissions(kick_members = True) + async def kick(self, ctx, member : commands.MemberConverter, *, reason="No reason provided."): + """Kick a user from the server""" + try: + await member.kick(reason=reason) + await ctx.send(member.mention + " has been kicked.") + except: + await ctx.send(f"Unable to kick {member.mention}.\nIs {member.mention} at the same role level or higher than {self.bot.user.name}?") + + @commands.command() + @commands.has_permissions(ban_members = True) + async def ban(self, ctx, member : commands.MemberConverter, *, reason="No reason provided."): + """Ban a user from the server""" + try: + await member.ban(reason=reason) + await ctx.send(member.mention + " has been banned.") + except: + await ctx.send(f"Unable to ban {member.mention}.\nIs {member.mention} at the same role level or higher than {self.bot.user.name}?") + +def setup(bot): + bot.add_cog(ModerationCog(bot)) \ No newline at end of file diff --git a/cogs/moderation/pruneCog.py b/cogs/moderation/pruneCog.py new file mode 100644 index 0000000..5a7cc8c --- /dev/null +++ b/cogs/moderation/pruneCog.py @@ -0,0 +1,18 @@ +import discord +from discord.ext import commands + +class PruneCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command(aliases=['clear', 'prune']) + @commands.has_permissions(manage_messages=True) + async def purge(self, ctx, amount=10): + """Removes a number of messages (10 by default)""" + await ctx.channel.purge(limit=amount+1) + await ctx.send(f'`{amount}` messages deleted.', delete_after=3) + +def setup(bot): + bot.add_cog(PruneCog(bot)) \ No newline at end of file diff --git a/cogs/owner/loaderCog.py b/cogs/owner/loaderCog.py new file mode 100644 index 0000000..2f5da8a --- /dev/null +++ b/cogs/owner/loaderCog.py @@ -0,0 +1,23 @@ +import discord +from discord.ext import commands + +class LoaderCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.is_owner() + @commands.command() + async def load(self, ctx, extension): + """Loads a cog""" + self.bot.load_extension(f'cogs.{extension}') + + @commands.is_owner() + @commands.command() + async def unload(self, ctx, extension): + """Unloads a cog""" + self.bot.unload_extension(f'cogs.{extension}') + +def setup(bot): + bot.add_cog(LoaderCog(bot)) \ No newline at end of file diff --git a/cogs/owner/sayCog.py b/cogs/owner/sayCog.py new file mode 100644 index 0000000..f5db55e --- /dev/null +++ b/cogs/owner/sayCog.py @@ -0,0 +1,18 @@ +import discord +from discord.ext import commands + +class SayCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command(aliases=['speak']) + @commands.is_owner() + async def say(self, ctx, *, content): + """Lets the bot say given arguments""" + await ctx.message.delete() + await ctx.send(content) + +def setup(bot): + bot.add_cog(SayCog(bot)) \ No newline at end of file diff --git a/cogs/owner/statusCog.py b/cogs/owner/statusCog.py new file mode 100644 index 0000000..7f4c6e3 --- /dev/null +++ b/cogs/owner/statusCog.py @@ -0,0 +1,29 @@ +import discord +from discord.ext import commands + +class StatusCog(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + # Commands + @commands.command(aliases=['botstatus', 'stat']) + @commands.is_owner() + async def status(self, ctx): + """Gives bot statistics""" + # Total members of all servers bot is in + total_guild_users = 0 + for guild in ctx.bot.guilds: + total_guild_users += guild.member_count + + embed = discord.Embed( + title=f"Bot Status", + description=(f'`{ctx.bot.user.name}` is online.' + f'\nBot is in `{len(ctx.bot.guilds)}` guilds.' + f'\nGuilds have `{total_guild_users}` members.'), + color=ctx.guild.get_member(ctx.bot.user.id).color + ) + await ctx.send(embed=embed) + +def setup(bot): + bot.add_cog(StatusCog(bot)) \ No newline at end of file diff --git a/images/Bot-Example.png b/images/Bot-Example.png new file mode 100644 index 0000000000000000000000000000000000000000..950c533842669c34a221aedb1f0ee1b4f055fb58 GIT binary patch literal 35658 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�ro28hLnk_5e1Bx&;k_2diozx}Sm9owb}L`% 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 jXo-CO*9Y)4o=)WJDLlSh;Qi(V \ No newline at end of file diff --git a/images/icons/facebook-alt.svg b/images/icons/facebook-alt.svg new file mode 100644 index 0000000..dd748b1 --- /dev/null +++ b/images/icons/facebook-alt.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/icons/facebook.svg b/images/icons/facebook.svg new file mode 100644 index 0000000..b328631 --- /dev/null +++ b/images/icons/facebook.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/icons/github.svg b/images/icons/github.svg new file mode 100644 index 0000000..3fac1ed --- /dev/null +++ b/images/icons/github.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/icons/instagram.svg b/images/icons/instagram.svg new file mode 100644 index 0000000..9371bdc --- /dev/null +++ b/images/icons/instagram.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/icons/link.svg b/images/icons/link.svg new file mode 100644 index 0000000..d82cb90 --- /dev/null +++ b/images/icons/link.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + diff --git a/images/icons/linked-in-alt.svg b/images/icons/linked-in-alt.svg new file mode 100644 index 0000000..1f9463a --- /dev/null +++ b/images/icons/linked-in-alt.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/icons/linked-in.svg b/images/icons/linked-in.svg new file mode 100644 index 0000000..4e7b515 --- /dev/null +++ b/images/icons/linked-in.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/images/icons/mail.svg b/images/icons/mail.svg new file mode 100644 index 0000000..2b5177d --- /dev/null +++ b/images/icons/mail.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + diff --git a/images/icons/reddit.svg b/images/icons/reddit.svg new file mode 100644 index 0000000..e13d583 --- /dev/null +++ b/images/icons/reddit.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/icons/twitch.svg b/images/icons/twitch.svg new file mode 100644 index 0000000..3120fea --- /dev/null +++ b/images/icons/twitch.svg @@ -0,0 +1,21 @@ + + + + +Asset 2 + + + + + + + + + + + diff --git a/images/icons/twitter-alt.svg b/images/icons/twitter-alt.svg new file mode 100644 index 0000000..165cd7c --- /dev/null +++ b/images/icons/twitter-alt.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/icons/twitter.svg b/images/icons/twitter.svg new file mode 100644 index 0000000..1303a71 --- /dev/null +++ b/images/icons/twitter.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/icons/youtube.svg b/images/icons/youtube.svg new file mode 100644 index 0000000..62005ce --- /dev/null +++ b/images/icons/youtube.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +