import asyncio import aiohttp import discord import json from datetime import datetime from redbot.core import Config, checks, commands from redbot.core.utils.chat_formatting import box, humanize_list, pagify url = 'https://raw.githubusercontent.com/Kanium/KaniumCogs/master/welcomeCog/data/embedded_message.json' allowed_guilds = {274657393936302080, 693796372092289024, 508781789737648138} admin_roles = {'Developer', 'admin', 'Council'} statsThumbnailUrl = 'https://www.kanium.org/machineroom/logomachine-small.png' class WelcomeCog(commands.Cog): def __init__(self, bot): self.bot = bot self.message: str = '' self.channel: discord.TextChannel = None self.dailyJoinedCount: int = 0 self.totalJoinedCount: int = 0 self.dailyLeftCount: int = 0 self.totalLeftCount: int = 0 self.totalLogs: int = 0 self.toggleLogs: bool = True self.date = datetime.now() @staticmethod async def fetchMessage(): async def fetch(): async with aiohttp.ClientSession() as session: async with session.get(url) as response: html = await response.text() x = json.loads(str(html)) return x return await fetch() @staticmethod def formatMessage(jsonFormat: str): try: message = discord.Embed(title=str(jsonFormat['title']), description=''.join( map(str, jsonFormat['description'])), color=int(jsonFormat['color'], 16)) message.set_thumbnail(url=jsonFormat['thumbnail']) for field in jsonFormat['fields']: if(field['id'] != 'links'): message.add_field( name=field['name'], value=field['value'], inline=field['inline']) else: message.add_field(name=field['name'], value=''.join( map(str, field['value'])), inline=field['inline']) message.set_footer( text=jsonFormat['footer']['text'], icon_url=jsonFormat['footer']['icon_url']) return message except: message = discord.Embed( title='Kanium', description='', color=0x3399ff) message.add_field( name='Welcome', value='Welcome To Kanium !', inline=True) return message def __checkClock(self): currdate = self.date - datetime.now() if currdate.day >= 0 : self.dailyJoinedCount = 0 self.dailyLeftCount = 0 self.date = datetime.now() @commands.command(name='pullmessage', description='pulls the message from github again') @commands.has_any_role(*admin_roles) async def pullMessage(self, ctx: commands.Context) -> None: try: await ctx.trigger_typing() self.message = await WelcomeCog.fetchMessage() await ctx.send('Welcome message updated') except: print('error occured fetching message') @commands.command(name='welcomepreview', case_insensitive=True, description='Shows a preview of the welcome message') @commands.has_any_role(*admin_roles) async def previewMessage(self, ctx: commands.Context) -> None: try: await ctx.trigger_typing() if ctx.guild.id not in allowed_guilds: return if self.message == '': self.message = await WelcomeCog.fetchMessage() message = WelcomeCog.formatMessage(self.message) await ctx.send(content=None, embed=message) except(): print(f'Error Occured!') @commands.command(name='setchannel', description='Sets the channel to sends log to') @commands.has_any_role(*admin_roles) async def setChannel(self, ctx: commands.Context, channel: discord.TextChannel) -> None: await ctx.trigger_typing() if not channel in ctx.guild.channels: await ctx.send('Channel doesnt exist in guild') return if not channel.permissions_for(ctx.guild.me).send_messages: await ctx.send('No permissions to talk in that channel.') return self.channel = channel await ctx.send(f'I will now send event notices to {channel.mention}.') @commands.command(name='stats', description='Shows current statistics') @commands.has_any_role(*admin_roles) async def statistics(self, ctx: commands.Context) -> None: self.__checkClock() await ctx.trigger_typing() statsString = '\nDaily Joined = {0}\tDaily Left = {1}\nTotal Joined = {2}\tTotal Left = {3}\n------------------------\nTotal Logs = {4}'.format( self.dailyJoinedCount, self.dailyLeftCount, self.totalJoinedCount, self.totalLeftCount, self.totalLogs) message = discord.Embed(title='Server Traffic Stats', description='Statistics on server activity\n\n'.join(statsString)) message.set_thumbnail(url=statsThumbnailUrl) await ctx.send(content=None, embed=message) @commands.command(name='resetstats', description='Resets statistics') @commands.has_any_role(*admin_roles) async def resetStatistics(self, ctx: commands.Context) -> None: await ctx.trigger_typing() self.dailyJoinedCount = 0 self.dailyLeftCount = 0 self.totalJoinedCount = 0 self.totalLeftCount = 0 self.totalLogs = 0 await ctx.send('Successfully reset the statistics') @commands.command(name='toggleLogs', description='Toggles the logs functionality on or off') @commands.has_any_role(*admin_roles) async def toggleLogs(self, ctx: commands.Context) -> None: await ctx.trigger_typing() self.toggleLogs = not self.toggleLogs await ctx.send('Logging functionality is `ON`' if self.toggleLogs else 'Logging functionality is `OFF`') @commands.Cog.listener() async def on_member_join(self, member: discord.Member) -> None: try: if member.guild.id not in allowed_guilds: return if self.message == '': self.message = await WelcomeCog.fetchMessage() message = WelcomeCog.formatMessage(self.message) await member.send(content=None, embed=message) self.__checkClock() if self.channel in member.guild.channels and self.toggleLogs: await self.channel.send('>>> {0} has joined the server'.format(member.mention)) self.totalJoinedCount += 1 self.dailyJoinedCount += 1 self.totalLogs += 1 except (discord.NotFound, discord.Forbidden): print( f'Error Occured! sending a dm to {member.display_name} didnt work !') @commands.Cog.listener() async def on_member_remove(self, member: discord.Member) -> None: try: self.__checkClock() if self.channel in member.guild.channels and self.toggleLogs: await self.channel.send('>>> {0} has left the server'.format(member.mention)) self.totalLeftCount += 1 self.dailyLeftCount += 1 self.totalLogs += 1 except (discord.NotFound, discord.Forbidden): print( f'Error Occured!') @commands.Cog.listener() async def on_member_ban(self, guild: discord.Guild, member: discord.Member) -> None: try: self.__checkClock() if self.channel in member.guild.channels and self.toggleLogs: await self.channel.send('>>> {0} has been banned from the server'.format(member.mention)) self.totalLogs += 1 except (discord.NotFound, discord.Forbidden): print( f'Error Occured!') @commands.Cog.listener() async def on_member_ban(self, guild: discord.Guild, member: discord.Member) -> None: try: self.__checkClock() if self.channel in member.guild.channels and self.toggleLogs: await self.channel.send('>>> {0} has been unbanned from the server'.format(member.mention)) self.totalLogs += 1 except (discord.NotFound, discord.Forbidden): print( f'Error Occured!')