所以在我的Discord机器人中,我正在创建一个完整的审核系统,其中具有适当权限的用户可以向其他用户发出警告,这些将被记录,一旦发出3个警告,用户静音一段时间,这它可以发生5次静音更长时间,在第五次静音后,当用户再发出3次警告时,它们会被永久禁止。因此,我几乎完成了与用户等历史查看器无关的整个问题,但我遇到的问题是比较角色。我找到了一个解决方案,我不确定它从长远来看是否正常工作,但这是我能想到的唯一方法。我希望它不允许用户警告排名高于自己的人。这是我的代码:
public class Warn : ModuleBase<SocketCommandContext>
{
[Command("Warn")]
public async Task WarnMain([Remainder, Summary("Warn a user for a reason.")] IGuildUser user, string warnInfo)
{
var userRole = -1;
var victimRole = -1;
var counter = 0;
foreach(var role in Context.Guild.Roles)
{
if (Context.Guild.GetUser(Context.User.Id).Roles.Contains(role) && userRole == -1)
{
userRole = counter;
}
if (Context.Guild.GetUser(user.Id).Roles.Contains(role) && victimRole == -1)
{
victimRole = counter;
}
}
if (userRole < victimRole)
// blah blah
}
}
如果您知道更好的方式或更有效的方式,请分享,将不胜感激。感谢。
答案 0 :(得分:0)
首先,我想指出discord.py有自己的权限比较方法。您可以尝试在C#代码中运行他们的python脚本,或者将它从python“转换”为C#。
您可以查看他们的源代码,以便比较权限here。
就我个人而言,由于我的机器人并非真正适合审核,因此我采取了懒惰的方式,并创建了一个简单的函数,使用嵌套的if-else语句来比较权限。
# make autoencoders not trainable
autoencoder1.trainable = False
autoencoder2.trainable = False
encoded1 = autoencoder1(kerasInputs1)
encoded2 = autoencoder2(kerasInputs2)
concatenated = layers.concatenate([encoded1, encoded2], axis=-1)
h = Dense(num_hidden, activation='relu', name='hidden')(concatenated)
y = Dense(1, activation='sigmoid', name='prediction')(h)
myMLP = Model([input_data1, input_data2], y)
myMLP.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Training
myMLP.fit([x1_train, x2_train], y_train, epochs=200, batch_size=8)
# Testing
myMLP.predict([x1_test, x2_test])
如果他们看起来更好,我个人建议使用其他方法。
答案 1 :(得分:0)
就我所知,我做它的方式似乎是实际比较角色的唯一方法。花了最后4个小时寻找替代品,但没有遇到任何问题。
我的方法只是简单地浏览每个角色并进行比较,我相信API已经将角色从最高的一个到最后一个进行排序。然后,您可以使用计数器来比较找到分配给用户的最高角色的数字。
比较权限并不总是有效,特别是在我的情况下,因此我也无法使用该方法。这对我来说似乎最有效。如果有人有更好的方式可以随意分享,我很乐意看到如何改进它。
答案 2 :(得分:0)
如果将用户强制转换为SocketGuilderUser,则可以比较Hierarchy属性。 您已经在做的基本上相同的事情就是避免循环浏览角色。