mirror of
https://github.com/osukey/osukey.git
synced 2025-08-05 07:33:55 +09:00
Allow opening a new chat with right click on User
Allow faster viewing of the usertab using lasy loading
This commit is contained in:
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user