Playlist loading, saving and listing done
This commit is contained in:
		| @@ -356,6 +356,20 @@ namespace NadekoBot.Migrations | ||||
|                     b.ToTable("ModulePrefixes"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<string>("Author"); | ||||
|  | ||||
|                     b.Property<string>("Name"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.ToTable("MusicPlaylists"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
| @@ -397,6 +411,30 @@ namespace NadekoBot.Migrations | ||||
|                     b.ToTable("PlayingStatus"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("MusicPlaylistId"); | ||||
|  | ||||
|                     b.Property<string>("Provider"); | ||||
|  | ||||
|                     b.Property<int>("ProviderType"); | ||||
|  | ||||
|                     b.Property<string>("Query"); | ||||
|  | ||||
|                     b.Property<string>("Title"); | ||||
|  | ||||
|                     b.Property<string>("Uri"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("MusicPlaylistId"); | ||||
|  | ||||
|                     b.ToTable("PlaylistSong"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
| @@ -588,6 +626,13 @@ namespace NadekoBot.Migrations | ||||
|                         .HasForeignKey("BotConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.MusicPlaylist") | ||||
|                         .WithMany("Songs") | ||||
|                         .HasForeignKey("MusicPlaylistId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.BotConfig") | ||||
|   | ||||
| @@ -614,10 +614,11 @@ namespace NadekoBot.Modules.Administration | ||||
|         { | ||||
|             var channel = (ITextChannel)umsg.Channel; | ||||
|  | ||||
|             foreach (var ch in _client.GetGuilds().Select(async g => await g.GetDefaultChannelAsync().ConfigureAwait(false))) | ||||
|             { | ||||
|                 await channel.SendMessageAsync(message).ConfigureAwait(false); | ||||
|             } | ||||
|             var channels = await Task.WhenAll(_client.GetGuilds().Select(g => | ||||
|                 g.GetDefaultChannelAsync() | ||||
|             )).ConfigureAwait(false); | ||||
|  | ||||
|             await Task.WhenAll(channels.Select(c => c.SendMessageAsync($"`Message from {umsg.Author} (Bot Owner):` " + message))); | ||||
|  | ||||
|             await channel.SendMessageAsync(":ok:").ConfigureAwait(false); | ||||
|         } | ||||
|   | ||||
| @@ -84,7 +84,8 @@ Nadeko Support Server: https://discord.gg/0ehQwTK2RBjAxzEY"; | ||||
|             comToFind = comToFind?.ToLowerInvariant(); | ||||
|             if (string.IsNullOrWhiteSpace(comToFind)) | ||||
|             { | ||||
|                 await (await (umsg.Author as IGuildUser).CreateDMChannelAsync()).SendMessageAsync(HelpString).ConfigureAwait(false); | ||||
|                 IMessageChannel ch = channel is ITextChannel ? await ((IGuildUser)umsg.Author).CreateDMChannelAsync() : channel; | ||||
|                 await ch.SendMessageAsync(HelpString).ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|             var com = _commands.Commands.FirstOrDefault(c => c.Text.ToLowerInvariant() == comToFind || c.Aliases.Select(a=>a.ToLowerInvariant()).Contains(comToFind)); | ||||
|   | ||||
| @@ -252,7 +252,7 @@ namespace NadekoBot.Modules.Music.Classes | ||||
|                 playlist.Clear(); | ||||
|                 if (!SongCancelSource.IsCancellationRequested) | ||||
|                     SongCancelSource.Cancel(); | ||||
|                 await audioClient.DisconnectAsync(); | ||||
|               await audioClient.DisconnectAsync(); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -14,6 +14,7 @@ using System.Net.Http; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using System.Collections.Generic; | ||||
| using NadekoBot.Services.Database; | ||||
| using NadekoBot.Services.Database.Models; | ||||
|  | ||||
| namespace NadekoBot.Modules.Music | ||||
| { | ||||
| @@ -520,48 +521,95 @@ namespace NadekoBot.Modules.Music | ||||
|             await channel.SendMessageAsync($"🎵🔁`Repeat playlist {(currentValue ? "enabled" : "disabled")}`").ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task Save(IUserMessage umsg, [Remainder] string name) | ||||
|         //{ | ||||
|         //    var channel = (ITextChannel)umsg.Channel; | ||||
|         //    MusicPlayer musicPlayer; | ||||
|         //    if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) | ||||
|         //        return; | ||||
|         [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Save(IUserMessage umsg, [Remainder] string name) | ||||
|         { | ||||
|             var channel = (ITextChannel)umsg.Channel; | ||||
|             MusicPlayer musicPlayer; | ||||
|             if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) | ||||
|                 return; | ||||
|  | ||||
|         //    var curSong = musicPlayer.CurrentSong; | ||||
|         //    var items = musicPlayer.Playlist.Append(curSong); | ||||
|             var curSong = musicPlayer.CurrentSong; | ||||
|             var songs = musicPlayer.Playlist.Append(curSong) | ||||
|                                 .Select(s=> new PlaylistSong() { | ||||
|                                     Provider = s.SongInfo.Provider, | ||||
|                                     ProviderType = s.SongInfo.ProviderType, | ||||
|                                     Title = s.SongInfo.Title, | ||||
|                                     Uri = s.SongInfo.Uri, | ||||
|                                     Query = s.SongInfo.Query, | ||||
|                                 }).ToList(); | ||||
|  | ||||
|         //    MusicPlaylist playlist; | ||||
|         //    using (var uow = DbHandler.UnitOfWork()) | ||||
|         //    { | ||||
|         //        playlist = new MusicPlaylist | ||||
|         //        { | ||||
|         //            Name = name, | ||||
|         //            Songs = items.ToList() | ||||
|         //        }; | ||||
|         //        uow.MusicPlaylists.Add(playlist); | ||||
|         //    } | ||||
|             MusicPlaylist playlist; | ||||
|             using (var uow = DbHandler.UnitOfWork()) | ||||
|             { | ||||
|                 playlist = new MusicPlaylist | ||||
|                 { | ||||
|                     Name = name, | ||||
|                     Author = umsg.Author.Username, | ||||
|                     Songs = songs, | ||||
|                 }; | ||||
|                 uow.MusicPlaylists.Add(playlist); | ||||
|                 await uow.CompleteAsync().ConfigureAwait(false); | ||||
|             } | ||||
|  | ||||
|         //    await channel.SendMessageAsync($"Playlist saved as {name}, id: {playlist.Id}."); | ||||
|         //} | ||||
|             await channel.SendMessageAsync(($"🎵 `Saved playlist as {name}.` `Id: {playlist.Id}`")).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task Load(IUserMessage umsg, [Remainder] string name) | ||||
|         //{ | ||||
|         //    var channel = (ITextChannel)umsg.Channel; | ||||
|         [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Load(IUserMessage umsg, [Remainder] int id) | ||||
|         { | ||||
|             var channel = (ITextChannel)umsg.Channel; | ||||
|  | ||||
|         //} | ||||
|             MusicPlaylist mpl; | ||||
|             using (var uow = DbHandler.UnitOfWork()) | ||||
|             { | ||||
|                 mpl = uow.MusicPlaylists.GetWithSongs(id); | ||||
|             } | ||||
|  | ||||
|         //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task Playlists(IUserMessage umsg, [Remainder] string num) | ||||
|         //{ | ||||
|         //    var channel = (ITextChannel)umsg.Channel; | ||||
|             if (mpl == null) | ||||
|             { | ||||
|                 await channel.SendMessageAsync("Can't find playlist with that ID").ConfigureAwait(false); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|         //} | ||||
|             var msg = await channel.SendMessageAsync($"`Attempting to load {mpl.Songs.Count} songs...`").ConfigureAwait(false); | ||||
|             foreach (var item in mpl.Songs) | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     var usr = (IGuildUser)umsg.Author; | ||||
|                     await QueueSong(usr, channel, usr.VoiceChannel, item.Query, true, item.ProviderType).ConfigureAwait(false); | ||||
|                 } | ||||
|                 catch { break; } | ||||
|             } | ||||
|  | ||||
|             await msg.ModifyAsync(m => m.Content = $"`Done loading playlist {mpl.Name}.`").ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||
|         [RequireContext(ContextType.Guild)] | ||||
|         public async Task Playlists(IUserMessage umsg, [Remainder] int num = 1) | ||||
|         { | ||||
|             var channel = (ITextChannel)umsg.Channel; | ||||
|  | ||||
|             if (num <= 0) | ||||
|                 return; | ||||
|  | ||||
|             List<MusicPlaylist> playlists; | ||||
|  | ||||
|             using (var uow = DbHandler.UnitOfWork()) | ||||
|             { | ||||
|                 playlists = uow.MusicPlaylists.GetPlaylistsOnPage(num); | ||||
|             } | ||||
|  | ||||
|             await channel.SendMessageAsync($@"`Page {num} of saved playlists` | ||||
|  | ||||
| " + string.Join("\n", playlists.Select(r => $"`#{r.Id}` - `{r.Name}` by {r.Author} - **{r.Songs.Count}** songs"))).ConfigureAwait(false); | ||||
|         } | ||||
|  | ||||
|         //todo only author or owner | ||||
|         //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||
|         //[RequireContext(ContextType.Guild)] | ||||
|         //public async Task DeletePlaylist(IUserMessage umsg, [Remainder] string pl) | ||||
|   | ||||
| @@ -42,16 +42,20 @@ namespace NadekoBot | ||||
|  | ||||
|             _log.Info("Starting NadekoBot v" + typeof(NadekoBot).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion); | ||||
|  | ||||
|  | ||||
|             Credentials = new BotCredentials(); | ||||
|  | ||||
|             //create client | ||||
|             Client = new ShardedDiscordClient (new DiscordSocketConfig | ||||
|             { | ||||
|                 AudioMode = Discord.Audio.AudioMode.Outgoing, | ||||
|                 MessageCacheSize = 10, | ||||
|                 LogLevel = LogSeverity.Warning, | ||||
|                 TotalShards = Credentials.TotalShards, | ||||
|                 ConnectionTimeout = 60000 | ||||
|             }); | ||||
|  | ||||
|             //initialize Services | ||||
|             Credentials = new BotCredentials(); | ||||
|             CommandService = new CommandService(); | ||||
|             Localizer = new Localization(); | ||||
|             Google = new GoogleApiService(); | ||||
|   | ||||
| @@ -43,22 +43,27 @@ namespace NadekoBot.Services | ||||
|  | ||||
|             var throwaway = Task.Run(async () => | ||||
|             { | ||||
|                 var sw = new Stopwatch(); | ||||
|               var sw = new Stopwatch(); | ||||
|                 sw.Start(); | ||||
|  | ||||
|                 try | ||||
|                 { | ||||
|                     bool verbose; | ||||
|                     Permission rootPerm; | ||||
|                     string permRole; | ||||
|                     using (var uow = DbHandler.UnitOfWork()) | ||||
|                      | ||||
|                     bool verbose = false; | ||||
|                     Permission rootPerm = null; | ||||
|                     string permRole = ""; | ||||
|                     if (guild != null) | ||||
|                     { | ||||
|                         var config = uow.GuildConfigs.PermissionsFor(guild.Id); | ||||
|                         verbose = config.VerbosePermissions; | ||||
|                         rootPerm = config.RootPermission; | ||||
|                         permRole = config.PermissionRole.Trim().ToLowerInvariant(); | ||||
|                         using (var uow = DbHandler.UnitOfWork()) | ||||
|                         { | ||||
|                             var config = uow.GuildConfigs.PermissionsFor(guild.Id); | ||||
|                             verbose = config.VerbosePermissions; | ||||
|                             rootPerm = config.RootPermission; | ||||
|                             permRole = config.PermissionRole.Trim().ToLowerInvariant(); | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|  | ||||
|                     var t = await ExecuteCommand(usrMsg, usrMsg.Content, guild, usrMsg.Author, rootPerm, permRole, MultiMatchHandling.Best); | ||||
|                     var command = t.Item1; | ||||
|                     var result = t.Item2; | ||||
|   | ||||
| @@ -22,6 +22,7 @@ namespace NadekoBot.Services.Database | ||||
|         public DbSet<Currency> Currency { get; set; } | ||||
|         public DbSet<ConvertUnit> ConversionUnits { get; set; } | ||||
|         public DbSet<TypingArticle> TypingArticles { get; set; } | ||||
|         public DbSet<MusicPlaylist> MusicPlaylists { get; set; } | ||||
|  | ||||
|         //logging | ||||
|         public DbSet<LogSetting> LogSettings { get; set; } | ||||
|   | ||||
| @@ -38,12 +38,16 @@ namespace NadekoBot.Services.Database | ||||
|  | ||||
|         private ICurrencyRepository _currency; | ||||
|         public ICurrencyRepository Currency => _currency ?? (_currency = new CurrencyRepository(_context)); | ||||
|  | ||||
|         private IUnitConverterRepository _conUnits; | ||||
|         public IUnitConverterRepository ConverterUnits => _conUnits ?? (_conUnits = new UnitConverterRepository(_context)); | ||||
|  | ||||
|         private ITypingArticlesRepository _typingArticles; | ||||
|         public ITypingArticlesRepository TypingArticles => _typingArticles ?? (_typingArticles = new TypingArticlesRepository(_context)); | ||||
|  | ||||
|         private IMusicPlaylistRepository _musicPlaylists; | ||||
|         public IMusicPlaylistRepository MusicPlaylists => _musicPlaylists ?? (_musicPlaylists = new MusicPlaylistRepository(_context)); | ||||
|  | ||||
|         public UnitOfWork(NadekoContext context) | ||||
|         { | ||||
|             _context = context; | ||||
|   | ||||
| @@ -27,6 +27,7 @@ namespace NadekoBot.Services.Impl | ||||
|         public string SoundCloudClientId { get; } | ||||
|  | ||||
|         public DB Db { get; } | ||||
|         public int TotalShards { get; } | ||||
|  | ||||
|         public BotCredentials() | ||||
|         { | ||||
| @@ -40,6 +41,7 @@ namespace NadekoBot.Services.Impl | ||||
|                 GoogleApiKey = cm.GoogleApiKey; | ||||
|                 MashapeKey = cm.MashapeKey; | ||||
|                 OsuApiKey = cm.OsuApiKey; | ||||
|                 TotalShards = cm.TotalShards < 1 ? 1 : cm.TotalShards; | ||||
|                 SoundCloudClientId = cm.SoundCloudClientId; | ||||
|                 if (cm.Db == null) | ||||
|                     Db = new DB("sqlite", ""); | ||||
| @@ -60,6 +62,7 @@ namespace NadekoBot.Services.Impl | ||||
|             public string OsuApiKey { get; set; } | ||||
|             public string SoundCloudClientId { get; set; } | ||||
|             public DB Db { get; set; } | ||||
|             public int TotalShards { get; set; } = 1; | ||||
|         } | ||||
|  | ||||
|         private class DbModel | ||||
|   | ||||
		Reference in New Issue
	
	Block a user