为不同公会的同一用户保存不同的数据

Save different data for same user on different Guilds

我设置了一个stats命令如下

[Command("Stats")]
        public async Task StatsOther(SocketUser socketUser = null)
        {
            if (socketUser == null)
            {
                socketUser = Context.User;
            }
            var account = UserAccounts.GetAccount(socketUser);
            await Context.Channel.SendMessageAsync($"Hey {socketUser.Mention}, You have {account.Size} long sandwhiches and {account.XP} XP.");
        }

然后classUserAccounts搜索我们的数据库中是否存在socketUserID属性。现在说同一个用户在不同的公会,我需要为他存储不同的数据,但是 socketUser.ID 将是相同的,无论公会如何。因此,当用户尝试使用 stats 命令时,无论他现在所在的公会如何,他都会看到相同的数据。

这里是 UserAccounts.GetAccount 领导和做事的地方,

public static UserAccount GetAccountFromID(ulong ID)
        {
            var result = from a in accounts
                         where a.ID == ID
                         select a;

            var FoundAccount = result.FirstOrDefault();
            if (FoundAccount == null)
            {
                FoundAccount = CreateUserAccount(ID);
            }
            return FoundAccount;
        }

很明显,linq 查询正在检查 ID,并且无论公会如何,它们对于用户来说都是相同的。

我尝试使用 SocketGuildUser,但遗憾的是 socketGuildUser.ID 也独立于公会。所以我无法为来自不同行会的同一用户存储不同的数据。使用可用的最新测试版。

我怎样才能做到这一点。

您可以使用为每个用户实施的 Dictionary。每个用户都有自己的 Dictionary<GuildID, Data>.

并且在 SQL 端(如果您使用的是 SQL),您可以有一个新的 table,它在用户 ID 上有一个外键约束,并且也有公会ID。
(如果用户统计数据的 none 在所有公会之间共享,则可能不需要对 userID 的外键约束;也就是说,您只有一个 SQL-table,您可以执行 SELECT stuff FROM tableName WHERE userID = ? AND guildID = ?)