我在 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()
这是我的命令,它使用 unbelievaboat 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 个硬币