Discord.net 如何处理 Auditlog.data

问题描述

我目前正在处理一个 bot 命令,它应该检查用户是否具有角色“foobar”。如果是这样,我想在他被分配该角色时阅读审计日志。我可以获取审计日志并读取结果等,但我无法处理数据。我尝试了很多不同的方法,但每次都以 audit.data.Equals、.GetHashCode、.GetType 或 .ToString 结束。

我尝试通过 foreach 解析 audit.data 但这也不起作用,因为 .data 没有 GetEnumerator 实例。

    public async Task GetUsers()
    {
        var userlist = Context.Guild.Users;
        
        var channellist = Context.Guild.Channels;
        foreach(var s in userlist)
        {
            if (!(s.IsBot))
            {
                foreach (var userrole in s.Roles)
                {
                    if (userrole.ToString() == "foobar")
                    {
                        var auditlogs = Context.Guild.GetAuditLogsAsync(10,null,s.Id,ActionType.MemberRoleUpdated).FlattenAsync();
                        foreach (var audit in auditlogs.Result)
                        {
                            Console.WriteLine(audit.Data.GetType());
                            IAuditLogData auditdata = audit.Data;
                            foreach (var datalog in audit.Data)
                            {


                            }
                        }
                        
                    }
                }
                
            }
        }
    }

解决方法

您不能直接读取 IAuditLogData,因为它是所有不同审计日志数据类型的接口。您需要先投射它,然后才能使用它。 这样的事情应该可以工作:

foreach (var audit in auditlogs.Result)
{
    if (audit.Data is MemberRoleAuditLogData data)
    {
        // use the "data" variable here
    }
}

然而,正如评论中提到的,审计日志数据不会永远存在,你最好使用事件并将这些信息存储在数据库中。此外,您不能按更新的人进行搜索,您的示例搜索更新的人(在您的情况下听起来像机器人)。您需要为 data.Target 添加另一个过滤器。