提及用户时,并非在字符串格式化期间转换了所有参数

时间:2018-08-18 23:21:35

标签: python discord discord.py

我正在尝试创建一个不和谐的机器人,该机器人将记录已编辑或删除的消息。

出于某种原因,程序有时将作者ID视为字符串。

clear的代码不能像on_message_edit的代码一样工作

当我在on_message时,我提到这样的作者是可行的

on_message

但是当我尝试在UserID = message.author.id await bot.send_message(whatever channel, 'This is <@%s>' % (UserId)) 上执行相同的提及方法时,它没有用。我做了

on_message_edit

我收到此错误

 @bot.event
async def on_message_edit(before, after):
    MemberId = after.author.id
    await bot.send_message(bot.get_channel('480495197034381332'), 'The user <@%s> have edited his message from ``' + before.content + '`` to `` ' + after.content + ' `` ' % (MemberId))

2 个答案:

答案 0 :(得分:1)

运算符$letters = array('a', 'b', 'c', 'd'); $hex = array('6100','6200','6300','6400'); //'a', 'b', 'c', 'd' 的优先级高于%。参见the docs on operator precedence

因此,执行+的代码首先会评估a + b % c

在您的代码中,这意味着评估的第一件事是b % c,并且失败,因为' `` ' % (MemberId)中没有%s

' `` '

可以通过在'The user <@%s> have edited his message from ``' + before.content + '`` to `` ' + after.content + ' `` ' % (MemberId) 之前的所有内容周围加上括号来解决此问题,例如:

%

但这仍然是一种很差的方法。

例如,如果bot.send_message(bot.get_channel('480495197034381332'), ('The user <@%s> have edited his message from ``' + before.content + '`` to `` ' + after.content + ' `` ') % (MemberId)) %中有before.content,则失败。如果after.content是一个元组,它也会失败。

这是正确的:

MemberId

这会更好:

bot.send_message(bot.get_channel('480495197034381332'),
                 'The user <@%s> have edited his message from ``%s``'
                 ' to ``%s`` ' % (MemberId, before.content, after.content))

答案 1 :(得分:0)

您需要移动function rands(used) { let r; do { r = Math.floor(Math.random() * 20) + 1; } while (used.indexOf(r) >= 0); return r; } var rand = []; for (let i = 0; i < 4; i++) rand[i] = rands(rand);

%s

根据您的情况

>>> '12%s' + '45' % '3'
TypeError: not all arguments converted during string formatting

>>> '12%s' % '3' + '45'
'12345'

如果您使用的是Python3.6 +,f字符串会更干净

await bot.send_message(bot.get_channel('480495197034381332'), 'The user <@%s> have edited his message from ``' % MemberId + before.content + '`` to `` ' + after.content + ' `` ')