public async Task fmAsync(string user = null) { User userSettings = await _userService.GetUserSettingsAsync(Context.User); if (userSettings?.UserNameLastFM == null) { await UsernameNotSetErrorResponseAsync(); return; } if (user == "help") { await ReplyAsync( "Usage: `.fm 'lastfm username/discord user'` \n" + "You can set your default user and your display mode through the `.fmset 'username' 'embedfull/embedmini/textfull/textmini'` command."); this._logger.LogCommandUsed(Context.Guild?.Id, Context.Channel.Id, Context.User.Id, Context.Message.Content); return; } try { string lastFMUserName = userSettings.UserNameLastFM; bool self = true; if (user != null) { if (await _lastFmService.LastFMUserExistsAsync(user)) { lastFMUserName = user; self = false; } else if (!_guildService.CheckIfDM(Context)) { IGuildUser guildUser = await _guildService.FindUserFromGuildAsync(Context, user); if (guildUser != null) { User guildUserLastFM = await _userService.GetUserSettingsAsync(guildUser); if (guildUserLastFM?.UserNameLastFM != null) { lastFMUserName = guildUserLastFM.UserNameLastFM; self = false; } } } } PageResponse <LastTrack> tracks = await _lastFmService.GetRecentScrobblesAsync(lastFMUserName); if (tracks?.Any() != true) { await NoScrobblesErrorResponseFoundAsync(); return; } LastResponse <LastUser> userinfo = await _lastFmService.GetUserInfoAsync(lastFMUserName); LastTrack currentTrack = tracks.Content[0]; LastTrack lastTrack = tracks.Content[1]; const string nullText = "[undefined]"; string trackName = currentTrack.Name; string artistName = currentTrack.ArtistName; string albumName = string.IsNullOrWhiteSpace(currentTrack.AlbumName) ? nullText : currentTrack.AlbumName; string lastTrackName = lastTrack.Name; string lastTrackArtistName = lastTrack.ArtistName; string lastTrackAlbumName = string.IsNullOrWhiteSpace(lastTrack.AlbumName) ? nullText : lastTrack.AlbumName; int playCount = userinfo.Content.Playcount; switch (userSettings.ChartType) { case ChartType.textmini: await Context.Channel.SendMessageAsync(await _userService.GetUserTitleAsync(Context) + "\n**Current** - " + artistName + " - " + trackName + " [" + albumName + "]\n<https://www.last.fm/user/" + userSettings.UserNameLastFM + ">\n" + userSettings.UserNameLastFM + "'s total scrobbles: " + playCount.ToString("N0")); break; case ChartType.textfull: await Context.Channel.SendMessageAsync(await _userService.GetUserTitleAsync(Context) + "\n**Current** - " + artistName + " - " + trackName + " [" + albumName + "]\n**Previous** - " + lastTrackArtistName + " - " + lastTrackName + " [" + lastTrackAlbumName + "]\n<https://www.last.fm/user/" + userSettings.UserNameLastFM + ">\n" + userSettings.UserNameLastFM + "'s total scrobbles: " + playCount.ToString("N0")); break; default: if (!_guildService.CheckIfDM(Context)) { GuildPermissions perms = await _guildService.CheckSufficientPermissionsAsync(Context); if (!perms.EmbedLinks) { await ReplyAsync("Insufficient permissions, I need to the 'Embed links' permission to show you your scrobbles."); break; } } var userTitle = await _userService.GetUserTitleAsync(Context); this._embed.AddField( $"Current: {tracks.Content[0].Name}", $"By **{tracks.Content[0].ArtistName}**" + (string.IsNullOrEmpty(tracks.Content[0].AlbumName) ? "" : $" | {tracks.Content[0].AlbumName}")); if (userSettings.ChartType == ChartType.embedfull) { this._embedAuthor.WithName("Last tracks for " + userTitle); this._embed.AddField( $"Previous: {tracks.Content[1].Name}", $"By **{tracks.Content[1].ArtistName}**" + (string.IsNullOrEmpty(tracks.Content[1].AlbumName) ? "" : $" | {tracks.Content[1].AlbumName}")); } else { this._embedAuthor.WithName("Last track for " + userTitle); } this._embed.WithTitle(tracks.Content[0].IsNowPlaying == true ? "*Now playing*" : $"Last scrobble {tracks.Content[0].TimePlayed?.ToString("g")}"); this._embedAuthor.WithIconUrl(Context.User.GetAvatarUrl()); this._embed.WithAuthor(this._embedAuthor); this._embed.WithUrl("https://www.last.fm/user/" + lastFMUserName); LastImageSet AlbumImages = await _lastFmService.GetAlbumImagesAsync(currentTrack.ArtistName, currentTrack.AlbumName); if (AlbumImages?.Medium != null) { this._embed.WithThumbnailUrl(AlbumImages.Medium.ToString()); } this._embedFooter.WithText($"{userinfo.Content.Name} has {userinfo.Content.Playcount} scrobbles."); this._embed.WithFooter(this._embedFooter); this._embed.WithColor(Constants.LastFMColorRed); await ReplyAsync("", false, this._embed.Build()); break; } this._logger.LogCommandUsed(Context.Guild?.Id, Context.Channel.Id, Context.User.Id, Context.Message.Content); } catch (Exception e) { _logger.LogError(e.Message, Context.Message.Content, Context.User.Username, Context.Guild?.Name, Context.Guild?.Id); await ReplyAsync("Unable to show Last.FM info due to an internal error. Try scrobbling something then use the command again."); } }