关于python:Discord.py silence命令

Discord.py silence command

最近我问了很多关于discord.py的问题,这就是其中之一。

有时,有些人向你的不和谐服务器发送垃圾邮件,但踢或禁止他们似乎过于严厉。我想到了一个silence命令,它可以在给定的时间内删除一个通道上的所有新消息。

到目前为止,我的代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@BSL.command(pass_context = True)
async def silence(ctx, lenghth = None):
        if ctx.message.author.server_permissions.administrator or ctx.message.author.id == ownerID:
             global silentMode
             global silentChannel
             silentChannel = ctx.message.channel
             silentMode = True
             lenghth = int(lenghth)
             if lenghth != '':
                  await asyncio.sleep(lenghth)
                  silentMode = False
             else:
                  await asyncio.sleep(10)
                  silentMode = False
        else:
             await BSL.send_message(ctx.message.channel, 'Sorry, you do not have the permissions to do that @{}!'.format(ctx.message.author))

我的on_message部分中的代码是:

1
2
3
4
if silentMode == True:
        await BSL.delete_message(message)
        if message.content.startswith('bsl;'):
                await BSL.process_commands(message)

所有使用的变量都是在bot顶部预先定义的。

我的问题是,bot会删除它可以访问的所有通道中的所有新消息。我试着把if silentChannel == ctx.message.channel放在on_message区,但这使命令完全停止工作。

关于这件事发生原因的任何建议都非常感谢。


有点像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
silent_channels = set()

@BSL.event
async def on_message(message):
    if message.channel in silent_channels:
        if not message.author.server_permissions.administrator and  message.author.id != ownerID:
            await BSL.delete_message(message)
            return
    await BSL.process_commands(message)

@BSL.command(pass_context=True)
async def silent(ctx, length=0): # Corrected spelling of length
    if ctx.message.author.server_permissions.administrator or ctx.message.author.id == ownerID:
        silent_channels.add(ctx.message.channel)
        await BSL.say('Going silent.')
        if length:
            length = int(length)
            await asyncio.sleep(length)
            if ctx.message.channel not in silent_channels: # Woken manually
                return
            silent_channels.discard(ctx.message.channel)
            await BSL.say('Waking up.')

@BSL.command(pass_context=True)
async def wake(ctx):
    silent_channels.discard(ctx.message.channel)

应该有效(我还没有测试过,测试机器人很痛苦)。通过集合进行搜索很快,所以对每条消息进行搜索不应该成为您资源的真正负担。