mirror of
https://github.com/osukey/osukey.git
synced 2025-08-07 00:23:59 +09:00
Merge pull request #13690 from smoogipoo/fix-action-posting
Fix commands posted to the wrong channel
This commit is contained in:
105
osu.Game.Tests/Chat/TestSceneChannelManager.cs
Normal file
105
osu.Game.Tests/Chat/TestSceneChannelManager.cs
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
// 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.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Testing;
|
||||||
|
using osu.Game.Online.API;
|
||||||
|
using osu.Game.Online.API.Requests;
|
||||||
|
using osu.Game.Online.Chat;
|
||||||
|
using osu.Game.Tests.Visual;
|
||||||
|
using osu.Game.Users;
|
||||||
|
|
||||||
|
namespace osu.Game.Tests.Chat
|
||||||
|
{
|
||||||
|
[HeadlessTest]
|
||||||
|
public class TestSceneChannelManager : OsuTestScene
|
||||||
|
{
|
||||||
|
private ChannelManager channelManager;
|
||||||
|
private int currentMessageId;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup() => Schedule(() =>
|
||||||
|
{
|
||||||
|
var container = new ChannelManagerContainer();
|
||||||
|
Child = container;
|
||||||
|
channelManager = container.ChannelManager;
|
||||||
|
});
|
||||||
|
|
||||||
|
[SetUpSteps]
|
||||||
|
public void SetUpSteps()
|
||||||
|
{
|
||||||
|
AddStep("register request handling", () =>
|
||||||
|
{
|
||||||
|
currentMessageId = 0;
|
||||||
|
|
||||||
|
((DummyAPIAccess)API).HandleRequest = req =>
|
||||||
|
{
|
||||||
|
switch (req)
|
||||||
|
{
|
||||||
|
case JoinChannelRequest joinChannel:
|
||||||
|
joinChannel.TriggerSuccess();
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case PostMessageRequest postMessage:
|
||||||
|
postMessage.TriggerSuccess(new Message(++currentMessageId)
|
||||||
|
{
|
||||||
|
IsAction = postMessage.Message.IsAction,
|
||||||
|
ChannelId = postMessage.Message.ChannelId,
|
||||||
|
Content = postMessage.Message.Content,
|
||||||
|
Links = postMessage.Message.Links,
|
||||||
|
Timestamp = postMessage.Message.Timestamp,
|
||||||
|
Sender = postMessage.Message.Sender
|
||||||
|
});
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestCommandsPostedToCorrectChannelWhenNotCurrent()
|
||||||
|
{
|
||||||
|
Channel channel1 = null;
|
||||||
|
Channel channel2 = null;
|
||||||
|
|
||||||
|
AddStep("join 2 rooms", () =>
|
||||||
|
{
|
||||||
|
channelManager.JoinChannel(channel1 = createChannel(1, ChannelType.Public));
|
||||||
|
channelManager.JoinChannel(channel2 = createChannel(2, ChannelType.Public));
|
||||||
|
});
|
||||||
|
|
||||||
|
AddStep("select channel 1", () => channelManager.CurrentChannel.Value = channel1);
|
||||||
|
|
||||||
|
AddStep("post /me command to channel 2", () => channelManager.PostCommand("me dances", channel2));
|
||||||
|
AddAssert("/me command received by channel 2", () => channel2.Messages.Last().Content == "dances");
|
||||||
|
|
||||||
|
AddStep("post /np command to channel 2", () => channelManager.PostCommand("np", channel2));
|
||||||
|
AddAssert("/np command received by channel 2", () => channel2.Messages.Last().Content.Contains("is listening to"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Channel createChannel(int id, ChannelType type) => new Channel(new User())
|
||||||
|
{
|
||||||
|
Id = id,
|
||||||
|
Name = $"Channel {id}",
|
||||||
|
Topic = $"Topic of channel {id} with type {type}",
|
||||||
|
Type = type,
|
||||||
|
};
|
||||||
|
|
||||||
|
private class ChannelManagerContainer : CompositeDrawable
|
||||||
|
{
|
||||||
|
[Cached]
|
||||||
|
public ChannelManager ChannelManager { get; } = new ChannelManager();
|
||||||
|
|
||||||
|
public ChannelManagerContainer()
|
||||||
|
{
|
||||||
|
InternalChild = ChannelManager;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -82,7 +82,8 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
{
|
{
|
||||||
switch (req)
|
switch (req)
|
||||||
{
|
{
|
||||||
case JoinChannelRequest _:
|
case JoinChannelRequest joinChannel:
|
||||||
|
joinChannel.TriggerSuccess();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,11 +9,11 @@ namespace osu.Game.Online.API.Requests
|
|||||||
{
|
{
|
||||||
public class PostMessageRequest : APIRequest<Message>
|
public class PostMessageRequest : APIRequest<Message>
|
||||||
{
|
{
|
||||||
private readonly Message message;
|
public readonly Message Message;
|
||||||
|
|
||||||
public PostMessageRequest(Message message)
|
public PostMessageRequest(Message message)
|
||||||
{
|
{
|
||||||
this.message = message;
|
Message = message;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override WebRequest CreateWebRequest()
|
protected override WebRequest CreateWebRequest()
|
||||||
@ -21,12 +21,12 @@ namespace osu.Game.Online.API.Requests
|
|||||||
var req = base.CreateWebRequest();
|
var req = base.CreateWebRequest();
|
||||||
|
|
||||||
req.Method = HttpMethod.Post;
|
req.Method = HttpMethod.Post;
|
||||||
req.AddParameter(@"is_action", message.IsAction.ToString().ToLowerInvariant());
|
req.AddParameter(@"is_action", Message.IsAction.ToString().ToLowerInvariant());
|
||||||
req.AddParameter(@"message", message.Content);
|
req.AddParameter(@"message", Message.Content);
|
||||||
|
|
||||||
return req;
|
return req;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string Target => $@"chat/channels/{message.ChannelId}/messages";
|
protected override string Target => $@"chat/channels/{Message.ChannelId}/messages";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -225,7 +225,7 @@ namespace osu.Game.Online.Chat
|
|||||||
switch (command)
|
switch (command)
|
||||||
{
|
{
|
||||||
case "np":
|
case "np":
|
||||||
AddInternal(new NowPlayingCommand());
|
AddInternal(new NowPlayingCommand(target));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "me":
|
case "me":
|
||||||
@ -235,7 +235,7 @@ namespace osu.Game.Online.Chat
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PostMessage(content, true);
|
PostMessage(content, true, target);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "join":
|
case "join":
|
||||||
|
@ -21,6 +21,17 @@ namespace osu.Game.Online.Chat
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private Bindable<WorkingBeatmap> currentBeatmap { get; set; }
|
private Bindable<WorkingBeatmap> currentBeatmap { get; set; }
|
||||||
|
|
||||||
|
private readonly Channel target;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new <see cref="NowPlayingCommand"/> to post the currently-playing beatmap to a parenting <see cref="IChannelPostTarget"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="target">The target channel to post to. If <c>null</c>, the currently-selected channel will be posted to.</param>
|
||||||
|
public NowPlayingCommand(Channel target = null)
|
||||||
|
{
|
||||||
|
this.target = target;
|
||||||
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
@ -48,7 +59,7 @@ namespace osu.Game.Online.Chat
|
|||||||
|
|
||||||
var beatmapString = beatmap.OnlineBeatmapID.HasValue ? $"[{api.WebsiteRootUrl}/b/{beatmap.OnlineBeatmapID} {beatmap}]" : beatmap.ToString();
|
var beatmapString = beatmap.OnlineBeatmapID.HasValue ? $"[{api.WebsiteRootUrl}/b/{beatmap.OnlineBeatmapID} {beatmap}]" : beatmap.ToString();
|
||||||
|
|
||||||
channelManager.PostMessage($"is {verb} {beatmapString}", true);
|
channelManager.PostMessage($"is {verb} {beatmapString}", true, target);
|
||||||
Expire();
|
Expire();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user