Allow opening a new chat with right click on User

Allow faster viewing of the usertab using lasy loading
This commit is contained in:
miterosan
2018-04-09 23:14:39 +02:00
parent 762b4412e5
commit 85f736ae89
5 changed files with 96 additions and 33 deletions

View File

@ -11,6 +11,7 @@ using osu.Framework.Logging;
using osu.Framework.Threading;
using osu.Game.Online.API;
using osu.Game.Online.API.Requests;
using osu.Game.Users;
namespace osu.Game.Online.Chat
{
@ -52,6 +53,40 @@ namespace osu.Game.Online.Chat
private long? lastChannelMsgId;
private long? lastUserMsgId;
public void OpenChannelChat(string name)
{
if (name == null)
throw new ArgumentNullException(nameof(name));
CurrentChat.Value = AvailableChannels.FirstOrDefault(c => c.Name == name)
?? throw new ArgumentException($"Channel {name} was not found.");
}
public void OpenUserChat(long userId)
{
var chat = OpenedUserChats.FirstOrDefault(c => c.ChatID == userId);
if (chat == null)
{
chat = new UserChat(new User
{
Id = userId
});
chat.RequestDetails(api);
}
CurrentChat.Value = chat;
}
public void OpenUserChat(User user)
{
if (user == null)
throw new ArgumentNullException(nameof(user));
CurrentChat.Value = OpenedUserChats.FirstOrDefault(c => c.ChatID == user.Id)
?? new UserChat(user);
}
public ChatManager(Scheduler scheduler)
{
this.scheduler = scheduler ?? throw new ArgumentNullException(nameof(scheduler));
@ -62,6 +97,9 @@ namespace osu.Game.Online.Chat
{
if (chatBase is ChannelChat channel && !JoinedChannels.Contains(channel))
JoinedChannels.Add(channel);
if (chatBase is UserChat userChat && !OpenedUserChats.Contains(userChat))
OpenedUserChats.Add(userChat);
}
/// <summary>
@ -171,23 +209,19 @@ namespace osu.Game.Online.Chat
chat.AddNewMessages(messageGroup.ToArray());
var outgoingTargetMessages = outgoingMessagesGroups.FirstOrDefault(g => g.Key == targetUser.Id);
chat.AddNewMessages(outgoingTargetMessages.ToArray());
if (outgoingTargetMessages != null)
chat.AddNewMessages(outgoingTargetMessages.ToArray());
}
var withoutReplyGroups = outgoingMessagesGroups.Where(g => OpenedUserChats.All(m => m.ChatID != g.Key));
foreach (var withoutReplyGroup in withoutReplyGroups)
{
var getUserRequest = new GetUserRequest(withoutReplyGroup.First().TargetId);
getUserRequest.Success += user =>
{
var chat = new UserChat(user);
{
var chat = new UserChat(new User {Id = withoutReplyGroup.First().TargetId });
chat.AddNewMessages(withoutReplyGroup.ToArray());
OpenedUserChats.Add(chat);
};
api.Queue(getUserRequest);
chat.AddNewMessages(withoutReplyGroup.ToArray());
OpenedUserChats.Add(chat);
chat.RequestDetails(api);
}
}

View File

@ -2,13 +2,20 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using osu.Framework.Logging;
using osu.Game.Online.API;
using osu.Game.Online.API.Requests;
using osu.Game.Users;
namespace osu.Game.Online.Chat
{
public class UserChat : ChatBase
{
public User User { get; }
public User User { get; private set; }
public override TargetType Target => TargetType.User;
public override long ChatID => User.Id;
public Action<User> DetailsArrived;
public UserChat(User user, Message[] messages = null)
{
@ -17,7 +24,19 @@ namespace osu.Game.Online.Chat
if (messages != null) AddNewMessages(messages);
}
public override TargetType Target => TargetType.User;
public override long ChatID => User.Id;
public void RequestDetails(IAPIProvider api)
{
if (api == null)
throw new ArgumentNullException(nameof(api));
var req = new GetUserRequest(User.Id);
req.Success += user =>
{
User = user;
DetailsArrived?.Invoke(user);
};
req.Failure += exception => Logger.Error(exception, $"Requesting details for user with Id:{User.Id} failed.");
api.Queue(req);
}
}
}