在介绍了身份验证和状态接口之后,为了完善关于Epic账户服务的Epic在线服务入门文章,我们将继续介绍如何使用好友接口查询Epic好友及其状态。在本文中,我们将介绍:
好友API作用域
为应用程序添加好友权限
查询好友
获取好友的准许
订阅更新
查询好友状态
获取代码
好友API作用域
在深入研究查询API之前,了解这些API的作用域非常重要。如前一篇文章所述,默认情况下,好友API不会返回玩家在Epic Games启动器等地方所能够看到的完整好友列表。我们看到,当我们的EAS应用程序访问我们指定的特定信息(基本资料、状态和好友)时,玩家将收到准许提示。只有在玩家的好友提供准许后,好友接口才会在查询时返回该特定好友。如果玩家通过Epic Games商城购买游戏,作为购买流程的一部分,后台将自动提供准许。举个例子:
玩家A是玩家B和玩家C的好友,并通过Epic Games商城购买了游戏
玩家B未拥有该游戏
玩家C通过Steam购买了该游戏
在这种情况下,当我们调用查询API时,玩家A不会在游戏中看到任何好友,除非玩家C启动该游戏,并在身份验证流程中提供准许。查询API永远不会返回玩家B,因为他没有该款游戏。
请注意,根据文档,目前没有API能够管理好友请求或为玩家添加/删除好友。我们将在今年晚些时候扩展社交覆层,以帮助实现这一功能。
为应用程序添加好友权限
与处理状态时类似,我们必须为EAS应用程序添加好友权限,才能正确取得玩家们的准许:
访问https://dev.epicgames.com/portal/登录开发者门户
导航到你的产品,然后单击左侧菜单中的“Epic账户服务”
单击你正在使用的应用程序旁的“配置”按钮
单击右上方的“权限”选项卡
启用“好友(friends_list)”权限。请注意,你将在左侧看到预览更新,它现在包括关于好友准许的信息
单击“保存”以确认
为EAS应用程序添加好友权限
最后,我们在Visual Studio解决方案中打开ApplicationSettings.cs,并添加状态ScopeFlag:
public AuthScopeFlags ScopeFlags
{
get
{
return AuthScopeFlags.BasicProfile | AuthScopeFlags.Presence | AuthScopeFlags.FriendsList;
}
}
现在,当你运行应用程序并触发身份验证登录时,应该可以在浏览器中看到更新后的准许屏幕,并且仍然能够成功地完成身份验证。
查询好友
添加完成之后,我们就可以在解决方案中实现查询功能:
在Views文件夹中添加一个名为FriendsView的新UserControl
粘贴以下XAML,替换空的Grid节点:
我们将使用一个ListView来显示API返回给我们的好友,并添加额外的按钮来订阅更新或取消订阅更新,以及查询好友的状态。
打开FriendsView.xaml.cs并定义DataContext:
public partial class FriendsView : UserControl
{
public FriendsViewModel ViewModel { get { return ViewModelLocator.Friends; } }
public FriendsView()
{
InitializeComponent();
DataContext = ViewModel;
}
private void FriendsListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
注意空白的FriendsListView_SelectionChanged事件句柄,我们将在稍后实现好友状态查询时使用它。
我们将在UI中结合一些属性(Epic账户Id、好友状态、在线状态)来显示好友,因此,我们在项目根目录下创建一个名为Models的文件夹,然后在其中添加一个Friend.cs类:
public class Friend : BindableBase
{
private EpicAccountId _epicAccountId;
public EpicAccountId EpicAccountId
{
get { return _epicAccountId; }
set { SetProperty(ref _epicAccountId, value); }
}
private FriendsStatus _friendsStatus;
public FriendsStatus FriendsStatus
{
get { return _friendsStatus; }
set { SetProperty(ref _friendsStatus, value); }
}
private Status _status;
public Status Status
{
get { return _status; }
set { SetProperty(ref _status, value); }
}
}
在ViewModels文件夹中添加一个FriendsViewModel.cs类:
public class FriendsViewModel : BindableBase
{
private ObservableCollection _friends;
public ObservableCollection Friends
{
get { return _friends; }
set { SetProperty(ref _friends, value); }
}
private Friend _selectedFriend;
public Friend SelectedFriend
{
get { return _selectedFriend; }
set { SetProperty(ref _selectedFriend, value); }
}
private ulong _notificationId;
public ulong NotificationId
{
get { return _notificationId; }
set { SetProperty(ref _notificationId, value); }
}
}
在ViewModelLocator中添加一个对FriendsViewModel的静态引用:
private static FriendsViewModel _friends;
public static FriendsViewModel Friends
{
get { return _friends ??= new FriendsViewModel(); }
}
在Services文件夹中添加一个FriendsService.cs类:
public static class FriendsService
{
public static void QueryFriends()
{
var queryFriendsOptions = new QueryFriendsOptions()
{
LocalUserId = EpicAccountId.FromString(ViewModelLocator.Main.AccountId)
};
ViewModelLocator.Main.StatusBarText = $"Querying friends...";
App.Settings.PlatformInterface.GetFriendsInterface()
.QueryFriends(queryFriendsOptions, null, (QueryFriendsCallbackInfo queryFriendsCallbackInfo) =>
{
Debug.WriteLine($"QueryFriends {queryFriendsCallbackInfo.ResultCode}");
if (queryFriendsCallbackInfo.ResultCode == Result.Success)
{
var getFriendsCountOptions = new GetFriendsCountOptions()
{
LocalUserId = EpicAccountId.FromString(ViewModelLocator.Main.AccountId)
};
var friendsCount = App.Settings.PlatformInterface.GetFriendsInterface()
.GetFriendsCount(getFriendsCountOptions);
for (int i = 0; i
{
Debug.WriteLine($"OnFriendsUpdate: {onFriendsUpdateInfo.TargetUserId}");
ViewModelLocator.Friends.Friends.SingleOrDefault(f => f.EpicAccountId == onFriendsUpdateInfo.TargetUserId).FriendsStatus = onFriendsUpdateInfo.CurrentStatus;
});
ViewModelLocator.Friends.FriendsSubscribeUpdates
.RaiseCanExecuteChanged();
ViewModelLocator.Friends.FriendsUnsubscribeUpdates
.RaiseCanExecuteChanged();
ViewModelLocator.Main.StatusBarText = string.Empty;
}
public static void UnsubscribeUpdates()
{
ViewModelLocator.Main.StatusBarText = $"Removing notification for friends updates...";
App.Settings.PlatformInterface.GetFriendsInterface()
.RemoveNotifyFriendsUpdate(ViewModelLocator.Friends.NotificationId);
ViewModelLocator.Friends.NotificationId = 0;
ViewModelLocator.Friends.FriendsSubscribeUpdates
.RaiseCanExecuteChanged();
ViewModelLocator.Friends.FriendsUnsubscribeUpdates
.RaiseCanExecuteChanged();
ViewModelLocator.Main.StatusBarText = string.Empty;
}
我们调用AddNotifyFriendsUpdate,传入空白options,以获取一个返回的通知ID,它将确认通知已经设置完毕,并且,当我们取消订阅更新时,也要用到它(见UnsubscribeUpdates())。
然后我们定义一个回调方法,在其中实现当通知发送完毕时所需的功能。在本例中,我们只是将另一条记录添加到具有新状态的好友列表中。
我们还为这些命令的CanExecuteChanged行为添加了一个触发器,如此一来,只有在我们对好友进行首次查询后,这些命令才可使用:
添加:
ViewModelLocator.Friends.FriendsSubscribeUpdates
.RaiseCanExecuteChanged();
ViewModelLocator.Friends.FriendsUnsubscribeUpdates
.RaiseCanExecuteChanged();
至FriendsService.QueryFriends()中以下行的下方:
[...]
var friendStatus = App.Settings.PlatformInterface.GetFriendsInterface()
.GetStatus(getStatusOptions);
ViewModelLocator.Friends.Friends.Add(new Friend()
{
EpicAccountId = friend,
FriendsStatus = friendStatus
});
}
}
ViewModelLocator.Friends.FriendsSubscribeUpdates
.RaiseCanExecuteChanged();
ViewModelLocator.Friends.FriendsUnsubscribeUpdates
.RaiseCanExecuteChanged();
在Commands文件夹中添加一个FriendsSubscribeUpdatesCommand.cs类:
public class FriendsSubscribeUpdatesCommand : CommandBase
{
public override bool CanExecute(object parameter)
{
return !string.IsNullOrWhiteSpace(ViewModelLocator.Main.AccountId) && (ViewModelLocator.Friends.Friends.Count != 0) && (ViewModelLocator.Friends.NotificationId == 0);
}
public override void Execute(object parameter)
{
FriendsService.SubscribeUpdates();
}
}
在Commands文件夹中添加一个FriendsUnsubscribeUpdatesCommand.cs类:
public class FriendsUnsubscribeUpdatesCommand : CommandBase
{
public override bool CanExecute(object parameter)
{
return !string.IsNullOrWhiteSpace(ViewModelLocator.Main.AccountId) && (ViewModelLocator.Friends.Friends.Count != 0) && (ViewModelLocator.Friends.NotificationId != 0);
}
public override void Execute(object parameter)
{
FriendsService.UnsubscribeUpdates();
}
}
在FriendsViewModel.cs中声明并初始化新命令:
public FriendsQueryCommand FriendsQuery { get; set; }
public FriendsSubscribeUpdatesCommand FriendsSubscribeUpdates { get; set; }
public FriendsUnsubscribeUpdatesCommand FriendsUnsubscribeUpdates { get; set; }
public FriendsViewModel()
{
FriendsQuery = new FriendsQueryCommand();
FriendsSubscribeUpdates = new FriendsSubscribeUpdatesCommand();
FriendsUnsubscribeUpdates = new FriendsUnsubscribeUpdatesCommand();
}
现在,当我们运行应用程序时,就可以查询好友并订阅/取消订阅更新。一旦订阅了更新,通过Epic Games启动程序删除列表中的一个好友后,你会在ListView中看到一个新条目,将该好友的状态显示为NotFriends。
查询好友状态
最后,我们基于上一篇文章中所实现的功能,来实现查询好友在线状态的功能。现在我们可以使用QueryPresence来检索每个好友的状态。
在Commands文件夹中打开PresenceQueryCommand,并用以下代码行替换这两个方法:
public override bool CanExecute(object parameter)
{
if (parameter == null)
return !string.IsNullOrWhiteSpace(ViewModelLocator.Main.AccountId);
else
return ((Friend)parameter).EpicAccountId != null;
}
public override void Execute(object parameter)
{
if (parameter == null)
PresenceService.Copy(EpicAccountId
.FromString(ViewModelLocator.Main.AccountId), EpicAccountId
.FromString(ViewModelLocator.Main.AccountId));
else
PresenceService.Query(((Friend)parameter).EpicAccountId);
}
我们修改CanExecute代码,使它也能够检查参数(即我们将从FriendsView ListView中传递的所选好友),并在Execute中添加“else”语句,以在传递好友时调用PresenceService.Query()。
打开FriendsViewModel并实例化PresenceQueryCommand:
public FriendsQueryCommand FriendsQuery { get; set; }
public FriendsSubscribeUpdatesCommand FriendsSubscribeUpdates { get; set; }
public FriendsUnsubscribeUpdatesCommand FriendsUnsubscribeUpdates { get; set; }
public PresenceQueryCommand PresenceQuery { get; set; }
public FriendsViewModel()
{
FriendsQuery = new FriendsQueryCommand();
FriendsSubscribeUpdates = new FriendsSubscribeUpdatesCommand();
FriendsUnsubscribeUpdates = new FriendsUnsubscribeUpdatesCommand();
PresenceQuery = new PresenceQueryCommand();
}
最后,在FriendsView.xaml.cs中的FriendsListView_SelectionChanged事件句柄中添加以下内容,确保查询状态按钮只在选中好友时可用:
ViewModel.PresenceQuery.RaiseCanExecuteChanged();
现在,当我们运行应用程序时,点击“查询好友”并选择一个在线的好友,再点击“查询状态”,我们就能在UI中看到他们的状态更新。
被查询好友的状态
正如前一篇文章中所提到的,你应该在制作游戏时实现AddNotifyOnPresenceChanged,以便在好友的在线状态发生变化时获得通知。
获取代码
在下方获取本文的代码。(按照这篇文章中的步骤5和步骤10,将SDK添加到解决方案中,然后将SDK凭证添加到ApplicationSettings.cs中)。
|