From dd34e01c5764ca270b10ffa2b794426faf6b3853 Mon Sep 17 00:00:00 2001 From: Fadi Atamny Date: Sun, 3 May 2020 20:04:33 +0300 Subject: [PATCH] splitting into two cogs --- trafficTrackerCog/README.md | 36 +++++++++ trafficTrackerCog/__init__.py | 5 ++ trafficTrackerCog/info.json | 13 +++ trafficTrackerCog/trafficTrack.py | 129 ++++++++++++++++++++++++++++++ welcomeCog/info.json | 2 +- welcomeCog/welcome.py | 111 +------------------------ 6 files changed, 185 insertions(+), 111 deletions(-) create mode 100644 trafficTrackerCog/README.md create mode 100644 trafficTrackerCog/__init__.py create mode 100644 trafficTrackerCog/info.json create mode 100644 trafficTrackerCog/trafficTrack.py diff --git a/trafficTrackerCog/README.md b/trafficTrackerCog/README.md new file mode 100644 index 0000000..bfcc802 --- /dev/null +++ b/trafficTrackerCog/README.md @@ -0,0 +1,36 @@ +# WelcomeCog +This is the Kanium community/guild welcome cog. it sends a DM to any new user that joins the Kanium discord with a [message](./data/embedded_message.json), which has been templated in a json format. +Furthermore, this cog allows the ability to monitor discord activity and log it into a specific channel using the specific commands. + +# How to use: +In order to use our cog you would need to install it onto your instance of [RedBot](https://github.com/Cog-Creators/Red-DiscordBot). + + +## Requirments: +- Instance of [RedBot](https://github.com/Cog-Creators/Red-DiscordBot) +- Downloader cog has to be loaded. to load: + `[Prefix]load downloader` + +## How to install & load: +1. `[PREFIX]repo add [RepoName] https://github.com/Kanium/KaniumCogs [ActiveBranch (EX: Master)] ` +2. `[PREFIX]cog install [RepoName] welcomeCog` +3. `[PREFIX]load welcomeCog` + +### To update the Cog: +- `[PREFIX]cog uninstall welcomeCog` +- `[PREFIX]repo update [RepoName]` +- `[PREFIX]cog install [RepoName] welcomeCog` +- `[PREFIX]load welcomeCog` + +### Commands +- `[PREFIX]welcomepreview` - sends in the chat a preview of the template message +- `[PREFIX]pullmessage` - allows you to pull the latest version of your message without restarting the bot +- `[PREFIX]setchannel` - allows you to select a channel in your discord to dump logs to +- `[PREFIX]stats` - prints the statistics that the cog has gathered. +- `[PREFIX]resetstats` - allows for a hard reset of the stats +- `[PREFIX]toggleLogs` - Toggles the logs functionality on or off + +### To modify the sent message: +If you would like to modify the message to your liking, you can either : +- fork the bot. change the [message](./data/embedded_message.json) and [welcome.py](./welcome.py) line 9 to your repo. +- fork the bot. update the [welcome.py](./welcome.py) line 9 to be directed to your message.json file that you like without having it hosted on github with your repo. diff --git a/trafficTrackerCog/__init__.py b/trafficTrackerCog/__init__.py new file mode 100644 index 0000000..05799ea --- /dev/null +++ b/trafficTrackerCog/__init__.py @@ -0,0 +1,5 @@ +from .trafficTrack import TrafficTrack +from redbot.core.bot import Red + +def setup(bot: Red): + bot.add_cog(TrafficTrack(bot)) \ No newline at end of file diff --git a/trafficTrackerCog/info.json b/trafficTrackerCog/info.json new file mode 100644 index 0000000..60ab654 --- /dev/null +++ b/trafficTrackerCog/info.json @@ -0,0 +1,13 @@ +{ + "author": [ + "Deathblade" + ], + "install_msg": "May Kanuim broaden your horizons", + "name": "TrafficTracker", + "short": "Tracks daily activity on the server", + "description": "Tracks incoming and outgoing member activity on the server with daily resets", + "requirements": ["aiohttp","datetime"], + "tags": [ + "Traffic" + ] +} \ No newline at end of file diff --git a/trafficTrackerCog/trafficTrack.py b/trafficTrackerCog/trafficTrack.py new file mode 100644 index 0000000..5acb9cf --- /dev/null +++ b/trafficTrackerCog/trafficTrack.py @@ -0,0 +1,129 @@ +import discord +from datetime import datetime + +from redbot.core import Config, checks, commands +from redbot.core.utils.chat_formatting import box, humanize_list, pagify + +allowed_guilds = {274657393936302080, 693796372092289024, 508781789737648138} +admin_roles = {'Developer', 'admin', 'Council'} +statsThumbnailUrl = 'https://www.kanium.org/machineroom/logomachine-small.png' + +class TrafficTrack(commands.Cog): + + def __init__(self, bot): + 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() + + def __checkClock(self): + currdate = self.date - datetime.now() + if currdate.days >= 0 : + self.dailyJoinedCount = 0 + self.dailyLeftCount = 0 + self.date = datetime.now() + + @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() + message = discord.Embed(title='Server Traffic Stats', description='Statistics on server activity\n\n') + message.set_thumbnail(url=statsThumbnailUrl) + message.add_field(name='Daily Joined', value=self.dailyJoinedCount, inline='True') + message.add_field(name='Daily Left', value='{0}\n'.format(self.dailyLeftCount), inline='True') + message.add_field(name='Total Joined', value=self.totalJoinedCount, inline='True') + message.add_field(name='Total Left', value=self.totalLeftCount, inline='True') + message.add_field(name='Total Traffic', value=self.totalLogs, inline='False') + 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 + 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!') diff --git a/welcomeCog/info.json b/welcomeCog/info.json index 43ab182..5094e8f 100644 --- a/welcomeCog/info.json +++ b/welcomeCog/info.json @@ -6,7 +6,7 @@ "name": "Welcome", "short": "Sends a welcome dm thats written in a specific format to the users", "description": "Sends a welcome dm thats written in a specific format to the users", - "requirements": ["aiohttp","datetime"], + "requirements": ["aiohttp"], "tags": [ "welcome" ] diff --git a/welcomeCog/welcome.py b/welcomeCog/welcome.py index c8112bb..35928ef 100644 --- a/welcomeCog/welcome.py +++ b/welcomeCog/welcome.py @@ -1,8 +1,6 @@ -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 @@ -11,21 +9,13 @@ url = 'https://raw.githubusercontent.com/Kanium/KaniumCogs/master/welcomeCog/dat 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(): @@ -62,14 +52,6 @@ class WelcomeCog(commands.Cog): 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: @@ -94,56 +76,6 @@ class WelcomeCog(commands.Cog): 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: @@ -153,47 +85,6 @@ class WelcomeCog(commands.Cog): 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!')