Как стать автором
Обновить

Как сделать экономического бота в Discord на Python?

Чтобы сделать экономического бота, нужно создать этого бота. Здесь мы не будем об этом писать, но если вы новичок и не знаете, то вот ссылка на статью как это сделать.

После того, как мы добавили его на сервер. То пишем такой код:

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}`**")
  

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.