python - Discord.py - 我如何在没有 ctx 或成员的情况下踢用户?- 解决方案在这里
问题描述
@pytest.mark.asyncio
async def timecheck():
tm = time.localtime()
if tm[6] == 6:
user = await client.fetch_user(id)
await user.kick(reason='Test')
@tasks.loop(seconds=60)
async def mainloop():
asyncio.create_task(timecheck())
mainloop.start()
当我尝试运行机器人时,它给了我错误:
AttributeError:“用户”对象没有属性“踢”
我试图查看 discord 文档但该命令不起作用,然后我尝试搜索它但我找不到任何东西。
解决方案
不要混淆user
和member
对象!成员可以被踢,因为根据定义,他们是公会的成员。User
代表只是一个普通的 Discord 用户,所以没什么可踢的。为了在没有事件处理程序提供的对象的情况下从公会中踢出成员,您需要像这样手动创建它们
guild = client.get_guild(<guild-id>)
member = guild.get_user(<user-id>)
括号内的内容<>
显然必须用真实的ID替换。
但是,如果您的机器人没有缓存公会或成员,您将需要取而代之
guild = await client.fetch_guild(<guild-id>)
member = await guild.fetch_member(<user-id>)
然后,您可以使用此信息来踢该成员
@pytest.mark.asyncio
async def timecheck():
tm = time.localtime()
if tm[6] == 6:
guild = await client.fetch_guild(guildID)
member = await guild.fetch_member(userID)
await member.kick(reason='Test')
@tasks.loop(seconds=60)
async def mainloop():
asyncio.create_task(timecheck())
mainloop.start()
如果您不确定 fetch 函数是否总是返回对象,您还可以检查它们是否不会None
避免任何错误
@pytest.mark.asyncio
async def timecheck():
tm = time.localtime()
if tm[6] == 6:
guild = await client.fetch_guild(guildID)
if guild != None:
member = await guild.fetch_member(userID)
if member != None:
await member.kick(reason='Test')
@tasks.loop(seconds=60)
async def mainloop():
asyncio.create_task(timecheck())
mainloop.start()
推荐阅读
- google-bigquery - 与他人(公开)共享我在 BigQuery 中的项目是否安全?
- python - Python。while 循环中的变量未更新。
- c - pthreads:独占+并发函数(反向信号量)
- php - htaccess 用于域转发和屏蔽
- sql - 更新另一个表时必须声明标量变量@tablename
- c - 如何在c中删除文本文件中的最后一个字符?
- php - 按日期对来自 glob 的修改结果排序 PHP
- c# - 从给定列表中查找最长的公共匹配子字符串
在一个字符串中 - java - 在 Jersey 2.27 中注册自定义 ValueParamProvider
- python - Plotly/dash - 模块“dash_html_components”没有“Div”成员