Как «временно заблокировать» кого-то с помощью discord.py? - PullRequest
2 голосов
/ 07 марта 2019

Я создаю бот-диск с управленческим диссонансом с помощью discord.py, поэтому я понял, что мне нужно добавить команду для временного запрета кого-либо на некоторое время, этот запрет может быть сделан из-за ролей или изгнания участника из канала, а затем забанить его, но я не знаю, как это сделать. Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

После долгих проб и ошибок я наконец-то понял!Ниже приведен бот discord.py с командой для временного бана пользователя, который может использоваться несколькими пользователями

import discord
from discord.ext import commands
import asyncio

TOKEN=""

client=commands.Bot(command_prefix=".")

ban_list=[]
day_list=[]
server_list=[]

#This is a background process
async def countdown():
    await client.wait_until_ready()
    while not client.is_closed:
        await asyncio.sleep(1)
        day_list[:]=[x-1 for x in day_list]
        for day in day_list:
            if day<=0:
                try:
                    await client.unban(server_list[day_list.index(day)],ban_list[day_list.index(day)])
                except:
                    print('Error! User already unbanned!')
                del ban_list[day_list.index(day)]
                del server_list[day_list.index(day)]
                del day_list[day_list.index(day)]

#Command starts here
@client.command(pass_context=True)
async def ban(ctx,member:discord.Member,days=1):
    if str(ctx.message.author.id)=='<You ID goes here>':
        try:
            await client.ban(member,delete_message_days=0)
            await client.say('User banned for **'+str(days)+' day(s)**')
            ban_list.append(member)
            day_list.append(days*24*60*60)
            server_list.append(ctx.message.server)
        except:
            await client.say('Error! User not active')
    else:
        await client.say('You do not have permission to ban users!')

client.loop.create_task(countdown())
client.run(TOKEN)

enter image description here

Я проверил эту программу, забанив трех пользователей на определенное количество времени, и она работала как очарование.Обратите внимание, что время может быть не слишком точным.Чем больше выбранное вами время, тем больше ошибка.

По какой-то причине бот, находящийся в автономном режиме, не может быть заблокирован ботом.

Бот должен быть в сети все время, чтобыэто работает ... Если вы перезагружаете бота или он падает, все списки очищаются.

0 голосов
/ 08 марта 2019

Это зависит от того, что вы подразумеваете под «временным баном».

Хотите ли вы, чтобы пользователь был фактически выгнан и заблокирован с сервера на определенный период времени, или вы хотите, чтобы пользователь был временно ограничен определенными разрешениями, такими как общение в чате?

Я рекомендую последний вариант и использую ветвь Discord rewrite API, которая является новой и улучшенной.

Ограничить участника с помощью назначения роли и неограниченно через x секунд:

@bot.command()
async def restrict(ctx, member:discord.Member, duration: int):
    role = discord.utils.get(ctx.guild.roles, name="Restricted")
    await member.add_roles(role)
    await asyncio.sleep(duration)
    await member.remove_roles(role)

Забанить пользователя и снять бан через x секунд:

@bot.command()
async def ban(ctx, user:discord.User, duration: int):
    await ctx.guild.ban(user)
    await asyncio.sleep(duration)
    await ctx.guild.unban(user)

Имейте в виду, что если ваш бот вылетает или отключается от сети по какой-либо причине, пока он находится в процессе сна, чтобы разблокировать пользователя, бот не разблокирует пользователя после того, как он вернется, поэтому что-то, что стоит рассмотреть, может быть базы данных и хранения времени окончания бана. Затем вы можете запросить все сохраненные даты во время запуска бота, чтобы выяснить, как долго нужно спать. Кроме того, вам придется получить их объект User, а не объект Member, поскольку они больше не являются частью гильдии.

...