using Discord.WebSocket; using Kerobot.Services; using Npgsql; using System.Collections.Generic; using System.Threading.Tasks; namespace Kerobot { /// /// Kerobot main class, and the most accessible and useful class in the whole program. /// Provides an interface for any part of the program to call into all existing services. /// public partial class Kerobot { /// /// Gets application instance configuration. /// internal InstanceConfig Config { get; } /// /// Gets the Discord client instance. /// public DiscordSocketClient DiscordClient { get; } /// /// Gets all loaded services in an iterable form. /// internal IReadOnlyCollection Services { get; } /// /// Gets all loaded modules in an iterable form. /// internal IReadOnlyCollection Modules { get; } internal Kerobot(InstanceConfig conf, DiscordSocketClient client) { Config = conf; DiscordClient = client; // Get all services started up Services = InitializeServices(); // Load externally defined functionality Modules = ModuleLoader.Load(Config, this); // Everything's ready to go. Print the welcome message here. var ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; InstanceLogAsync(false, "Kerobot", $"This is Kerobot v{ver.ToString(3)}. https://github.com/Noikoio/Kerobot").Wait(); } private IReadOnlyCollection InitializeServices() { var svcList = new List(); // Put services here as they become usable. _svcLogging = new Services.Logging.LoggingService(this); svcList.Add(_svcLogging); _svcGuildState = new Services.GuildState.GuildStateService(this); svcList.Add(_svcGuildState); _svcCommonFunctions = new Services.CommonFunctions.CommonFunctionsService(this); return svcList.AsReadOnly(); } /// /// Returns an open NpgsqlConnection instance. /// /// /// If manipulating guild-specific information, this parameter sets the database connection's search path. /// internal async Task GetOpenNpgsqlConnectionAsync(ulong? guild) { string cs = Config.PostgresConnString; if (guild.HasValue) cs += ";searchpath=guild_" + guild.Value; var db = new NpgsqlConnection(cs); await db.OpenAsync(); return db; } } }