splitting into two cogs

This commit is contained in:
Fadi Atamny 2020-05-03 20:04:33 +03:00
parent c685e7cf4a
commit dd34e01c57
6 changed files with 185 additions and 111 deletions

View File

@ -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.

View File

@ -0,0 +1,5 @@
from .trafficTrack import TrafficTrack
from redbot.core.bot import Red
def setup(bot: Red):
bot.add_cog(TrafficTrack(bot))

View File

@ -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"
]
}

View File

@ -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!')

View File

@ -6,7 +6,7 @@
"name": "Welcome", "name": "Welcome",
"short": "Sends a welcome dm thats written in a specific format to the users", "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", "description": "Sends a welcome dm thats written in a specific format to the users",
"requirements": ["aiohttp","datetime"], "requirements": ["aiohttp"],
"tags": [ "tags": [
"welcome" "welcome"
] ]

View File

@ -1,8 +1,6 @@
import asyncio
import aiohttp import aiohttp
import discord import discord
import json import json
from datetime import datetime
from redbot.core import Config, checks, commands from redbot.core import Config, checks, commands
from redbot.core.utils.chat_formatting import box, humanize_list, pagify 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} allowed_guilds = {274657393936302080, 693796372092289024, 508781789737648138}
admin_roles = {'Developer', 'admin', 'Council'} admin_roles = {'Developer', 'admin', 'Council'}
statsThumbnailUrl = 'https://www.kanium.org/machineroom/logomachine-small.png'
class WelcomeCog(commands.Cog): class WelcomeCog(commands.Cog):
def __init__(self, bot): def __init__(self, bot):
self.bot = bot self.bot = bot
self.message: str = '' 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 @staticmethod
async def fetchMessage(): async def fetchMessage():
@ -62,14 +52,6 @@ class WelcomeCog(commands.Cog):
name='Welcome', value='Welcome To Kanium !', inline=True) name='Welcome', value='Welcome To Kanium !', inline=True)
return message 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.command(name='pullmessage', description='pulls the message from github again')
@commands.has_any_role(*admin_roles) @commands.has_any_role(*admin_roles)
async def pullMessage(self, ctx: commands.Context) -> None: async def pullMessage(self, ctx: commands.Context) -> None:
@ -94,56 +76,6 @@ class WelcomeCog(commands.Cog):
except(): except():
print(f'Error Occured!') 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() @commands.Cog.listener()
async def on_member_join(self, member: discord.Member) -> None: async def on_member_join(self, member: discord.Member) -> None:
try: try:
@ -153,47 +85,6 @@ class WelcomeCog(commands.Cog):
self.message = await WelcomeCog.fetchMessage() self.message = await WelcomeCog.fetchMessage()
message = WelcomeCog.formatMessage(self.message) message = WelcomeCog.formatMessage(self.message)
await member.send(content=None, embed=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): except (discord.NotFound, discord.Forbidden):
print( print(
f'Error Occured! sending a dm to {member.display_name} didnt work !') 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!')