Discord.NET比较角色的更好方法

时间:2018-06-02 12:48:28

标签: c# warnings bots discord discord.net

所以在我的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
        }
    }

如果您知道更好的方式或更有效的方式,请分享,将不胜感激。感谢。

3 个答案:

答案 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属性。 您已经在做的基本上相同的事情就是避免循环浏览角色。