mirror of
https://github.com/ppy/osu.git
synced 2025-02-16 18:32:56 +08:00
commit
1d4ffe1000
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
@ -85,6 +86,22 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
case JoinChannelRequest joinChannel:
|
case JoinChannelRequest joinChannel:
|
||||||
joinChannel.TriggerSuccess();
|
joinChannel.TriggerSuccess();
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case GetUserRequest getUser:
|
||||||
|
if (getUser.Lookup.Equals("some body", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
getUser.TriggerSuccess(new User
|
||||||
|
{
|
||||||
|
Username = "some body",
|
||||||
|
Id = 1,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
getUser.TriggerFailure(new Exception());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -322,6 +339,27 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
AddAssert("Current channel is channel 1", () => currentChannel == channel1);
|
AddAssert("Current channel is channel 1", () => currentChannel == channel1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestChatCommand()
|
||||||
|
{
|
||||||
|
AddStep("Join channel 1", () => channelManager.JoinChannel(channel1));
|
||||||
|
AddStep("Select channel 1", () => clickDrawable(chatOverlay.TabMap[channel1]));
|
||||||
|
|
||||||
|
AddStep("Open chat with user", () => channelManager.PostCommand("chat some body"));
|
||||||
|
AddAssert("PM channel is selected", () =>
|
||||||
|
channelManager.CurrentChannel.Value.Type == ChannelType.PM && channelManager.CurrentChannel.Value.Users.Single().Username == "some body");
|
||||||
|
|
||||||
|
AddStep("Open chat with non-existent user", () => channelManager.PostCommand("chat nobody"));
|
||||||
|
AddAssert("Last message is error", () => channelManager.CurrentChannel.Value.Messages.Last() is ErrorMessage);
|
||||||
|
|
||||||
|
// Make sure no unnecessary requests are made when the PM channel is already open.
|
||||||
|
AddStep("Select channel 1", () => clickDrawable(chatOverlay.TabMap[channel1]));
|
||||||
|
AddStep("Unregister request handling", () => ((DummyAPIAccess)API).HandleRequest = null);
|
||||||
|
AddStep("Open chat with user", () => channelManager.PostCommand("chat some body"));
|
||||||
|
AddAssert("PM channel is selected", () =>
|
||||||
|
channelManager.CurrentChannel.Value.Type == ChannelType.PM && channelManager.CurrentChannel.Value.Users.Single().Username == "some body");
|
||||||
|
}
|
||||||
|
|
||||||
private void pressChannelHotkey(int number)
|
private void pressChannelHotkey(int number)
|
||||||
{
|
{
|
||||||
var channelKey = Key.Number0 + number;
|
var channelKey = Key.Number0 + number;
|
||||||
|
@ -8,7 +8,7 @@ namespace osu.Game.Online.API.Requests
|
|||||||
{
|
{
|
||||||
public class GetUserRequest : APIRequest<User>
|
public class GetUserRequest : APIRequest<User>
|
||||||
{
|
{
|
||||||
private readonly string lookup;
|
public readonly string Lookup;
|
||||||
public readonly RulesetInfo Ruleset;
|
public readonly RulesetInfo Ruleset;
|
||||||
private readonly LookupType lookupType;
|
private readonly LookupType lookupType;
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ namespace osu.Game.Online.API.Requests
|
|||||||
/// <param name="ruleset">The ruleset to get the user's info for.</param>
|
/// <param name="ruleset">The ruleset to get the user's info for.</param>
|
||||||
public GetUserRequest(long? userId = null, RulesetInfo ruleset = null)
|
public GetUserRequest(long? userId = null, RulesetInfo ruleset = null)
|
||||||
{
|
{
|
||||||
lookup = userId.ToString();
|
Lookup = userId.ToString();
|
||||||
lookupType = LookupType.Id;
|
lookupType = LookupType.Id;
|
||||||
Ruleset = ruleset;
|
Ruleset = ruleset;
|
||||||
}
|
}
|
||||||
@ -38,12 +38,12 @@ namespace osu.Game.Online.API.Requests
|
|||||||
/// <param name="ruleset">The ruleset to get the user's info for.</param>
|
/// <param name="ruleset">The ruleset to get the user's info for.</param>
|
||||||
public GetUserRequest(string username = null, RulesetInfo ruleset = null)
|
public GetUserRequest(string username = null, RulesetInfo ruleset = null)
|
||||||
{
|
{
|
||||||
lookup = username;
|
Lookup = username;
|
||||||
lookupType = LookupType.Username;
|
lookupType = LookupType.Username;
|
||||||
Ruleset = ruleset;
|
Ruleset = ruleset;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string Target => lookup != null ? $@"users/{lookup}/{Ruleset?.ShortName}?k={lookupType.ToString().ToLower()}" : $@"me/{Ruleset?.ShortName}";
|
protected override string Target => Lookup != null ? $@"users/{Lookup}/{Ruleset?.ShortName}?key={lookupType.ToString().ToLower()}" : $@"me/{Ruleset?.ShortName}";
|
||||||
|
|
||||||
private enum LookupType
|
private enum LookupType
|
||||||
{
|
{
|
||||||
|
@ -256,8 +256,36 @@ namespace osu.Game.Online.Chat
|
|||||||
JoinChannel(channel);
|
JoinChannel(channel);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "chat":
|
||||||
|
case "msg":
|
||||||
|
case "query":
|
||||||
|
if (string.IsNullOrWhiteSpace(content))
|
||||||
|
{
|
||||||
|
target.AddNewMessages(new ErrorMessage($"Usage: /{command} [user]"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the user has joined the requested channel already.
|
||||||
|
// This uses the channel name for comparison as the PM user's username is unavailable after a restart.
|
||||||
|
var privateChannel = JoinedChannels.FirstOrDefault(
|
||||||
|
c => c.Type == ChannelType.PM && c.Users.Count == 1 && c.Name.Equals(content, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
if (privateChannel != null)
|
||||||
|
{
|
||||||
|
CurrentChannel.Value = privateChannel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var request = new GetUserRequest(content);
|
||||||
|
request.Success += OpenPrivateChannel;
|
||||||
|
request.Failure += e => target.AddNewMessages(
|
||||||
|
new ErrorMessage(e.InnerException?.Message == @"NotFound" ? $"User '{content}' was not found." : $"Could not fetch user '{content}'."));
|
||||||
|
|
||||||
|
api.Queue(request);
|
||||||
|
break;
|
||||||
|
|
||||||
case "help":
|
case "help":
|
||||||
target.AddNewMessages(new InfoMessage("Supported commands: /help, /me [action], /join [channel], /np"));
|
target.AddNewMessages(new InfoMessage("Supported commands: /help, /me [action], /join [channel], /chat [user], /np"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user