protected override async Task <bool> PostServerInfoAsync(GameServer discordGameServer) { if (discordGameServer == null) { return(false); } MineQuery query = null; try { query = new MineQuery(discordGameServer.ServerIP.Address, discordGameServer.ServerIP.Port, logger); MineQueryResult serverInfo = await query.GetServerInfoAsync().ConfigureAwait(false); if (serverInfo == null) { return(false); } SocketGuild guild = discordClient?.GetGuild(discordGameServer.GuildID); SocketTextChannel channel = guild?.GetTextChannel(discordGameServer.ChannelID); if (guild == null || channel == null) { return(false); } EmbedBuilder builder = new EmbedBuilder() .WithColor(new Color(21, 26, 35)) .WithTitle($"Minecraft Server ({discordGameServer.ServerIP.Address}:{discordGameServer.ServerIP.Port})") .WithDescription($"Motd: {serverInfo.Description.Motd}"); _ = serverInfo.Players.Sample != null && serverInfo.Players.Sample.Count > 0 ? builder.AddField($"Online Players ({serverInfo.Players.Online}/{serverInfo.Players.Max})", string.Join(", ", serverInfo.Players.Sample.Select(x => x.Name))) : builder.AddField("Online Players", $"{serverInfo.Players.Online}/{serverInfo.Players.Max}"); if (discordGameServer.GameVersion.IsEmpty()) { discordGameServer.GameVersion = serverInfo.Version.Name; _ = dbContext.GameServers.Update(discordGameServer); _ = await dbContext.SaveChangesAsync().ConfigureAwait(false); } else { if (serverInfo.Version.Name != discordGameServer.GameVersion) { discordGameServer.GameVersion = serverInfo.Version.Name; discordGameServer.LastVersionUpdate = DateTime.Now; _ = dbContext.GameServers.Update(discordGameServer); _ = await dbContext.SaveChangesAsync().ConfigureAwait(false); } } string lastServerUpdate = ""; if (discordGameServer.LastVersionUpdate.HasValue) { lastServerUpdate = $" (Last update: {discordGameServer.LastVersionUpdate.Value})"; } _ = builder.WithFooter($"Server version: {serverInfo.Version.Name}{lastServerUpdate} || Last check: {DateTime.Now}"); // Generate chart every full 10 minutes if (DateTime.Now.Minute % 10 == 0) { string chart = await GenerateHistoryChartAsync(discordGameServer, serverInfo.Players.Online, serverInfo.Players.Max).ConfigureAwait(false); if (!chart.IsEmptyOrWhiteSpace()) { _ = builder.AddField("Player Count History", chart); } } if (discordGameServer.MessageID.HasValue) { if (await channel.GetMessageAsync(discordGameServer.MessageID.Value).ConfigureAwait(false) is IUserMessage existingMessage && existingMessage != null) { await existingMessage.ModifyAsync(x => x.Embed = builder.Build()).ConfigureAwait(false); } else { logger.LogWarning($"Error getting updates for server {discordGameServer.ServerIP}. Original message was removed."); await RemoveServerAsync(discordGameServer.ServerIP, discordGameServer.GuildID).ConfigureAwait(false); _ = await channel.SendMessageAsync($"Error getting updates for server {discordGameServer.ServerIP}. Original message was removed. Please use the proper remove command to remove the gameserver").ConfigureAwait(false); return(false); } } else { IUserMessage message = await(channel?.SendMessageAsync("", false, builder.Build())).ConfigureAwait(false); discordGameServer.MessageID = message.Id; _ = dbContext.GameServers.Update(discordGameServer); _ = await dbContext.SaveChangesAsync().ConfigureAwait(false); } }
protected override async Task <bool> PostServerInfoAsync(GameServer discordGameServer) { if (discordGameServer == null) { return(false); } MineQuery query = null; try { query = new MineQuery(discordGameServer.ServerIP.Address, discordGameServer.ServerIP.Port, logger); var serverInfo = await query.GetServerInfoAsync().ConfigureAwait(false); if (serverInfo == null) { return(false); } var guild = discordClient?.GetGuild(discordGameServer.GuildID); var channel = guild?.GetTextChannel(discordGameServer.ChannelID); if (guild == null || channel == null) { return(false); } var builder = new EmbedBuilder() .WithColor(new Color(21, 26, 35)) .WithTitle($"Minecraft Server ({discordGameServer.ServerIP.Address}:{discordGameServer.ServerIP.Port})") .WithDescription($"Motd: {serverInfo.Description.Motd}"); if (serverInfo.Players.Sample != null && serverInfo.Players.Sample.Count > 0) { builder.AddField($"Online Players ({serverInfo.Players.Online}/{serverInfo.Players.Max})", string.Join(", ", serverInfo.Players.Sample.Select(x => x.Name))); } else { builder.AddField("Online Players", $"{serverInfo.Players.Online}/{serverInfo.Players.Max}"); } if (discordGameServer.GameVersion.IsEmpty()) { discordGameServer.GameVersion = serverInfo.Version.Name; dbContext.GameServers.Update(discordGameServer); await dbContext.SaveChangesAsync().ConfigureAwait(false); } else { if (serverInfo.Version.Name != discordGameServer.GameVersion) { discordGameServer.GameVersion = serverInfo.Version.Name; discordGameServer.LastVersionUpdate = DateTime.Now; dbContext.GameServers.Update(discordGameServer); await dbContext.SaveChangesAsync().ConfigureAwait(false); } } string lastServerUpdate = ""; if (discordGameServer.LastVersionUpdate.HasValue) { lastServerUpdate = $" (Last update: {discordGameServer.LastVersionUpdate.Value})"; } builder.WithFooter($"Server version: {serverInfo.Version.Name}{lastServerUpdate} || Last check: {DateTime.Now}"); // Generate chart every full 5 minutes (limit picture upload API calls) string pictureUrl = ""; if (DateTime.Now.Minute % 5 == 0) { pictureUrl = await GenerateAndUploadChartAsync( discordGameServer.ServerIP.ToString().Replace(".", "_").Replace(":", "_"), serverInfo.Players.Online, serverInfo.Players.Max).ConfigureAwait(false); if (!pictureUrl.IsEmptyOrWhiteSpace()) { builder.WithImageUrl(pictureUrl); } } if (discordGameServer.MessageID.HasValue) { if (await channel.GetMessageAsync(discordGameServer.MessageID.Value).ConfigureAwait(false) is IUserMessage existingMessage && existingMessage != null) { await existingMessage.ModifyAsync(x => { //Reuse old image url if new one is not set if (pictureUrl.IsEmptyOrWhiteSpace() && existingMessage.Embeds.FirstOrDefault() != null && existingMessage.Embeds.First().Image.HasValue) { builder.WithImageUrl(existingMessage.Embeds.First().Image.Value.Url); } x.Embed = builder.Build(); }).ConfigureAwait(false); } else { logger.LogWarning($"Error getting updates for server {discordGameServer.ServerIP}. Original message was removed."); await RemoveServerAsync(discordGameServer.ServerIP, discordGameServer.GuildID).ConfigureAwait(false); await channel.SendMessageAsync($"Error getting updates for server {discordGameServer.ServerIP}. Original message was removed. Please use the proper remove command to remove the gameserver").ConfigureAwait(false); return(false); } } else { var message = await(channel?.SendMessageAsync("", false, builder.Build())).ConfigureAwait(false); discordGameServer.MessageID = message.Id; dbContext.GameServers.Update(discordGameServer); await dbContext.SaveChangesAsync().ConfigureAwait(false); } }