Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fix] TTS 3: Враг в отражении #138

Closed
wants to merge 11 commits into from
Closed

[Fix] TTS 3: Враг в отражении #138

wants to merge 11 commits into from

Conversation

Spatison
Copy link
Member

@Spatison Spatison commented Dec 5, 2024

Описание PR

Удалил наш ТТС. Добавил ТТС бэкмена. Портировал один ПР с виздена для работы кода


Изменения

no cl

Spatison and others added 3 commits December 5, 2024 20:23
* Move PlayerRateLimitManager to shared

* Add interaction rate limits

* uncap tests

(cherry picked from commit f1f1fc1dc3cb5543af9b52850b253a88cc62b949)
@Spatison Spatison self-assigned this Dec 5, 2024
Copy link
Contributor

coderabbitai bot commented Dec 5, 2024

Warning

Rate limit exceeded

@Spatison has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 21 minutes and 36 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between fd7f145 and ecc37f1.

Walkthrough

В этом пулл-запросе внесены значительные изменения в систему управления чатом и функциональность текстового синтеза речи (TTS). Основные изменения включают добавление новых классов и интерфейсов, улучшение управления зависимостями и внедрение системы ограничения частоты действий для игроков. Также обновлены методы для обработки сообщений и уведомлений, а также добавлены новые конфигурационные переменные, связанные с TTS и административными функциями. Эти изменения направлены на улучшение управления взаимодействиями игроков и обработку сообщений в игровом окружении.

Changes

Файл Изменения
Content.Client/Chat/Managers/ChatManager.cs Изменена модификатор класса на internal sealed, добавлены новые поля и методы для управления зависимостями и отправки уведомлений.
Content.Client/Chat/Managers/IChatManager.cs Интерфейс теперь наследуется от ISharedChatManager, удален метод Initialize.
Content.Client/IoC/ClientContentIoC.cs Добавлены регистрации для ISharedChatManager и PlayerRateLimitManager, удалена регистрация TTSManager.
Content.Client/Players/RateLimiting/PlayerRateLimitManager.cs Новый класс для управления ограничениями частоты действий игроков, добавлены методы для подсчета действий и регистрации.
Content.Client/_White/TTS/AnnounceTTSSystem.cs Новый класс для управления TTS-объявлениями, добавлены методы для обработки аудио.
Content.Client/_White/TTS/HumanoidProfileEditor.TTS.cs Изменена логика инициализации голосов и обработка событий.
Content.Client/_White/TTS/TTSManager.cs Переименован в TTSSystem, изменены зависимости и добавлены новые методы для управления TTS.
Content.Server/Administration/Systems/BwoinkSystem.cs Добавлены новые зависимости и методы для управления уведомлениями администраторов.
Content.Server/Chat/Managers/ChatManager.RateLimit.cs Изменена логика управления ограничениями частоты сообщений, добавлены новые методы.
Content.Server/Chat/Managers/ChatManager.cs Обновлены методы для обработки сообщений и отправки уведомлений администраторам.
Content.Server/IoC/ServerContentIoC.cs Изменены регистрации для управления зависимостями, добавлены новые менеджеры.
Content.Shared/CCVar/CCVars.cs Добавлены новые конфигурационные переменные для управления административными функциями и ограничениями взаимодействий.
Content.Shared/Chat/ISharedChatManager.cs Новый интерфейс для управления чатом с методами для отправки уведомлений.
Content.Shared/Players/RateLimiting/RateLimitRegistration.cs Новый класс для регистрации ограничений частоты действий.
Content.Shared/Players/RateLimiting/SharedPlayerRateLimitManager.cs Новый абстрактный класс для управления ограничениями частоты действий игроков.
Resources/Locale/en-US/interaction/interaction-system.ftl Добавлены новые сообщения для системы взаимодействия.

Suggested labels

Changes: Audio

Suggested reviewers

  • Remuchi
  • DVOniksWyvern

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 23

🧹 Outside diff range and nitpick comments (31)
Content.Shared/Players/RateLimiting/RateLimitRegistration.cs (3)

39-39: Исправьте опечатку в комментарии

В строке 39 присутствует опечатка: лишнее слово "there". Это приводит к некорректному построению предложения.

Примените следующий дифф для исправления опечатки:

-/// If the cvar is set to 0, there every breach will be reported.
+/// If the cvar is set to 0, every breach will be reported.

17-59: Добавьте валидацию параметров в конструкторе

Согласно комментариям, если задан CVarAdminAnnounceDelay, то должен быть задан и AdminAnnounceAction, и наоборот. Рекомендуется добавить проверки в конструкторе, чтобы гарантировать корректность переданных параметров.

Пример кода для добавления проверок:

public RateLimitRegistration(...)
{
    // Инициализация свойств
    CVarLimitPeriodLength = cVarLimitPeriodLength;
    CVarLimitCount = cVarLimitCount;
    PlayerLimitedAction = playerLimitedAction;
    CVarAdminAnnounceDelay = cVarAdminAnnounceDelay;
    AdminAnnounceAction = adminAnnounceAction;
    AdminLogType = adminLogType;

    // Добавление проверок
    if (CVarAdminAnnounceDelay != null && AdminAnnounceAction == null)
    {
        throw new ArgumentException("Если задан CVarAdminAnnounceDelay, должен быть задан и AdminAnnounceAction.");
    }

    if (AdminAnnounceAction != null && CVarAdminAnnounceDelay == null)
    {
        throw new ArgumentException("Если задан AdminAnnounceAction, должен быть задан и CVarAdminAnnounceDelay.");
    }
}

65-76: Явно задайте значения для членов перечисления RateLimitStatus

Для повышения ясности и предотвращения возможных ошибок рекомендуется явно указать значения элементов перечисления RateLimitStatus.

Примените следующий дифф:

 public enum RateLimitStatus : byte
 {
     /// <summary>
     /// The action was not blocked by the rate limit.
     /// </summary>
-    Allowed,
+    Allowed = 0,

     /// <summary>
     /// The action was blocked by the rate limit.
     /// </summary>
-    Blocked,
+    Blocked = 1
 }
Content.Shared/Chat/ISharedChatManager.cs (1)

5-7: Добавьте документацию к методам интерфейса

Рекомендуется добавить XML-документацию к каждому методу для улучшения читаемости и поддержки кода.

Предлагаемые изменения:

 public interface ISharedChatManager
 {
+    /// <summary>
+    /// Инициализирует менеджер чата.
+    /// </summary>
     void Initialize();
+    
+    /// <summary>
+    /// Отправляет административное оповещение всем игрокам.
+    /// </summary>
+    /// <param name="message">Текст оповещения</param>
     void SendAdminAlert(string message);
+    
+    /// <summary>
+    /// Отправляет административное оповещение конкретному игроку.
+    /// </summary>
+    /// <param name="player">Идентификатор игрока</param>
+    /// <param name="message">Текст оповещения</param>
     void SendAdminAlert(EntityUid player, string message);
 }
Content.Server/_White/TTS/TTSSystem.cs (1)

71-82: Оптимизируйте обработку шепота в методе OnEntitySpoke

В логике обработки шепота есть повторяющиеся проверки и вызовы. Рекомендуется упростить условные конструкции для повышения читабельности и эффективности кода.

Content.Server/_White/TTS/TTSSystem.Sanitize.cs (2)

16-27: Улучшите регулярные выражения в методе Sanitize

Объедините регулярные выражения или используйте предкомпилированные Regex, чтобы повысить производительность метода Sanitize. Также убедитесь, что все специальные символы корректно обрабатываются.


189-255: Оптимизируйте конвертацию чисел в слова

Методы в классе NumberConverter могут быть оптимизированы для повышения эффективности. Рассмотрите возможность использования существующих библиотек или алгоритмов для конвертации чисел в текст.

Content.Server/_White/TTS/TTSManagerExtension.cs (1)

196-200: Улучшите генерацию ключа кеша с учетом регистра эффекта

При генерации ключа кеша рекомендуется нормализовать эффект и другие параметры, например, привести к нижнему регистру, чтобы избежать коллизий из-за различий в регистре символов.

Content.Server/Chat/Managers/ChatManager.cs (2)

29-35: Избегайте использования статических словарей для данных патронов

Использование статического словаря PatronOocColors может привести к проблемам при расширении функциональности. Рекомендуется вынести эти данные в конфигурационные файлы или базы данных для упрощения управления и обновления.


283-290: Оптимизируйте отправку сообщений администраторам

В методе SendAdminChat можно оптимизировать цикл отправки сообщений, используя групповые операции или фильтры, чтобы повысить производительность при отправке сообщений большому количеству администраторов.

Content.Server/Administration/Systems/BwoinkSystem.cs (3)

58-60: Рассмотрите возможность использования отдельного класса или структуры вместо сложного кортежа.

Использование кортежей с большим количеством полей может снизить читаемость кода. Создание отдельного класса или структуры для хранения данных _relayMessages улучшит понимание и поддержку кода.


133-135: Рассмотрите возможность вынесения значения тайм-аута в константу или конфигурацию.

Вместо использования жестко заданного значения 5 минут, рекомендуется вынести это значение в константу или сделать настройкой, чтобы упростить изменение тайм-аута в будущем.


721-726: Убедитесь в единообразии форматирования сообщений в методе GenerateAHelpMessage.

Когда parameters.Icon не равно null, двоеточие после parameters.Username опускается. Для согласованности стиля рекомендуется добавить двоеточие в обоих случаях.

Content.Client/Chat/Managers/IChatManager.cs (1)

Line range hint 9-12: Улучшить документацию метода

Текущая документация содержит нестандартный префикс "Nyano" и неполное описание функциональности.

Предлагаю следующее изменение:

-    /// <summary>
-    ///     Nyano - Summary:. Will refresh perms.
-    /// </summary>
+    /// <summary>
+    ///     Обновляет разрешения чата для текущего пользователя.
+    /// </summary>
Content.Shared/_White/TTS/TTSVoicePrototype.cs (1)

26-29: Уточните документацию

Комментарий к свойству RoundStart может быть более информативным. Рекомендуется указать точное влияние этого параметра на доступность голоса в редакторе персонажа.

Content.Server/_White/Chat/Systems/AnnouncementSpokeEvent.cs (1)

27-27: Удалите лишнюю пустую строку

В классе RadioSpokeEvent присутствует лишняя пустая строка.

Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs (1)

20-30: Улучшите обработку ошибок и локализацию

В методе OnChangeVoice:

  1. Отсутствует явное сообщение об ошибке при неверном voice ID
  2. Строка для popup-сообщения захардкожена

Рекомендуемые изменения:

 private void OnChangeVoice(Entity<VoiceMaskComponent> entity, ref VoiceMaskChangeVoiceMessage msg)
 {
     if (msg.Voice is { } id && !_proto.HasIndex<TTSVoicePrototype>(id))
+    {
+        _popupSystem.PopupEntity(Loc.GetString("voice-mask-voice-invalid"), entity);
         return;
+    }

     entity.Comp.VoiceId = msg.Voice;

     _popupSystem.PopupEntity(Loc.GetString("voice-mask-voice-popup-success"), entity);

     UpdateUI(entity);
 }
Content.Server/_White/TTS/TTSSystem.RateLimit.cs (1)

17-25: Добавьте документацию и улучшите обработку ошибок регистрации

Метод RegisterRateLimits не имеет документации и не обрабатывает потенциальные ошибки при регистрации.

Предлагаемые улучшения:

+/// <summary>
+/// Регистрирует ограничения частоты использования TTS.
+/// Использует параметры из WhiteCVars для настройки периода и количества.
+/// </summary>
 private void RegisterRateLimits()
 {
+    try
+    {
         _rateLimitManager.Register(RateLimitKey,
             new RateLimitRegistration(
                 WhiteCVars.TTSRateLimitPeriod,
                 WhiteCVars.TTSRateLimitCount,
                 RateLimitPlayerLimited)
             );
+    }
+    catch (Exception e)
+    {
+        Logger.ErrorS("tts", e, "Ошибка при регистрации ограничений TTS");
+    }
 }
Content.Server/_White/TTS/TTSSystem.Cache.cs (1)

1-37: Рассмотрите добавление механизма очистки кэша

Текущая реализация не предусматривает механизм очистки устаревших файлов кэша, что может привести к неконтролируемому росту размера кэша.

Рекомендуется добавить:

  1. Механизм отслеживания времени последнего использования файлов кэша
  2. Периодическую очистку неиспользуемых файлов
  3. Ограничение общего размера кэша

Могу помочь с реализацией этих улучшений, если потребуется.

Content.Shared/_White/TTS/TTSSerializable.cs (3)

6-10: Добавьте документацию для перечисления

Рекомендуется добавить XML-документацию для VoiceRequestType и его значений для улучшения понимания кода.

+/// <summary>
+/// Определяет тип запроса голоса в системе TTS
+/// </summary>
 public enum VoiceRequestType
 {
+    /// <summary>
+    /// Нет запроса
+    /// </summary>
     None,
+    /// <summary>
+    /// Предварительное прослушивание голоса
+    /// </summary>
     Preview
 }

36-40: Несогласованность в реализации свойства

В классе VoiceMaskChangeVoiceMessage свойство Voice реализовано как поле, в то время как в других классах используются автосвойства. Рекомендуется привести к единому стилю.

 public sealed class VoiceMaskChangeVoiceMessage(string voice) : BoundUserInterfaceMessage
 {
-    public string Voice = voice;
+    public string Voice { get; } = voice;
 }

12-19: Рассмотрите оптимизацию работы с аудиоданными

В классе PlayTTSEvent массив байтов Data может потреблять значительный объем памяти. Рекомендуется рассмотреть возможность использования потоковой передачи данных или ограничения размера буфера.

Content.Client/_White/TTS/HumanoidProfileEditor.TTS.cs (3)

60-65: Оптимизируйте проверку на null

В методе PlayPreviewTTS можно использовать паттерн guard clause для более чистого кода.

 private void PlayPreviewTTS()
 {
-    if (Profile is null)
-        return;
+    if (Profile is not null)
+        _entManager.System<TTSSystem>().RequestGlobalTTS(VoiceRequestType.Preview, Profile.Voice);
-    _entManager.System<TTSSystem>().RequestGlobalTTS(VoiceRequestType.Preview,Profile.Voice);
 }

16-20: Оптимизируйте инициализацию списка голосов

Рекомендуется вынести фильтрацию и сортировку голосов в отдельный метод для улучшения читаемости и поддерживаемости кода.

+private List<TTSVoicePrototype> GetSortedVoiceList()
+{
+    return _prototypeManager
+        .EnumeratePrototypes<TTSVoicePrototype>()
+        .Where(o => o.RoundStart)
+        .OrderBy(o => Loc.GetString(o.Name))
+        .ToList();
+}

 private void InitializeVoice()
 {
-    _voiceList = _prototypeManager
-        .EnumeratePrototypes<TTSVoicePrototype>()
-        .Where(o => o.RoundStart)
-        .OrderBy(o => Loc.GetString(o.Name))
-        .ToList();
+    _voiceList = GetSortedVoiceList();

53-57: Упростите логику выбора голоса

Текущая реализация выбора голоса может быть упрощена для лучшей читаемости.

-if (!VoiceButton.TrySelectId(voiceChoiceId) &&
-    VoiceButton.TrySelectId(firstVoiceChoiceId))
-{
-    SetVoice(_voiceList[firstVoiceChoiceId].ID);
-}
+var selectedId = VoiceButton.TrySelectId(voiceChoiceId) ? voiceChoiceId :
+    VoiceButton.TrySelectId(firstVoiceChoiceId) ? firstVoiceChoiceId : -1;
+
+if (selectedId != -1)
+    SetVoice(_voiceList[selectedId].ID);
Content.Server/_White/TTS/TTSSystem.Announce.cs (1)

14-16: Магические числа в условиях проверки

Константа MaxMessageChars * 2 должна быть вынесена в отдельную именованную константу для улучшения читаемости и поддерживаемости кода.

+private const int MaxAnnouncementChars = MaxMessageChars * 2;
+
 if (!_isEnabled ||
-    args.Message.Length > MaxMessageChars * 2 ||
+    args.Message.Length > MaxAnnouncementChars ||
     !_prototypeManager.TryIndex<TTSVoicePrototype>(_voiceId, out var protoVoice))
Content.Shared/_White/CVars.cs (1)

80-86: Период ограничения частоты TTS

Значение по умолчанию в 2 секунды для периода ограничения может быть недостаточным для комфортного использования.

Рекомендуется увеличить значение по умолчанию до 5-10 секунд для лучшего пользовательского опыта:

-    CVarDef.Create("tts.rate_limit_period", 2f, CVar.SERVERONLY);
+    CVarDef.Create("tts.rate_limit_period", 5f, CVar.SERVERONLY);
Content.Client/Chat/Managers/ChatManager.cs (3)

70-74: Необходимо реализовать разделение команд radio и say

TODO комментарий указывает на необходимость разделения команд. Это может привести к проблемам с поддержкой кода в будущем.

Хотите, чтобы я помог реализовать разделение этих команд или создал issue для отслеживания этой задачи?


80-83: Добавьте документацию для телепатической связи

Рекомендуется добавить XML-документацию, описывающую:

  • Условия использования телепатической связи
  • Ограничения и особенности работы
  • Взаимодействие с другими системами

90-94: Рассмотрите использование событий для обновления разрешений

Текущая реализация использует прямой вызов события. Рекомендуется рассмотреть использование системы событий Robust.Server для лучшей масштабируемости.

Content.Shared/Chat/SharedChatSystem.cs (1)

27-31: Константы голосовой связи выглядят логично!

Значения и реализация выглядят правильными. Предлагаю добавить XML-документацию для улучшения читаемости кода:

     // WD EDIT START
-    public const int VoiceRange = 10; // how far voice goes in world units
-    public const int WhisperClearRange = 2; // how far whisper goes while still being understandable, in world units
-    public const int WhisperMuffledRange = 5; // how far whisper goes at all, in world units
+    /// <summary>
+    /// Максимальная дистанция распространения обычной речи в игровых единицах
+    /// </summary>
+    public const int VoiceRange = 10;
+
+    /// <summary>
+    /// Дистанция, на которой шёпот остается разборчивым, в игровых единицах
+    /// </summary>
+    public const int WhisperClearRange = 2;
+
+    /// <summary>
+    /// Максимальная дистанция распространения шёпота в игровых единицах
+    /// </summary>
+    public const int WhisperMuffledRange = 5;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between c5bd6b7 and f4286ed.

📒 Files selected for processing (44)
  • Content.Client/Chat/Managers/ChatManager.cs (1 hunks)
  • Content.Client/Chat/Managers/IChatManager.cs (1 hunks)
  • Content.Client/IoC/ClientContentIoC.cs (3 hunks)
  • Content.Client/Players/RateLimiting/PlayerRateLimitManager.cs (1 hunks)
  • Content.Client/_White/TTS/AnnounceTTSSystem.cs (1 hunks)
  • Content.Client/_White/TTS/HumanoidProfileEditor.TTS.cs (2 hunks)
  • Content.Client/_White/TTS/TTSManager.cs (1 hunks)
  • Content.Client/_White/TTS/TTSSystem.cs (0 hunks)
  • Content.IntegrationTests/PoolManager.Cvars.cs (1 hunks)
  • Content.Server/Administration/Systems/BwoinkSystem.cs (23 hunks)
  • Content.Server/Chat/Managers/ChatManager.RateLimit.cs (1 hunks)
  • Content.Server/Chat/Managers/ChatManager.cs (1 hunks)
  • Content.Server/Chat/Managers/IChatManager.cs (4 hunks)
  • Content.Server/Chat/Systems/ChatSystem.cs (1 hunks)
  • Content.Server/IoC/ServerContentIoC.cs (3 hunks)
  • Content.Server/Players/RateLimiting/PlayerRateLimitManager.cs (1 hunks)
  • Content.Server/VoiceMask/VoiceMaskComponent.cs (2 hunks)
  • Content.Server/VoiceMask/VoiceMaskSystem.cs (1 hunks)
  • Content.Server/_White/Chat/Systems/AnnouncementSpokeEvent.cs (1 hunks)
  • Content.Server/_White/TTS/TTSManager.cs (2 hunks)
  • Content.Server/_White/TTS/TTSManagerExtension.cs (1 hunks)
  • Content.Server/_White/TTS/TTSSystem.Announce.cs (1 hunks)
  • Content.Server/_White/TTS/TTSSystem.Cache.cs (1 hunks)
  • Content.Server/_White/TTS/TTSSystem.Preview.cs (1 hunks)
  • Content.Server/_White/TTS/TTSSystem.RateLimit.cs (1 hunks)
  • Content.Server/_White/TTS/TTSSystem.SSML.cs (1 hunks)
  • Content.Server/_White/TTS/TTSSystem.Sanitize.cs (2 hunks)
  • Content.Server/_White/TTS/TTSSystem.cs (2 hunks)
  • Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs (1 hunks)
  • Content.Shared/CCVar/CCVars.cs (4 hunks)
  • Content.Shared/Chat/ISharedChatManager.cs (1 hunks)
  • Content.Shared/Chat/SharedChatSystem.cs (1 hunks)
  • Content.Shared/Interaction/SharedInteractionSystem.cs (8 hunks)
  • Content.Shared/Players/RateLimiting/RateLimitRegistration.cs (1 hunks)
  • Content.Shared/Players/RateLimiting/SharedPlayerRateLimitManager.cs (1 hunks)
  • Content.Shared/_White/CVars.cs (1 hunks)
  • Content.Shared/_White/TTS/Events/PlayTTSEvent.cs (0 hunks)
  • Content.Shared/_White/TTS/Events/RequestTTSEvent.cs (0 hunks)
  • Content.Shared/_White/TTS/MsgRequestTTS.cs (0 hunks)
  • Content.Shared/_White/TTS/TTSComponent.cs (1 hunks)
  • Content.Shared/_White/TTS/TTSPitchRateSystem.cs (0 hunks)
  • Content.Shared/_White/TTS/TTSSerializable.cs (1 hunks)
  • Content.Shared/_White/TTS/TTSVoicePrototype.cs (1 hunks)
  • Resources/Locale/en-US/interaction/interaction-system.ftl (1 hunks)
💤 Files with no reviewable changes (5)
  • Content.Shared/_White/TTS/Events/RequestTTSEvent.cs
  • Content.Shared/_White/TTS/Events/PlayTTSEvent.cs
  • Content.Shared/_White/TTS/MsgRequestTTS.cs
  • Content.Shared/_White/TTS/TTSPitchRateSystem.cs
  • Content.Client/_White/TTS/TTSSystem.cs
🔇 Additional comments (70)
Content.Shared/Players/RateLimiting/RateLimitRegistration.cs (1)

10-16: ⚠️ Potential issue

Исправьте объявление класса RateLimitRegistration

Класс RateLimitRegistration использует недопустимый синтаксис объявления для класса в C#. В текущей версии C# классы не могут принимать параметры непосредственно в объявлении. Рекомендуется либо использовать record, если необходим неизменяемый тип данных, либо перенести параметры в конструктор класса.

Примените следующий дифф для исправления синтаксиса:

Вариант 1 (если необходим неизменяемый тип): изменить класс на record:

-public sealed class RateLimitRegistration(
+public sealed record RateLimitRegistration(

Вариант 2: перенести параметры в конструктор класса:

-public sealed class RateLimitRegistration(
-    CVarDef<float> cVarLimitPeriodLength,
-    CVarDef<int> cVarLimitCount,
-    Action<ICommonSession>? playerLimitedAction,
-    CVarDef<int>? cVarAdminAnnounceDelay = null,
-    Action<ICommonSession>? adminAnnounceAction = null,
-    LogType adminLogType = LogType.RateLimited)
+public sealed class RateLimitRegistration
 {
+    public RateLimitRegistration(
+        CVarDef<float> cVarLimitPeriodLength,
+        CVarDef<int> cVarLimitCount,
+        Action<ICommonSession>? playerLimitedAction,
+        CVarDef<int>? cVarAdminAnnounceDelay = null,
+        Action<ICommonSession>? adminAnnounceAction = null,
+        LogType adminLogType = LogType.RateLimited)
+    {
+        CVarLimitPeriodLength = cVarLimitPeriodLength;
+        CVarLimitCount = cVarLimitCount;
+        PlayerLimitedAction = playerLimitedAction;
+        CVarAdminAnnounceDelay = cVarAdminAnnounceDelay;
+        AdminAnnounceAction = adminAnnounceAction;
+        AdminLogType = adminLogType;
+    }

Likely invalid or redundant comment.

Content.Shared/Chat/ISharedChatManager.cs (2)

1-4: Проверьте соответствие интерфейса целям PR

Интерфейс ISharedChatManager определен как общий (shared) компонент системы чата, но в описании PR упоминается изменение системы TTS. Рекомендуется уточнить, как этот интерфейс связан с новой системой TTS.

✅ Verification successful

Let me analyze the results. I can see that:

  1. There are TTS-related files in Content.Server/_White/TTS/ directory
  2. The ISharedChatManager is used by both client and server implementations
  3. The interface is part of the chat system infrastructure that could be used by TTS

Let me verify the relationship between chat and TTS systems:


Based on the findings, I can now generate the final response:

Интерфейс корректно интегрирован с новой системой TTS

Анализ показал, что ISharedChatManager является частью инфраструктуры чата, которая используется новой системой TTS (TTSSystem). Система TTS имеет зависимость от менеджера чата и правильно интегрирована в общую архитектуру. Изменения соответствуют целям PR по обновлению системы TTS.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Поиск связанных с TTS компонентов в кодовой базе

# Поиск файлов, связанных с TTS
rg -l "TTS|TextToSpeech|Speech" 

# Поиск использования ISharedChatManager
rg -A 5 "ISharedChatManager"

Length of output: 19465


Script:

# Check if TTS systems use chat manager
rg -A 5 "ChatManager|ISharedChatManager" Content.Server/_White/TTS/

# Check implementation of ISharedChatManager
ast-grep --pattern 'class $_ : ISharedChatManager { $$$ }'

Length of output: 582


6-7: Рассмотрите добавление обработки ошибок

Методы SendAdminAlert могут столкнуться с различными ошибками (например, недействительный EntityUid или пустое сообщение). Рекомендуется определить, как эти случаи должны обрабатываться.

Content.Server/Chat/Managers/ChatManager.RateLimit.cs (3)

24-27: Метод RateLimitPlayerLimited корректно уведомляет игрока о превышении лимита.

Метод отправляет игроку сообщение о том, что он превышил лимит отправки сообщений, что соответствует ожидаемой функциональности.


29-32: Метод RateLimitAlertAdmins корректно уведомляет администраторов о превышении лимита игроком.

Метод отправляет уведомление администраторам с указанием имени игрока, превысившего лимит, что позволяет администраторам своевременно реагировать.


10-10: Константа RateLimitKey правильно определена и используется.

Константа RateLimitKey используется для идентификации категории ограничения скорости и обеспечивает согласованность в коде.

Content.Shared/Players/RateLimiting/SharedPlayerRateLimitManager.cs (2)

24-37: Метод CountAction корректно объявлен для учета действий игрока.

Абстрактный метод обеспечивает интерфейс для учета и проверки действий игрока в соответствии с зарегистрированными ограничениями скорости.


39-55: Метод Register корректно объявлен для регистрации новых категорий ограничений.

Метод позволяет регистрировать новые категории ограничений, гарантируя уникальность ключей и правильную настройку параметров ограничения.

Content.Client/_White/TTS/TTSManager.cs (5)

43-51: Метод Initialize корректно инициализирует систему TTS.

Метод устанавливает необходимые зависимости, добавляет контентный корень для ресурсов TTS и подписывается на события изменения конфигурации и сетевые события воспроизведения TTS.


58-63: Метод Shutdown корректно освобождает ресурсы системы TTS.

Метод отписывается от событий изменения конфигурации и очищает контентный корень, предотвращая потенциальные утечки ресурсов.


75-101: Метод OnPlayTTS корректно обрабатывает воспроизведение TTS аудио.

Метод загружает аудиоданные, настраивает параметры звука и воспроизводит аудио либо от имени сущности, либо глобально, в зависимости от наличия SourceUid.


103-113: Метод AdjustVolume корректно регулирует громкость в зависимости от того, является ли речь шепотом.

Громкость уменьшается на значение WhisperFade, если параметр isWhisper установлен в true, обеспечивая реалистичность звучания шепота.


115-117: Метод AdjustDistance корректно устанавливает максимальную дистанцию звука.

Метод возвращает разные значения максимальной дистанции в зависимости от параметра isWhisper, что отражает ограничения слышимости шепота по сравнению с обычной речью.

Content.Server/Players/RateLimiting/PlayerRateLimitManager.cs (4)

24-70: Метод CountAction успешно реализует логику учета и ограничения действий игроков.

Метод учитывает действия игроков, обрабатывает периоды ограничения, обновляет счетчики и уведомляет игроков и администраторов при превышении лимитов, обеспечивая надежную работу системы ограничений.


72-106: Метод Register корректно регистрирует новые категории ограничений и обрабатывает настройки конфигурации.

Метод проверяет уникальность ключей, подписывается на изменения конфигурации и обеспечивает правильную настройку параметров ограничения и уведомлений.


108-111: Метод Initialize корректно инициализирует менеджер ограничений при запуске сервера.

Подписка на события изменения статуса игроков позволяет своевременно очищать данные ограничений для отключенных игроков.


113-117: Метод PlayerManagerOnPlayerStatusChanged корректно обрабатывает отключение игроков.

При изменении статуса игрока на Disconnected, данные его ограничений удаляются, предотвращая накопление ненужной информации.

Content.Client/_White/TTS/AnnounceTTSSystem.cs (2)

85-106: Метод OnAnnounceTTSPlay корректно обрабатывает запросы на воспроизведение объявлений TTS.

Метод проверяет наличие аудиофайла, создает аудиопотоки для объявления и дополнительного TTS-аудио, добавляя их в очередь воспроизведения.


165-193: Класс TTSAudioStream корректно управляет аудиопотоками и ресурсами.

Класс отвечает за создание, воспроизведение и очистку аудиопотоков, обеспечивая безопасное удаление временных файлов и остановку потоков при необходимости.

Content.Server/_White/TTS/TTSManager.cs (1)

53-59: Проверьте настройку обработчиков изменений конфигурации

Обработчики изменений конфигурации _cfg.OnValueChanged настроены корректно, однако стоит убедиться, что они правильно отписываются при завершении работы, чтобы избежать возможных утечек памяти.

Content.Server/_White/TTS/TTSSystem.cs (1)

44-48: Назначьте случайный голос при инициализации компонента TTS

Код корректно присваивает случайный голос из прототипов TTSVoicePrototype, если VoicePrototypeId не задан. Убедитесь, что прототипы голосов загружены и доступны в менеджере прототипов.

Content.Server/Chat/Managers/ChatManager.cs (2)

208-216: Добавьте проверку прав доступа перед отправкой сообщения OOC

В методе TrySendOOCMessage следует добавить проверку, имеет ли игрок право отправлять сообщения определенного типа, особенно для административных сообщений.


248-260: Убедитесь в корректности отображения цвета для патронов

Код для настройки цвета сообщений патронов корректен, но убедитесь, что сервер поддерживает данные цвета и что они правильно отображаются у клиентов.

Content.Server/Administration/Systems/BwoinkSystem.cs (8)

10-18: Новые зависимости импортированы корректно.

Добавлены необходимые using директивы для новых функциональностей.


34-35: Константа RateLimitKey добавлена корректно.

Использование константы улучшает читаемость и поддерживаемость кода.


44-45: Новые зависимости внедрены корректно.

Добавлены необходимые зависимости _dbManager и _rateLimit для работы с базой данных и ограничения частоты действий.


80-80: Добавление словаря _activeConversations выполнено корректно.

Словарь для отслеживания активных бесед необходим для новой функциональности.


91-99: Инициализация defaultParams и вычисление _maxAdditionalChars выполнены корректно.

Код корректно создает параметры по умолчанию для сообщения помощи и вычисляет максимальную дополнительную длину сообщения.


104-105: Очистка _activeConversations при перезапуске раунда реализована корректно.

Подписка на RoundRestartCleanupEvent для очистки активных бесед позволяет предотвратить накопление неактуальных данных.


106-112: Регистрация ограничения частоты действий выполнена корректно.

Код правильно регистрирует ограничение частоты сообщений с использованием заданных параметров и колбека PlayerRateLimitedAction.


114-117: Обработчик PlayerRateLimitedAction реализован корректно.

Метод отправляет пользователю соответствующее сообщение при достижении лимита частоты действий.

Content.Client/Chat/Managers/IChatManager.cs (1)

5-5: Одобрено наследование от ISharedChatManager

Наследование от ISharedChatManager улучшает организацию кода и позволяет разделить общую функциональность чата.

Content.Shared/_White/TTS/TTSComponent.cs (2)

6-9: Хорошая документация компонента

Добавленная документация четко описывает назначение компонента TTS.


13-18: Проверить обработку null значений

Свойство VoicePrototypeId теперь может быть null. Необходимо убедиться, что все системы, использующие это свойство, корректно обрабатывают null значения.

✅ Verification successful

Проверка обработки null значений завершена успешно

Анализ кода показывает, что все места использования VoicePrototypeId корректно обрабатывают null значения:

  • В TTSSystem.OnTtsInitialized есть явная проверка на null с установкой случайного значения
  • В TTSSystem.OnEntitySpoke присутствует проверка voiceId == null в условиях выхода из метода
  • Других прямых обращений к этому свойству в кодовой базе не обнаружено
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск использования VoicePrototypeId без проверки на null
ast-grep --pattern 'VoicePrototypeId.$$$'

Length of output: 43


Script:

#!/bin/bash
# Поиск использования VoicePrototypeId в коде
rg "VoicePrototypeId" -A 3 -B 3

Length of output: 1609


Script:

#!/bin/bash
# Поиск файлов с TTSComponent
fd "TTSComponent" --type f

Length of output: 68


Script:

#!/bin/bash
# Поиск использования TTSComponent
rg "TTSComponent" -A 3 -B 3

Length of output: 2749

Content.Server/_White/TTS/TTSSystem.SSML.cs (1)

16-22: Флаги определены корректно

Правильное использование атрибута [Flags] и побитовых операций для определения признаков звука.

Content.Shared/_White/TTS/TTSVoicePrototype.cs (1)

19-20: Проверьте инициализацию обязательного поля

Свойство Sex помечено как обязательное (required: true), но инициализируется значением по умолчанию default!. Это может привести к проблемам во время выполнения, если значение не будет установлено при десериализации.

Давайте проверим использование этого прототипа:

✅ Verification successful

Инициализация обязательного поля Sex безопасна

Проверка показала, что поле Sex корректно указывается во всех определениях TTS голосов в файле конфигурации. Все прототипы имеют явно заданное значение sex одним из допустимых значений: Male, Female или Unsexed. Инициализация значением по умолчанию в классе TTSVoicePrototype не представляет проблемы, так как это поле всегда заполняется при десериализации из YAML-файла.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Поиск файлов прототипов TTS голосов
# Ожидаемый результат: Файлы с определениями голосов, где должно быть указано значение для Sex

rg -g "*.yml" -g "*.yaml" "ttsVoice" -A 5

Length of output: 21005

Content.Server/VoiceMask/VoiceMaskComponent.cs (1)

36-40: Корректное добавление поля для TTS интеграции

Поле VoiceId правильно аннотировано и имеет разумное значение по умолчанию. Интеграция с системой TTS выполнена корректно.

Content.Client/IoC/ClientContentIoC.cs (1)

37-37: Корректная регистрация новых сервисов

Регистрация новых сервисов выполнена правильно, соблюдая принципы инверсии зависимостей.

Also applies to: 56-57

Content.Server/_White/TTS/TTSSystem.Preview.cs (1)

29-31: ⚠️ Potential issue

Проблемы безопасности требуют технического решения

Комментарий указывает на потенциальные проблемы с DDoS. Рекомендуется:

  1. Реализовать более строгие ограничения на частоту запросов
  2. Добавить мониторинг подозрительной активности
  3. Внедрить механизм временной блокировки при превышении лимитов
Content.Server/Chat/Managers/IChatManager.cs (3)

4-4: Добавление зависимости для ограничения частоты действий

Добавление Content.Shared.Players.RateLimiting согласуется с новой системой ограничения частоты действий.


39-39: Изменение типа параметра в DeleteMessagesBy

Изменение с ICommonSession на NetUserId улучшает точность идентификации пользователя при удалении сообщений.


50-50: Улучшение обработки ограничений частоты действий

Изменение возвращаемого типа с bool на RateLimitStatus предоставляет более детальную информацию о статусе ограничения.

✅ Verification successful

Подтверждено изменение возвращаемого типа для улучшения обработки ограничений

Изменение с bool на RateLimitStatus действительно улучшает информативность API, позволяя получать более детальную информацию о статусе ограничения. Это подтверждается:

  • Определением RateLimitStatus как перечисления, начинающегося со значения Allowed
  • Корректным использованием нового типа в существующем коде:
    • ChatManager.cs
    • TTSSystem.Preview.cs
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования RateLimitStatus в кодовой базе
ast-grep --pattern 'RateLimitStatus $_ = $_'

Length of output: 46


Script:

#!/bin/bash
# Поиск определения и использования RateLimitStatus
rg -l "RateLimitStatus" 

# Поиск мест, где используется HandleRateLimit
rg "HandleRateLimit" -A 2

# Поиск определения RateLimitStatus
ast-grep --pattern 'enum RateLimitStatus'

Length of output: 65741


Script:

#!/bin/bash
# Поиск определения RateLimitStatus
rg -A 5 "enum RateLimitStatus"

# Поиск использования HandleRateLimit с возвращаемым значением
rg -A 2 "HandleRateLimit.*RateLimitStatus"

# Поиск мест, где проверяется результат HandleRateLimit
rg "HandleRateLimit.*!= RateLimitStatus\.Allowed"

Length of output: 1325

Content.IntegrationTests/PoolManager.Cvars.cs (1)

39-40: Настройка тестовых параметров ограничения частоты взаимодействий

Добавленные параметры корректно настраивают среду тестирования:

  • Большое значение InteractionRateLimitCount (9999999) предотвращает ложные срабатывания ограничений
  • Малый период InteractionRateLimitPeriod (0.1) обеспечивает быстрое обновление счетчиков
✅ Verification successful

Let me gather more context about the rate limiting implementation to ensure these test values are appropriate.


Параметры ограничения частоты взаимодействий корректно настроены для тестовой среды

Установленные значения в тестовой конфигурации обоснованы:

  • Значение 9999999 для InteractionRateLimitCount и период 0.1 секунд для InteractionRateLimitPeriod эффективно отключают ограничения в тестовой среде
  • Это необходимо для корректной работы интеграционных тестов, так как система ограничения частоты взаимодействий активна в SharedInteractionSystem
  • Данные параметры не влияют на производственную среду, так как используются только в контексте тестов
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования этих параметров в тестах
rg "InteractionRateLimit(Count|Period)" -t cs

Length of output: 946


Script:

#!/bin/bash
# Check the rate limiting implementation details
ast-grep --pattern 'class SharedInteractionSystem {
  $$$
  RateLimitRegistration($_) {
    $$$
  }
  $$$
}'

Length of output: 110


Script:

#!/bin/bash
# Check for any rate limit related tests
rg "test.*ratelimit" -i -t cs

Length of output: 31


Script:

#!/bin/bash
# Get the default values from CCVars
ast-grep --pattern 'CVarDef<$_> InteractionRateLimit$_ = new($_)'

Length of output: 67


Script:

#!/bin/bash
# Let's try a different pattern to get the default values
rg "InteractionRateLimit.*=.*new" -t cs Content.Shared/CCVar/CCVars.cs -A 2

# And check the actual rate limiting implementation
rg "RateLimitRegistration" -t cs Content.Shared/Interaction/SharedInteractionSystem.cs -A 5 -B 5

Length of output: 681

Content.Shared/_White/CVars.cs (2)

73-78: Добавление конфигурации голоса для объявлений

Корректно определена конфигурация для идентификатора голоса системы объявлений с разумным значением по умолчанию "Announcer".


88-93: Количество TTS сообщений в период

Ограничение в 3 сообщения за период выглядит разумным для предотвращения спама, но требует проверки в реальных условиях.

✅ Verification successful

Ограничение в 3 TTS сообщения реализовано корректно

Реализация использует стандартную систему ограничений с корректной обработкой превышения лимита:

  • Регистрация ограничения через PlayerRateLimitManager
  • Уведомление игрока при достижении лимита
  • Проверка лимита перед каждым действием
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования параметров ограничения TTS
rg "TTSRateLimit(Count|Period)" -t cs

Length of output: 415


Script:

#!/bin/bash
# Проверяем реализацию использования TTSRateLimit
ast-grep --pattern 'TTSRateLimit' Content.Server/_White/TTS/TTSSystem.RateLimit.cs

Length of output: 82


Script:

#!/bin/bash
# Проверяем содержимое файла с реализацией ограничений TTS
cat Content.Server/_White/TTS/TTSSystem.RateLimit.cs

Length of output: 1170

Content.Server/IoC/ServerContentIoC.cs (1)

73-74: Проверьте порядок регистрации зависимостей

Убедитесь, что PlayerRateLimitManager регистрируется после всех необходимых зависимостей. Рекомендуется группировать связанные регистрации вместе.

✅ Verification successful

Let me analyze the dependencies and generate additional verification scripts to check the initialization order.


Порядок регистрации зависимостей корректный

На основе анализа кода можно сделать вывод, что регистрация PlayerRateLimitManager выполняется в правильном порядке:

  • Все базовые сервисы, от которых зависит PlayerRateLimitManager (IAdminLog, IGameTiming, IConfigurationManager, IPlayerManager), регистрируются ранее в процессе инициализации IoC
  • Регистрация конкретной реализации и интерфейса выполнена последовательно
  • Компоненты, использующие PlayerRateLimitManager, регистрируются после него
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка зависимостей PlayerRateLimitManager
rg -l "PlayerRateLimitManager" | xargs rg "Dependency"

Length of output: 6067


Script:

#!/bin/bash
# Проверяем инициализацию зависимостей PlayerRateLimitManager
ast-grep --pattern 'Initialize()
{
  $$$
}'  Content.Server/Players/RateLimiting/PlayerRateLimitManager.cs

# Проверяем порядок регистрации компонентов в IoC
rg -A 5 -B 5 "Register<PlayerRateLimitManager>" Content.Server/IoC/ServerContentIoC.cs

Length of output: 656

Content.Server/VoiceMask/VoiceMaskSystem.cs (2)

33-34: ⚠️ Potential issue

Требуется реализация метода InitializeTTS()

Вызов метода InitializeTTS() добавлен, но его реализация отсутствует в предоставленном коде. Это может привести к ошибкам во время выполнения.

✅ Verification successful

Метод InitializeTTS() реализован корректно

Реализация метода InitializeTTS() найдена в файле Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs. Метод содержит необходимую логику для обработки событий, связанных с системой TTS (Text-to-Speech). Проблем с реализацией не обнаружено.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск реализации InitializeTTS
rg -p "InitializeTTS" --type cs

Length of output: 199


Script:

#!/bin/bash
# Проверим реализацию метода InitializeTTS
ast-grep --pattern 'private void InitializeTTS() { $$$ }' Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs

Length of output: 108


Script:

#!/bin/bash
# Посмотрим содержимое файла с реализацией TTS
cat Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs

Length of output: 1036


32-34: Проверьте порядок инициализации

Убедитесь, что вызов InitializeTTS() происходит после инициализации всех необходимых зависимостей. Рекомендуется добавить комментарий, объясняющий причину размещения этого вызова в конце метода Initialize.

✅ Verification successful

Let me gather more information about the initialization order and dependencies.


Let me try a different approach to gather the initialization information.


Let me check one more thing about the TTS dependencies.


Порядок инициализации корректен

На основе анализа кода можно сделать вывод, что вызов InitializeTTS() безопасен в текущем месте, так как:

  • Метод InitializeTTS() только подписывается на события TransformSpeakerVoiceEvent и VoiceMaskChangeVoiceMessage
  • Все необходимые зависимости системы (SharedUserInterfaceSystem, SharedPopupSystem, ISharedAdminLogManager, IPrototypeManager) уже внедрены через атрибут [Dependency] и доступны к моменту вызова
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск зависимостей TTS системы
rg -p "TTSSystem|TTSManager" --type cs | rg "\[Dependency\]" -B 2 -A 2

Length of output: 414


Script:

#!/bin/bash
# Check TTSSystem initialization and dependencies
ast-grep --pattern 'class TTSSystem : EntitySystem {
  $$$
  Initialize() {
    $$$
  }
  $$$
}'

# Check VoiceMaskSystem initialization and dependencies
ast-grep --pattern 'class VoiceMaskSystem {
  $$$
  Initialize() {
    $$$
  }
  $$$
}'

# Look for InitializeTTS implementation
rg "InitializeTTS" -A 5 --type cs

Length of output: 188


Script:

#!/bin/bash
# Search for VoiceMaskSystem initialization and TTS related code
rg "InitializeTTS|VoiceMaskSystem" -B 2 -A 5 --type cs

# Look for TTS system dependencies and initialization
rg "TTSSystem.*Initialize" -A 10 --type cs

# Check if VoiceMaskSystem has any TTS-related dependencies
rg "\[Dependency\].*TTS" -B 2 -A 2 Content.Server/VoiceMask/VoiceMaskSystem.cs

Length of output: 2512


Script:

#!/bin/bash
# Check TTS dependencies in VoiceMaskSystem
rg "\[Dependency\]" -B 1 -A 1 Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs

# Check if TTSSystem is injected into VoiceMaskSystem
rg "TTSSystem.*=.*default" Content.Server/VoiceMask/VoiceMaskSystem.cs

Length of output: 153

Content.Shared/Chat/SharedChatSystem.cs (2)

Line range hint 82-92: Улучшена логика кэширования радиоканалов!

Очистка словаря перед повторным заполнением и проверка на дубликаты ключей - правильное решение. Это предотвращает:

  1. Накопление устаревших записей
  2. Конфликты ключей каналов
  3. Утечки памяти при перезагрузке прототипов

27-31: Проверить использование констант в связанных системах

Необходимо убедиться, что новые константы корректно используются в системах обработки голосовой связи.

✅ Verification successful

Константы голосовой связи корректно используются в системе

Проверка показала, что константы VoiceRange, WhisperClearRange и WhisperMuffledRange правильно интегрированы в следующих ключевых системах:

  • Основная система чата (ChatSystem.cs) использует все три константы для определения дальности голосовой связи
  • Система прослушивания (ListeningSystem.cs) корректно обрабатывает шёпот с учетом WhisperClearRange
  • TTS система (TTSSystem.cs, TTSManager.cs) учитывает все константы для определения дальности звука
  • Система микрофонов камер наблюдения (SurveillanceCameraMicrophoneSystem.cs) корректно использует VoiceRange
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск использования констант голосовой связи
echo "Поиск использования VoiceRange:"
rg "VoiceRange" --type cs

echo -e "\nПоиск использования WhisperClearRange:"
rg "WhisperClearRange" --type cs

echo -e "\nПоиск использования WhisperMuffledRange:"
rg "WhisperMuffledRange" --type cs

# Поиск потенциальных мест, где константы должны использоваться
echo -e "\nПоиск потенциальных мест использования:"
rg "voice.*range|whisper.*range|chat.*range" --type cs -i

Length of output: 15109

Content.Server/Chat/Systems/ChatSystem.cs (5)

24-24: Добавлено пространство имен для ограничения скорости игроков

Было добавлено пространство имен Content.Shared.Players.RateLimiting, что указывает на использование функционала ограничения скорости игроков в этом классе. Убедитесь, что все зависимости корректно настроены и используются в коде.


Line range hint 105-106: Добавлен параметр languageOverride в метод

В метод TrySendInGameICMessage добавлен новый параметр LanguagePrototype? languageOverride = null. Пожалуйста, убедитесь, что все вызовы этого метода обновлены и передают корректное значение для этого параметра, чтобы избежать возможных ошибок во время выполнения.


Line range hint 233-235: Добавлена обработка телепатического чата

Добавлен новый тип чата InGameICChatType.Telepathic, обрабатываемый в случае Telepathic. Метод _telepath.SendTelepathicChat вызывается для отправки телепатических сообщений. Убедитесь, что этот метод реализован корректно и телепатический чат функционирует согласно ожиданиям.


Line range hint 371-378: Использование languageOverride при определении языка

Добавлено использование параметра languageOverride при определении языка сообщения:

-var language = _language.GetLanguage(source);
+var language = languageOverride ?? _language.GetLanguage(source);

Убедитесь, что логика выбора языка корректна и не приводит к неожиданному поведению при передаче languageOverride.


Line range hint 545-546: Добавлен параметр LanguagePrototype language в методы обертки сообщений

В методы WrapPublicMessage, WrapWhisperMessage и WrapMessage добавлен параметр LanguagePrototype? language. Убедитесь, что переданный язык используется корректно при формировании сообщений и что это изменение совместимо с существующим функционалом.

Content.Shared/Interaction/SharedInteractionSystem.cs (8)

5-6: Добавлены пространства имен для настроек и чата

Добавлены using Content.Shared.CCVar; и using Content.Shared.Chat; для использования конфигурационных переменных и функционала чата в системе взаимодействия.


21-21: Добавлено пространство имен для ограничения скорости игроков

Добавлено using Content.Shared.Players.RateLimiting; для использования механизма ограничения скорости взаимодействий игроков.


30-30: Добавлена зависимость на конфигурационный менеджер

Добавлено using Robust.Shared.Configuration; для доступа к настройкам конфигурации в системе взаимодействия.


72-74: Добавлены новые зависимости

В класс SharedInteractionSystem добавлены следующие зависимости:

  • SharedPlayerRateLimitManager _rateLimit
  • IConfigurationManager _cfg
  • ISharedChatManager _chat

Убедитесь, что эти зависимости корректно инициализированы и используются для управления ограничением скорости взаимодействий и отправки сообщений администраторам.


92-92: Определена константа RateLimitKey

Добавлена константа public const string RateLimitKey = "Interaction"; для использования в системе ограничения скорости взаимодействий.


134-141: Регистрация ограничения скорости взаимодействий

В методе Initialize зарегистрировано ограничение скорости взаимодействий с помощью _rateLimit.Register:

_rateLimit.Register(RateLimitKey,
    new RateLimitRegistration(CCVars.InteractionRateLimitPeriod,
        CCVars.InteractionRateLimitCount,
        null,
        CCVars.InteractionRateLimitAnnounceAdminsDelay,
        RateLimitAlertAdmins)
);

Убедитесь, что параметры ограничения скорости настроены корректно и соответствуют требованиям для предотвращения злоупотреблений взаимодействиями.


145-148: Реализован метод оповещения администраторов о нарушениях ограничения скорости

Добавлен метод RateLimitAlertAdmins, который отправляет сообщение администраторам при превышении игроком лимита взаимодействий:

private void RateLimitAlertAdmins(ICommonSession session)
{
    _chat.SendAdminAlert(Loc.GetString("interaction-rate-limit-admin-announcement", ("player", session.Name)));
}

Убедитесь, что сообщение локализации "interaction-rate-limit-admin-announcement" определено и отображается корректно.


Line range hint 1241-1275: Добавлена проверка ограничения скорости в ValidateClientInput

В метод ValidateClientInput добавлена проверка ограничения скорости взаимодействий:

return _rateLimit.CountAction(session!, RateLimitKey) == RateLimitStatus.Allowed;

Убедитесь, что это изменение эффективно предотвращает злоупотребления взаимодействиями без негативного влияния на честных игроков, особенно тех, у кого могут быть проблемы с сетью.

Content.Shared/CCVar/CCVars.cs (6)

959-965: Добавлен CVar AdminBypassMaxPlayers

Добавлен новый конфигурационный параметр AdminBypassMaxPlayers, позволяющий администраторам подключаться к серверу даже при достижении максимального количества игроков.


966-974: Добавлен CVar AdminUseCustomNamesAdminRank

Добавлен новый конфигурационный параметр AdminUseCustomNamesAdminRank, определяющий, будут ли использоваться настраиваемые названия рангов для администраторов. Если установлено значение false, будет использоваться фактическое название ранга независимо от пользовательского титула.


979-993: Добавлены параметры ограничения скорости AHELP сообщений

Введены новые конфигурационные параметры для управления ограничением скорости AHELP сообщений:

  • AhelpRateLimitPeriod: период времени для подсчета сообщений (секунды).
  • AhelpRateLimitCount: максимальное количество сообщений в рамках периода.

Убедитесь, что эти параметры настроены в соответствии с требованиями сервера для предотвращения спама в AHELP.


994-1011: Добавлены параметры отображения префиксов администраторов в AHELP

Введены новые конфигурационные параметры:

  • AhelpAdminPrefix: определяет, отображается ли позиция администратора в AHELP сообщениях.
  • AhelpAdminPrefixWebhook: определяет, отображается ли позиция администратора в вебхуках AHELP.

Убедитесь, что эти настройки соответствуют политикам приватности и требованиям отображения информации об администраторах.


1946-1947: Изменен тип CVar ChatRateLimitPeriod

Тип конфигурационного параметра ChatRateLimitPeriod изменен с int на float для поддержки более точных значений периода ограничения скорости чата.


2188-2211: Добавлены параметры ограничения скорости взаимодействий

Введены новые конфигурационные параметры для ограничения скорости взаимодействий игроков:

  • InteractionRateLimitCount: максимальное количество взаимодействий в заданный период.
  • InteractionRateLimitPeriod: период времени для подсчета взаимодействий (в секундах).
  • InteractionRateLimitAnnounceAdminsDelay: минимальная задержка между оповещениями администраторов о превышении лимита взаимодействий.

Убедитесь, что эти параметры настроены корректно для эффективного предотвращения злоупотреблений взаимодействиями без негативного влияния на честных игроков.

Resources/Locale/en-US/interaction/interaction-system.ftl (1)

2-3: Добавлены новые строки локализации для системы взаимодействий

Добавлены следующие строки локализации:

  • interaction-system-user-interaction-cannot-reach: "You can't reach there!"
  • interaction-rate-limit-admin-announcement: сообщение для оповещения администраторов о превышении игроком лимита взаимодействий.

Убедитесь, что переводы на другие языки актуальны и сообщения отображаются корректно в игре.

Comment on lines +12 to +21
private void RegisterRateLimits()
{
ref var datum = ref CollectionsMarshal.GetValueRefOrAddDefault(_rateLimitData, player, out _);
var time = _gameTiming.RealTime;
if (datum.CountExpires < time)
{
// Period expired, reset it.
var periodLength = _configurationManager.GetCVar(CCVars.ChatRateLimitPeriod);
datum.CountExpires = time + TimeSpan.FromSeconds(periodLength);
datum.Count = 0;
datum.Announced = false;
}

var maxCount = _configurationManager.GetCVar(CCVars.ChatRateLimitCount);
datum.Count += 1;

if (datum.Count <= maxCount)
return true;

// Breached rate limits, inform admins if configured.
if (_configurationManager.GetCVar(CCVars.ChatRateLimitAnnounceAdmins))
{
if (datum.NextAdminAnnounce < time)
{
SendAdminAlert(Loc.GetString("chat-manager-rate-limit-admin-announcement", ("player", player.Name)));
var delay = _configurationManager.GetCVar(CCVars.ChatRateLimitAnnounceAdminsDelay);
datum.NextAdminAnnounce = time + TimeSpan.FromSeconds(delay);
}
}

if (!datum.Announced)
{
DispatchServerMessage(player, Loc.GetString("chat-manager-rate-limited"), suppressLog: true);
_adminLogger.Add(LogType.ChatRateLimited, LogImpact.Medium, $"Player {player} breached chat rate limits");

datum.Announced = true;
}

return false;
_rateLimitManager.Register(RateLimitKey,
new RateLimitRegistration(CCVars.ChatRateLimitPeriod,
CCVars.ChatRateLimitCount,
RateLimitPlayerLimited,
CCVars.ChatRateLimitAnnounceAdminsDelay,
RateLimitAlertAdmins,
LogType.ChatRateLimited)
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Необходимо вызвать метод RegisterRateLimits() для регистрации ограничений скорости.

Метод RegisterRateLimits() определен, но его вызов не обнаружен. Чтобы система ограничения скорости чата работала корректно, вызовите этот метод в конструкторе или методе инициализации класса ChatManager.

Comment on lines +34 to +36
public RateLimitStatus HandleRateLimit(ICommonSession player)
{
return _rateLimitManager.CountAction(player, RateLimitKey);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Обнаружены места, требующие исправления в ChatSystem.cs

В файле ChatSystem.cs найдены два места, где метод HandleRateLimit используется некорректно с устаревшей логикой булевого значения:

  • if (player != null && !_chatManager.HandleRateLimit(player))

Эти проверки должны быть обновлены для работы с RateLimitStatus, как в TTSSystem.Preview.cs:
if (HandleRateLimit(player) != RateLimitStatus.Allowed)

🔗 Analysis chain

Убедитесь, что все обращения к HandleRateLimit учитывают новый тип возвращаемого значения.

Метод HandleRateLimit теперь возвращает RateLimitStatus вместо bool. Проверьте, что все места в кодовой базе, где вызывается этот метод, обновлены для корректной обработки нового возвращаемого типа.

Запустите следующий скрипт для поиска всех вызовов HandleRateLimit и проверки их использования:


Let me check the usage context of these calls to verify if they handle the return type correctly.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск всех вызовов метода HandleRateLimit в кодовой базе

rg 'HandleRateLimit\(' -t cs

Length of output: 828


Script:

#!/bin/bash
# Get context for ChatSystem.cs calls
rg 'HandleRateLimit\(' Content.Server/Chat/Systems/ChatSystem.cs -B 2 -A 2

# Get the definition of RateLimitStatus enum
rg -g '*.cs' 'enum RateLimitStatus'

Length of output: 425


Script:

#!/bin/bash
# Get the definition of RateLimitStatus enum values
rg -g '*.cs' -A 5 'enum RateLimitStatus'

# Get more context around the TTSSystem preview usage
rg 'HandleRateLimit\(' Content.Server/_White/TTS/TTSSystem.Preview.cs -B 2 -A 2

Length of output: 739

Comment on lines +58 to +67
try
{
isDoNext = _currentlyPlaying == null ||
(_currentlyPlaying.AudioStream != null && TerminatingOrDeleted(_currentlyPlaying.AudioStream!.Value))
|| !(_currentlyPlaying.AudioStream?.Comp.Playing ?? false);
}
catch (Exception err)
{
isDoNext = true;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Необходимо логировать исключения в блоке catch для улучшения отладки.

В блоке catch исключение перехватывается, но не обрабатывается и не логируется, что затрудняет выявление потенциальных проблем.

Предлагаемое изменение для логирования исключения:

catch (Exception err)
{
    isDoNext = true;
+   _sawmill.Error($"Ошибка при проверке состояния аудиопотока: {err}");
}

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +41 to +48
// ReSharper disable once InconsistentNaming
public readonly Dictionary<string, byte[]> _cache = new();
// ReSharper disable once InconsistentNaming
public readonly HashSet<string> _cacheKeysSeq = new();
// ReSharper disable once InconsistentNaming
public int _maxCachedCount = 200;
private string _apiUrl = string.Empty;
private string _apiToken = string.Empty;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Используйте свойства вместо публичных полей с подчеркиванием

Объявление публичных полей _cache, _cacheKeysSeq и _maxCachedCount с подчеркиванием нарушает конвенции именования в C#. Рекомендуется сделать их приватными и предоставить доступ через свойства. Это улучшит инкапсуляцию и поддерживаемость кода.

Comment on lines +112 to +117
if (_cache.Count > _maxCachedCount)
{
var firstKey = _cacheKeysSeq.First();
_cache.Remove(firstKey);
_cacheKeysSeq.Remove(firstKey);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Исправьте логику удаления устаревших элементов кеша

Использование HashSet для хранения последовательности ключей _cacheKeysSeq может привести к непредсказуемому порядку элементов, так как HashSet не гарантирует сохранение порядка добавления. Рекомендуется заменить HashSet на Queue или LinkedList для обеспечения корректного порядка удаления устаревших элементов из кеша.

Примените следующий дифф для исправления:

-public readonly HashSet<string> _cacheKeysSeq = new();
+public readonly Queue<string> _cacheKeysSeq = new();
...
_cacheKeysSeq.Enqueue(cacheKey);
...
var firstKey = _cacheKeysSeq.Dequeue();
_cache.Remove(firstKey);

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +13 to +18
private ResPath GetCacheId(TTSVoicePrototype voicePrototype, string cacheId)
{
var resPath = new ResPath($"voicecache/{voicePrototype.ID}/{cacheId}.ogg").ToRootedPath();
_resourceManager.UserData.CreateDir(resPath.Directory);
return resPath.ToRootedPath();
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Улучшите безопасность работы с путями файлов

В методе GetCacheId отсутствует санитизация входных параметров и проверка безопасности пути.

Рекомендуемые изменения:

 private ResPath GetCacheId(TTSVoicePrototype voicePrototype, string cacheId)
 {
+    if (voicePrototype == null)
+        throw new ArgumentNullException(nameof(voicePrototype));
+
+    if (string.IsNullOrEmpty(cacheId))
+        throw new ArgumentException("Cache ID cannot be empty", nameof(cacheId));
+
+    // Санитизация входных параметров
+    var sanitizedId = string.Join("_", cacheId.Split(Path.GetInvalidFileNameChars()));
+
-    var resPath = new ResPath($"voicecache/{voicePrototype.ID}/{cacheId}.ogg").ToRootedPath();
+    var resPath = new ResPath($"voicecache/{voicePrototype.ID}/{sanitizedId}.ogg").ToRootedPath();
     _resourceManager.UserData.CreateDir(resPath.Directory);
     return resPath.ToRootedPath();
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
private ResPath GetCacheId(TTSVoicePrototype voicePrototype, string cacheId)
{
var resPath = new ResPath($"voicecache/{voicePrototype.ID}/{cacheId}.ogg").ToRootedPath();
_resourceManager.UserData.CreateDir(resPath.Directory);
return resPath.ToRootedPath();
}
private ResPath GetCacheId(TTSVoicePrototype voicePrototype, string cacheId)
{
if (voicePrototype == null)
throw new ArgumentNullException(nameof(voicePrototype));
if (string.IsNullOrEmpty(cacheId))
throw new ArgumentException("Cache ID cannot be empty", nameof(cacheId));
// Санитизация входных параметров
var sanitizedId = string.Join("_", cacheId.Split(Path.GetInvalidFileNameChars()));
var resPath = new ResPath($"voicecache/{voicePrototype.ID}/{sanitizedId}.ogg").ToRootedPath();
_resourceManager.UserData.CreateDir(resPath.Directory);
return resPath.ToRootedPath();
}

Comment on lines +28 to +31
catch (Exception)
{
// skip!
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Пустой блок catch может скрыть важные ошибки

Пустой блок catch может привести к тому, что важные ошибки останутся незамеченными. Рекомендуется добавить логирование ошибок для облегчения отладки.

 catch (Exception)
 {
-    // skip!
+    _sawmill.Error($"Не удалось сгенерировать TTS для объявления");
 }

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +13 to +27
private readonly List<string> _sampleText = new() // TODO: Локализация?
{
"Съешь же ещё этих мягких французских булок, да выпей чаю.",
"Клоун, прекрати разбрасывать банановые кожурки офицерам под ноги!",
"Капитан, вы уверены что хотите назначить клоуна на должность главы персонала?",
"Эс Бэ! Тут человек в сером костюме, с тулбоксом и в маске! Помогите!!",
"Учёные, тут странная аномалия в баре! Она уже съела мима!",
"Я надеюсь что инженеры внимательно следят за сингулярностью...",
"Вы слышали эти странные крики в техах? Мне кажется туда ходить небезопасно.",
"Вы не видели Гамлета? Мне кажется он забегал к вам на кухню.",
"Здесь есть доктор? Человек умирает от отравленного пончика! Нужна помощь!",
"Вам нужно согласие и печать квартирмейстера, если вы хотите сделать заказ на партию дробовиков.",
"Возле эвакуационного шаттла разгерметизация! Инженеры, нам срочно нужна ваша помощь!",
"Бармен, налей мне самого крепкого вина, которое есть в твоих запасах!"
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Необходима локализация примеров текста

Примеры текста жёстко закодированы на русском языке. Следует перенести их в систему локализации для поддержки многоязычности.

Хотите, чтобы я помог с реализацией локализации для этих текстов?

Comment on lines +42 to +47
var cached = await GetFromCache(cacheId);
if (cached != null)
{
RaiseNetworkEvent(new PlayTTSEvent(cached), Filter.SinglePlayer(args.SenderSession));
return;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Based on the search results, I can now provide a final response regarding the caching mechanism in TTSSystem:

Механизм кэширования требует улучшений

В текущей реализации кэширования TTS обнаружены следующие проблемы:

  • Отсутствует явное ограничение размера кэша на диске (в TTSSystem.Cache.cs)
  • Нет механизма очистки устаревших файлов кэша
  • Отсутствует синхронизация при конкурентном доступе к файловому кэшу

Рекомендации:

  • Добавить ограничение на общий размер кэш-файлов и удаление старых файлов при превышении лимита
  • Реализовать периодическую очистку неиспользуемых кэш-файлов
  • Использовать блокировки при работе с файловым кэшем для предотвращения race conditions
🔗 Analysis chain

Проверьте механизм кэширования

Убедитесь, что механизм кэширования имеет:

  1. Ограничение размера кэша
  2. Стратегию очистки устаревших данных
  3. Обработку конкурентного доступа
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск реализации кэширования
ast-grep --pattern 'GetFromCache($_) {
  $$$
}'

Length of output: 49


Script:

#!/bin/bash
# Поиск реализации GetFromCache с учетом возможного async
rg -A 10 "GetFromCache" 

# Поиск использования кэша и связанных структур данных
rg -A 5 "cache" -i

# Поиск конкурентных примитивов
rg -A 3 "(SemaphoreSlim|lock|Mutex|ConcurrentDictionary)"

Length of output: 66742

@@ -66,7 +69,9 @@ public static void Register()
IoCManager.Register<DiscordAuthManager>();
IoCManager.Register<ISharedPlaytimeManager, PlayTimeTrackingManager>();
IoCManager.Register<ServerApi>();
IoCManager.Register<TTSManager>(); // WD EDIT
IoCManager.Register<JobWhitelistManager>();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Обнаружена дублирующаяся регистрация JobWhitelistManager

JobWhitelistManager уже зарегистрирован выше в строке 69. Необходимо удалить дублирующуюся регистрацию.

-            IoCManager.Register<JobWhitelistManager>();

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (1)
Content.Shared.Database/LogType.cs (1)

Line range hint 420-421: Несогласованность в стиле документации

Для новых значений BagOfHolding и Psionics используются однострочные комментарии, в то время как для RateLimited используется XML-документация. Рекомендуется придерживаться единого стиля документации.

Предлагаемое решение:

- BagOfHolding = 420, //Nyano - Summary: adds bag of holding.
- Psionics = 421, //Nyano - Summary: ads psionic as a log type.
+ /// <summary>
+ /// Adds bag of holding functionality.
+ /// </summary>
+ BagOfHolding = 420,
+ /// <summary>
+ /// Adds psionic as a log type.
+ /// </summary>
+ Psionics = 421,
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between f4286ed and 9192a76.

📒 Files selected for processing (1)
  • Content.Shared.Database/LogType.cs (1 hunks)

Comment on lines 92 to 98
/// <summary>
/// User was rate-limited for some spam action.
/// </summary>
/// <remarks>
/// This is a default value used by <c>PlayerRateLimitManager</c>, though users can use different log types.
/// </remarks>
RateLimited = 87,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Критическая ошибка: Дублирование значения перечисления

Обнаружено дублирование значения 87 для RateLimited и ChatRateLimited. Это может привести к неоднозначности при логировании и нарушает принцип уникальности значений перечисления.

Рекомендации:

  1. Выберите одно из двух значений для логирования ограничения частоты
  2. Присвойте второму значению уникальный идентификатор

Предлагаемое решение:

- RateLimited = 87,
+ RateLimited = 422, // Using next available value

или объедините оба значения в одно, если они представляют схожую функциональность.

Also applies to: 420-421

Spatison and others added 5 commits December 5, 2024 21:30
…minor rewrite on respawn command and new erase command (#30433)

* Localize respawn command, allow for it to use userids, and make it use [Dependency] attributes

* Make respawn verb available for offline players

* Make erase available for offline players

A thousand admins rejoice

* Reorder verbs in code

* Add erase command

* Fix localisation for erase command

* Address reviews and add completion to respawn command

* Complete reviews which I forgor

(cherry picked from commit 9a63144636f9ef272d955f1e131b17233c6ec5da)
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

🧹 Outside diff range and nitpick comments (13)
Resources/Locale/en-US/administration/bwoink.ftl (1)

18-20: Новые строки локализации выглядят корректно

Добавленные сообщения соответствуют общему стилю файла локализации и правильно описывают новую функциональность ограничения частоты сообщений.

Рекомендуется добавить комментарии для переводчиков, объясняющие контекст использования этих сообщений.

Resources/Locale/en-US/administration/commands/respawn.ftl (4)

1-2: Проверьте согласованность описания команды!

Описание команды и формат справки соответствуют стандартам, но рекомендуется добавить примеры использования для большей ясности.

Предлагаю добавить примеры:

 cmd-respawn-desc = Respawns a player, kicking them back to the lobby.
 cmd-respawn-help = respawn [player or UserId]
+cmd-respawn-help-examples = Examples:
+    respawn John
+    respawn 12345

4-7: Улучшите информативность сообщений об ошибках!

Текущие сообщения об ошибках могут быть более информативными для пользователя.

Предлагаю следующие изменения:

-cmd-respawn-invalid-args = Must provide <= 1 argument.
+cmd-respawn-invalid-args = Error: Command accepts only 0 or 1 argument.
-cmd-respawn-no-player = If not a player, an argument must be given.
+cmd-respawn-no-player = Error: Player name or UserId required when executing from console.
-cmd-respawn-unknown-player = Unknown player
+cmd-respawn-unknown-player = Error: Player not found in the system.

8-8: Уточните сообщение о статусе игрока!

Сообщение о статусе оффлайн игрока корректно, но может быть более точным.

Предлагаю уточнить формулировку:

-cmd-respawn-player-not-online = Player is not currently online, but they will respawn if they come back online
+cmd-respawn-player-not-online = Player is offline. Respawn will be triggered automatically upon their next login.

9-9: Дополните подсказку автозаполнения!

Текущая подсказка автозаполнения слишком лаконична.

Предлагаю расширить подсказку:

-cmd-respawn-player-completion = <Username>
+cmd-respawn-player-completion = <Username or UserId>
Content.Server/GameTicking/Commands/RespawnCommand.cs (1)

46-47: Уточните сообщения об ошибках для разных ситуаций

Сообщение об ошибке cmd-respawn-unknown-player используется в двух разных случаях: когда игрок не найден по имени или ID (строки 46-47) и когда не удалось получить данные игрока (строка 57). Рекомендуется использовать разные сообщения об ошибках для этих ситуаций, чтобы предоставить более точную информацию пользователю.

Also applies to: 57-57

Content.Server/Administration/Systems/AdminSystem.cs (1)

65-65: Предложение по улучшению: Инкапсулировать поле PanicBunker

Поле PanicBunker объявлено как public readonly, что позволяет внешним классам получать к нему доступ напрямую. Рекомендуется предоставить ограниченный доступ через свойство или методы, чтобы улучшить инкапсуляцию и предотвратить непреднамеренные изменения извне.

Resources/Locale/en-US/administration/commands/erase.ftl (1)

3-3: Нитпик: Исправьте опечатку в тексте помощи команды

В строке 3 в описании параметров команды возможно допущена опечатка. Вместо "erase " лучше использовать "erase " для ясности и корректности.

Content.Server/Administration/BanPanelEui.cs (1)

135-140: Улучшена обработка ошибок при удалении игрока!

Изменения делают код более надежным, но можно улучшить обработку ошибок.

Предлагаю добавить информирование игрока об ошибке:

 try
 {
     if (_entities.TrySystem(out AdminSystem? adminSystem))
         adminSystem.Erase(targetUid.Value);
 }
 catch (Exception e)
 {
     _sawmill.Error($"Error while erasing banned player:\n{e}");
+    _chat.DispatchServerMessage(Player, Loc.GetString("ban-panel-erase-error"));
 }
Content.Server/Chat/Managers/ChatManager.cs (2)

196-197: Добавить логирование для ограничения частоты сообщений!

Реализация ограничения частоты сообщений работает корректно, но стоит добавить логирование для отладки и мониторинга.

Предлагаю добавить логирование:

+    private const string LoggerSawmill = "chat.ratelimit";
+    [Dependency] private readonly ILogManager _logManager = default!;
+    private ISawmill _sawmill = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+        _sawmill = _logManager.GetSawmill(LoggerSawmill);
+    }

     if (player != null && _chatManager.HandleRateLimit(player) != RateLimitStatus.Allowed)
+    {
+        _sawmill.Debug($"Rate limit exceeded for player {player.Name}");
         return;
+    }

Also applies to: 295-296


169-182: Добавить проверку входных параметров в SendAdminAlert!

Реализация хорошая, но стоит добавить проверку входных параметров для большей надежности.

Предлагаю добавить проверки:

     public void SendAdminAlert(EntityUid player, string message)
     {
+        if (string.IsNullOrEmpty(message))
+        {
+            _sawmill.Warning($"Attempted to send empty admin alert for player {player}");
+            return;
+        }
+
         var mindSystem = _entityManager.System<SharedMindSystem>();
         if (!mindSystem.TryGetMind(player, out var mindId, out var mind))
         {
             SendAdminAlert(message);
             return;
         }
Content.Server/Chat/Systems/ChatSystem.cs (1)

196-197: Добавить документацию для телепатического чата!

Реализация телепатического чата работает корректно, но требуется документация для лучшего понимания функциональности.

Предлагаю добавить XML-документацию:

+    /// <summary>
+    /// Обрабатывает телепатические сообщения между игроками.
+    /// </summary>
+    /// <param name="source">Сущность-отправитель</param>
+    /// <param name="message">Текст сообщения</param>
+    /// <param name="hideChat">Флаг скрытия сообщения в чате</param>
     public void SendTelepathicChat(EntityUid source, string message, bool hideChat)
     {
         // ... existing implementation
     }
Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs (1)

Line range hint 5-6: Рассмотрите добавление документации для DefaultSexVoice

Словарь DefaultSexVoice играет важную роль в системе, но не имеет XML-документации, объясняющей его назначение и использование.

Предлагаемые изменения:

+    /// <summary>
+    /// Сопоставляет пол персонажа с голосом по умолчанию.
+    /// Используется при создании нового персонажа или сбросе настроек голоса.
+    /// </summary>
     public static readonly Dictionary<Sex, string> DefaultSexVoice = new()
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 9897751 and 8055d6d.

📒 Files selected for processing (18)
  • Content.Client/Entry/EntryPoint.cs (0 hunks)
  • Content.Server/Administration/BanPanelEui.cs (1 hunks)
  • Content.Server/Administration/Commands/EraseCommand.cs (1 hunks)
  • Content.Server/Administration/Systems/AdminSystem.cs (2 hunks)
  • Content.Server/Administration/Systems/AdminVerbSystem.cs (5 hunks)
  • Content.Server/Chat/Managers/ChatManager.cs (1 hunks)
  • Content.Server/Chat/Managers/IChatManager.cs (4 hunks)
  • Content.Server/Chat/Systems/ChatSystem.cs (3 hunks)
  • Content.Server/Entry/EntryPoint.cs (2 hunks)
  • Content.Server/GameTicking/Commands/RespawnCommand.cs (1 hunks)
  • Content.Server/IoC/ServerContentIoC.cs (3 hunks)
  • Content.Server/Players/RateLimiting/PlayerRateLimitManager.cs (1 hunks)
  • Content.Shared.Database/LogType.cs (1 hunks)
  • Content.Shared/CCVar/CCVars.cs (4 hunks)
  • Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs (1 hunks)
  • Resources/Locale/en-US/administration/bwoink.ftl (1 hunks)
  • Resources/Locale/en-US/administration/commands/erase.ftl (1 hunks)
  • Resources/Locale/en-US/administration/commands/respawn.ftl (1 hunks)
💤 Files with no reviewable changes (1)
  • Content.Client/Entry/EntryPoint.cs
🚧 Files skipped from review as they are similar to previous changes (2)
  • Content.Server/IoC/ServerContentIoC.cs
  • Content.Shared.Database/LogType.cs
🔇 Additional comments (21)
Content.Server/Entry/EntryPoint.cs (1)

123-123: Инициализация менеджера ограничения частоты действий выглядит корректно

Размещение инициализации PlayerRateLimitManager после JobWhitelistManager логично, так как они относятся к одной области функциональности.

Resources/Locale/en-US/administration/commands/respawn.ftl (1)

1-9: Проверьте согласованность ключей локализации!

Необходимо убедиться, что названия ключей локализации соответствуют общему паттерну команд администратора.

✅ Verification successful

Let me check the naming patterns for other localization keys to ensure completeness.


Ключи локализации соответствуют общему паттерну

Проверка показала, что все ключи локализации в файле respawn.ftl следуют единому паттерну именования, используемому в других командных файлах:

  • Префикс cmd- для всех ключей
  • Суффиксы -desc и -help для описания и справки
  • Дополнительные суффиксы для сообщений об ошибках и подсказок
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверяем паттерны именования в других файлах локализации команд
rg -g "*.ftl" "cmd-.*-desc|cmd-.*-help" "Resources/Locale/en-US/administration/commands/"

Length of output: 3649


Script:

#!/bin/bash
# Check for other command-related keys to ensure full pattern consistency
rg -g "*.ftl" "cmd-.*" "Resources/Locale/en-US/administration/commands/"

Length of output: 5529

Content.Shared/CCVar/CCVars.cs (3)

959-974: Конфигурация для обхода ограничений администраторами выглядит правильно!

Новые CVar'ы для управления обходом ограничений администраторами и отображением пользовательских званий хорошо документированы и корректно настроены.


975-1011: Конфигурация ограничений частоты AHELP реализована корректно!

CVar'ы для управления ограничениями частоты сообщений AHELP и отображением позиции администратора имеют правильную документацию и настройки.


2203-2230: Конфигурация ограничений частоты взаимодействий реализована правильно!

CVar'ы для управления ограничениями частоты взаимодействий хорошо документированы и включают подробное обоснование выбранных значений по умолчанию.

Content.Server/GameTicking/Commands/RespawnCommand.cs (2)

11-11: Изменение базового класса на LocalizedEntityCommands выглядит корректным

Переход от IConsoleCommand к LocalizedEntityCommands позволяет использовать локализованные команды и улучшает структуру кода.


53-62: Проверьте корректность стирания разума офлайн игрока

В случае отсутствия сессии игрока и успешного получения данных вызывается _mind.WipeMind(data.ContentData()?.Mind);. Убедитесь, что стирание разума офлайн игрока является ожидаемым поведением и не приведёт к неожиданным последствиям для игрока при следующем входе в игру.

Content.Server/Administration/Systems/AdminVerbSystem.cs (9)

37-40: Добавлены новые зависимости для законов силиконов и управления игроками

Добавлены using директивы для Content.Server.Silicons.Laws, Content.Shared.Silicons.Laws, Content.Shared.Silicons.Laws.Components и Robust.Server.Player, что обеспечит необходимые зависимости для новых функциональностей.


74-76: Корректное внедрение зависимостей через атрибуты [Dependency]

Поля _freeze, _playerManager и _siliconLawSystem правильно объявлены с атрибутом [Dependency] и инициализированы как default!, что соответствует стандартам внедрения зависимостей.


161-161: Проверьте корректность использования дополнительного аргумента в _mindSystem.TransferTo

В вызове _mindSystem.TransferTo(targetMind.Value, mobUid, true); добавлен аргумент true. Убедитесь, что метод TransferTo принимает этот аргумент и что использование дополнительного параметра соответствует ожидаемому поведению системы (например, перезапись существующего носителя сознания).


191-198: Добавлен новый верб для открытия панели игрока

Реализация верба для открытия панели игрока (playerpanel) корректна. Команда вызывается правильно с использованием идентификатора пользователя targetActor.PlayerSession.UserId.


200-230: Добавлены вербы 'Erase' и 'Respawn' с использованием UserId

Вербы для удаления (Erase) и возрождения (Respawn) игрока правильно добавлены. Использование mind.UserId после проверки на null обеспечивает безопасное выполнение действий.


225-225: Убедитесь, что mind.UserId корректно форматируется в команде respawn

Вызов _console.ExecuteCommand(player, $"respawn \"{mind.UserId}\""); использует интерполяцию строки с mind.UserId. Убедитесь, что идентификатор пользователя правильно форматируется в строку и что команда respawn принимает ожидаемый формат идентификатора.


232-282: Реализованы вербы 'Freeze', 'Freeze and Mute' и 'Unfreeze' с корректной логикой

Логика определения состояния заморозки игрока и добавления соответствующих вербов реализована правильно. Учитываются различные состояния: когда игрок не заморожен, заморожен или заморожен с запрещением чата.


351-369: Добавлен верб для доступа к интерфейсу законов силиконов

Верб для открытия интерфейса законов силиконов (Silicon Law UI) добавлен корректно. Проверяется наличие компонента SiliconLawBoundComponent, и осуществляется безопасное получение сессии игрока через _playerManager.TryGetSessionByEntity.


360-363: Убедитесь, что args.User всегда соответствует активной сессии игрока

В методе используется _playerManager.TryGetSessionByEntity(args.User, out var session). Необходимо удостовериться, что args.User всегда связан с активной сессией игрока, чтобы избежать потенциальных ситуаций, когда сессия не будет получена и метод вернёт выполнение без действий.

Content.Server/Administration/Systems/AdminSystem.cs (1)

338-399: Код соответствует требованиям

Метод Erase реализован корректно, логика удаления игрока и связанных с ним данных выполнена аккуратно и эффективно.

Content.Server/Administration/Commands/EraseCommand.cs (1)

38-46: Код соответствует требованиям

Реализация команды EraseCommand выглядит корректной, и методы Execute и GetCompletion работают ожидаемым образом.

Content.Server/Chat/Managers/IChatManager.cs (1)

Line range hint 27-55: Код соответствует требованиям

Изменения в интерфейсе IChatManager обоснованы и соответствуют современной архитектуре приложения. Обновленные сигнатуры методов улучшают согласованность и расширяют функциональность.

Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs (2)

333-333: ⚠️ Potential issue

Проверьте обработку ошибок при установке голоса

Присвоение VoicePrototypeId выполняется без проверки существования прототипа голоса. Это может привести к ошибкам во время выполнения.

Предлагаемые изменения:

-        comp.VoicePrototypeId = voiceId;
+        if (_proto.HasIndex<TTSVoicePrototype>(voiceId))
+        {
+            comp.VoicePrototypeId = voiceId;
+        }
+        else
+        {
+            comp.VoicePrototypeId = DefaultVoice;
+            Log.Warning($"Attempted to set invalid voice ID {voiceId}, falling back to default");
+        }

Line range hint 4-4: Проверьте валидность значения DefaultVoice

Убедитесь, что значение "Eugene" существует в прототипах голосов.

✅ Verification successful

Голос Eugene существует в прототипах

Проверка показала, что голос "Eugene" определен в файле прототипов Resources/Prototypes/_White/Voice/tts_voices.yml как действительный TTS-голос со следующими параметрами:

- type: ttsVoice
  id: Eugene
  name: tts-voice-name-eugene
  sex: Male
  speaker: eugene
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверяем наличие прототипа голоса Eugene
rg -l "id: Eugene" Resources/Prototypes/Voice

Length of output: 47


Script:

#!/bin/bash
# Поиск файлов с прототипами голосов
fd . Resources/Prototypes -t f -e yml -e yaml | xargs cat

# Поиск использования DefaultVoice
ast-grep --pattern 'DefaultVoice = "$_"'

Length of output: 68722


Script:

#!/bin/bash
# Поиск файлов с прототипами голосов в директории Resources
fd . Resources -t f -e yml -e yaml | grep -i voice | xargs cat

# Поиск всех упоминаний Eugene в коде
rg "Eugene" -l

Length of output: 56631

Comment on lines +15 to +21
<<<<<<< HEAD
=======

bwoink-title-none-selected = None selected

bwoink-system-rate-limited = System: you are sending messages too quickly.
>>>>>>> c33644532d (Rate limit ahelps (#29219))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Необходимо разрешить конфликт слияния

В файле присутствуют маркеры конфликта слияния Git (<<<<<<< HEAD, =======, >>>>>>), которые необходимо удалить перед слиянием изменений.

Примените следующие изменения для разрешения конфликта:

-<<<<<<< HEAD
-=======
-
bwoink-title-none-selected = None selected

bwoink-system-rate-limited = System: you are sending messages too quickly.
->>>>>>> c33644532d (Rate limit ahelps (#29219))
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<<<<<<< HEAD
=======
bwoink-title-none-selected = None selected
bwoink-system-rate-limited = System: you are sending messages too quickly.
>>>>>>> c33644532d (Rate limit ahelps (#29219))
bwoink-title-none-selected = None selected
bwoink-system-rate-limited = System: you are sending messages too quickly.

Comment on lines +20 to +24
<<<<<<< HEAD
=======
using Content.Server.Players;
using Content.Server.Players.JobWhitelist;
>>>>>>> c33644532d (Rate limit ahelps (#29219))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Необходимо разрешить конфликт слияния

В коде присутствуют маркеры конфликта слияния (<<<<<<< HEAD, =======, >>>>>>>), которые необходимо удалить. Также присутствует дублирование директивы using Content.Server.Players.JobWhitelist.

Примените следующие изменения:

-<<<<<<< HEAD
-
-=======
using Content.Server.Players;
-using Content.Server.Players.JobWhitelist;
->>>>>>> c33644532d (Rate limit ahelps (#29219))

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines 1012 to 1030
/*
* AHELP
*/

/// <summary>
/// Ahelp rate limit values are accounted in periods of this size (seconds).
/// After the period has passed, the count resets.
/// </summary>
/// <seealso cref="AhelpRateLimitCount"/>
public static readonly CVarDef<int> AhelpRateLimitPeriod =
CVarDef.Create("ahelp.rate_limit_period", 2, CVar.SERVERONLY);

/// <summary>
/// How many ahelp messages are allowed in a single rate limit period.
/// </summary>
/// <seealso cref="AhelpRateLimitPeriod"/>
public static readonly CVarDef<int> AhelpRateLimitCount =
CVarDef.Create("ahelp.rate_limit_count", 10, CVar.SERVERONLY);

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Обнаружено дублирование секции AHELP!

Этот блок кода является точной копией предыдущей секции AHELP (строки 975-1011) с небольшими отличиями в типах. Необходимо удалить дублирование.

Примените следующие изменения:

-        /*
-         * AHELP
-         */
-
-        /// <summary>
-        /// Ahelp rate limit values are accounted in periods of this size (seconds).
-        /// After the period has passed, the count resets.
-        /// </summary>
-        /// <seealso cref="AhelpRateLimitCount"/>
-        public static readonly CVarDef<int> AhelpRateLimitPeriod =
-            CVarDef.Create("ahelp.rate_limit_period", 2, CVar.SERVERONLY);
-
-        /// <summary>
-        /// How many ahelp messages are allowed in a single rate limit period.
-        /// </summary>
-        /// <seealso cref="AhelpRateLimitPeriod"/>
-        public static readonly CVarDef<int> AhelpRateLimitCount =
-            CVarDef.Create("ahelp.rate_limit_count", 10, CVar.SERVERONLY);

Committable suggestion skipped: line range outside the PR's diff.

public void Execute(IConsoleShell shell, string argStr, string[] args)
public override string Command => "respawn";

public override async void Execute(IConsoleShell shell, string argStr, string[] args)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Избегайте использования async void в методе Execute

Использование async void может привести к тому, что исключения не будут правильно обработаны и могут вызвать неожиданное завершение программы. Рекомендуется изменить сигнатуру метода на public override async Task Execute(...) и соответствующим образом изменить вызывающий код.

Примените следующий дифф для исправления сигнатуры метода:

-public override async void Execute(IConsoleShell shell, string argStr, string[] args)
+public override async Task Execute(IConsoleShell shell, string argStr, string[] args)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public override async void Execute(IConsoleShell shell, string argStr, string[] args)
public override async Task Execute(IConsoleShell shell, string argStr, string[] args)

Comment on lines +4 to +7
<<<<<<< HEAD
using Content.Shared.Players.RateLimiting;
=======
>>>>>>> c33644532d (Rate limit ahelps (#29219))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Критическая ошибка: Неразрешенные конфликты слияния в коде

В строках 4-7 обнаружены маркеры конфликтов слияния Git (<<<<<< HEAD, =======, >>>>>> c33644532d). Это указывает на неразрешенные конфликты в коде, которые необходимо решить. Пожалуйста, разрешите конфликты и удалите эти маркеры для обеспечения корректной компиляции и работы приложения.

Comment on lines +51 to +66
public override RateLimitStatus CountAction(ICommonSession player, string key)
=======
/// <summary>
/// Count and validate an action performed by a player against rate limits.
/// </summary>
/// <param name="player">The player performing the action.</param>
/// <param name="key">The key string that was previously used to register a rate limit category.</param>
/// <returns>Whether the action counted should be blocked due to surpassing rate limits or not.</returns>
/// <exception cref="ArgumentException">
/// <paramref name="player"/> is not a connected player
/// OR <paramref name="key"/> is not a registered rate limit category.
/// </exception>
/// <seealso cref="Register"/>
public RateLimitStatus CountAction(ICommonSession player, string key)
>>>>>>> c33644532d (Rate limit ahelps (#29219))
{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Критическая ошибка: Неразрешенный конфликт слияния в методе CountAction

В методе CountAction (строки 51-66) обнаружены маркеры конфликтов слияния Git. Это указывает на неразрешенные конфликты в коде метода. Пожалуйста, разрешите конфликты и удалите соответствующие маркеры.

Comment on lines +122 to +135
public override void Register(string key, RateLimitRegistration registration)
=======
/// <summary>
/// Register a new rate limit category.
/// </summary>
/// <param name="key">
/// The key string that will be referred to later with <see cref="CountAction"/>.
/// Must be unique and should probably just be a constant somewhere.
/// </param>
/// <param name="registration">The data specifying the rate limit's parameters.</param>
/// <exception cref="InvalidOperationException"><paramref name="key"/> has already been registered.</exception>
/// <exception cref="ArgumentException"><paramref name="registration"/> is invalid.</exception>
public void Register(string key, RateLimitRegistration registration)
>>>>>>> c33644532d (Rate limit ahelps (#29219))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Критическая ошибка: Неразрешенный конфликт слияния в методе Register

В строках 122-135 присутствуют маркеры конфликтов слияния Git в методе Register. Необходимо решить конфликт и удалить маркеры, чтобы обеспечить корректную работу метода.

Comment on lines +176 to +183
public override void Initialize()
=======
/// <summary>
/// Initialize the manager's functionality at game startup.
/// </summary>
public void Initialize()
>>>>>>> c33644532d (Rate limit ahelps (#29219))
{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Критическая ошибка: Неразрешенный конфликт слияния в методе Initialize

В методе Initialize (строки 176-183) обнаружен маркер конфликта слияния Git. Это свидетельствует о неразрешенном конфликте в коде. Пожалуйста, разрешите конфликт и удалите маркеры.

Comment on lines +226 to +290
=======

/// <summary>
/// Contains all data necessary to register a rate limit with <see cref="PlayerRateLimitManager.Register"/>.
/// </summary>
public sealed class RateLimitRegistration
{
/// <summary>
/// CVar that controls the period over which the rate limit is counted, measured in seconds.
/// </summary>
public required CVarDef<int> CVarLimitPeriodLength { get; init; }

/// <summary>
/// CVar that controls how many actions are allowed in a single rate limit period.
/// </summary>
public required CVarDef<int> CVarLimitCount { get; init; }

/// <summary>
/// An action that gets invoked when this rate limit has been breached by a player.
/// </summary>
/// <remarks>
/// This can be used for informing players or taking administrative action.
/// </remarks>
public required Action<ICommonSession> PlayerLimitedAction { get; init; }

/// <summary>
/// CVar that controls the minimum delay between admin notifications, measured in seconds.
/// This can be omitted to have no admin notification system.
/// </summary>
/// <remarks>
/// If set, <see cref="AdminAnnounceAction"/> must be set too.
/// </remarks>
public CVarDef<int>? CVarAdminAnnounceDelay { get; init; }

/// <summary>
/// An action that gets invoked when a rate limit was breached and admins should be notified.
/// </summary>
/// <remarks>
/// If set, <see cref="CVarAdminAnnounceDelay"/> must be set too.
/// </remarks>
public Action<ICommonSession>? AdminAnnounceAction { get; init; }

/// <summary>
/// Log type used to log rate limit violations to the admin logs system.
/// </summary>
public LogType AdminLogType { get; init; } = LogType.RateLimited;
}

/// <summary>
/// Result of a rate-limited operation.
/// </summary>
/// <seealso cref="PlayerRateLimitManager.CountAction"/>
public enum RateLimitStatus : byte
{
/// <summary>
/// The action was not blocked by the rate limit.
/// </summary>
Allowed,

/// <summary>
/// The action was blocked by the rate limit.
/// </summary>
Blocked,
}
>>>>>>> c33644532d (Rate limit ahelps (#29219))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Критическая ошибка: Неразрешенные конфликты слияния в конце файла

В строках 226-290 имеются маркеры конфликтов слияния Git, что указывает на неразрешенные конфликты в конце файла. Пожалуйста, разрешите эти конфликты и удалите маркеры для обеспечения корректной компиляции.

Comment on lines +28 to +34
private static readonly Dictionary<string, string> PatronOocColors = new()
{
// I had plans for multiple colors and those went nowhere so...
{ "nuclear_operative", "#aa00ff" },
{ "syndicate_agent", "#aa00ff" },
{ "revolutionary", "#aa00ff" }
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Требуется улучшение реализации цветов для патронов!

Текущая реализация имеет несколько проблем:

  1. Жестко закодированные цвета лучше вынести в конфигурацию
  2. Все типы патронов используют один и тот же цвет
  3. Комментарий указывает на незавершенность реализации

Предлагаю следующие изменения:

-    private static readonly Dictionary<string, string> PatronOocColors = new()
-    {
-        // I had plans for multiple colors and those went nowhere so...
-        { "nuclear_operative", "#aa00ff" },
-        { "syndicate_agent", "#aa00ff" },
-        { "revolutionary", "#aa00ff" }
-    };
+    [Dependency] private readonly IConfigurationManager _config = default!;
+    
+    private Dictionary<string, string> PatronOocColors => new()
+    {
+        { "nuclear_operative", _config.GetCVar(CCVars.PatronColorNuclearOperative) },
+        { "syndicate_agent", _config.GetCVar(CCVars.PatronColorSyndicateAgent) },
+        { "revolutionary", _config.GetCVar(CCVars.PatronColorRevolutionary) }
+    };

Committable suggestion skipped: line range outside the PR's diff.

@Spatison Spatison closed this Dec 5, 2024
@Spatison Spatison deleted the new-tts branch December 5, 2024 21:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants