-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #160 from Tortoise-Community/dev
Merge dev branch
- Loading branch information
Showing
7 changed files
with
328 additions
and
318 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,35 +1,35 @@ | ||
from discord import Invite, Member | ||
from discord.ext import commands | ||
|
||
from bot.utils import invite_help | ||
from bot.utils import invite_help, embed_handler | ||
from bot.constants import tortoise_guild_id, successful_verifications_channel_id | ||
|
||
|
||
class InviteTracker(commands.Cog): | ||
def __init__(self, bot): | ||
self.bot = bot | ||
self.tracker = invite_help.TRACKER(bot) | ||
self.tracker = invite_help.GuildInviteTracker(self.bot.get_guild(tortoise_guild_id)) | ||
self.log_channel = self.bot.get_channel(successful_verifications_channel_id) | ||
self.bot.loop.create_task(self.tracker.refresh_invite_cache()) | ||
|
||
@commands.Cog.listener() | ||
async def on_ready(self): | ||
await self.tracker.all_invites() | ||
async def on_invite_create(self, invite: Invite): | ||
await self.tracker.add_new_invite(invite) | ||
|
||
@commands.Cog.listener() | ||
async def on_invite_create(self, invite): | ||
await self.tracker.update_invite(invite) | ||
async def on_invite_delete(self, invite: Invite): | ||
await self.tracker.remove_invite(invite) | ||
|
||
@commands.Cog.listener() | ||
async def on_guild_join(self, guild): | ||
await self.tracker.create_guild_invites(guild) | ||
|
||
@commands.Cog.listener() | ||
async def on_invite_delete(self, invite): | ||
await self.tracker.delete_guild_invites(invite) | ||
|
||
@commands.Cog.listener() | ||
async def on_guild_remove(self, guild): | ||
await self.tracker.remove_invites(guild) | ||
|
||
@commands.Cog.listener() | ||
async def on_member_join(self, member): | ||
# TODO | ||
# inviter = await self.tracker.get_inviter(member).id | ||
pass | ||
async def on_member_join(self, member: Member): | ||
inviter = await self.tracker.track_invite() | ||
if inviter: | ||
await self.log_channel.send(embed=embed_handler.info( | ||
f"New member {member} was invited by {inviter}", | ||
member=member, | ||
title="" | ||
)) | ||
|
||
|
||
def setup(bot): | ||
bot.add_cog(InviteTracker(bot)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,93 +1,38 @@ | ||
import sys | ||
|
||
import discord | ||
|
||
|
||
class CACHE: | ||
def __init__(self): | ||
self.cache = {} | ||
self.size = 40 | ||
|
||
def __iter__(self): | ||
return self.cache | ||
class GuildInviteTracker: | ||
def __init__(self, guild): | ||
self.guild = guild | ||
self._cache = {} | ||
|
||
async def refresh_invite_cache(self): | ||
self._cache = await self.get_all_invites() | ||
|
||
class TRACKER: | ||
def __init__(self, bot): | ||
self.bot = bot | ||
self.__cache = CACHE() | ||
async def get_inviter(self, code): | ||
return self._cache.get(code)["created_by"] | ||
|
||
async def all_invites(self): | ||
for guild in self.bot.guilds: | ||
self.__cache.cache[guild.id] = {} | ||
try: | ||
invites = await guild.invites() | ||
for invite in invites: | ||
if invite.inviter not in self.__cache.cache[guild.id].keys(): | ||
self.__cache.cache[guild.id][invite.inviter] = [] | ||
self.__cache.cache[guild.id][invite.inviter].append(invite) | ||
self.__cache.size = sys.getsizeof(self.__cache.cache) | ||
except discord.errors.Forbidden: | ||
pass | ||
|
||
async def update_invite(self, invite): | ||
try: | ||
if invite.guild.id not in self.__cache.cache.keys(): | ||
self.__cache.cache[invite.guild.id] = {} | ||
if invite.inviter not in self.__cache.cache[invite.guild.id].keys(): | ||
self.__cache.cache[invite.guild.id][invite.inviter] = [] | ||
self.__cache.cache[invite.guild.id][invite.inviter].append(invite) | ||
self.__cache.size = sys.getsizeof(self.__cache.cache) | ||
except discord.errors.Forbidden: | ||
return | ||
async def add_new_invite(self, invite): | ||
if invite.code not in self._cache.keys(): | ||
self._cache[invite.code] = {"created_by": invite.inviter, "uses": invite.uses} | ||
|
||
async def remove_invites(self, invite): | ||
for key in self.__cache.cache: | ||
for lists in self.__cache.cache[key]: | ||
user = self.__cache.cache[key][lists] | ||
if invite in user: | ||
self.__cache.cache[key][lists].remove(invite) | ||
self.__cache.size = sys.getsizeof(self.__cache.cache) | ||
break | ||
async def remove_invite(self, invite): | ||
self._cache.pop(invite.code, None) | ||
|
||
async def delete_guild_invites(self, guild: discord.Guild): | ||
if guild.id in self.__cache.cache.keys(): | ||
self.__cache.size = sys.getsizeof(self.__cache.cache) | ||
del self.__cache.cache[guild.id] | ||
async def track_invite(self): | ||
new_invites = await self.get_all_invites() | ||
for code, data in new_invites.items(): | ||
if data["uses"] > self._cache.get(code)["uses"]: | ||
self._cache = new_invites | ||
return await self.get_inviter(code) | ||
|
||
async def create_guild_invites(self, guild: discord.Guild): | ||
async def get_all_invites(self) -> dict: | ||
try: | ||
invites = await guild.invites() | ||
self.__cache.cache[guild.id] = {} | ||
invites = await self.guild.invites() | ||
new_invites = {} | ||
for invite in invites: | ||
if invite.inviter not in self.__cache.cache[guild.id].keys(): | ||
self.__cache.cache[guild.id][invite.inviter] = [] | ||
self.__cache.cache[guild.id][invite.inviter].append(invite) | ||
self.__cache.size = sys.getsizeof(self.__cache.cache) | ||
except discord.errors.Forbidden: | ||
return | ||
|
||
async def get_inviter(self, member: discord.Member): | ||
invites = {} | ||
try: | ||
new_invites = await member.guild.invites() | ||
if invite.code not in new_invites.keys(): | ||
new_invites[invite.code] = {"created_by": invite.inviter, "uses": invite.uses} | ||
return new_invites | ||
except discord.errors.Forbidden: | ||
return | ||
for invite in new_invites: | ||
if invite.inviter not in invites.keys(): | ||
invites[invite.inviter] = [] | ||
invites[invite.inviter].append(invite) | ||
for new_invite_key in invites: | ||
for cached_invite_key in self.__cache.cache[member.guild.id]: | ||
if new_invite_key == cached_invite_key: | ||
new_invite_list = invites[new_invite_key] | ||
cached_invite_list = self.__cache.cache[member.guild.id][cached_invite_key] | ||
for new_invite in new_invite_list: | ||
for old_invite in cached_invite_list: | ||
if new_invite.code == old_invite.code and new_invite.uses-old_invite.uses >= 1: | ||
cached_invite_list.remove(old_invite) | ||
cached_invite_list.append(new_invite) | ||
self.__cache.size = sys.getsizeof(self.__cache.cache) | ||
return new_invite_key | ||
else: | ||
return None | ||
pass |