diff --git a/Content.Server/ADT/Administration/Commands/SendUpdateServerCommand.cs b/Content.Server/ADT/Administration/Commands/SendUpdateServerCommand.cs new file mode 100644 index 00000000000..74c294afda1 --- /dev/null +++ b/Content.Server/ADT/Administration/Commands/SendUpdateServerCommand.cs @@ -0,0 +1,26 @@ +using Content.Shared.Administration; +using Robust.Shared.Console; +using Content.Server.Administration; +using Content.Server.ServerUpdates; + +namespace Content.Server.ADT.Administration.Commands; + + +[AdminCommand(AdminFlags.Permissions)] +public sealed class SendUpdateServerCommand : LocalizedCommands +{ + [Dependency] private readonly ServerUpdateManager _serverManager = default!; + public override string Command => "send_updateserver_devtest"; + + public override async void Execute(IConsoleShell shell, string argStr, string[] args) + { + var player = shell.Player; + if (player == null) + { + shell.WriteError(LocalizationManager.GetString("shell-target-player-does-not-exist")); + return; + } + + _serverManager.SendDiscordWebHookUpdateMessage(); + } +} diff --git a/Content.Server/ServerUpdates/ServerUpdateManager.cs b/Content.Server/ServerUpdates/ServerUpdateManager.cs index b18544daf0f..2fc6d3f2fb8 100644 --- a/Content.Server/ServerUpdates/ServerUpdateManager.cs +++ b/Content.Server/ServerUpdates/ServerUpdateManager.cs @@ -157,7 +157,6 @@ void IPostInjectInit.PostInject() // ADT-Tweak-start: Отправка сообщения в Discord при обновлении сервера public async void SendDiscordWebHookUpdateMessage() { - if (!string.IsNullOrWhiteSpace(_cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordServerUpdateWebhook))) { var webhookUrl = _cfg.GetCVar(ADTDiscordWebhookCCVars.DiscordServerUpdateWebhook); @@ -167,13 +166,16 @@ public async void SendDiscordWebHookUpdateMessage() if (await _discord.GetWebhook(webhookUrl) is not { } webhookData) return; + // Получение данных сервера var serverName = _cfg.GetCVar("game.hostname"); var serverDesc = _cfg.GetCVar("game.desc"); var engineVersion = _cfg.GetCVar("build.engine_version"); var buildVersion = _cfg.GetCVar("build.version"); + // Сообщение о перезапуске сервера var descContent = "Обновление получено, сервер автоматически перезапустится для обновления в конце этого раунда."; + // Определение состояния раунда var gameTicker = _entitySystemManager.GetEntitySystem(); var roundDescription = gameTicker.RunLevel switch { @@ -185,7 +187,7 @@ public async void SendDiscordWebHookUpdateMessage() _ => throw new ArgumentOutOfRangeException(nameof(gameTicker.RunLevel), $"{gameTicker.RunLevel} was not matched."), }; - // Создание структуры сообщения для вебхука + // Формирование структуры embed var embed = new WebhookEmbed { Title = "Обновление пришло", @@ -198,30 +200,42 @@ public async void SendDiscordWebHookUpdateMessage() Fields = new List() }; - // Добавление полей только если данные доступны - if (!string.IsNullOrWhiteSpace(serverName)) - embed.Fields.Add(new WebhookEmbedField { Name = "Название сервера", Value = serverName, Inline = true }); - - if (!string.IsNullOrWhiteSpace(serverDesc)) - embed.Fields.Add(new WebhookEmbedField { Name = "Описание сервера", Value = serverDesc, Inline = true }); - - if (!string.IsNullOrWhiteSpace(engineVersion)) - embed.Fields.Add(new WebhookEmbedField { Name = "RobustToolbox version", Value = engineVersion, Inline = true }); - - if (!string.IsNullOrWhiteSpace(buildVersion)) - embed.Fields.Add(new WebhookEmbedField { Name = "Build version", Value = buildVersion, Inline = true }); + // Добавление полей только если они не пустые + AddIfNotEmpty(embed.Fields, "Название сервера", serverName); + AddIfNotEmpty(embed.Fields, "Описание сервера", serverDesc); + AddIfNotEmpty(embed.Fields, "RobustToolbox version", engineVersion); + AddIfNotEmpty(embed.Fields, "Build version", buildVersion); + // Формирование полезной нагрузки var payload = new WebhookPayload { Embeds = new List { embed }, Username = Loc.GetString("username-webhook-update") }; + // Проверка, нужно ли добавлять пинг + var shouldPingOnUpdate = _cfg.GetCVar(ADTDiscordWebhookCCVars.ShouldPingOnUpdate); + if (shouldPingOnUpdate) + { + // Добавляем пинг в поле Content. Это будет сообщение, которое будет сверху + payload.Content = "<@&1275740664264659017>"; // ID роли "Обновления" + } + // Отправка сообщения в Discord var identifier = webhookData.ToIdentifier(); + payload.AllowedMentions.AllowRoleMentions(); await _discord.CreateMessage(identifier, payload); } } + + // Вспомогательный метод для добавления полей в embed + private void AddIfNotEmpty(List fields, string fieldName, string? fieldValue) + { + if (!string.IsNullOrWhiteSpace(fieldValue)) + { + fields.Add(new WebhookEmbedField { Name = fieldName, Value = fieldValue, Inline = true }); + } + } // ADT-Tweak-end } diff --git a/Content.Shared/ADT/CCVar/CCVars.WebhookDiscord.cs b/Content.Shared/ADT/CCVar/CCVars.WebhookDiscord.cs index c933cf80dd2..e27a7c4a2ba 100644 --- a/Content.Shared/ADT/CCVar/CCVars.WebhookDiscord.cs +++ b/Content.Shared/ADT/CCVar/CCVars.WebhookDiscord.cs @@ -10,11 +10,19 @@ public sealed class ADTDiscordWebhookCCVars : CVars /// URL of the Discord webhook which will relay adminwho info to the channel. /// public static readonly CVarDef DiscordAdminwhoWebhook = - CVarDef.Create("discord.adminwho_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL); + CVarDef.Create("discord.adminwho_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL | CVar.ARCHIVE); /// /// This constant specifies a webhook that will send a message to Discord when a server updates. /// public static readonly CVarDef DiscordServerUpdateWebhook = - CVarDef.Create("discord.server_update_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL); + CVarDef.Create("discord.server_update_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL | CVar.ARCHIVE); + + /// + /// This constant specifies whether a ping should be sent to a specific Discord role + /// when the server update notification is triggered. If set to true, a ping will be sent to the role. + /// If set to false, no ping will be sent. + /// + public static readonly CVarDef ShouldPingOnUpdate = + CVarDef.Create("discord.server_update_webhook_ping", true, CVar.SERVERONLY | CVar.ARCHIVE); }