1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-22 09:27:34 +08:00

Create an abstraction for APIMessagesRequest

This commit is contained in:
miterosan 2018-04-14 13:23:16 +02:00
parent a9f3885d28
commit 1b51da70af
4 changed files with 65 additions and 49 deletions

View File

@ -0,0 +1,28 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.Collections.Generic;
using osu.Framework.IO.Network;
using osu.Game.Online.Chat;
namespace osu.Game.Online.API
{
public abstract class APIMessagesRequest : APIRequest<List<Message>>
{
private long? sinceId;
protected APIMessagesRequest(long? sinceId)
{
this.sinceId = sinceId;
}
protected override WebRequest CreateWebRequest()
{
var req = base.CreateWebRequest();
if (sinceId.HasValue) req.AddParameter(@"since", sinceId.Value.ToString());
return req;
}
}
}

View File

@ -9,12 +9,11 @@ using osu.Game.Online.Chat;
namespace osu.Game.Online.API.Requests
{
public class GetMessagesRequest : APIRequest<List<Message>>
public class GetMessagesRequest : APIMessagesRequest
{
private readonly IEnumerable<Channel> channels;
private long? since;
public GetMessagesRequest(IEnumerable<Channel> channels, long? sinceId)
public GetMessagesRequest(IEnumerable<Channel> channels, long? sinceId) : base(sinceId)
{
if (channels == null)
throw new ArgumentNullException(nameof(channels));
@ -22,7 +21,6 @@ namespace osu.Game.Online.API.Requests
throw new ArgumentException("All channels in the argument channels must have the targettype Channel");
this.channels = channels;
since = sinceId;
}
protected override WebRequest CreateWebRequest()
@ -31,7 +29,6 @@ namespace osu.Game.Online.API.Requests
var req = base.CreateWebRequest();
req.AddParameter(@"channels", channelString);
if (since.HasValue) req.AddParameter(@"since", since.Value.ToString());
return req;
}

View File

@ -1,28 +1,15 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.Collections.Generic;
using osu.Framework.IO.Network;
using osu.Game.Online.Chat;
namespace osu.Game.Online.API.Requests
{
public class GetPrivateMessagesRequest : APIRequest<List<Message>>
public class GetPrivateMessagesRequest : APIMessagesRequest
{
private long? since;
public GetPrivateMessagesRequest(long? sinceId = null)
: base(sinceId)
{
since = sinceId;
}
protected override WebRequest CreateWebRequest()
{
var request = base.CreateWebRequest();
if (since.HasValue)
request.AddParameter(@"since", since.Value.ToString());
return request;
}
protected override string Target => @"chat/messages/private";

View File

@ -152,25 +152,46 @@ namespace osu.Game.Online.Chat
private void fetchNewMessages()
{
if (fetchMsgReq == null)
fetchNewChannelMessages();
fetchMessages(
() => new GetMessagesRequest(JoinedChannels.Where(c => c.Target == TargetType.Channel), lastChannelMsgId),
messages =>
{
if (messages == null)
return;
handleChannelMessages(messages);
lastChannelMsgId = messages.LastOrDefault()?.Id ?? lastChannelMsgId;
fetchMsgReq = null;
}
);
if (fetchPrivateMsgReq == null)
fetchNewUserMessages();
fetchMessages(
() => new GetPrivateMessagesRequest(lastChannelMsgId),
messages =>
{
if (messages == null)
return;
handleUserMessages(messages);
lastUserMsgId = messages.LastOrDefault()?.Id ?? lastUserMsgId;
fetchPrivateMsgReq = null;
}
);
}
private void fetchNewUserMessages()
private void fetchMessages(Func<APIMessagesRequest> messagesRequest, Action<List<Message>> handler)
{
fetchPrivateMsgReq = new GetPrivateMessagesRequest(lastUserMsgId);
if (messagesRequest == null)
throw new ArgumentNullException(nameof(messagesRequest));
if (handler == null)
throw new ArgumentNullException(nameof(handler));
fetchPrivateMsgReq.Success += messages =>
{
handleUserMessages(messages);
lastUserMsgId = messages.LastOrDefault()?.Id ?? lastUserMsgId;
fetchPrivateMsgReq = null;
};
fetchPrivateMsgReq.Failure += exception => Logger.Error(exception, "Fetching user messages failed.");
var messagesReq = messagesRequest.Invoke();
api.Queue(fetchPrivateMsgReq);
messagesReq.Success += handler.Invoke;
messagesReq.Failure += exception => Logger.Error(exception, "Fetching messages failed.");
api.Queue(messagesReq);
}
private void handleUserMessages(IEnumerable<Message> messages)
@ -218,23 +239,6 @@ namespace osu.Game.Online.Chat
}
}
private void fetchNewChannelMessages()
{
fetchMsgReq = new GetMessagesRequest(JoinedChannels.Where(c => c.Target == TargetType.Channel), lastChannelMsgId);
fetchMsgReq.Success += messages =>
{
if (messages == null)
return;
handleChannelMessages(messages);
lastChannelMsgId = messages.LastOrDefault()?.Id ?? lastChannelMsgId;
fetchMsgReq = null;
};
fetchMsgReq.Failure += exception => Logger.Error(exception, "Fetching channel messages failed.");
api.Queue(fetchMsgReq);
}
private void handleChannelMessages(IEnumerable<Message> messages)
{
var channels = JoinedChannels.ToList();