discord.py | Sqlite邀请记录器

2024-06-16 12:08:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在sqlite中创建了一个邀请记录器 现在这是我的update_total函数

async def update_totals(self, member):
        invites = await member.guild.invites()

        c = datetime.today().strftime("%Y-%m-%d").split("-")
        c_y = int(c[0])
        c_m = int(c[1])
        c_d = int(c[2])

        async with self.bot.db.execute("SELECT id, uses FROM invites WHERE guild_id = ?", (member.guild.id,)) as cursor: 
            async for invite_id, old_uses in cursor:
                for invite in invites:
                    if invite.id == invite_id and invite.uses - old_uses > 0: 
                        if not (c_y == member.created_at.year and c_m == member.created_at.month and c_d - member.created_at.day < 7): 
                            print(invite.id)
                            await self.bot.db.execute("UPDATE invites SET uses = uses + 1 WHERE guild_id = ? AND id = ?", (invite.guild.id, invite.id))
                            await self.bot.db.execute("INSERT OR IGNORE INTO joined (guild_id, inviter_id, joiner_id) VALUES (?,?,?)", (invite.guild.id, invite.inviter.id, member.id))
                            await self.bot.db.execute("UPDATE totals SET normal = normal + 1 WHERE guild_id = ? AND inviter_id = ?", (invite.guild.id, invite.inviter.id))

                        else:
                            await self.bot.db.execute("UPDATE totals SET normal = normal + 1, fake = fake + 1 WHERE guild_id = ? and inviter_id = ?", (invite.guild.id, invite.inviter.id))

                        return

这是我的on_member_join活动

@commands.Cog.listener()
async def on_member_join(self, member):
        await self.update_totals(member)
        await self.bot.db.commit()
        inviter = await self.tracker.fetch_inviter(member)
        cur = await self.bot.db.execute("SELECT normal, left, fake FROM totals WHERE guild_id = ? AND inviter_id = ?", (member.guild.id, inviter.id))
        
        res = await cur.fetchone()
        if res is None:
            normal, left, fake = 0, 0, 0
        else:
            normal, left, fake = res
        
        total = normal - (left + fake)
     
        embed = discord.Embed(title=f'Welcome To {member.guild.name}!', description=f'**{member.mention} Was Invited By {inviter.mention}!**\n**{inviter.name}#{inviter.discriminator}** Now Has ``{total} Invites``', timestamp=datetime.now())
        embed.set_footer(text = f'Invited By {inviter.name}', icon_url=member.avatar_url)

        channel = discord.utils.get(member.guild.channels, name = 'general')
        
        await channel.send(embed=embed)

这是我的setup函数

async def setup(self):
        await self.bot.wait_until_ready()
        self.bot.db = await aiosqlite.connect("inviteData.db")
        await self.bot.db.execute("CREATE TABLE IF NOT EXISTS totals (guild_id int, inviter_id int, normal int, left int, fake int, PRIMARY KEY (guild_id, inviter_id))")
        await self.bot.db.execute("CREATE TABLE IF NOT EXISTS invites (guild_id int, id string, uses int, PRIMARY KEY (guild_id, id))")
        await self.bot.db.execute("CREATE TABLE IF NOT EXISTS joined (guild_id int, inviter_id int, joiner_id int, PRIMARY KEY (guild_id, inviter_id, joiner_id))")
    

        for guild in self.bot.guilds:
            for invite in await guild.invites():
                await self.bot.db.execute("INSERT OR IGNORE INTO invites (guild_id, id, uses) VALUES (?,?,?)", (invite.guild.id, invite.id, invite.uses))
                await self.bot.db.execute("INSERT OR IGNORE INTO totals (guild_id, inviter_id, normal, left, fake) VALUES (?,?,?,?,?)", (guild.id, invite.inviter.id, 0, 0, 0))
                                 
        await self.bot.db.commit()

这是我的命令,它使用api向用户余额中添加了一些钱

@commands.command()
 @commands.has_permissions(administrator=True)
 async def add_money(self, ctx, member: discord.Member=None, amount: int=None):
          if member is None: member == ctx.author
          if amount is None: 
              await ctx.send(f'You have to type the amount you want to add')
              return
          else:
              #Gives a member some money
              await self.bot.pizza.patch_user_balance(ctx.guild.id, member.id, bank=amount, reason="add_money command")

现在,我该如何实现这一点,即当一个真实的人加入时,它会向邀请者添加1枚硬币,而不是伪造或重新加入


Tags: selfidexecutedbbotawaitinvitefake