@VickR0mE

Как ввести мультисерверную экономику в бота?

Пишу экономику для бота, все работает, но при начислении валюты участнику на одном сервере его баланс меняется и на другом. Как можно разграничить выдачу денег на серверах?

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))
  • Вопрос задан
  • 273 просмотра
Решения вопроса 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Если немного сесть и подумать если нужно чтобы валюта была отдельная для каждого сервера, значит сервер должен где-то в модели данных фигурировать. А у вас его нет.
6439241be37d6227319386.png
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы