Пишу экономику для бота, все работает, но при начислении валюты участнику на одном сервере его баланс меняется и на другом. Как можно разграничить выдачу денег на серверах?
import disnake
from disnake.ext import commands
import sqlite3
connection = sqlite3.connect("server.db")
cursor = connection.cursor()
class Economy(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.Cog.listener()
async def on_ready(self):
cursor.execute("""CREATE TABLE IF NOT EXISTS users (
name TEXT,
id INT,
cash BIGINT,
rep INT,
lvl INT
)""")
cursor.execute("""CREATE TABLE IF NOT EXISTS shop (
role_id INT,
id INT,
cost BIGINT
)""")
connection.commit()
for guild in self.bot.guilds:
for member in guild.members:
if cursor.execute(f"SELECT id FROM users WHERE id = {member.id}").fetchone() is None:
cursor.execute(f"INSERT INTO users VALUES('{member}', {member.id}, 0, 0, 1)")
else:
pass
connection.commit()
print(f"Модуль {self.__class__.__name__} загружен...")
@commands.Cog.listener()
async def on_member_join(self, member):
if cursor.execute(f"SELECT id FROM users WHERE id = {member.id}").fetchone() is None:
cursor.execute(f"INSERT INTO users VALUES('{member}', {member.id}, 0, 0, 1)")
connection.commit()
else:
pass
@commands.command(name="balance", aliases=["bal"])
async def __balance(self, ctx, member: disnake.Member = None):
if member is None:
await ctx.send(embed=disnake.Embed(
description=f"""Баланс пользователя **{ctx.author}** составляет **{cursor.execute("SELECT cash FROM guild WHERE member_id = {}".format(ctx.author.id)).fetchone()[0]} :leaves:**"""
))
else:
await ctx.send(embed=disnake.Embed(
description=f"""Баланс пользователя **{member}** составляет **{cursor.execute("SELECT cash FROM guild WHERE member_id = {}".format(member.id)).fetchone()[0]} :leaves:**"""
))
@commands.command(name="award")
@commands.has_permissions(administrator=True)
async def __award(self, ctx, member: disnake.Member = None, amout: int = None):
if member is None:
await ctx.send(f"**{ctx.author}**, укажите пользователя, которому желаете выдать определенную сумму")
else:
if amout is None:
await ctx.send(f"**{ctx.author}**, укажите сумму, которую желаете начислить пользователю")
elif amout < 1:
await ctx.send(f"**{ctx.author}**, укажите сумму больше 1 :leaves:")
else:
cursor.execute("UPDATE users SET cash = cash + {} WHERE id = {}".format(amout, member.id))
connection.commit()
await ctx.message.add_reaction("✅")
@commands.command(name="take")
@commands.has_permissions(administrator=True)
async def __take(self, ctx, member: disnake.Member = None, amout = None):
if member is None:
await ctx.send(f"**{ctx.author}**, укажите пользователя, у которого желаете отнять определенную сумму")
else:
if amout is None:
await ctx.send(f"**{ctx.author}**, укажите сумму, которую желаете отнять у пользователя")
elif amout == "all":
cursor.execute("UPDATE users SET cash = {} WHERE id = {}".format(0, member.id))
connection.commit()
await ctx.message.add_reaction("✅")
elif int(amout) < 1:
await ctx.send(f"**{ctx.author}**, укажите сумму больше 1 :leaves:")
else:
cursor.execute("UPDATE users SET cash = cash - {} WHERE id = {}".format(int(amout), member.id))
connection.commit()
await ctx.message.add_reaction("✅")
@commands.command(aliases=["add-shop"])
@commands.has_permissions(administrator=True)
async def __add_shop(self, ctx, role: disnake.Role = None, cost: int = None):
if role is None:
await ctx.send(f"**{ctx.author}**, укажите роль, которую вы желаете добавить в магазин")
else:
if cost is None:
await ctx.send(f"**{ctx.author}**, укажите стоимость данной роли")
elif cost < 0:
await ctx.send(f"**{ctx.author}**, стоимость роли не может быть меньше нуля")
else:
cursor.execute("INSERT INTO shop VALUES ({}, {}, {})".format(role.id, ctx.guild.id, cost))
connection.commit()
await ctx.send(f"Роль {role.name} успешно добавлена в магазин ✅")
@commands.command(aliases = ["remove-shop"])
@commands.has_permissions(administrator=True)
async def __remove_shop(self, ctx, role: disnake.Role = None):
if role is None:
await ctx.send(f"**{ctx.author}**, укажите роль, которую вы желаете удалить из магазин")
else:
cursor.execute("DELETE FROM shop WHERE role_id = {}".format(role.id))
connection.commit()
await ctx.send(f"Роль {role.name} успешно удалена ✅")
@commands.command(aliases = ["shop"])
async def __shop(self, ctx):
embed = disnake.Embed(title = "Магазин ролей")
for row in cursor.execute("SELECT role_id, cost FROM shop WHERE id = {}".format(ctx.guild.id)):
if ctx.guild.get_role(row[0]) !=None:
embed.add_field(
name = f"Стоимость **{row[1]} :leaves:**",
value = f"Вы покупаете роль {ctx.guild.get_role(row[0]).mention}",
inline = False
)
else:
pass
await ctx.send(embed = embed)
@commands.command(aliases = ["buy", "bay-role"])
async def __buy(self, ctx, role: disnake.Role = None):
if role is None:
await ctx.send(f"**{ctx.author}**, укажите роль, которую вы желаете приобрести")
else:
if role in ctx.author.roles:
await ctx.send(f"**{ctx.author}**, у вас уже имеется данная роль")
elif cursor.execute("SELECT cost FROM shop WHERE role_id = {}".format(role.id)).fetchone()[0] > cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]:
await ctx.send(f"**{ctx.author}, у вас недостаточно средств для покупки данной роли**")
else:
await ctx.author.add_roles(role)
cursor.execute("UPDATE users SET cash = cash - {0} WHERE id = {1}".format(cursor.execute("SELECT cost FROM shop WHERE role_id = {}".format(role.id)).fetchone()[0], ctx.author.id))
connection.commit()
await ctx.message.add_reaction("✅")
def setup(bot):
bot.add_cog(Economy(bot))