Чтобы сделать экономического бота, нужно создать этого бота. Здесь мы не будем об этом писать, но если вы новичок и не знаете, то вот ссылка на статью как это сделать.
После того, как мы добавили его на сервер. То пишем такой код:
import discord
from discord.ext import commands
from discord.utils import get
intents = discord.Intents.all()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
bot.run("[token]")
Вместо "!" можно поставить другой префикс. Это символ, на который будет начинаться любая команда бота. И вместо [token] вставьте туда свой токен своего бота. Запустите бота и проверьте, нет ли ошибок. Если он появился в сети, то значит все работает.
Первое, что можно сделать. Это то, чтобы можно было посмотреть свой баланс, то-есть, посмотреть сколько у вас монет. Для этого, создаем файл wallets.json. В нем будут все данные о нас или о другого участника на сервере. В этот файл нужно только написать {}.
Далее создаем еще один файл stats.py. И пишем туда этот код:
import json
WALLET_DEFAULT = {"balance": 0}
async def get_user_wallet(user_id):
user_id = str(user_id)
with open("wallets.json", "r", encoding="UTF-8") as file:
users_wallets = json.load(file)
if user_id not in users_wallets.keys():
users_wallets[user_id] = WALLET_DEFAULT
with open("wallets.json", "w", encoding="UTF-8") as file:
json.dump(users_wallets, file)
return users_wallets[user_id]
async def set_user_wallet(user_id, parameter, new_value):
user_id = str(user_id)
with open("wallets.json", "r", encoding="UTF-8") as file:
users_wallets = json.load(file)
if user_id not in users_wallets.keys():
users_wallets[user_id] = WALLET_DEFAULT
users_wallets[user_id][parameter] = new_value
with open("wallets.json", "w", encoding="UTF-8") as file:
json.dump(users_wallets, file)
Этот код можно просто скопировать. Функция get_user_wallet возвращает нам данные о участнике сервера. Если участника нету в файле wallets.json, то он туда записывается. Функция set_user_wallet изменяет значение его баланса.
Также нужно этот файл импортировать в нашем главном файле. Поэтому пишем этот код в наш первоначальный файл.
import discord
from discord.ext import commands
from discord.utils import get
from stats import *
intents = discord.Intents.all()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
bot.run("[token]")
Давайте сделаем первую команду, с помощью которого, можно будет посмотреть свой или баланс другого участника. Данный код копируем и вставляем в первоначальный файл.
import discord
from discord.ext import commands
from discord.utils import get
from stats import *
intents = discord.Intents.all()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.command()
async def balance(ctx, user_mention=None):
if user_mention is None:
user = ctx.author
else:
user = get(ctx.guild.members, id=int(user_mention[2:-1]))
user_wallet = await get_user_wallet(user.id)
await ctx.send(f"**Баланс `{user.name}`: {user_wallet["balance"]}**")
bot.run("[token]")
Здесь в функции balance программа проверяет, написали ли мы в user_mention кого-то упоминание. Если да, то находим этого участника по его упоминанию. Если нет, то просто берем за участника того, кто написал команду. Дальше мы по ID участника, получаем его данные. Его баланс и инвентарь. После наш бот пишет в чат что у кого-то есть сколько-то денег. То-есть пишет его баланс.
Теперь мы можем добавить команду, чтобы мы могли задать, добавить или отнять у баланса участника деньги. Для этого пишем этот код в наш главный первоначальный файл.
@bot.command()
async def set_money(ctx, user_mention=None, amount=None):
if not ctx.author.guild_permissions.administrator:
await ctx.send("**У вас нету прав!**")
return
if user_mention is None or amount is None:
await ctx.send("**Заполните все параметры!** `!set_money [user] [amount]`")
return
user = get(ctx.guild.members, id=int(user_mention[2:-1]))
user_wallet = await get_user_wallet(user.id)
user_wallet["balance"] = int(amount)
await set_user_wallet(user.id, "balance", user_wallet["balance"])
await ctx.send(f"**Баланс `{user.name}` изменен на {amount}!**")
@bot.command()
async def add_money(ctx, user_mention=None, amount=None):
if not ctx.author.guild_permissions.administrator:
await ctx.send("**У вас нету прав!**")
return
if user_mention is None or amount is None:
await ctx.send("**Заполните все параметры!** `!add_money [user] [amount]`")
return
user = get(ctx.guild.members, id=int(user_mention[2:-1]))
user_wallet = await get_user_wallet(user.id)
user_wallet["balance"] += int(amount)
await set_user_wallet(user.id, "balance", user_wallet["balance"])
await ctx.send(f"**К балансу `{user.name}` прибавлено {amount}!**")
@bot.command()
async def remove_money(ctx, user_mention=None, amount=None):
if not ctx.author.guild_permissions.administrator:
await ctx.send("**У вас нету прав!**")
return
if user_mention is None or amount is None:
await ctx.send("**Заполните все параметры!** `!remove_money [user] [amount]`")
return
user = get(ctx.guild.members, id=int(user_mention[2:-1]))
user_wallet = await get_user_wallet(user.id)
amount = int(amount)
if user_wallet["balance"] < amount:
await ctx.send(f"**У `{user.name}` нету столько денег, чтобы их у него убрать!**")
return
user_wallet["balance"] -= int(amount)
await set_user_wallet(user.id, "balance", user_wallet["balance"])
await ctx.send(f"**У баланса `{user.name}` убрано {amount}!**")
Команда set_money задает количество монет в балансе участника сервера. Команда add_money добавляет монеты к балансу, а команда remove_money убирает у баланса монеты. Все эти команды можно использовать, только если у вас есть права Администратора.
Также, давайте сделаем чтобы можно было зарабатывать эти монеты. И зарабатывать их каждую минуту. Для этого мы напишем такую функцию.
@bot.command()
@commands.cooldown(1, 60, commands.BucketType.user) # 1, 60 - это сколько раз мы можем использовать эту команду в сколько то времени (1 раз в 60 секунд)
async def earn(ctx):
user_wallet = await get_user_wallet(ctx.author.id)
amount = random.randint(1000, 100000) # Заработок от 1.000 до 100.000 монет в минуту.
user_wallet["balance"] += amount
await set_user_wallet(ctx.author.id, "balance", user_wallet["balance"])
await ctx.send(f"**Вы заработали {amount} монет!**")
@bot.listen("on_command_error")
async def cooldown_message(ctx, error):
if isinstance(error, commands.CommandOnCooldown):
await ctx.send(f"**Вы сможете использовать команду `!{ctx.command.qualified_name}` только через {int(error.retry_after)} секунд-(ы)!**")
Только перед тем как написать эту функцию, импортируйте модуль random.
import random
Таким образом прописав команду earn можно заработать от 60к до 100к монет.
И конечно же команда чтобы давать друг-другу деньги.
@bot.command()
async def pay(ctx, user_mention, amount):
user_from = ctx.author
user_to = get(ctx.guild.members, id=int(user_mention[2:-1]))
user_from_wallet = await get_user_wallet(user_from.id)
user_to_wallet = await get_user_wallet(user_to.id)
amount = int(amount)
if amount > user_from_wallet["balance"]:
await ctx.send("**У вас нету столько денег, чтобы отдать их другому участнику!**")
return
user_from_wallet["balance"] -= amount
user_to_wallet["balance"] += amount
await set_user_wallet(user_from.id, "balance", user_from_wallet["balance"])
await set_user_wallet(user_to.id, "balance", user_to_wallet["balance"])
await ctx.send(f"**Деньги успешно переведины участнику `{user_to.name}`**")