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

View File

@ -1,28 +1,15 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>. // Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE // 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 namespace osu.Game.Online.API.Requests
{ {
public class GetPrivateMessagesRequest : APIRequest<List<Message>> public class GetPrivateMessagesRequest : APIMessagesRequest
{ {
private long? since; private long? since;
public GetPrivateMessagesRequest(long? sinceId = null) 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"; protected override string Target => @"chat/messages/private";

View File

@ -152,25 +152,46 @@ namespace osu.Game.Online.Chat
private void fetchNewMessages() private void fetchNewMessages()
{ {
if (fetchMsgReq == null) 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) 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 => var messagesReq = messagesRequest.Invoke();
{
handleUserMessages(messages);
lastUserMsgId = messages.LastOrDefault()?.Id ?? lastUserMsgId;
fetchPrivateMsgReq = null;
};
fetchPrivateMsgReq.Failure += exception => Logger.Error(exception, "Fetching user messages failed.");
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) 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) private void handleChannelMessages(IEnumerable<Message> messages)
{ {
var channels = JoinedChannels.ToList(); var channels = JoinedChannels.ToList();