· 4 years ago · May 27, 2021, 09:40 AM
1import sqlite3
2import discord
3from discord.ext import commands
4from datetime import datetime
5
6db = sqlite3.connect('main.sqlite')
7
8
9async def update_totals(member):
10 invites = await member.guild.invites()
11 cursor = db.cursor()
12
13 c = datetime.today().strftime("%Y-%m-%d").split("-")
14 c_y = int(c[0])
15 c_m = int(c[1])
16 c_d = int(c[2])
17
18 db.execute(f"SELECT id, uses FROM invites WHERE guild_id = {member.guild.id}")
19 for invite_id, old_uses in cursor:
20 for invite in invites:
21 if invite.id == invite_id and invite.uses - old_uses > 0: # the count has been updated, invite is the invite that member joined by
22 if not (
23 c_y == member.created_at.year and c_m == member.created_at.month and c_d - member.created_at.day < 7): # year can only be less or equal, month can only be less or equal, then check days
24 print(invite.id)
25 db.execute("UPDATE invites SET uses = uses + 1 WHERE guild_id = ? AND id = ?",
26 (invite.guild.id, invite.id))
27 db.execute("INSERT OR IGNORE INTO joined (guild_id, inviter_id, joiner_id) VALUES (?,?,?)",
28 (invite.guild.id, invite.inviter.id, member.id))
29 db.execute("UPDATE totals SET normal = normal + 1 WHERE guild_id = ? AND inviter_id = ?",
30 (invite.guild.id, invite.inviter.id))
31
32 else:
33 db.execute(
34 "UPDATE totals SET normal = normal + 1, fake = fake + 1 WHERE guild_id = ? and inviter_id = ?",
35 (invite.guild.id, invite.inviter.id))
36
37 return
38
39
40class LevelClass(commands.Cog):
41 def __init__(self, bot):
42 self.bot = bot
43
44 @commands.Cog.listener()
45 async def on_ready(ready):
46 print("Invite System wurde erfolgreich geladen")
47
48 # events
49 @commands.Cog.listener()
50 async def on_member_join(self, member):
51 await update_totals(member)
52 db.commit()
53
54 @commands.Cog.listener()
55 async def on_member_remove(self, member):
56
57 cur = db.execute("SELECT inviter_id FROM joined WHERE guild_id = ? and joiner_id = ?",
58 (member.guild.id, member.id))
59 res = cur.fetchone()
60 if res is None:
61 return
62
63 inviter = res[0]
64
65 db.execute("DELETE FROM joined WHERE guild_id = ? AND joiner_id = ?", (member.guild.id, member.id))
66 db.execute("DELETE FROM totals WHERE guild_id = ? AND inviter_id = ?", (member.guild.id, member.id))
67 db.execute("UPDATE totals SET left = left + 1 WHERE guild_id = ? AND inviter_id = ?",
68 (member.guild.id, inviter))
69 db.commit()
70
71 @commands.Cog.listener()
72 async def on_invite_create(self, invite):
73 db.execute("INSERT OR IGNORE INTO totals (guild_id, inviter_id, normal, left, fake) VALUES (?,?,?,?,?)",
74 (invite.guild.id, invite.inviter.id, invite.uses, 0, 0))
75 db.execute("INSERT OR IGNORE INTO invites (guild_id, id, uses) VALUES (?,?,?)",
76 (invite.guild.id, invite.id, invite.uses))
77 db.commit()
78
79 @commands.Cog.listener()
80 async def on_invite_delete(self, invite):
81 db.execute("DELETE FROM invites WHERE guild_id = ? AND id = ?", (invite.guild.id, invite.id))
82 db.commit()
83
84 @commands.Cog.listener()
85 async def on_guild_join(self, guild): # add new invites to monitor
86 for invite in await guild.invites():
87 db.execute("INSERT OR IGNORE INTO invites (guild_id, id, uses), VAlUES (?,?,?)",
88 (guild.id, invite.id, invite.uses))
89
90 db.commit()
91
92 @commands.Cog.listener()
93 async def on_guild_remove(self, guild): # remove all instances of the given guild_id
94 db.execute("DELETE FROM totals WHERE guild_id = ?", (guild.id,))
95 db.execute("DELETE FROM invites WHERE guild_id = ?", (guild.id,))
96 db.execute("DELETE FROM joined WHERE guild_id = ?", (guild.id,))
97
98 db.commit()
99
100 # commands
101 @commands.command()
102 async def invites(self, ctx, member: discord.Member = None):
103 if member is None: member = ctx.author
104
105 # get counts
106 cur = db.execute("SELECT normal, left, fake FROM totals WHERE guild_id = ? AND inviter_id = ?",
107 (ctx.guild.id, member.id))
108 res =cur.fetchone()
109 if res is None:
110 normal, left, fake = 0, 0, 0
111
112 else:
113 normal, left, fake = res
114
115 total = normal - (left + fake)
116
117 em = discord.Embed(
118 title=f"Invites for {member.name}#{member.discriminator}",
119 description=f"{member.mention} currently has **{total}** invites. (**{normal}** normal, **{left}** left, **{fake}** fake).",
120 timestamp=datetime.now(),
121 color=discord.Color.orange())
122
123 await ctx.send(embed=em)
124
125 async def setup(self):
126
127 await self.bot.wait_until_ready()
128 db.execute(
129 "CREATE TABLE IF NOT EXISTS totals (guild_id int, inviter_id int, normal int, left int, fake int, PRIMARY KEY (guild_id, inviter_id))")
130 db.execute(
131 "CREATE TABLE IF NOT EXISTS invites (guild_id int, id string, uses int, PRIMARY KEY (guild_id, id))")
132 db.execute(
133 "CREATE TABLE IF NOT EXISTS joined (guild_id int, inviter_id int, joiner_id int, PRIMARY KEY (guild_id, inviter_id, joiner_id))")
134
135 # fill invites if not there
136 for guild in self.bot.guilds:
137 for invite in await guild.invites(): # invites before bot was added won't be recorded, invitemanager/tracker don't do this
138 db.execute("INSERT OR IGNORE INTO invites (guild_id, id, uses) VALUES (?,?,?)",
139 (invite.guild.id, invite.id, invite.uses))
140 db.execute(
141 "INSERT OR IGNORE INTO totals (guild_id, inviter_id, normal, left, fake) VALUES (?,?,?,?,?)",
142 (guild.id, invite.inviter.id, 0, 0, 0))
143 db.commit()
144
145 self.bot.loop.create_task(setup())
146
147
148def setup(bot):
149 bot.add_cog(LevelClass(bot))
150