mirror of
https://github.com/ppy/osu
synced 2025-01-04 13:22:08 +00:00
Better handling for joining channels with only ID
This commit is contained in:
parent
e3adf5a985
commit
cf03001c83
19
osu.Game/Online/API/Requests/GetChannelRequest.cs
Normal file
19
osu.Game/Online/API/Requests/GetChannelRequest.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests
|
||||||
|
{
|
||||||
|
public class GetChannelRequest : APIRequest<GetChannelResponse>
|
||||||
|
{
|
||||||
|
private readonly long channelId;
|
||||||
|
|
||||||
|
public GetChannelRequest(long channelId)
|
||||||
|
{
|
||||||
|
this.channelId = channelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string Target => $"chat/channels/{channelId}";
|
||||||
|
}
|
||||||
|
}
|
19
osu.Game/Online/API/Requests/Responses/GetChannelResponse.cs
Normal file
19
osu.Game/Online/API/Requests/Responses/GetChannelResponse.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Online.Chat;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests.Responses
|
||||||
|
{
|
||||||
|
[JsonObject(MemberSerialization.OptIn)]
|
||||||
|
public class GetChannelResponse
|
||||||
|
{
|
||||||
|
[JsonProperty(@"channel")]
|
||||||
|
public Channel Channel { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonProperty(@"users")]
|
||||||
|
public List<APIUser> Users { get; set; } = null!;
|
||||||
|
}
|
||||||
|
}
|
@ -88,15 +88,14 @@ namespace osu.Game.Online.Chat
|
|||||||
{
|
{
|
||||||
connector.ChannelJoined += ch => Schedule(() =>
|
connector.ChannelJoined += ch => Schedule(() =>
|
||||||
{
|
{
|
||||||
var localChannel = getChannel(ch);
|
if (ch.Joined.Value)
|
||||||
|
JoinChannel(ch);
|
||||||
if (localChannel != ch)
|
else
|
||||||
{
|
{
|
||||||
localChannel.Joined.Value = true;
|
var req = new GetChannelRequest(ch.Id);
|
||||||
localChannel.Id = ch.Id;
|
req.Success += response => JoinChannel(response.Channel);
|
||||||
|
api.Queue(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
joinChannel(localChannel);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
connector.ChannelParted += ch => Schedule(() => LeaveChannel(getChannel(ch)));
|
connector.ChannelParted += ch => Schedule(() => LeaveChannel(getChannel(ch)));
|
||||||
@ -421,20 +420,7 @@ namespace osu.Game.Online.Chat
|
|||||||
{
|
{
|
||||||
Channel found = null;
|
Channel found = null;
|
||||||
|
|
||||||
bool lookupCondition(Channel ch)
|
bool lookupCondition(Channel ch) => lookup.Id > 0 ? ch.Id == lookup.Id : ch.Name == lookup.Name;
|
||||||
{
|
|
||||||
// If both channels have an id, use that.
|
|
||||||
if (lookup.Id > 0 && ch.Id > 0)
|
|
||||||
return ch.Id == lookup.Id;
|
|
||||||
|
|
||||||
// In the case that the local echo is received in a new channel (i.e. one that does not yet have an ID),
|
|
||||||
// then we need to check for any existing channel with the message containing the same message matched by UUID.
|
|
||||||
if (lookup.Messages.Count > 0 && ch.Messages.Any(m => m.Uuid == lookup.Messages.Last().Uuid))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// As a last resort, fallback to matching by name.
|
|
||||||
return lookup.Name == ch.Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
var available = AvailableChannels.FirstOrDefault(lookupCondition);
|
var available = AvailableChannels.FirstOrDefault(lookupCondition);
|
||||||
if (available != null)
|
if (available != null)
|
||||||
|
@ -46,7 +46,10 @@ namespace osu.Game.Online.Notifications
|
|||||||
if (updates?.Presence != null)
|
if (updates?.Presence != null)
|
||||||
{
|
{
|
||||||
foreach (var channel in updates.Presence)
|
foreach (var channel in updates.Presence)
|
||||||
|
{
|
||||||
|
channel.Joined.Value = true;
|
||||||
HandleJoinedChannel(channel);
|
HandleJoinedChannel(channel);
|
||||||
|
}
|
||||||
|
|
||||||
//todo: handle left channels
|
//todo: handle left channels
|
||||||
|
|
||||||
@ -59,12 +62,7 @@ namespace osu.Game.Online.Notifications
|
|||||||
return fetchReq;
|
return fetchReq;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void HandleJoinedChannel(Channel channel)
|
protected void HandleJoinedChannel(Channel channel) => ChannelJoined?.Invoke(channel);
|
||||||
{
|
|
||||||
// we received this from the server so should mark the channel already joined.
|
|
||||||
channel.Joined.Value = true;
|
|
||||||
ChannelJoined?.Invoke(channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void HandleChannelParted(Channel channel) => ChannelParted?.Invoke(channel);
|
protected void HandleChannelParted(Channel channel) => ChannelParted?.Invoke(channel);
|
||||||
|
|
||||||
|
@ -119,6 +119,7 @@ namespace osu.Game.Online.Notifications.WebSocket
|
|||||||
Channel? joinedChannel = JsonConvert.DeserializeObject<Channel>(message.Data.ToString());
|
Channel? joinedChannel = JsonConvert.DeserializeObject<Channel>(message.Data.ToString());
|
||||||
Debug.Assert(joinedChannel != null);
|
Debug.Assert(joinedChannel != null);
|
||||||
|
|
||||||
|
joinedChannel.Joined.Value = true;
|
||||||
HandleJoinedChannel(joinedChannel);
|
HandleJoinedChannel(joinedChannel);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -138,7 +139,7 @@ namespace osu.Game.Online.Notifications.WebSocket
|
|||||||
Debug.Assert(messageData != null);
|
Debug.Assert(messageData != null);
|
||||||
|
|
||||||
foreach (var msg in messageData.Messages)
|
foreach (var msg in messageData.Messages)
|
||||||
HandleJoinedChannel(new Channel(msg.Sender) { Id = msg.ChannelId, Messages = { msg } });
|
HandleJoinedChannel(new Channel { Id = msg.ChannelId });
|
||||||
|
|
||||||
HandleMessages(messageData.Messages);
|
HandleMessages(messageData.Messages);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user