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
几个月前,我萌生了为我朋友的服务器制作一个功能强大的 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