C#在玩游戏时为用户分配角色



如果正在玩特定游戏,我正试图通过机器人分配Discord角色。

这是我的代码:

private async Task UserUpdated(SocketGuildUser before, SocketGuildUser after)
{
//fetch guild and user by id
ulong long2 = ulong.Parse(after.Id.ToString());
var user = _client.GetGuild(myguildid).GetUser(long2);
var Game = user.Activity as Game;
if (user.IsBot) { return; }
//check if playing a game with the name mygamename          
if (Game.Name == "mygamename")
{
//if so, assign the role
SocketGuild socketGuild = after.Guild;
SocketRole socketRole = socketGuild.GetRole(myroleid);
await after.AddRoleAsync(socketRole);
}
//Check if user isn't playing game with name mygamename
else if (Game.Name != "mygamename")
{
//If so, remove role
SocketGuild socketGuild = after.Guild;
SocketRole socketRole = socketGuild.GetRole(myroleid);
await after.RemoveRoleAsync(socketRole);
}
}

然而,如果我尝试用mygamename这个名字玩游戏,它会分配角色,但如果我停止玩,它会在这一行给我一个错误:

if (Game.Name == "mygamename")

它给了我一个错误:

20:31:10网关GuildMemberUpdated处理程序引发了未处理的异常。:系统NullReferenceException:对象引用未设置为对象的实例。在myprogram。在中编程.d_6.MoveNext((C: \Users\User\Desktop\myprogram\myprogram\Program.cs:line 9---从上一个引发异常的位置开始的堆栈结尾跟踪--在系统运行时。编译器服务。任务等待者。ThrowForNonSuccess(任务任务(系统运行时。编译器服务。任务等待者。HandleNonSuccessAndDebugger通知(任务任务(。EventExtensions.d_2`2.MoveNext((---从上一个引发异常的位置开始的堆栈结尾跟踪--在系统运行时。编译器服务。任务等待者。ThrowForNonSuccess(任务任务(系统运行时。编译器服务。任务等待者。HandleNonSuccessAndDebugger通知(任务任务(不一致WebSocket。DiscordSocketClient.d_139.MoveNext((

并且它不分配角色。我该怎么解决?有没有更好的方法可以在之前/之后获取并检查正在玩的游戏?

也许不需要转换为Game类型?默认情况下,Game对象具有值为PlayingActivityType属性。所以你可以试着先拿IActivity,它有Playing活动类型和你游戏的Name

var game = userAfter.Activities.FirstOrDefault(activity => activity.Type == ActivityType.Playing
&& activity.Name == "MyGameName");

如果没有任何Playing活动,或者你的游戏名称没有,game变量将为空,所以你只检查is not null:

private async Task UserUpdated(SocketGuildUser userBefore, SocketGuildUser userAfter)
{
if (userAfter.IsBot)
return;
var myRoleID = 123123123UL;
var role = userAfter.Guild.GetRole(myRoleID);
var game = userAfter.Activities.FirstOrDefault(activity => activity.Type == ActivityType.Playing
&& activity.Name == "MyGameName");
if (game != null)
{
// No need to add AddRole, if user already have it
if (!userAfter.Roles.Contains(role))
await userAfter.AddRoleAsync(role);
}
else
{
// No need to call RemoveRole, if user haven't it
if (userAfter.Roles.Contains(role))
await userAfter.RemoveRoleAsync(role);
}         
}

我没有自己测试代码示例,但无论如何你都可以尝试。

最新更新