Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
28 kB
1
Indexable
Never
import discord
import keep_alive
import os
import random
import datetime
from discord.ext import commands, tasks
import sqlite3
import asyncio

intents = discord.Intents.default()
intents.message_content = True
conn = sqlite3.connect('base.db')
cursor = conn.cursor()
cursor.execute('SELECT user_id FROM economy')

bot = commands.Bot(command_prefix='!', intents=intents)
hug_images = [
    "hug1.jpg", "hug2.jpg", "hug3.jpg", "hug4.jpg", "hug5.jpg", "hug6.jpg",
    "hug7.jpg", "hug8.jpg", "hug9.jpg"
]
kiss_images = [
    "kiss1.jpg", "kiss2.jpg", "kiss3.jpg", "kiss4.jpg", "kiss5.jpg",
    "kiss6.jpg", "kiss7.jpg", "kiss8.jpg"
]
kill_images = [
    "kill1.png", "kill2.jpg", "kill3.png", "kill4.png", "kill5.jpg",
    "kill6.jpg"
]
ykysit_images = [
    "ykysit1.jpg", "ykysit2.jpg", "ykysit3.jpg", "ykysit4.jpg", "ykysit5.gif",
    "ykysit6.jpg"
]
bang_images = [
    "bang1.jpg", "bang2.jpg", "bang3.jpg", "bang4.jpg", "bang5.jpg",
    "bang6.jpg"
]
hit_images = [
    "hit1.jpg", "hit2.jpg", "hit3.jpg", "hit4.jpg", "hit5.jpg", "hit6.jpg"
]


@bot.event
async def on_ready():
  print(f'Logged in as {bot.user.name}')


@bot.command()
@commands.check(lambda ctx: ctx.channel.id == 1004818706238554274)
async def репорт(ctx, user: discord.User, *, reason):
  channel = bot.get_channel(
      1144163529595834368
  )  # Замените текстовый_канал_id на ID вашего текстового канала
  message = f'Пользователь {ctx.author.mention} пожаловался на игрока {user.mention} по причине: {reason}'

  # Отправить сообщение в текстовый канал
  await channel.send(message)

  # Отправить ответное сообщение автору команды
  await ctx.send('Жалоба успешно отправлена, ожидайте ответа от Администратора'
                 )


@bot.command()
async def личнаярума(ctx):
  # Проверяем баланс пользователя
  user_id = str(ctx.author.id)
  conn = sqlite3.connect('base.db')
  cursor = conn.cursor()
  cursor.execute('SELECT balance FROM economy WHERE user_id = ?', (user_id, ))
  user_balance = cursor.fetchone()

  if not user_balance:
    await ctx.send(f'{ctx.author.mention}, у вас нет баланса.')
    conn.close()
    return

  user_balance = user_balance[0]

  # Условие для создания комнаты
  if user_balance >= 25000:
    # Здесь вы можете указать айди категории, в которой нужно создать комнату
    category_id = 1147198161241251841  # Замените на айди вашей категории

    # Создаем голосовую комнату
    overwrites = {
        ctx.guild.default_role: discord.PermissionOverwrite(
            connect=False),  # Запрещаем соединение для всех
        ctx.author: discord.PermissionOverwrite(
            connect=True, manage_channels=True
        )  # Разрешаем соединение и управление каналом для создателя
    }

    category = ctx.guild.get_channel(category_id)
    if category:
      new_channel = await ctx.guild.create_voice_channel(
          name=f' Комната {ctx.author.display_name}',
          category=category,
          overwrites=overwrites)

      # Обновляем баланс пользователя
      new_balance = user_balance - 25000
      cursor.execute('UPDATE economy SET balance = ? WHERE user_id = ?',
                     (new_balance, user_id))
      conn.commit()

      await ctx.send(
          f'{ctx.author.mention}, ваша голосовая личная комната была создана: {new_channel.mention}'
      )
      conn.close()
    else:
      await ctx.send(
          f'{ctx.author.mention}, указанной категории не существует.')
      conn.close()
  else:
    await ctx.send(
        f'{ctx.author.mention}, у вас недостаточно средств для создания голосовой личной комнаты.'
    )
    conn.close()


@bot.command()
async def уничтожить(ctx, количество: int):
  if ctx.author.guild_permissions.manage_messages:
    if количество <= 0:
      await ctx.send(
          'Пожалуйста, укажите положительное количество сообщений для очистки.'
      )
    else:
      try:
        deleted = await ctx.channel.purge(
            limit=количество + 1)  # +1 для удаления команды !уничтожить
        await ctx.send(f'Успешно удалено {len(deleted) - 1} сообщений.'
                       )  # -1, чтобы не учитывать команду
      except discord.Forbidden:
        await ctx.send('У меня нет разрешения удалять сообщения в этом канале.'
                       )
      except discord.HTTPException:
        await ctx.send('Произошла ошибка при попытке удалить сообщения.')
  else:
    await ctx.send(
        'У вас нет разрешения управлять сообщениями в этом серверном канале.')


@bot.command()
async def обнять(ctx, user: discord.User):
  hug_image = random.choice(hug_images)

  # Создаем Embed сообщение с указанием цвета
  embed = discord.Embed(
      description=f'{ctx.author.mention} обнял {user.mention}', color=0x2f3136)

  # Устанавливаем изображение в Embed
  embed.set_image(url=f'attachment://{hug_image}')

  # Отправляем Embed сообщение с прикрепленным файлом
  await ctx.send(file=discord.File(hug_image), embed=embed)


@bot.command()
async def ударить(ctx, user: discord.User):
  hit_image = random.choice(hit_images)

  # Создаем Embed сообщение с указанием цвета
  embed = discord.Embed(
      description=f'{ctx.author.mention} ударил {user.mention}',
      color=0x2f3136)

  # Устанавливаем изображение в Embed
  embed.set_image(url=f'attachment://{hit_image}')

  # Отправляем Embed сообщение с прикрепленным файлом
  await ctx.send(file=discord.File(hit_image), embed=embed)


@bot.command()
async def поцеловать(ctx, user: discord.User):
  kiss_image = random.choice(kiss_images)

  # Создаем Embed сообщение с указанием цвета
  embed = discord.Embed(
      description=f'{ctx.author.mention} поцеловал {user.mention}',
      color=0x2f3136)

  # Устанавливаем изображение в Embed
  embed.set_image(url=f'attachment://{kiss_image}')

  # Отправляем Embed сообщение с прикрепленным файлом
  await ctx.send(file=discord.File(kiss_image), embed=embed)


@bot.command()
async def убить(ctx, user: discord.User):
  kill_image = random.choice(kill_images)

  # Создаем Embed сообщение с указанием цвета
  embed = discord.Embed(
      description=f'{ctx.author.mention} убил {user.mention}', color=0x2f3136)

  # Устанавливаем изображение в Embed
  embed.set_image(url=f'attachment://{kill_image}')

  # Отправляем Embed сообщение с прикрепленным файлом
  await ctx.send(file=discord.File(kill_image), embed=embed)


@bot.command()
async def выстрелить(ctx, user: discord.User):
  bang_image = random.choice(bang_images)

  # Создаем Embed сообщение с указанием цвета
  embed = discord.Embed(
      description=f'{ctx.author.mention} выстрелил {user.mention}',
      color=0x2f3136)

  # Устанавливаем изображение в Embed
  embed.set_image(url=f'attachment://{bang_image}')

  # Отправляем Embed сообщение с прикрепленным файлом
  await ctx.send(file=discord.File(bang_image), embed=embed)


@bot.command()
async def укусить(ctx, user: discord.User):
  ykysit_image = random.choice(ykysit_images)

  # Создаем Embed сообщение с указанием цвета
  embed = discord.Embed(
      description=f'{ctx.author.mention} укусил {user.mention}',
      color=0x2f3136)

  # Устанавливаем изображение в Embed
  embed.set_image(url=f'attachment://{ykysit_image}')

  # Отправляем Embed сообщение с прикрепленным файлом
  await ctx.send(file=discord.File(ykysit_image), embed=embed)


@bot.command()
@commands.has_role(946951469263892481
                   )  # Указываем ID роли, которая имеет доступ к команде
async def девочка(ctx, member: discord.Member):
  role_id = 857541604578820106  # ID роли "Девочка" (замените на вашу роль)
  role = discord.utils.get(ctx.guild.roles, id=role_id)

  if role is None:
    await ctx.send('Роль не найдена.')
    return

  if role in member.roles:
    await member.remove_roles(role)
    await ctx.send(f'Роль "Девочка" успешно убрана у {member.mention}.')
  else:
    await member.add_roles(role)
    await ctx.send(f'Роль "Девочка" успешно добавлена {member.mention}.')


@девочка.error
async def девочка_error(ctx, error):
  if isinstance(error, commands.MissingRole):
    await ctx.send('У вас нет прав для выполнения этой команды.')


@bot.command()
@commands.has_role(946951469263892481
                   )  # Указываем ID роли, которая имеет доступ к команде
async def мальчик(ctx, member: discord.Member):
  role_id = 889151368823205970  # ID роли "Мальчик" (замените на вашу роль)
  role = discord.utils.get(ctx.guild.roles, id=role_id)

  if role is None:
    await ctx.send('Роль не найдена.')
    return

  if role in member.roles:
    await member.remove_roles(role)
    await ctx.send(f'Роль "Мальчик" успешно убрана у {member.mention}.')
  else:
    await member.add_roles(role)
    await ctx.send(f'Роль "Мальчик" успешно добавлена {member.mention}.')


@мальчик.error
async def мальчик_error(ctx, error):
  if isinstance(error, commands.MissingRole):
    await ctx.send('У вас нет прав для выполнения этой команды.')


@bot.command()
@commands.has_permissions(administrator=True)
async def банроль(ctx, member: discord.Member):
  role_id = 1084826124346990665  # ID роли "Бан-роль" (замените на вашу роль)
  role_to_give = discord.utils.get(ctx.guild.roles, id=role_id)

  if role_to_give is None:
    await ctx.send('Роль не найдена.')
    return

  try:
    roles_to_remove = member.roles[
        1:]  # Получить все роли пользователя, кроме @everyone
    await member.remove_roles(*roles_to_remove)
    await member.add_roles(role_to_give)
    await ctx.send(
        f'{member.mention} получил бан-роль на сервере, и у него больше нет других ролей.'
    )
  except discord.Forbidden:
    await ctx.send('У меня нет разрешения выдавать/забирать роли.')


@банроль.error
async def банроль_error(ctx, error):
  if isinstance(error, commands.MissingPermissions):
    await ctx.send('У вас нет прав для выполнения этой команды.')


@bot.command()
async def брак(ctx, user: discord.User):
  author = ctx.author
  channel = ctx.channel

  # Отправить запрос на брак
  await channel.send(
      f'{user.mention}, {author.mention} предлагает вам брак! Напишите !брак принять если согласны'
  )

  # Ожидание ответа от пользователя
  def check(message):
    return message.author == user and message.content.lower() in [
        '!брак принять', '!брак отказать'
    ]

  try:
    response = await bot.wait_for('message', timeout=60.0, check=check)
  except asyncio.TimeoutError:
    await channel.send(f'{user.mention}, время на решение истекло.')
    return

  if response.content.lower() == '!брак принять':
    # Записать брак в файл
    with open('marry.txt', 'a') as file:
      file.write(f'{author.id} + {user.id}\n')
    await channel.send(
        f'Брак успешно создан между {author.mention} и {user.mention}! c:')


@bot.command()
async def браки(ctx):
  # Прочитать список браков из файла
  with open('marry.txt', 'r') as file:
    marriages = file.read().splitlines()

  if not marriages:
    await ctx.send('Список браков пуст.')
    return

  marriage_list = []
  for marriage in marriages:
    user_ids = marriage.split(' + ')
    user_mentions = []
    for user_id in user_ids:
      user = ctx.guild.get_member(int(user_id))
      if user:
        user_mentions.append(user.mention)
      else:
        user_mentions.append(
            f'<@{user_id}>'
        )  # Здесь мы используем <@{user_id}> для упоминания пользователя
    marriage_list.append(' + '.join(user_mentions))

  await ctx.send('Список браков:\n' + '\n'.join(marriage_list))


@bot.command()
async def развод(ctx, user2: discord.User):
  user1 = ctx.author  # Первый пользователь - тот, кто вызвал команду
  marriage_to_remove = f'{user1.id} + {user2.id}'

  # Прочитать список браков из файла
  with open('marry.txt', 'r') as file:
    marriages = file.read().splitlines()

  found = False
  for marriage in marriages:
    if marriage == marriage_to_remove:
      found = True
      marriages.remove(marriage)
      break

  if found:
    # Записать обновленный список браков в файл
    with open('marry.txt', 'w') as file:
      file.write('\n'.join(marriages))

    await ctx.send(f'{user1.mention} развелся со своей парой {user2.mention}.')
  else:
    await ctx.send(f'Брак между вами и {user2.mention} не найден.')


@bot.command()
async def секс(ctx):
  # Проверка наличия брака у пользователя
  user = ctx.author
  with open('marry.txt', 'r') as file:
    marriages = file.read().splitlines()

  marriages_with_user = [
      marriage for marriage in marriages if str(user.id) in marriage
  ]

  if len(marriages_with_user) < 1:
    await ctx.send(f'{user.mention}, у вас нет брака.')
    return

  partner_id = None
  for marriage in marriages_with_user:
    user_ids = marriage.split(' + ')
    if str(user.id) in user_ids:
      # Находим ID партнера
      partner_id = user_ids[0] if user_ids[1] == str(user.id) else user_ids[1]

  if partner_id is None:
    await ctx.send(f'{user.mention}, у вас нет брака.')
    return

  # Упоминание партнера
  partner = ctx.guild.get_member(int(partner_id))
  if partner:
    love_images_to_send = [
        "sex1.jpg", "sex2.jpg", "sex3.jpg", "sex4.jpg", "sex5.jpg", "sex6.jpg"
    ]  # Определение списка изображений
    love_image = random.choice(
        love_images_to_send)  # Выбираем случайное изображение

    # Создаем Embed сообщение с указанием цвета
    embed = discord.Embed(
        description=f'{user.mention} занялся любовью с {partner.mention}',
        color=0x2f3136)

    # Устанавливаем изображение в Embed
    embed.set_image(url=f'attachment://{love_image}')

    # Отправляем Embed сообщение с прикрепленным файлом
    await ctx.send(embed=embed, file=discord.File(love_image))
  else:
    await ctx.send(f'{user.mention}, у вас нет брака.')


@bot.command()
@commands.check(lambda ctx: ctx.channel.id == 1146479994697166918)
async def помощь(ctx):
  commands_list = [
      ('**!репорт** <пользователь> <причина> — Отправить жалобу на игрока.'),
      ('**!личная рума** — Создает личную комнату при наличии 25.000 монет.'),
      ('**!balance** — Ваш баланс'), ('**!send** — Перевод денег'),
      ('**!shop** — Покупка персональных ролей'),
      ('**!duel** @пользователь сумма'), ('**!timely** — Ежедневная награда'),
      ('**!браки** — Выводит список браков.'),
      ('**!брак** @пользователь — Предложить брак пользователю.'),
      ('**!обнять** @пользователь — Обнять пользователя.'),
      ('**!укусить** @пользователь — Укусить пользователя.'),
      ('**!убить** @пользователь — Убить пользователя.'),
      ('**!поцеловать** @пользователь — Поцеловать пользователя.'),
      ('**!ударить** @пользователь — Ударить пользователя.'),
      ('**!выстрелить** @пользователь — Выстрелить в пользователя.')
  ]

  embed = discord.Embed(
      title='Список команд',
      description='Список доступных команд бота:',
      color=0x2f3136  # Цвет фона в формате HEX (#2f3136)
  )

  for command, description in commands_list:
    embed.add_field(name=command, value=description, inline=False)

  # Добавление картинки к эмбеду
  embed.set_image(url='https://i.imgur.com/h6ZwyAO.png')

  await ctx.send(embed=embed)


@bot.command()
async def аватар(ctx, member: discord.Member):
  # Получаем URL аватара пользователя
  avatar_url = member.avatar.url

  # Создаем и отправляем эмбед с аватаром и сообщением
  embed = discord.Embed(title=f"Аватар пользователя {member.name}",
                        color=0x2f3136)
  embed.set_image(url=avatar_url)

  await ctx.send(embed=embed)


@bot.command()
async def balance(ctx):
  user_id = str(ctx.author.id)
  cursor.execute('SELECT balance FROM economy WHERE user_id = ?', (user_id, ))
  user_balance = cursor.fetchone()
  if user_balance:
    await ctx.send(
        f'Баланс пользователя {ctx.author.mention}: {user_balance[0]} монеток')
  else:
    await ctx.send(f'Пользователь {ctx.author.mention} не имеет баланса.')


import datetime


@bot.command()
async def timely(ctx):
  user_id = str(ctx.author.id)

  # Подключаемся к базе данных
  conn = sqlite3.connect('base.db')
  cursor = conn.cursor()

  # Проверяем, существует ли запись для пользователя в базе данных
  cursor.execute('SELECT last_daily_reward FROM economy WHERE user_id = ?',
                 (user_id, ))
  last_reward_date = cursor.fetchone()

  # Получаем текущую дату
  current_date = datetime.date.today()

  if not last_reward_date or last_reward_date[0] != str(current_date):
    # Если записи нет или последняя награда была не сегодня, начисляем 1000 монет
    cursor.execute(
        'INSERT OR REPLACE INTO economy (user_id, balance, last_daily_reward) VALUES (?, ?, ?)',
        (user_id, 1000, str(current_date)))
    conn.commit()
    conn.close()

    await ctx.send(
        f'{ctx.author.mention}, вы получили ежедневную награду в размере 1000 монет.'
    )
  else:
    conn.close()
    await ctx.send(
        f'{ctx.author.mention}, вы уже получили ежедневную награду сегодня.')


@bot.command()
@commands.has_permissions(administrator=True)
async def get(ctx, member: discord.Member, amount: int):
  user_id = str(member.id)
  cursor.execute('SELECT balance FROM economy WHERE user_id = ?', (user_id, ))
  user_balance = cursor.fetchone()

  if not user_balance:
    await ctx.send(f'{member.mention} не имеет баланса.')
    return

  user_balance = user_balance[0]
  new_balance = user_balance + amount

  if new_balance < 0:
    await ctx.send(
        f'Вы не можете у пользователя {member.mention} убрать больше монет, чем у него есть.'
    )
  else:
    cursor.execute('UPDATE economy SET balance = ? WHERE user_id = ?',
                   (new_balance, user_id))
    conn.commit()
    await ctx.send(
        f'У пользователя {member.mention} теперь {new_balance} монет.')


@get.error
async def get_error(ctx, error):
  if isinstance(error, commands.MissingPermissions):
    await ctx.send('У вас нет прав для выполнения этой команды.')


@bot.command()
async def send(ctx, recipient: discord.User, amount: int):
  sender_id = str(ctx.author.id)
  recipient_id = str(recipient.id)

  # Проверяем, что сумма для перевода положительная
  if amount <= 0:
    await ctx.send(
        'Пожалуйста, укажите положительное количество монет для перевода.')
    return

  # Проверяем, есть ли у отправителя достаточное количество монет
  conn = sqlite3.connect('base.db')
  cursor = conn.cursor()
  cursor.execute('SELECT balance FROM economy WHERE user_id = ?',
                 (sender_id, ))
  sender_balance = cursor.fetchone()

  if not sender_balance or sender_balance[0] < amount:
    await ctx.send(
        f'{ctx.author.mention}, у вас недостаточно средств для перевода {amount} монет.'
    )
    conn.close()
    return

  # Обновляем баланс отправителя
  new_sender_balance = sender_balance[0] - amount
  cursor.execute('UPDATE economy SET balance = ? WHERE user_id = ?',
                 (new_sender_balance, sender_id))

  # Проверяем, есть ли запись для получателя в базе данных
  cursor.execute('SELECT balance FROM economy WHERE user_id = ?',
                 (recipient_id, ))
  recipient_balance = cursor.fetchone()

  if not recipient_balance:
    # Если записи нет, создаем ее с начальным балансом
    cursor.execute('INSERT INTO economy (user_id, balance) VALUES (?, ?)',
                   (recipient_id, amount))
  else:
    # Если запись существует, обновляем ее баланс
    new_recipient_balance = recipient_balance[0] + amount
    cursor.execute('UPDATE economy SET balance = ? WHERE user_id = ?',
                   (new_recipient_balance, recipient_id))

  # Сохраняем изменения в базе данных
  conn.commit()
  conn.close()

  await ctx.send(
      f'{ctx.author.mention} перевел {amount} монет пользователю {recipient.mention}.'
  )


@bot.command()
async def duel(ctx, opponent: discord.User, amount: int):
  if amount <= 0:
    await ctx.send(
        'Пожалуйста, укажите положительное количество монет для дуэли.')
    return

  sender_id = str(ctx.author.id)
  recipient_id = str(opponent.id)

  # Проверяем, что у отправителя достаточно монет
  conn = sqlite3.connect('base.db')
  cursor = conn.cursor()
  cursor.execute('SELECT balance FROM economy WHERE user_id = ?',
                 (sender_id, ))
  sender_balance = cursor.fetchone()

  if not sender_balance or sender_balance[0] < amount:
    await ctx.send(
        f'{ctx.author.mention}, у вас недостаточно средств для дуэли на {amount} монет.'
    )
    conn.close()
    return

  # Проверяем, что у получателя достаточно монет
  cursor.execute('SELECT balance FROM economy WHERE user_id = ?',
                 (recipient_id, ))
  recipient_balance = cursor.fetchone()

  if not recipient_balance or recipient_balance[0] < amount:
    await ctx.send(
        f'{opponent.mention} не имеет достаточного количества монет для дуэли на {amount} монет.'
    )
    conn.close()
    return

  # Отправляем запрос на дуэль
  await ctx.send(
      f'{opponent.mention}, {ctx.author.mention} предлагает вам дуэль на {amount} монет. Напишите !accept для принятия.'
  )

  # Ожидаем ответ от получателя
  def check(message):
    return message.author == opponent and message.content.lower() == '!accept'

  try:
    response = await bot.wait_for('message', timeout=60.0, check=check)
  except asyncio.TimeoutError:
    await ctx.send(f'{opponent.mention} не принял вашу дуэль. Дуэль отменена.')
    conn.close()
    return

  # Генерируем случайного победителя
  winner = random.choice([ctx.author, opponent])

  if winner == ctx.author:
    # Победитель - отправитель
    new_sender_balance = sender_balance[0] + amount
    new_recipient_balance = recipient_balance[0] - amount
    winner_mention = ctx.author.mention
    loser_mention = opponent.mention
  else:
    # Победитель - получатель
    new_sender_balance = sender_balance[0] - amount
    new_recipient_balance = recipient_balance[0] + amount
    winner_mention = opponent.mention
    loser_mention = ctx.author.mention

  # Обновляем балансы в базе данных
  cursor.execute('UPDATE economy SET balance = ? WHERE user_id = ?',
                 (new_sender_balance, sender_id))
  cursor.execute('UPDATE economy SET balance = ? WHERE user_id = ?',
                 (new_recipient_balance, recipient_id))
  conn.commit()
  conn.close()

  await ctx.send(
      f'{winner_mention} выиграл дуэль и забрал {amount} монет от {loser_mention}.'
  )


# В остальных командах для экономики также следует проверить наличие записи пользователя в базе данных и, при необходимости, создать ее.

keep_alive.keep_alive()

bot.run(
    'MTExNDk0MzgyMzI5OTIxOTQ1Nw.GR5p9d.jP9wcL_SHtpoEuIjHXkZHao8PVmn4Kh-bdINss'
)  # Замените токен_бота на токен вашего Discord-бота