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."); } }
public TimerService(DiscordShardedClient client, Logger logger) { _logger = logger; _timer = new Timer(async _ => { string LastFMName = await userService.GetRandomLastFMUserAsync().ConfigureAwait(false); if (LastFMName != null) { Random random = new Random(); int randavmode = random.Next(1, 4); string randmodestring = ""; if (randavmode == 1) { randmodestring = "1 - Recent Listens"; } else if (randavmode == 2) { randmodestring = "2 - Weekly Albums"; } else if (randavmode == 3) { randmodestring = "3 - Overall Albums"; } else if (randavmode == 4) { randmodestring = "4 - Default Avatar"; } _logger.Log("Changing avatar to mode " + randmodestring); string nulltext = ""; try { if (randavmode == 1) { PageResponse <LastTrack> tracks = await lastFMService.GetRecentScrobblesAsync(LastFMName).ConfigureAwait(false); LastTrack currentTrack = tracks.Content[0]; string TrackName = string.IsNullOrWhiteSpace(currentTrack.Name) ? nulltext : currentTrack.Name; string ArtistName = string.IsNullOrWhiteSpace(currentTrack.ArtistName) ? nulltext : currentTrack.ArtistName; string AlbumName = string.IsNullOrWhiteSpace(currentTrack.AlbumName) ? nulltext : currentTrack.AlbumName; LastImageSet AlbumImages = null; if (GlobalVars.CensoredAlbums.Contains(new KeyValuePair <string, string>(ArtistName, AlbumName))) { // use the censored cover. try { UseLocalAvatar(client, AlbumName, ArtistName, LastFMName); return; } catch (Exception) { UseDefaultAvatar(client); } } else { AlbumImages = await lastFMService.GetAlbumImagesAsync(ArtistName, AlbumName).ConfigureAwait(false); trackString = ArtistName + " - " + AlbumName + Environment.NewLine + LastFMName; _logger.Log("Changed avatar to: " + trackString); if (AlbumImages?.Large != null) { ChangeToNewAvatar(client, AlbumImages.Large.AbsoluteUri); } } } else if (randavmode == 2) { PageResponse <LastAlbum> albums = await lastFMService.GetTopAlbumsAsync(LastFMName, LastStatsTimeSpan.Week, 1).ConfigureAwait(false); LastAlbum currentAlbum = albums.Content[random.Next(albums.Count())]; string ArtistName = string.IsNullOrWhiteSpace(currentAlbum.ArtistName) ? nulltext : currentAlbum.ArtistName; string AlbumName = string.IsNullOrWhiteSpace(currentAlbum.Name) ? nulltext : currentAlbum.Name; LastImageSet AlbumImages = null; if (GlobalVars.CensoredAlbums.Contains(new KeyValuePair <string, string>(ArtistName, AlbumName))) { // use the censored cover. try { UseLocalAvatar(client, AlbumName, ArtistName, LastFMName); return; } catch (Exception) { UseDefaultAvatar(client); } } else { AlbumImages = await lastFMService.GetAlbumImagesAsync(ArtistName, AlbumName).ConfigureAwait(false); trackString = ArtistName + " - " + AlbumName + Environment.NewLine + LastFMName; _logger.Log("Changed avatar to: " + trackString); if (AlbumImages?.Large != null) { ChangeToNewAvatar(client, AlbumImages.Large.AbsoluteUri); } } } else if (randavmode == 3) { PageResponse <LastAlbum> albums = await lastFMService.GetTopAlbumsAsync(LastFMName, LastStatsTimeSpan.Overall, 1).ConfigureAwait(false); LastAlbum currentAlbum = albums.Content[random.Next(albums.Count())]; string ArtistName = string.IsNullOrWhiteSpace(currentAlbum.ArtistName) ? nulltext : currentAlbum.ArtistName; string AlbumName = string.IsNullOrWhiteSpace(currentAlbum.Name) ? nulltext : currentAlbum.Name; LastImageSet AlbumImages = null; if (GlobalVars.CensoredAlbums.Contains(new KeyValuePair <string, string>(ArtistName, AlbumName))) { // use the censored cover. try { UseLocalAvatar(client, AlbumName, ArtistName, LastFMName); } catch (Exception) { UseDefaultAvatar(client); } } else { AlbumImages = await lastFMService.GetAlbumImagesAsync(ArtistName, AlbumName).ConfigureAwait(false); trackString = ArtistName + " - " + AlbumName + Environment.NewLine + LastFMName; _logger.Log("Changed avatar to: " + trackString); if (AlbumImages?.Large != null) { ChangeToNewAvatar(client, AlbumImages.Large.AbsoluteUri); } } } else if (randavmode == 4) { UseDefaultAvatar(client); } } catch (Exception e) { _logger.LogException("ChangeFeaturedAvatar", e); } } }, null, TimeSpan.FromSeconds(Convert.ToDouble(ConfigData.Data.TimerInit)), // 4) Time that message should fire after the timer is created TimeSpan.FromMinutes(Convert.ToDouble(ConfigData.Data.TimerRepeat))); // 5) Time after which message should repeat (use `Timeout.Infinite` for no repeat) timerEnabled = true; }