Discord.py 超时服务器成员

Its*_*1an 1 python timeout discord.py

几个月前,我想到了为我朋友的服务器制作一个功能性不和谐机器人的想法。我的朋友问我是否可以发出会员超时命令,所以我开始了我的研究。由于discord.py将不再更新,这个问题可能毫无用处并且浪费时间,但无论如何我真的很想尝试一下。我知道 Stack Overflow 是关于修改代码的,而不是代码编写服务,但我真的不知道应该如何做到这一点。

我的想法是在指定时间内为成员提供“静音”或“超时”角色,并在计时器停止后再次将其删除,但随后我应该使用 while 循环,导致其余代码不再可访问,使用该函数也是如此time.sleep

我在互联网上找不到任何关于此的信息,所以我唯一的希望是 Stack Overflow。我不希望您在答案中编写整个程序,只是在我可能正在寻找的地方,以便我可以自己弄清楚其余的内容。

提前致谢!

Ros*_*ose 9

Discord 最近发布了一个超时功能,该功能非常好,解决了创建/删除没有发送消息权限的角色的问题。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)
Run Code Online (Sandbox Code Playgroud)
{'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'}}
Run Code Online (Sandbox Code Playgroud)

由于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")
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关端点的更多信息

  • @SpacedOutKID,我在“discord.py”停止使用时写了这篇文章。它现在又回到开发阶段,并将此功能实现为 [`member.timeout()`](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member.timeout),我会推荐你可以使用它来代替这段代码! (3认同)