public async Task IntentionalShutdown() { if (Context.Message.Author.Id == ulong.Parse(Program.Instance.GetSetting("OWNER_ID"))) { if (!Program.Instance.serverUp) { Program.Instance.downIntentionally = true; if (Program.Instance.Client.GetChannel(ulong.Parse(Program.Instance.GetSetting("CHANNEL_ID"))) != null) { SocketTextChannel channel = (SocketTextChannel)Program.Instance.Client.GetChannel(ulong.Parse(Program.Instance.GetSetting("CHANNEL_ID"))); if (await channel.GetMessageAsync(ulong.Parse(Program.Instance.GetSetting("MESSAGE_ID"))) != null) { RestUserMessage message = (RestUserMessage)await channel.GetMessageAsync(ulong.Parse(Program.Instance.GetSetting("MESSAGE_ID"))); await message.ModifyAsync(msg => msg.Embed = EmbedMaker.PlayerListOffline(Color.Red, Program.Instance.Client, true, Program.Instance.GetSetting("SERVER_NAME"))); await Context.Message.Channel.SendMessageAsync("Changed down-message to intentional."); } } } else { await Context.Channel.SendMessageAsync($"The server is still up, if this isn't right, try again in **{Program.Instance.GetSetting("INTERVAL_SEC")} seconds**."); } } else { await Context.Channel.SendMessageAsync($"Only <@{Program.Instance.GetSetting("OWNER_ID")}> can do this."); } }
public TimerService(DiscordSocketClient client) { _timer = new Timer(async _ => { bool run = true; if (LastReceivedPlayerlist.Equals(LastSentPlayerList) && LastReceivedPlayerlist.timestamp != new DateTime() && DateTime.Now - LastReceivedPlayerlist.timestamp <= TimeSpan.FromMinutes(2)) { run = false; } if (Program.Instance.Settings["CHANNEL_ID"] == "0" || Program.Instance.Settings["MESSAGE_ID"] == "0") { run = false; } ulong ChannelID = 0; if (!ulong.TryParse(Program.Instance.Settings["CHANNEL_ID"], out ChannelID)) { run = false; } ulong MessageID = 0; if (!ulong.TryParse(Program.Instance.Settings["MESSAGE_ID"], out MessageID)) { run = false; } try { if (run && client.GetChannel(ChannelID) != null) { SocketTextChannel channel = (SocketTextChannel)client.GetChannel(ChannelID); try { await channel.GetMessageAsync(MessageID); } catch (Discord.Net.HttpException) { await Program.Instance.LogMessage(new LogMessage(LogSeverity.Error, "TimerService", "HTML Error when finding message.")); return; } catch (System.Net.Http.HttpRequestException) { await Program.Instance.LogMessage(new LogMessage(LogSeverity.Error, "TimerService", "HTML Error when finding message.")); return; } catch (TaskCanceledException) { await Program.Instance.LogMessage(new LogMessage(LogSeverity.Error, "TimerService", "Task was cancelled when finding message.")); return; } } } catch (Discord.Net.HttpException) { await Program.Instance.LogMessage(new LogMessage(LogSeverity.Error, "TimerService", "HTML Error when finding message.")); return; } catch (System.Net.Http.HttpRequestException) { await Program.Instance.LogMessage(new LogMessage(LogSeverity.Error, "TimerService", "HTML Error when finding message.")); return; } catch (TaskCanceledException) { await Program.Instance.LogMessage(new LogMessage(LogSeverity.Error, "TimerService", "Task was cancelled when finding message.")); return; } try { if (run && client.GetChannel(ChannelID) != null) { SocketTextChannel channel = (SocketTextChannel)client.GetChannel(ChannelID); if (run && await channel.GetMessageAsync(MessageID) != null) { RestUserMessage message = (RestUserMessage)await channel.GetMessageAsync(MessageID); if (LastReceivedPlayerlist._players == null || (DateTime.Now - LastReceivedPlayerlist.timestamp > TimeSpan.FromMinutes(2) && !Program.Instance.downIntentionally) || ((LastReceivedPlayerlist.players.Length == 1 || LastReceivedPlayerlist.players.Length == 2) && LastReceivedPlayerlist.players[0] == "OFFLINE")) { if (LastReceivedPlayerlist._players == null || (LastReceivedPlayerlist.PlayerCount == 2 && LastReceivedPlayerlist.players[0] == "OFFLINE" && LastReceivedPlayerlist.players[1] == "INTENTIONAL")) { await message.ModifyAsync(msg => msg.Embed = EmbedMaker.PlayerListOffline(Discord.Color.Red, client, true, Program.Instance.GetSetting("SERVER_NAME"))); Program.Instance.downIntentionally = true; } else { await message.ModifyAsync(msg => msg.Embed = EmbedMaker.PlayerListOffline(Discord.Color.Red, client, false, Program.Instance.GetSetting("SERVER_NAME"))); Program.Instance.downIntentionally = false; } if (Program.Instance.serverUp) { Program.Instance.serverUp = false; } if (!Program.Instance.serverUp) { await client.SetStatusAsync(UserStatus.Invisible); } LastSentPlayerList = LastReceivedPlayerlist; } else { await message.ModifyAsync(msg => msg.Embed = EmbedMaker.PlayerList(LastReceivedPlayerlist, Discord.Color.DarkGreen, client, Program.Instance.GetSetting("SERVER_NAME"))); await client.SetStatusAsync(UserStatus.Online); LastSentPlayerList = LastReceivedPlayerlist; if (LastReceivedPlayerlist.PlayerCount == 0) { await client.SetGameAsync("with no players online.", type: ActivityType.Playing); } else { await client.SetGameAsync("with " + LastReceivedPlayerlist.PlayerCount + $" player{LastReceivedPlayerlist.PlayerCount.s()} online.", type: ActivityType.Playing); } if (!Program.Instance.serverUp) { Program.Instance.serverUp = true; Program.Instance.downIntentionally = false; } } } } } catch (Discord.Net.HttpException) { await Program.Instance.LogMessage(new LogMessage(LogSeverity.Error, "TimerService", "HTML Error when finding message.")); return; } catch (System.Net.Http.HttpRequestException) { await Program.Instance.LogMessage(new LogMessage(LogSeverity.Error, "TimerService", "HTML Error when finding message.")); return; } catch (TaskCanceledException) { await Program.Instance.LogMessage(new LogMessage(LogSeverity.Error, "TimerService", "Task was cancelled when finding message.")); return; } }, null, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(double.Parse(Program.Instance.GetSetting("INTERVAL_SEC")))); }