Discord.py 超时服务器成员

Discord.py Timeout server members

几个月前,我萌生了为我朋友的服务器制作一个功能强大的 discord 机器人的想法。朋友问我能不能做一个成员超时命令,于是我开始研究。由于discord.py不会再更新了,这个问题可能没什么用,浪费时间,但我还是很想试一试。我知道 Stack Overflow 是关于修改代码而不是代码编写服务,但我真的不知道我应该怎么做。

我的想法是在指定时间内给成员一个 'Muted' 或 'Timed Out' 角色,并在计时器停止后再次将其删除,但我应该使用 while 循环导致其余部分代码不再可访问,使用 time.sleep 函数也是如此。

我在互联网上找不到任何相关信息,所以我唯一的希望是 Stack Overflow。我不希望你在答案中编写整个程序,只是我可能正在寻找的地方,这样我就可以自己解决剩下的问题。

提前致谢!

Discord 最近发布了一个超时功能,它非常好,消除了 creating/removing 没有发送消息权限的角色的问题。 Discord.py 可能收不到更新,但这不会阻止您向 discord API 编写自己的请求,或者您也可以使用已经实现此功能的分支之一。

这是我为使其工作而编写的一个简单的非机器人脚本:

import pprint
import requests
import datetime

BASE = "https://discord.com/api/v9/"
TOKEN = "BOT TOKEN" 


def timeout_user(*, user_id: int, guild_id: int, until: int):
    endpoint = f'guilds/{guild_id}/members/{user_id}'
    headers = {"Authorization": f"Bot {TOKEN}"}
    url = BASE + endpoint
    timeout = (datetime.datetime.utcnow() + datetime.timedelta(minutes=time_in_mins)).isoformat()
    json = {'communication_disabled_until': timeout}
    session = requests.patch(url, json=json, headers=headers)
    if session.status_code in range(200, 299):
        return session.json()
    else: 
        return print("Did not find any\n", session.status_code)

guild_id = 231
user_id = 123
time_in_mins = 2
member = timeout_user(user_id=user_id, guild_id=guild_id,until=time_in_mins)
pprint.pprint(member)
{'avatar': None,
 'communication_disabled_until': '2021-12-23T09:49:58.965896+00:00',
 'deaf': False,
 'is_pending': False,
 'joined_at': '2021-12-23T09:06:30.927000+00:00',
 'mute': False,
 'nick': None,
 'pending': False,
 'premium_since': None,
 'roles': [],
 'user': {'avatar': 'avatar hash string',
          'discriminator': '1234',
          'id': 'Member ID',
          'public_flags': 128,
          'username': 'Member Name'}}

由于 discord.py 是异步的,您可能需要一个异步代码。 这是一个快速集成

import aiohttp
import discord
import datetime
import warnings
from discord.ext import commands

warnings.filterwarnings("ignore", category=DeprecationWarning)
intents = discord.Intents.all()
bot = commands.Bot(command_prefix=['$',], intents=intents)
bot.session = aiohttp.ClientSession()

@bot.event
async def on_ready():
    print(f"{bot.user.name} is ready to go!")

async def timeout_user(*, user_id: int, guild_id: int, until):
    headers = {"Authorization": f"Bot {bot.http.token}"}
    url = f"https://discord.com/api/v9/guilds/{guild_id}/members/{user_id}"
    timeout = (datetime.datetime.utcnow() + datetime.timedelta(minutes=until)).isoformat()
    json = {'communication_disabled_until': timeout}
    async with bot.session.patch(url, json=json, headers=headers) as session:
        if session.status in range(200, 299):
           return True
        return False


@bot.command()
async def timeout(ctx: commands.Context, member: discord.Member, until: int):
    handshake = await timeout_user(user_id=member.id, guild_id=ctx.guild.id, until=until)
    if handshake:
         return await ctx.send(f"Successfully timed out user for {until} minutes.")
    await ctx.send("Something went wrong")

bot.run("BOT TOKEN")

您可以阅读有关端点的更多信息here