void IPStalkCommand(CommandDetails command)
 {
     if (IPHistory == null)
     {
         IPHistory = new YAMLConfiguration(File.ReadAllText("data/iphistory.yml"));
     }
     if (command.Arguments.Count < 1)
     {
         return;
     }
     List<string> data = IPHistory.ReadStringList(getippath(command.Arguments[0]));
     if (data == null || data.Count == 0)
     {
         Chat(command.Channel.Name, command.Pinger + ColorGeneral + "Nope, nothing for " + getippath(command.Arguments[0]));
         return;
     }
     StringBuilder sb = new StringBuilder();
     foreach (string dat in data)
     {
         sb.Append(dat).Append(", ");
     }
     string dater = sb.ToString();
     dater = dater.Substring(0, dater.Length - 2);
     Chat(command.Channel.Name, command.Pinger + ColorGeneral + "I've seen that IP as: " + dater, 3);
 }
Esempio n. 2
0
 public IRCUser(string mask)
 {
     ParseMask(mask);
     string fileName = GetFileName();
     lock (SaveLock)
     {
         if (!AllConfigs.TryGetValue(fileName, out Settings))
         {
             try
             {
                 if (File.Exists(fileName))
                 {
                     Settings = new YAMLConfiguration(File.ReadAllText(fileName));
                     AllConfigs.Add(fileName, Settings);
                 }
                 else
                 {
                     Logger.Output(LogType.DEBUG, "Can't find settings for " + fileName);
                 }
             }
             catch (Exception ex)
             {
                 Logger.Output(LogType.ERROR, "Loading settings for " + fileName + "(" + mask + ") : " + ex.ToString());
             }
             if (Settings == null)
             {
                 Settings = new YAMLConfiguration("");
                 AllConfigs.Add(fileName, Settings);
             }
         }
     }
 }
        void IPStalkCommand(CommandDetails command)
        {
            if (IPHistory == null)
            {
                IPHistory = new YAMLConfiguration(File.ReadAllText("data/iphistory.yml"));
            }
            if (command.Arguments.Count < 1)
            {
                return;
            }
            List <string> data = IPHistory.ReadStringList(getippath(command.Arguments[0]));

            if (data == null || data.Count == 0)
            {
                Chat(command.Channel.Name, command.Pinger + ColorGeneral + "Nope, nothing for " + getippath(command.Arguments[0]));
                return;
            }
            StringBuilder sb = new StringBuilder();

            foreach (string dat in data)
            {
                sb.Append(dat).Append(", ");
            }
            string dater = sb.ToString();

            dater = dater.Substring(0, dater.Length - 2);
            Chat(command.Channel.Name, command.Pinger + ColorGeneral + "I've seen that IP as: " + dater, 3);
        }
        void SeenUser(string name, string ip, bool save = true)
        {
            if (ip.Contains('@'))
            {
                ip = ip.Substring(ip.IndexOf('@') + 1);
            }
            if (IPHistory == null)
            {
                if (File.Exists("data/iphistory.yml"))
                {
                    IPHistory = new YAMLConfiguration(File.ReadAllText("data/iphistory.yml"));
                }
                else
                {
                    IPHistory = new YAMLConfiguration("");
                }
            }
            List <string> paths    = new List <string>();
            string        basepath = getippath(ip);

            paths.Add(basepath);
            string[] split = basepath.Split('.');
            for (int i = 0; i < split.Length; i++)
            {
                StringBuilder sb = new StringBuilder();
                for (int x = 0; x < split.Length; x++)
                {
                    if (x == i)
                    {
                        sb.Append("____STAR____");
                    }
                    else
                    {
                        sb.Append(split[x]);
                    }
                    if (x + 1 < split.Length)
                    {
                        sb.Append('.');
                    }
                }
                paths.Add(sb.ToString());
            }
            foreach (string pathy in paths)
            {
                List <object> original = IPHistory.ReadList(pathy);
                if (original == null)
                {
                    original = new List <object>();
                }
                if (!original.Contains(name.ToLower()))
                {
                    original.Add(name.ToLower());
                    IPHistory.Set(pathy, original);
                    if (save)
                    {
                        saveSeenList();
                    }
                }
            }
        }
 void InitGitHub()
 {
     try
     {
         GitHub = new GitHubClient() { Bot = this, ClientToken = Configuration.ReadString("dircbot.github.token", "") };
         GitHubConfig = new YAMLConfiguration(File.ReadAllText("data/repositories.yml"));
         AnnounceGitChannels = new List<string>();
         foreach (string chan in BaseChannels)
         {
             if (Configuration.ReadString("dircbot.irc-servers." + ServerName + ".channels." + chan.Replace("#", "") + ".announce_github", "false").StartsWith("t"))
             {
                 Logger.Output(LogType.INFO, "Watching commits in channel: " + chan);
                 AnnounceGitChannels.Add("#" + chan);
             }
         }
         GitHub.FetchRateLimit();
         foreach (string author in GitHubConfig.GetKeys(null))
         {
             foreach (string repository in GitHubConfig.GetKeys(author))
             {
                 YAMLConfiguration repoConfig = GitHubConfig.GetConfigurationSection(author + "." + repository);
                 bool hasIssues = repoConfig.ReadString("has_issues", "false").StartsWith("t");
                 bool hasComments = repoConfig.ReadString("has_comments", "false").StartsWith("t");
                 bool hasPulls = repoConfig.ReadString("has_pulls", "false").StartsWith("t");
                 GitHub.WatchRepository(author + "/" + repository, hasIssues, hasComments, hasPulls);
                 Logger.Output(LogType.INFO, "Watching: " + author + "/" + repository);
             }
         }
         GitHub.StartWatching();
     }
     catch (Exception ex)
     {
         Logger.Output(LogType.ERROR, "Failed to initialize GitHubEngine: " + ex.ToString());
     }
 }
Esempio n. 6
0
        public IRCUser(string mask)
        {
            ParseMask(mask);
            string fileName = GetFileName();

            lock (SaveLock)
            {
                if (!AllConfigs.TryGetValue(fileName, out Settings))
                {
                    try
                    {
                        if (File.Exists(fileName))
                        {
                            Settings = new YAMLConfiguration(File.ReadAllText(fileName));
                            AllConfigs.Add(fileName, Settings);
                        }
                        else
                        {
                            Logger.Output(LogType.DEBUG, "Can't find settings for " + fileName);
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Output(LogType.ERROR, "Loading settings for " + fileName + "(" + mask + ") : " + ex.ToString());
                    }
                    if (Settings == null)
                    {
                        Settings = new YAMLConfiguration("");
                        AllConfigs.Add(fileName, Settings);
                    }
                }
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Global program entry point.
        /// </summary>
        static void Main(string[] args)
        {
            Console.WriteLine("Initializing!");
            Configuration = new YAMLConfiguration(GetConfig());
            List <Task> tasks = new List <Task>();

            DiscordBot = new dDiscordBot();
            Task.Factory.StartNew(() => DiscordBot.Init(Configuration));
            foreach (string server in Configuration.GetKeys("dircbot.irc-servers"))
            {
                Console.WriteLine("Preparing server: " + server);
                tasks.Add(Task.Factory.StartNew(() =>
                {
                    dIRCBot core = new dIRCBot();
                    lock (presentBotsLock)
                    {
                        PresentBots.Add(core);
                    }
                    core.ServerName = server;
                    core.Init();
                }));
            }
            while (tasks.Count > 0)
            {
                for (int i = 0; i < tasks.Count; i++)
                {
                    if (tasks[i].IsCompleted)
                    {
                        tasks.RemoveAt(i--);
                    }
                }
                Thread.Sleep(100);
            }
            Logger.Output(LogType.INFO, "Quitting cleanly.");
        }
Esempio n. 8
0
 public void Init(YAMLConfiguration conf)
 {
     try
     {
         Config = conf;
         string token = Config.ReadString("discord.token", null);
         if (token == null)
         {
             Logger.Output(LogType.INFO, "Discord bot not configured!");
             return;
         }
         Client = new DiscordClient();
         Client.MessageReceived += messageReceived;
         Client.ExecuteAndWait(async() => await Client.Connect(token, TokenType.Bot));
     }
     catch (Exception ex)
     {
         Logger.Output(LogType.ERROR, ex.ToString());
     }
 }
Esempio n. 9
0
 public void Init(YAMLConfiguration conf)
 {
     try
     {
         Config = conf;
         string token = Config.ReadString("discord.token", null);
         if (token == null)
         {
             Logger.Output(LogType.INFO, "Discord bot not configured!");
             return;
         }
         Client = new DiscordClient();
         Client.MessageReceived += messageReceived;
         Client.ExecuteAndWait(async () => await Client.Connect(token, TokenType.Bot));
     }
     catch (Exception ex)
     {
         Logger.Output(LogType.ERROR, ex.ToString());
     }
 }
 public List<string> dScriptCheck(string rawYAML)
 {
     string fixedYAML = CleandScript(rawYAML);
     List<string> warnings = new List<string>();
     YAMLConfiguration file;
     try
     {
         file = new YAMLConfiguration(fixedYAML);
     }
     catch (Exception ex)
     {
         Warn(warnings, WarnType.ERROR, "Failed to read YAML: " + ex.Message);
         return warnings;
     }
     List<string> scripts = file.GetKeys(null);
     for (int i = 0; i < scripts.Count; i++)
     {
         dScriptCheckScript(warnings, scripts[i], file.GetConfigurationSection(scripts[i]));
     }
     return warnings;
 }
Esempio n. 11
0
 void InitGitHub()
 {
     try
     {
         GitHub = new GitHubClient()
         {
             Bot = this, ClientToken = Configuration.ReadString("dircbot.github.token", "")
         };
         GitHubConfig        = new YAMLConfiguration(File.ReadAllText("data/repositories.yml"));
         AnnounceGitChannels = new List <string>();
         foreach (string chan in BaseChannels)
         {
             if (Configuration.ReadString("dircbot.irc-servers." + ServerName + ".channels." + chan.Replace("#", "") + ".announce_github", "false").StartsWith("t"))
             {
                 Logger.Output(LogType.INFO, "Watching commits in channel: " + chan);
                 AnnounceGitChannels.Add("#" + chan);
             }
         }
         GitHub.FetchRateLimit();
         foreach (string author in GitHubConfig.GetKeys(null))
         {
             foreach (string repository in GitHubConfig.GetKeys(author))
             {
                 YAMLConfiguration repoConfig = GitHubConfig.GetConfigurationSection(author + "." + repository);
                 bool hasIssues   = repoConfig.ReadString("has_issues", "false").StartsWith("t");
                 bool hasComments = repoConfig.ReadString("has_comments", "false").StartsWith("t");
                 bool hasPulls    = repoConfig.ReadString("has_pulls", "false").StartsWith("t");
                 GitHub.WatchRepository(author + "/" + repository, hasIssues, hasComments, hasPulls);
                 Logger.Output(LogType.INFO, "Watching: " + author + "/" + repository);
             }
         }
         GitHub.StartWatching();
     }
     catch (Exception ex)
     {
         Logger.Output(LogType.ERROR, "Failed to initialize GitHubEngine: " + ex.ToString());
     }
 }
        public List <string> dScriptCheck(string rawYAML)
        {
            string            fixedYAML = CleandScript(rawYAML);
            List <string>     warnings  = new List <string>();
            YAMLConfiguration file;

            try
            {
                file = new YAMLConfiguration(fixedYAML);
            }
            catch (Exception ex)
            {
                Warn(warnings, WarnType.ERROR, "Failed to read YAML: " + ex.Message);
                return(warnings);
            }
            List <string> scripts = file.GetKeys(null);

            for (int i = 0; i < scripts.Count; i++)
            {
                dScriptCheckScript(warnings, scripts[i], file.GetConfigurationSection(scripts[i]));
            }
            return(warnings);
        }
 void SeenUser(string name, string ip, bool save = true)
 {
     if (ip.Contains('@'))
     {
         ip = ip.Substring(ip.IndexOf('@') + 1);
     }
     if (IPHistory == null)
     {
         if (File.Exists("data/iphistory.yml"))
         {
             IPHistory = new YAMLConfiguration(File.ReadAllText("data/iphistory.yml"));
         }
         else
         {
             IPHistory = new YAMLConfiguration("");
         }
     }
     List<string> paths = new List<string>();
     string basepath = getippath(ip);
     paths.Add(basepath);
     string[] split = basepath.Split('.');
     for (int i = 0; i < split.Length; i++)
     {
         StringBuilder sb = new StringBuilder();
         for (int x = 0; x < split.Length; x++)
         {
             if (x == i)
             {
                 sb.Append("____STAR____");
             }
             else
             {
                 sb.Append(split[x]);
             }
             if (x + 1 < split.Length)
             {
                 sb.Append('.');
             }
         }
         paths.Add(sb.ToString());
     }
     foreach (string pathy in paths)
     {
         List<object> original = IPHistory.ReadList(pathy);
         if (original == null)
         {
             original = new List<object>();
         }
         if (!original.Contains(name.ToLower()))
         {
             original.Add(name.ToLower());
             IPHistory.Set(pathy, original);
             if (save)
             {
                 saveSeenList();
             }
         }
     }
 }
 public void dScriptCheckScript(List<String> warnings, string scriptname, YAMLConfiguration script)
 {
     string script_type = script.ReadString("type", null);
     if (string.IsNullOrEmpty(script_type))
     {
         Warn(warnings, WarnType.ERROR, "Missing script type for script '" + scriptname + "'! Ignoring contents.");
         return;
     }
     switch (script_type)
     {
         case "interact":
             if (!script.HasKey(null, "steps"))
             {
                 Warn(warnings, WarnType.ERROR, "Missing STEPS key for script '" + scriptname + "'!");
             }
             break;
         case "yaml data":
             // Note: Nothing required here
             break;
         case "entity":
             {
                 if (!script.HasKey(null, "entity_type"))
                 {
                     Warn(warnings, WarnType.MINOR, "Missing ENTITY_TYPE key for script '" + scriptname + "'!");
                 }
                 List<string> keys = script.GetKeys(null);
                 foreach (string key in keys)
                 {
                     if (key != "entity_type" && key != "type")
                     {
                         bool exists = false;
                         for (int i = 0; i < AllMeta.Mechanisms.Count; i++)
                         {
                             if (AllMeta.Mechanisms[i].Objectd.ToLower() == "dentity"
                                 && AllMeta.Mechanisms[i].Name.ToLower() == key)
                             {
                                 exists = true;
                                 break;
                             }
                         }
                         if (!exists)
                         {
                             Warn(warnings, WarnType.WARNING, "Unrecognized entity mechanism '" + key + "' for " + scriptname);
                         }
                     }
                 }
             }
             break;
         case "custom":
             // Note: Nothing required here
             // TODO: tags: and requirements: script checks
             break;
         case "assignment":
             if (!script.HasKey(null, "interact scripts"))
             {
                 Warn(warnings, WarnType.MINOR, "Missing INTERACT SCRIPTS key for script '" + scriptname + "'!");
             }
             if (!script.HasKey(null, "actions"))
             {
                 Warn(warnings, WarnType.MINOR, "Missing ACTIONS key for script '" + scriptname + "'!");
             }
             // TODO: all actions, validate
             break;
         case "task":
             {
                 if (!script.HasKey(null, "script"))
                 {
                     Warn(warnings, WarnType.ERROR, "Missing SCRIPT key for script '" + scriptname + "'!");
                 }
                 List<string> keys = script.GetKeys(null);
                 for (int i = 0; i < keys.Count; i++)
                 {
                     if (script.IsList(keys[i]))
                     {
                         List<object> scriptData = script.ReadList(keys[i]);
                         ReadScriptData(warnings, scriptData, scriptname + "." + keys[i], "");
                     }
                 }
             }
             break;
         case "procedure":
             {
                 if (!script.HasKey(null, "script"))
                 {
                     Warn(warnings, WarnType.ERROR, "Missing SCRIPT key for script '" + scriptname + "'!");
                 }
                 List<string> keys = script.GetKeys(null);
                 for (int i = 0; i < keys.Count; i++)
                 {
                     if (script.IsList(keys[i]))
                     {
                         List<object> scriptData = script.ReadList(keys[i]);
                         ReadScriptData(warnings, scriptData, scriptname + "." + keys[i], "");
                     }
                 }
             }
             break;
         case "world":
             {
                 if (!script.HasKey(null, "events"))
                 {
                     Warn(warnings, WarnType.ERROR, "Missing EVENTS key for script '" + scriptname + "'!");
                 }
                 List<string> keys = script.GetKeys(null);
                 for (int i = 0; i < keys.Count; i++)
                 {
                     if (script.IsList(keys[i]))
                     {
                         List<object> scriptData = script.ReadList(keys[i]);
                         ReadScriptData(warnings, scriptData, scriptname + "." + keys[i], "");
                     }
                 }
                 keys = script.GetKeys("events");
                 for (int i = 0; i < keys.Count; i++)
                 {
                     if (script.IsList("events." + keys[i]))
                     {
                         ValidateEvent(warnings, keys[i], scriptname + ".events");
                         List<object> scriptData = script.ReadList("events." + keys[i]);
                         ReadScriptData(warnings, scriptData, scriptname + ".events." + keys[i], "");
                     }
                     else
                     {
                         Warn(warnings, WarnType.ERROR, "Invalid EVENTS sub-key '" + keys[i] + "' for " + scriptname);
                     }
                 }
             }
             break;
         case "book":
             // TODO: Book required keys
             break;
         case "command":
             {
                 if (!script.HasKey(null, "script"))
                 {
                     Warn(warnings, WarnType.ERROR, "Missing SCRIPT key for script '" + scriptname + "'!");
                 }
                 // TODO: Command required keys
                 List<string> keys = script.GetKeys(null);
                 for (int i = 0; i < keys.Count; i++)
                 {
                     if (keys[i].ToLower() != "aliases" && script.IsList(keys[i]))
                     {
                         List<object> scriptData = script.ReadList(keys[i]);
                         ReadScriptData(warnings, scriptData, scriptname + "." + keys[i], "");
                     }
                 }
             }
             break;
         case "format":
             if (!script.HasKey(null, "format"))
             {
                 Warn(warnings, WarnType.ERROR, "Missing FORMAT key for script '" + scriptname + "'!");
             }
             // TODO: Validate format line
             break;
         case "inventory":
             // TODO: Inventory required keys
             break;
         case "item":
             if (!script.HasKey(null, "material"))
             {
                 Warn(warnings, WarnType.ERROR, "Missing MATERIAL key for script '" + scriptname + "'!");
             }
             // TODO: Validate inputs
             break;
         case "map":
             // TODO: Map required keys
             break;
         case "version":
             // TODO: Version required keys
             break;
         default:
             Warn(warnings, WarnType.ERROR, "Unknown script type '" + script_type + "' for script '" + scriptname + "'!");
             break;
     }
 }
        public void dScriptCheckScript(List <String> warnings, string scriptname, YAMLConfiguration script)
        {
            string script_type = script.ReadString("type", null);

            if (string.IsNullOrEmpty(script_type))
            {
                Warn(warnings, WarnType.ERROR, "Missing script type for script '" + scriptname + "'! Ignoring contents.");
                return;
            }
            switch (script_type)
            {
            case "interact":
                if (!script.HasKey(null, "steps"))
                {
                    Warn(warnings, WarnType.ERROR, "Missing STEPS key for script '" + scriptname + "'!");
                }
                break;

            case "yaml data":
                // Note: Nothing required here
                break;

            case "entity":
            {
                if (!script.HasKey(null, "entity_type"))
                {
                    Warn(warnings, WarnType.MINOR, "Missing ENTITY_TYPE key for script '" + scriptname + "'!");
                }
                List <string> keys = script.GetKeys(null);
                foreach (string key in keys)
                {
                    if (key != "entity_type" && key != "type")
                    {
                        bool exists = false;
                        for (int i = 0; i < AllMeta.Mechanisms.Count; i++)
                        {
                            if (AllMeta.Mechanisms[i].Objectd.ToLower() == "dentity" &&
                                AllMeta.Mechanisms[i].Name.ToLower() == key)
                            {
                                exists = true;
                                break;
                            }
                        }
                        if (!exists)
                        {
                            Warn(warnings, WarnType.WARNING, "Unrecognized entity mechanism '" + key + "' for " + scriptname);
                        }
                    }
                }
            }
            break;

            case "custom":
                // Note: Nothing required here
                // TODO: tags: and requirements: script checks
                break;

            case "assignment":
                if (!script.HasKey(null, "interact scripts"))
                {
                    Warn(warnings, WarnType.MINOR, "Missing INTERACT SCRIPTS key for script '" + scriptname + "'!");
                }
                if (!script.HasKey(null, "actions"))
                {
                    Warn(warnings, WarnType.MINOR, "Missing ACTIONS key for script '" + scriptname + "'!");
                }
                // TODO: all actions, validate
                break;

            case "task":
            {
                if (!script.HasKey(null, "script"))
                {
                    Warn(warnings, WarnType.ERROR, "Missing SCRIPT key for script '" + scriptname + "'!");
                }
                List <string> keys = script.GetKeys(null);
                for (int i = 0; i < keys.Count; i++)
                {
                    if (script.IsList(keys[i]))
                    {
                        List <object> scriptData = script.ReadList(keys[i]);
                        ReadScriptData(warnings, scriptData, scriptname + "." + keys[i], "");
                    }
                }
            }
            break;

            case "procedure":
            {
                if (!script.HasKey(null, "script"))
                {
                    Warn(warnings, WarnType.ERROR, "Missing SCRIPT key for script '" + scriptname + "'!");
                }
                List <string> keys = script.GetKeys(null);
                for (int i = 0; i < keys.Count; i++)
                {
                    if (script.IsList(keys[i]))
                    {
                        List <object> scriptData = script.ReadList(keys[i]);
                        ReadScriptData(warnings, scriptData, scriptname + "." + keys[i], "");
                    }
                }
            }
            break;

            case "world":
            {
                if (!script.HasKey(null, "events"))
                {
                    Warn(warnings, WarnType.ERROR, "Missing EVENTS key for script '" + scriptname + "'!");
                }
                List <string> keys = script.GetKeys(null);
                for (int i = 0; i < keys.Count; i++)
                {
                    if (script.IsList(keys[i]))
                    {
                        List <object> scriptData = script.ReadList(keys[i]);
                        ReadScriptData(warnings, scriptData, scriptname + "." + keys[i], "");
                    }
                }
                keys = script.GetKeys("events");
                for (int i = 0; i < keys.Count; i++)
                {
                    if (script.IsList("events." + keys[i]))
                    {
                        ValidateEvent(warnings, keys[i], scriptname + ".events");
                        List <object> scriptData = script.ReadList("events." + keys[i]);
                        ReadScriptData(warnings, scriptData, scriptname + ".events." + keys[i], "");
                    }
                    else
                    {
                        Warn(warnings, WarnType.ERROR, "Invalid EVENTS sub-key '" + keys[i] + "' for " + scriptname);
                    }
                }
            }
            break;

            case "book":
                // TODO: Book required keys
                break;

            case "command":
            {
                if (!script.HasKey(null, "script"))
                {
                    Warn(warnings, WarnType.ERROR, "Missing SCRIPT key for script '" + scriptname + "'!");
                }
                // TODO: Command required keys
                List <string> keys = script.GetKeys(null);
                for (int i = 0; i < keys.Count; i++)
                {
                    if (keys[i].ToLower() != "aliases" && script.IsList(keys[i]))
                    {
                        List <object> scriptData = script.ReadList(keys[i]);
                        ReadScriptData(warnings, scriptData, scriptname + "." + keys[i], "");
                    }
                }
            }
            break;

            case "format":
                if (!script.HasKey(null, "format"))
                {
                    Warn(warnings, WarnType.ERROR, "Missing FORMAT key for script '" + scriptname + "'!");
                }
                // TODO: Validate format line
                break;

            case "inventory":
                // TODO: Inventory required keys
                break;

            case "item":
                if (!script.HasKey(null, "material"))
                {
                    Warn(warnings, WarnType.ERROR, "Missing MATERIAL key for script '" + scriptname + "'!");
                }
                // TODO: Validate inputs
                break;

            case "map":
                // TODO: Map required keys
                break;

            case "version":
                // TODO: Version required keys
                break;

            default:
                Warn(warnings, WarnType.ERROR, "Unknown script type '" + script_type + "' for script '" + scriptname + "'!");
                break;
            }
        }
Esempio n. 16
0
 /// <summary>
 /// Global program entry point.
 /// </summary>
 static void Main(string[] args)
 {
     Console.WriteLine("Initializing!");
     Configuration = new YAMLConfiguration(GetConfig());
     List<Task> tasks = new List<Task>();
     DiscordBot = new dDiscordBot();
     Task.Factory.StartNew(() => DiscordBot.Init(Configuration));
     foreach (string server in Configuration.GetKeys("dircbot.irc-servers"))
     {
         Console.WriteLine("Preparing server: " + server);
         tasks.Add(Task.Factory.StartNew(() =>
         {
             dIRCBot core = new dIRCBot();
             lock (presentBotsLock)
             {
                 PresentBots.Add(core);
             }
             core.ServerName = server;
             core.Init();
         }));
     }
     while (tasks.Count > 0)
     {
         for (int i = 0; i < tasks.Count; i++)
         {
             if (tasks[i].IsCompleted)
             {
                 tasks.RemoveAt(i--);
             }
         }
         Thread.Sleep(100);
     }
     Logger.Output(LogType.INFO, "Quitting cleanly.");
 }