private void Stop() { var serverName = "Unknown"; if (ircClient != null) { serverName = ircClient.ServerName; ircClient.Disconnect(); ircClient.Quit(); ircClient.Dispose(); } Console.Out.WriteLine("Disconnected from '{0}'.", serverName); isRunning = false; }
static void Main(string[] args) { //RC-Channel-ID 30773965 //ChatRoom 1a1bd140-55b3-4a63-815c-077b094ffba1 try { ///Load bot configuration Config = new BotConfiguration(Storage = new WindowsStorage("FoxBot")); Channel = Config.GetBindable <string>(BotSetting.Channel); ChatBotChannel = Config.GetBindable <string>(BotSetting.BotChatRoom); ///Set log folder Logger.Storage = Storage.GetStorageForDirectory("logs"); ///Create if not exist Directory.CreateDirectory("./Modues"); ///Create client instance client = new IrcClient() { //Username = Nick, //AuthToken = ServerPass, }; ///Initialize command service commands = new CommandService(new CommandServiceConfig() { CaseSensitiveCommands = false, DefaultRunMode = RunMode.Sync, }); ///Create form instance Form = new DialogWindow(); ///------------------------------================= bool interrupt = false; ///Modules update thread. Please, use async func for long timed work in case not blocking other modules Thread updateThread = new Thread(() => { while (!interrupt) { ///update if (DateTimeOffset.Now > GetUserListTimout) { var req = new JsonWebRequest <ChatData>($"https://tmi.twitch.tv/group/user/{Channel.Value.Replace("#", "")}/chatters"); req.Finished += () => { DialogWindow.UpdateChattersList(req.ResponseObject); if (BotEntry.ChannelsChatters.ContainsKey(BotEntry.Channel)) { BotEntry.ChannelsChatters[BotEntry.Channel] = req.ResponseObject.chatters; } else { BotEntry.ChannelsChatters.Add(BotEntry.Channel, req.ResponseObject.chatters); } }; ///In case not block current thread req.PerformAsync(); GetUserListTimout = GetUserListTimout.AddMinutes(5); } OnTickActions?.Invoke(); Thread.Sleep(50); } }); ///Load dust data using (var file = new StreamReader(Storage.GetStream($"Dust/{BotEntry.Channel}#RedstoneData.json", FileAccess.ReadWrite))) { if (!file.EndOfStream) { BotEntry.RedstoneDust = JsonConvert.DeserializeObject <SortedDictionary <string, RedstoneData> >(file.ReadToEnd()); } if (BotEntry.RedstoneDust == null) { BotEntry.RedstoneDust = new SortedDictionary <string, RedstoneData> { } } ; } ///Start update thread updateThread.Start(); ///Load some configs in form Form.Load(Storage); services = new ServiceCollection() .AddSingleton(client) .AddSingleton(commands) .AddSingleton(Form) .BuildServiceProvider(); client.ChannelMessage += HandleMessage; client.OnConnect += Client_OnConnect; commands.AddModulesAsync(Assembly.GetEntryAssembly(), services); ///Try load all module in /Modules folder var dll = Directory.GetFiles(Directory.GetCurrentDirectory() + "\\Modues", "*.dll", SearchOption.TopDirectoryOnly); foreach (var it in dll) { try { Logger.Log($"Loading {it} module..."); commands.AddModulesAsync(Assembly.LoadFile(it), services); } catch { continue; } } ///Load items metadata foreach (var data in RedstoneDust) { data.Value.ReadJsonData(); } PostInit?.Invoke(); ///Run form Application.Run(Form); ///Save any config changes inside form Logger.Log($"Unloading form data..."); Form.Unload(Storage); ///Interrupt a thread interrupt = true; Thread.Sleep(1000); ///Unload all data and exit Logger.Log($"====================UNLOADING SERVICES====================="); OnExiting?.Invoke(); client.Disconnect(); ///Commands.CommandsService.Unload(Storage); Logger.Log($"=================UNLOADING SERVICES ENDED=================="); ///Prepare item metadata to unloading foreach (var data in RedstoneDust) { data.Value.PrepareJsonData(); } ///Unload dust data using (var file = new StreamWriter(Storage.GetStream($"Dust/{BotEntry.Channel}#RedstoneData.json", FileAccess.ReadWrite, FileMode.Truncate))) { file.Write(JsonConvert.SerializeObject(BotEntry.RedstoneDust, Formatting.Indented)); } Thread.Sleep(1000); } catch (Exception e) { Logger.GetLogger(LoggingTarget.Stacktrace).Add($"FATAL ERROR: {e.Message}. SEE STACKTRACE FOR DETAIL"); Logger.GetLogger(LoggingTarget.Stacktrace).Add(e.StackTrace); Thread.Sleep(50); foreach (var data in RedstoneDust) { data.Value.PrepareJsonData(); } using (var file = new StreamWriter(Storage.GetStream($"Dust/{BotEntry.Channel}#RedstoneData.json", FileAccess.ReadWrite, FileMode.Truncate))) { file.Write(JsonConvert.SerializeObject(BotEntry.RedstoneDust, Formatting.Indented)); } } }