2019-01-24 16:43:03 +08:00
// 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.
2018-04-13 17:19:50 +08:00
2020-02-02 17:03:51 +08:00
using System.Linq ;
2018-02-26 12:08:37 +08:00
using osu.Framework.Allocation ;
2022-12-30 20:17:59 +08:00
using osu.Framework.Extensions.ObjectExtensions ;
2018-02-26 01:11:47 +08:00
using osu.Framework.Graphics ;
using osu.Framework.Graphics.Containers ;
2020-01-30 17:29:35 +08:00
using osu.Framework.Graphics.Sprites ;
2018-02-26 01:11:47 +08:00
using osu.Game.Graphics ;
2018-02-26 03:06:55 +08:00
using osu.Game.Graphics.Containers ;
using osu.Game.Online.API ;
2018-02-26 01:11:47 +08:00
using osu.Game.Online.API.Requests ;
2018-06-08 10:41:54 +08:00
using osu.Game.Online.API.Requests.Responses ;
2018-02-26 03:06:55 +08:00
using osu.Game.Online.Chat ;
2018-12-14 18:51:27 +08:00
using osu.Game.Online.Leaderboards ;
2020-02-02 17:03:51 +08:00
using osu.Game.Rulesets ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
namespace osu.Game.Overlays.Profile.Sections.Recent
{
2020-01-30 02:01:40 +08:00
public partial class DrawableRecentActivity : CompositeDrawable
2018-02-26 01:11:47 +08:00
{
2020-01-30 15:54:58 +08:00
private const int font_size = 14 ;
2020-02-02 17:03:51 +08:00
[Resolved]
2022-12-30 20:17:59 +08:00
private IAPIProvider api { get ; set ; } = null ! ;
2020-02-02 17:03:51 +08:00
[Resolved]
2022-12-30 20:17:59 +08:00
private IRulesetStore rulesets { get ; set ; } = null ! ;
2018-04-13 17:19:50 +08:00
2018-06-08 10:41:54 +08:00
private readonly APIRecentActivity activity ;
2018-04-13 17:19:50 +08:00
2022-12-30 20:17:59 +08:00
private LinkFlowContainer content = null ! ;
2018-04-13 17:19:50 +08:00
2018-06-08 10:41:54 +08:00
public DrawableRecentActivity ( APIRecentActivity activity )
2018-02-26 01:11:47 +08:00
{
this . activity = activity ;
}
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
[BackgroundDependencyLoader]
2020-02-02 17:03:51 +08:00
private void load ( OverlayColourProvider colourProvider )
2018-02-26 01:11:47 +08:00
{
2020-01-30 02:01:40 +08:00
RelativeSizeAxes = Axes . X ;
AutoSizeAxes = Axes . Y ;
AddInternal ( new GridContainer
2018-02-26 01:11:47 +08:00
{
2018-02-26 03:06:55 +08:00
RelativeSizeAxes = Axes . X ,
2020-01-30 02:01:40 +08:00
AutoSizeAxes = Axes . Y ,
ColumnDimensions = new [ ]
{
2020-01-30 16:16:58 +08:00
new Dimension ( GridSizeMode . Absolute , size : 28 ) ,
2020-01-30 02:01:40 +08:00
new Dimension ( ) ,
new Dimension ( GridSizeMode . AutoSize )
} ,
RowDimensions = new [ ]
{
new Dimension ( GridSizeMode . AutoSize )
} ,
Content = new [ ]
{
new Drawable [ ]
{
new Container
{
RelativeSizeAxes = Axes . X ,
AutoSizeAxes = Axes . Y ,
Child = createIcon ( ) . With ( icon = >
{
icon . Anchor = Anchor . Centre ;
icon . Origin = Anchor . Centre ;
} )
} ,
2020-01-30 15:54:58 +08:00
content = new LinkFlowContainer ( t = > t . Font = OsuFont . GetFont ( size : font_size ) )
2020-01-30 02:01:40 +08:00
{
Anchor = Anchor . CentreLeft ,
Origin = Anchor . CentreLeft ,
AutoSizeAxes = Axes . Y ,
RelativeSizeAxes = Axes . X ,
} ,
new DrawableDate ( activity . CreatedAt )
{
Anchor = Anchor . CentreRight ,
Origin = Anchor . CentreRight ,
Colour = colourProvider . Foreground1 ,
2020-01-30 15:54:58 +08:00
Font = OsuFont . GetFont ( size : font_size ) ,
2020-01-30 02:01:40 +08:00
}
}
}
2018-02-26 01:11:47 +08:00
} ) ;
2018-04-13 17:19:50 +08:00
2020-01-30 17:29:35 +08:00
createMessage ( ) ;
2018-02-26 01:11:47 +08:00
}
2018-04-13 17:19:50 +08:00
2020-01-30 02:01:40 +08:00
private Drawable createIcon ( )
2018-02-26 01:11:47 +08:00
{
switch ( activity . Type )
{
case RecentActivityType . Rank :
2019-06-18 01:04:09 +08:00
return new UpdateableRank ( activity . ScoreRank )
2018-02-26 01:11:47 +08:00
{
2020-01-30 02:01:40 +08:00
RelativeSizeAxes = Axes . X ,
2020-01-30 16:16:58 +08:00
Height = 11 ,
2018-02-26 01:11:47 +08:00
FillMode = FillMode . Fit ,
2020-01-30 16:16:58 +08:00
Margin = new MarginPadding { Top = 2 }
2018-02-26 01:11:47 +08:00
} ;
2018-04-13 17:19:50 +08:00
2018-02-26 15:38:12 +08:00
case RecentActivityType . Achievement :
2019-11-29 15:19:57 +08:00
return new DelayedLoadWrapper ( new MedalIcon ( activity . Achievement . Slug )
{
2020-01-30 02:01:40 +08:00
Anchor = Anchor . Centre ,
Origin = Anchor . Centre ,
2019-11-29 15:19:57 +08:00
RelativeSizeAxes = Axes . Both ,
FillMode = FillMode . Fit ,
} )
2018-02-26 15:38:12 +08:00
{
2020-01-30 02:01:40 +08:00
RelativeSizeAxes = Axes . X ,
2020-01-30 16:16:58 +08:00
Width = 0.5f ,
Height = 18
2018-02-26 15:38:12 +08:00
} ;
2018-04-13 17:19:50 +08:00
2022-08-06 13:16:34 +08:00
default :
2022-08-07 00:29:24 +08:00
return new RecentActivityIcon ( activity )
2022-07-23 18:06:30 +08:00
{
RelativeSizeAxes = Axes . X ,
Height = 11 ,
FillMode = FillMode . Fit ,
Margin = new MarginPadding { Top = 2 , Vertical = 2 }
} ;
2018-02-26 01:11:47 +08:00
}
}
2018-04-13 17:19:50 +08:00
2020-01-30 17:29:35 +08:00
private void createMessage ( )
{
2018-02-26 01:11:47 +08:00
switch ( activity . Type )
{
case RecentActivityType . Achievement :
2020-01-30 17:29:35 +08:00
addUserLink ( ) ;
addText ( $" unlocked the \" { activity . Achievement . Name } \ " medal!" ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . BeatmapPlaycount :
2020-01-30 17:29:35 +08:00
addBeatmapLink ( ) ;
addText ( $" has been played {activity.Count} times!" ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 14:16:16 +08:00
case RecentActivityType . BeatmapsetApprove :
2020-01-30 17:29:35 +08:00
addBeatmapsetLink ( ) ;
addText ( $" has been {activity.Approval.ToString().ToLowerInvariant()}!" ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . BeatmapsetDelete :
2020-01-30 17:29:35 +08:00
addBeatmapsetLink ( ) ;
addText ( " has been deleted." ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . BeatmapsetRevive :
2020-01-30 17:29:35 +08:00
addBeatmapsetLink ( ) ;
addText ( " has been revived from eternal slumber by " ) ;
addUserLink ( ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . BeatmapsetUpdate :
2020-01-30 17:29:35 +08:00
addUserLink ( ) ;
addText ( " has updated the beatmap " ) ;
addBeatmapsetLink ( ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . BeatmapsetUpload :
2020-01-30 17:29:35 +08:00
addUserLink ( ) ;
addText ( " has submitted a new beatmap " ) ;
addBeatmapsetLink ( ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . Medal :
2018-02-26 15:38:12 +08:00
// apparently this shouldn't exist look at achievement instead (https://github.com/ppy/osu-web/blob/master/resources/assets/coffee/react/profile-page/recent-activity.coffee#L111)
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . Rank :
2020-01-30 17:29:35 +08:00
addUserLink ( ) ;
addText ( $" achieved rank #{activity.Rank} on " ) ;
addBeatmapLink ( ) ;
2020-02-02 17:03:51 +08:00
addText ( $" ({getRulesetName()})" ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . RankLost :
2020-01-30 17:29:35 +08:00
addUserLink ( ) ;
addText ( " has lost first place on " ) ;
addBeatmapLink ( ) ;
2020-02-02 17:03:51 +08:00
addText ( $" ({getRulesetName()})" ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . UserSupportAgain :
2020-01-30 17:29:35 +08:00
addUserLink ( ) ;
addText ( " has once again chosen to support osu! - thanks for your generosity!" ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . UserSupportFirst :
2020-01-30 17:29:35 +08:00
addUserLink ( ) ;
addText ( " has become an osu!supporter - thanks for your generosity!" ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 01:11:47 +08:00
case RecentActivityType . UserSupportGift :
2020-01-30 17:29:35 +08:00
addUserLink ( ) ;
addText ( " has received the gift of osu!supporter!" ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-04-13 17:19:50 +08:00
2018-02-26 14:16:16 +08:00
case RecentActivityType . UsernameChange :
2020-01-30 17:29:35 +08:00
addText ( $"{activity.User?.PreviousUsername} has changed their username to " ) ;
addUserLink ( ) ;
2018-03-04 02:31:47 +08:00
break ;
2018-02-26 01:11:47 +08:00
}
}
2020-02-03 11:46:11 +08:00
private string getRulesetName ( ) = >
rulesets . AvailableRulesets . FirstOrDefault ( r = > r . ShortName = = activity . Mode ) ? . Name ? ? activity . Mode ;
private void addUserLink ( )
2022-12-30 20:17:59 +08:00
= > content . AddLink ( activity . User . AsNonNull ( ) . Username , LinkAction . OpenUserProfile , getLinkArgument ( activity . User . AsNonNull ( ) . Url ) , creationParameters : t = > t . Font = getLinkFont ( FontWeight . Bold ) ) ;
2020-02-03 11:46:11 +08:00
private void addBeatmapLink ( )
2022-12-30 20:17:59 +08:00
= > content . AddLink ( activity . Beatmap . AsNonNull ( ) . Title , LinkAction . OpenBeatmap , getLinkArgument ( activity . Beatmap . AsNonNull ( ) . Url ) , creationParameters : t = > t . Font = getLinkFont ( ) ) ;
2020-02-03 11:46:11 +08:00
private void addBeatmapsetLink ( )
2022-12-30 20:17:59 +08:00
= > content . AddLink ( activity . Beatmapset . AsNonNull ( ) . Title , LinkAction . OpenBeatmapSet , getLinkArgument ( activity . Beatmapset . AsNonNull ( ) . Url ) , creationParameters : t = > t . Font = getLinkFont ( ) ) ;
2020-02-03 11:46:11 +08:00
2023-06-24 23:11:34 +08:00
private object getLinkArgument ( string url ) = > MessageFormatter . GetLinkDetails ( $"{api.WebsiteRootUrl}{url}" ) . Argument . AsNonNull ( ) ;
2020-02-03 11:46:11 +08:00
private FontUsage getLinkFont ( FontWeight fontWeight = FontWeight . Regular )
= > OsuFont . GetFont ( size : font_size , weight : fontWeight , italics : true ) ;
private void addText ( string text )
= > content . AddText ( text , t = > t . Font = OsuFont . GetFont ( size : font_size , weight : FontWeight . SemiBold ) ) ;
2018-02-26 01:11:47 +08:00
}
}