using CustomUI.BeatSaber; using CustomUI.Utilities; using IPA.Loader; using IPA.Loader.Features; using IPA.Old; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; namespace BSIPA_ModList.UI.ViewControllers { internal interface IClickableCell { void OnSelect(ModListController cntrl); } internal class BSIPAModCell : CustomCellInfo, IClickableCell { internal PluginLoader.PluginMetadata Plugin; private ModListController list; public BSIPAModCell(ModListController list, PluginLoader.PluginMetadata plugin) : base($"{plugin.Name} v{plugin.Version}", plugin.Manifest.Author, null) { Plugin = plugin; this.list = list; if (string.IsNullOrWhiteSpace(subtext)) subtext = "Unspecified Author"; icon = plugin.GetIcon(); } private ModInfoViewController infoView; public void OnSelect(ModListController cntrl) { Logger.log.Debug($"Selected BSIPAModCell {Plugin.Name} {Plugin.Version}"); if (infoView == null) { var desc = Plugin.Manifest.Description; if (string.IsNullOrWhiteSpace(desc)) desc = "No description"; infoView = BeatSaberUI.CreateViewController(); infoView.Init(icon, Plugin.Name, "v" + Plugin.Version.ToString(), subtext, desc, Plugin, Plugin.Manifest.Links); } list.flow.SetSelected(infoView, immediate: list.flow.HasSelected); } } internal class BSIPAIgnoredModCell : CustomCellInfo, IClickableCell { internal PluginLoader.PluginMetadata Plugin; private ModListController list; private const string authorFormat = "{0} - Not loaded"; private string authorText; public BSIPAIgnoredModCell(ModListController list, PluginLoader.PluginMetadata plugin) : base($"{plugin.Name} v{plugin.Version}", "", Utilities.DefaultBSIPAIcon) { Plugin = plugin; this.list = list; if (string.IsNullOrWhiteSpace(plugin.Manifest.Author)) authorText = "Unspecified Author"; else authorText = plugin.Manifest.Author; subtext = string.Format(authorFormat, authorText); } private ModInfoViewController infoView; public void OnSelect(ModListController cntrl) { Logger.log.Debug($"Selected BSIPAIgnoredModCell {Plugin.Name} {Plugin.Version}"); if (infoView == null) { var desc = Plugin.Manifest.Description; if (string.IsNullOrWhiteSpace(desc)) desc = "No description"; infoView = BeatSaberUI.CreateViewController(); infoView.Init(icon, Plugin.Name, "v" + Plugin.Version.ToString(), authorText, desc, Plugin, Plugin.Manifest.Links); } list.flow.SetSelected(infoView, immediate: list.flow.HasSelected); } } internal class LibraryModCell : CustomCellInfo, IClickableCell { internal PluginLoader.PluginMetadata Plugin; private ModListController list; public LibraryModCell(ModListController list, PluginLoader.PluginMetadata plugin) : base($"{plugin.Name} v{plugin.Version}", plugin.Manifest.Author, null) { Plugin = plugin; this.list = list; if (string.IsNullOrWhiteSpace(subtext)) subtext = "Unspecified Author"; icon = Utilities.DefaultLibraryIcon; } private ModInfoViewController infoView; public void OnSelect(ModListController cntrl) { Logger.log.Debug($"Selected LibraryModCell {Plugin.Name} {Plugin.Version}"); if (infoView == null) { var desc = Plugin.Manifest.Description; if (string.IsNullOrWhiteSpace(desc)) desc = "No description"; infoView = BeatSaberUI.CreateViewController(); infoView.Init(icon, Plugin.Name, "v" + Plugin.Version.ToString(), subtext, desc, Plugin, Plugin.Manifest.Links); } list.flow.SetSelected(infoView, immediate: list.flow.HasSelected); } } #pragma warning disable CS0618 internal class IPAModCell : CustomCellInfo, IClickableCell { internal IPlugin Plugin; private ModListController list; public IPAModCell(ModListController list, IPlugin plugin) : base($"{plugin.Name} {plugin.Version}", "Legacy", Utilities.DefaultIPAIcon) { Plugin = plugin; this.list = list; } private ModInfoViewController infoView; public void OnSelect(ModListController cntrl) { Logger.log.Debug($"Selected IPAModCell {Plugin.Name} {Plugin.Version}"); if (infoView == null) { PluginLoader.PluginMetadata updateInfo = null; try { updateInfo = new PluginLoader.PluginMetadata { Name = Plugin.Name, Id = Plugin.Name, Version = new SemVer.Version(Plugin.Version) }; } catch (Exception e) { Logger.log.Warn($"Could not generate fake update info for {Plugin.Name}"); Logger.log.Warn(e); } infoView = BeatSaberUI.CreateViewController(); infoView.Init(icon, Plugin.Name, "v" + Plugin.Version.ToString(), "Unknown Author", "This mod was written for IPA.\n===\n\n## No metadata is avaliable for this mod.\n\n" + "Please contact the mod author and ask them to port it to BSIPA to provide more information.", updateInfo); } list.flow.SetSelected(infoView, immediate: list.flow.HasSelected); } } #pragma warning restore }