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

[PORT] Book printer #651

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open

[PORT] Book printer #651

wants to merge 6 commits into from

Conversation

CrimeMoot
Copy link
Collaborator

@CrimeMoot CrimeMoot commented Nov 30, 2024

Порт принтера книг, и их сохранение для дальнейшего использование в других раундах. Взято с https://github.com/AdventureTimeSS14/space_station_ADT , AdventureTimeSS14/space_station_ADT@c5d5fa4

CL: KashRas2

Summary by CodeRabbit

  • Новые функции

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

    • Улучшена обработка состояния и визуальных эффектов принтера книг в зависимости от его работы и наличия чернил.
  • Документация

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

Copy link

coderabbitai bot commented Nov 30, 2024

Процесс

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

Изменения

Файл Резюме изменений
Content.Client/_Cats/BookPrinter/BookPrinterBoundUserInterface.cs Добавлен класс BookPrinterBoundUserInterface, который управляет пользовательским интерфейсом принтера книг. Реализованы методы для открытия интерфейса и обновления его состояния.
Content.Client/_Cats/BookPrinter/BookPrinterWindow.xaml Создан XAML-файл для интерфейса окна принтера книг с кнопками для взаимодействия и списком книг.
Content.Client/_Cats/BookPrinter/BookTerminalWindow.xaml.cs Добавлен класс BookPrinterWindow, который управляет состоянием интерфейса и обновляет список книг.
Content.Client/_Cats/BookPrinter/Visualizers/BookPrinterVisualizerSystem.cs Добавлен класс BookPrinterVisualizerSystem, который управляет визуальными обновлениями принтера книг.
Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.Designer.cs Добавлена миграция для создания схемы базы данных для сущностей, связанных с принтером книг.
Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.cs Добавлена миграция для создания таблиц book_printer_entry и stamped_data.
Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs Обновлён снимок модели базы данных с новыми сущностями BookPrinterEntry и StampedData.
Content.Server.Database/Model.cs Добавлены классы BookPrinterEntry и StampedData в контекст базы данных.
Content.Server/Database/ServerDbBase.cs Добавлены методы для получения и загрузки записей принтера книг.
Content.Server/Database/ServerDbManager.cs Добавлены новые методы для управления записями принтера книг в интерфейсе IServerDbManager.
Content.Server/_Cats/BookPrinter/BookPrinterSystem.cs Добавлен класс BookPrinterSystem, который управляет функциональностью печати книг.
Content.Server/_Cats/BookPrinter/Components/BookPrinterComponent.cs Добавлен компонент BookPrinterComponent, управляющий данными принтера книг.
Content.Shared/Paper/PaperSystem.cs Обновлён метод TryStamp для улучшения обработки состояния печати.
Content.Shared/_Cats/BookPrinter/Components/BookPrinterCartridgeComponent.cs Добавлен компонент BookPrinterCartridgeComponent для управления зарядом картриджа.
Content.Shared/_Cats/BookPrinter/Components/BookPrinterVisualsComponent.cs Добавлен компонент BookPrinterVisualsComponent для управления визуальными состояниями принтера.
Content.Shared/_Cats/BookPrinter/SharedBookPrinter.cs Добавлены классы и перечисления для управления состоянием пользовательского интерфейса принтера книг.
Resources/Locale/ru-RU/... Добавлены локализации для интерфейса и функциональности принтера книг на русском языке.
Resources/Prototypes/... Добавлены новые сущности и конфигурации для поддержки функциональности принтера книг.

Стихотворение

🐇 В мире книг и печати,
Мы рады вам сообщить,
Новый принтер с возможностями,
Готов к работе, не спешит!
Кнопки, окна и локализация,
Печать книг — наша страсть,
С новым интерфейсом, с обновлением,
Давайте вместе радость создать! 📚✨


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 generate docstrings to generate docstrings for this PR. (Beta)
  • @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

github-actions bot commented Nov 30, 2024

RSI Diff Bot; head commit a211162 merging into 67cab8c
This PR makes changes to 1 or more RSIs. Here is a summary of all changes:

Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi

State Old New Status
icon Added
inhand-left Added
inhand-right Added

Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi

State Old New Status
full Added
high Added
icon Added
low Added
medium Added
none Added
slotted Added
working Added

Edit: diff updated after a211162

Copy link

@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: 29

🧹 Outside diff range and nitpick comments (30)
Resources/Prototypes/Catalog/VendingMachines/Inventories/curadrobe.yml (1)

18-19: Проверьте соответствие нового оборудования тематике автомата

Убедитесь, что добавленные предметы соответствуют тематике 'CuraDrobeInventory', который, как правило, содержит предметы для куратора и библиотекаря. Если это уместно, то всё в порядке.

Content.Shared/_Cats/BookPrinter/Components/BookPrinterVisualsComponent.cs (1)

11-12: Проверьте стиль именования в DataField

Поле doWorkAnimation в атрибуте DataField использует стиль camelCase. В проекте обычно используется snake_case для именования полей данных. Рекомендуется изменить на do_work_animation для согласованности с остальным кодом.

Content.Client/_Cats/BookPrinter/BookPrinterBoundUserInterface.cs (1)

38-48: Повторяющийся код в обработчиках событий мыши

Обработчики OnPrintBookButtonMouseEntered и OnPrintBookButtonMouseExited выполняют одинаковый код по обновлению информации контейнера. Возможно, это избыточно. Стоит проверить, необходимо ли обновлять информацию в обоих случаях, или же логика должна отличаться.

Resources/Prototypes/_SpaceCats/Entities/Structures/Machines/Computers/book_printer.yml (2)

4-5: Добавьте локализацию для имени и описания

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

Предложение:

-  name: book printer
-  description: A breeding ground for propaganda, a destroyer of democracy. Allows you to copy books and also enter them into the database.
+  name: book-printer-entity-name
+  description: book-printer-entity-description

5-5: Избегайте субъективных выражений в описании

Описание "A breeding ground for propaganda, a destroyer of democracy." может быть воспринято как субъективное или неуместное. Рекомендуется использовать более нейтральное и профессиональное описание.

Предложение:

-  description: A breeding ground for propaganda, a destroyer of democracy. Allows you to copy books and also enter them into the database.
+  description: Allows you to copy and archive books into the database.
Content.Client/_Cats/BookPrinter/BookTerminalWindow.xaml.cs (2)

71-80: Вынесите магическое число в константу

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

Предложение:

+ private const int MaxDescriptionLength = 47;

public string CutDescription(string? text)
{
    if (text is null)
        return "";

-    if (text.Length <= 47)
+    if (text.Length <= MaxDescriptionLength)
        return text;

-    return text.Substring(0, 47) + "...";
+    return text.Substring(0, MaxDescriptionLength) + "...";
}

106-107: Обработайте случай, когда сущность книги не найдена

Если _entMan.TryGetEntity возвращает false, рекомендуется обработать этот случай, чтобы избежать потенциальных проблем при использовании bookPreview.

Предложение:

if (_entMan.TryGetEntity(state.BookEntity, out var bookEntity))
    bookPreview.SetEntity(bookEntity);
else
    bookPreview.Visible = false; // Или другое подходящее действие
Content.Server.Database/Model.cs (3)

48-48: Рассмотрите переименование свойства DbSet для согласованности

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

Примените этот дифф, чтобы переименовать свойство:

-public DbSet<BookPrinterEntry> BookPrinterEntry { get; set; } = null!;
+public DbSet<BookPrinterEntry> BookPrinterEntries { get; set; } = null!;

57-59: Индекс на первичный ключ может быть избыточным

Вы создаете уникальный индекс на поле Id в BookPrinterEntry, которое уже помечено атрибутом [Key]. В большинстве случаев первичный ключ автоматически индексируется и гарантирует уникальность, поэтому дополнительный индекс может быть избыточным.


662-662: Рассмотрите использование перечисления для StampState

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

Пример реализации:

public enum StampState
{
    Void,
    Approved,
    Rejected
    // Добавьте другие состояния при необходимости
}

public StampState StampState { get; set; } = StampState.Void;
Content.Shared/_Cats/BookPrinter/Components/BookPrinterCartridgeComponent.cs (1)

8-10: Рассмотрите добавление документации к компоненту

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

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

 [RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+/// <summary>
+/// Компонент, представляющий картридж для принтера книг.
+/// Отслеживает текущий и максимальный заряд картриджа.
+/// </summary>
 public sealed partial class BookPrinterCartridgeComponent : Component
Content.Client/_Cats/BookPrinter/Visualizers/BookPrinterlVisualizerSystem.cs (3)

1-10: Исправьте опечатку в имени файла

Файл назван BookPrinterlVisualizerSystem.cs (обратите внимание на букву 'l'), но класс называется BookPrinterVisualizerSystem. Необходимо переименовать файл для соответствия имени класса.


16-20: Добавьте документацию для анимации

Рекомендуется добавить комментарии, объясняющие при каких условиях активируется анимация работы принтера и как она связана с флагом DoWorkAnimation.


21-27: Вынесите строковый идентификатор в константу

Строковый литерал "cartridgeSlot" используется несколько раз в коде. Рекомендуется вынести его в константу на уровне класса.

+ private const string CartridgeSlotId = "cartridgeSlot";

- args.Sprite.LayerSetVisible(slotLayer, (_itemSlotsSystem.GetItemOrNull(uid, "cartridgeSlot") is not null));
+ args.Sprite.LayerSetVisible(slotLayer, (_itemSlotsSystem.GetItemOrNull(uid, CartridgeSlotId) is not null));

- var cartridge = _itemSlotsSystem.GetItemOrNull(uid, "cartridgeSlot");
+ var cartridge = _itemSlotsSystem.GetItemOrNull(uid, CartridgeSlotId);
Content.Shared/Paper/PaperSystem.cs (2)

Line range hint 191-196: Улучшить стиль комментария и добавить документацию

Реализация проверки состояния штампа корректна, но есть замечания по оформлению:

  1. Инлайн-комментарий // Cats-BookPrinter не несет смысловой нагрузки
  2. Отсутствует документация о назначении новой проверки

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

-            if ((entity.Comp.StampState == null || entity.Comp.StampState == "paper_stamp-void") && TryComp<AppearanceComponent>(entity, out var appearance)) // Cats-BookPrinter
+            // Only update stamp state if it's not already set or is in initial state
+            if ((entity.Comp.StampState == null || entity.Comp.StampState == "paper_stamp-void") && TryComp<AppearanceComponent>(entity, out var appearance))

217-223: Улучшить именование параметра и документацию

Изменения в методе SetContent требуют улучшения:

  1. Параметр doNewline недостаточно описательный
  2. Комментарии // Cats-BookPrinter-Start/End избыточны
  3. Отсутствует документация нового параметра

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

-    public void SetContent(Entity<PaperComponent> entity, string content, bool? doNewline = true) // Cats-BookPrinter
+    /// <summary>
+    /// Sets the content of a paper entity
+    /// </summary>
+    /// <param name="entity">The paper entity to modify</param>
+    /// <param name="content">The content to set</param>
+    /// <param name="appendNewline">Whether to append a newline character to the content</param>
+    public void SetContent(Entity<PaperComponent> entity, string content, bool? appendNewline = true)
     {
         entity.Comp.Content = content;
-        // Cats-BookPrinter-Start
-        if (doNewline is not null && doNewline.Value)
+        if (appendNewline is not null && appendNewline.Value)
             entity.Comp.Content += '\n';
-        // Cats-BookPrinter-End
Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.cs (3)

13-27: Рекомендуется добавить ограничения на текстовые поля

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

  1. Добавить ограничение длины для полей name и description
  2. Создать индекс по полю name для ускорения поиска

Пример улучшения:

 name = table.Column<string>(type: "TEXT", nullable: false),
+    .Annotation("Sqlite:MaxLength", 100),
 description = table.Column<string>(type: "TEXT", nullable: false),
+    .Annotation("Sqlite:MaxLength", 500),

29-47: Возможные проблемы с целостностью данных

Обнаружены потенциальные проблемы в структуре таблицы stamped_data:

  1. Nullable внешний ключ book_printer_entry_id может привести к накоплению "осиротевших" записей
  2. Отсутствует CASCADE DELETE для автоматической очистки связанных записей

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

 table.ForeignKey(
     name: "FK_stamped_data_book_printer_entry_book_printer_entry_id",
     column: x => x.book_printer_entry_id,
     principalTable: "book_printer_entry",
-    principalColumn: "book_printer_entry_id");
+    principalColumn: "book_printer_entry_id",
+    onDelete: ReferentialAction.Cascade);

49-58: Избыточный уникальный индекс

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

Рекомендуется удалить избыточный индекс:

-migrationBuilder.CreateIndex(
-    name: "IX_book_printer_entry_book_printer_entry_id",
-    table: "book_printer_entry",
-    column: "book_printer_entry_id",
-    unique: true);
Content.Client/_Cats/BookPrinter/BookPrinterWindow.xaml (1)

1-6: Рекомендуется добавить ограничение максимального размера окна

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

  • Добавить MaxSize для предотвращения чрезмерного растягивания окна
  • Уменьшить MinSize для поддержки экранов с низким разрешением
 <DefaultWindow
             xmlns="https://spacestation14.io"
             xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
             Title="{Loc 'book-printer-title'}"
-            SetSize="525 475"
-            MinSize="525 475">
+            SetSize="525 475"
+            MinSize="400 350"
+            MaxSize="800 700">
Content.Server/Database/ServerDbBase.cs (1)

1524-1529: Рекомендуется добавить пагинацию для GetBookPrinterEntries.

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

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

-        protected async Task<List<BookPrinterEntry>> GetBookPrinterEntriesImpl(DbGuard db)
+        protected async Task<List<BookPrinterEntry>> GetBookPrinterEntriesImpl(
+            DbGuard db,
+            int skip = 0,
+            int take = 50)
         {
             return await db.DbContext.BookPrinterEntry
                 .Include(entry => entry.StampedBy)
+                .Skip(skip)
+                .Take(take)
                 .ToListAsync();
         }
Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.Designer.cs (2)

484-518: Добавьте ограничения и индексы для сущности BookPrinterEntry

Для обеспечения целостности данных и повышения производительности рекомендуется добавить ограничения NOT NULL для полей Name, Description и Content, если они обязательны. Также рассмотрите возможность добавления уникального индекса на поле Name, если требуется уникальность записей.


862-865: Проверьте соответствие индексов для Round

В сущности Round индекс создается по ServerId. Убедитесь, что этот индекс необходим для производительности запросов. Если индекс не используется, его можно удалить, чтобы уменьшить нагрузку на базу данных.

Content.Server/_Cats/BookPrinter/Components/BookPrinterComponent.cs (2)

13-18: Рекомендуется добавить константы для путей к звуковым файлам

Пути к звуковым файлам жёстко закодированы. Лучше вынести их в константы для упрощения поддержки.

+    private const string WorkSoundPath = "/Audio/Machines/tray_eject.ogg";
+    private const string ClickSoundPath = "/Audio/Machines/terminal_insert_disc.ogg";

     [DataField]
-    public SoundSpecifier WorkSound = new SoundPathSpecifier("/Audio/Machines/tray_eject.ogg");
+    public SoundSpecifier WorkSound = new SoundPathSpecifier(WorkSoundPath);

     [DataField]
-    public SoundSpecifier ClickSound = new SoundPathSpecifier("/Audio/Machines/terminal_insert_disc.ogg");
+    public SoundSpecifier ClickSound = new SoundPathSpecifier(ClickSoundPath);

31-33: Документируйте структуру SharedBookPrinterEntry

Тип SharedBookPrinterEntry используется для хранения данных книги, но его структура не очевидна. Добавьте XML-документацию для улучшения понимания кода.

     [DataField]
+    /// <summary>
+    /// Содержит информацию о книге, которая в данный момент печатается.
+    /// Null означает, что принтер в данный момент не печатает книгу.
+    /// </summary>
     public SharedBookPrinterEntry? PrintBookEntry;
Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs (1)

1345-1368: Рекомендуется добавить индекс для внешнего ключа

Для оптимизации запросов рекомендуется добавить индекс по полю BookPrinterEntryId, так как это внешний ключ.

 b.HasIndex("BookPrinterEntryId")
     .HasDatabaseName("IX_stamped_data_book_printer_entry_id");
+b.HasIndex("BookPrinterEntryId")
+    .HasDatabaseName("IX_stamped_data_book_printer_entry_id_lookup");
Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.Designer.cs (2)

877-882: Удалите комментарии, не относящиеся к миграции

В строках 877 и 882 присутствуют комментарии // Corvax-TTS-Start и // Corvax-TTS-End. Поскольку это сгенерированный файл миграции, эти комментарии могут быть неуместными и создать путаницу.


20-1869: Разделите метод BuildTargetModel на несколько частей для улучшения читаемости

Метод BuildTargetModel содержит более 1800 строк кода. Рассмотрите возможность разделения его на более мелкие методы или использования дополнительных настроек для автоматической генерации более компактного кода миграции.

Resources/Locale/ru-RU/_Cats/Entities/Structures/Machines/book_printer.ftl (1)

6-7: Улучшите согласование в названии картриджа

Текущее название "книжно-принтерный картридж" звучит неестественно.

Предлагаемые исправления:

-ent-BookPrinterInkCartridge = книжно-принтерный картридж
+ent-BookPrinterInkCartridge = картридж для принтера книг
Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.cs (1)

14-28: Проверьте ограничения для полей таблицы book_printer_entry

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

  • name: рекомендуется ограничить длину (например, 100 символов)
  • description: рекомендуется ограничить длину (например, 500 символов)
  • content: возможно, стоит использовать тип text с ограничением размера
 name = table.Column<string>(type: "text", nullable: false),
+    .Annotation("Npgsql:MaxLength", 100),
 description = table.Column<string>(type: "text", nullable: false),
+    .Annotation("Npgsql:MaxLength", 500),
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 44e29b1 and ebd5a4f.

⛔ Files ignored due to path filters (11)
  • Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/full.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/high.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/low.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/medium.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/none.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/slotted.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/working.png is excluded by !**/*.png
📒 Files selected for processing (31)
  • Content.Client/_Cats/BookPrinter/BookPrinterBoundUserInterface.cs (1 hunks)
  • Content.Client/_Cats/BookPrinter/BookPrinterWindow.xaml (1 hunks)
  • Content.Client/_Cats/BookPrinter/BookTerminalWindow.xaml.cs (1 hunks)
  • Content.Client/_Cats/BookPrinter/Visualizers/BookPrinterlVisualizerSystem.cs (1 hunks)
  • Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.Designer.cs (1 hunks)
  • Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.cs (1 hunks)
  • Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs (3 hunks)
  • Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.Designer.cs (1 hunks)
  • Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.cs (1 hunks)
  • Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs (3 hunks)
  • Content.Server.Database/Model.cs (2 hunks)
  • Content.Server/Database/ServerDbBase.cs (1 hunks)
  • Content.Server/Database/ServerDbManager.cs (2 hunks)
  • Content.Server/_Cats/BookPrinter/BookPrinterSystem.cs (1 hunks)
  • Content.Server/_Cats/BookPrinter/Components/BookPrinterComponent.cs (1 hunks)
  • Content.Shared/Paper/PaperSystem.cs (2 hunks)
  • Content.Shared/_Cats/BookPrinter/Components/BookPrinterCartridgeComponent.cs (1 hunks)
  • Content.Shared/_Cats/BookPrinter/Components/BookPrinterVisualsComponent.cs (1 hunks)
  • Content.Shared/_Cats/BookPrinter/SharedBookPrinter.cs (1 hunks)
  • Resources/Locale/ru-RU/_Cats/Entities/Objects/Device/flatpack.ftl (1 hunks)
  • Resources/Locale/ru-RU/_Cats/Entities/Structures/Machines/book_printer.ftl (1 hunks)
  • Resources/Locale/ru-RU/_Cats/bookprinter/bookprinter.ftl (1 hunks)
  • Resources/Prototypes/Catalog/VendingMachines/Inventories/curadrobe.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Catalog/Cargo/cargo_service.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Catalog/Fills/Crates/service.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/Circuitboards/Machine/production.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/flatpack.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Structures/Machines/Computers/book_printer.yml (1 hunks)
  • Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi/meta.json (1 hunks)
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/meta.json (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • Resources/Locale/ru-RU/_Cats/Entities/Objects/Device/flatpack.ftl
  • Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi/meta.json
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/meta.json
🔇 Additional comments (29)
Resources/Prototypes/_SpaceCats/Catalog/Cargo/cargo_service.yml (1)

1-9: ⚠️ Potential issue

Исправьте синтаксис YAML для корректного определения продукта.

В файле обнаружена ошибка синтаксиса:

  • На строке 1 символ - перед type: cargoProduct не требуется и может привести к ошибке синтаксиса.

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

- - type: cargoProduct
+ type: cargoProduct
  id: ServiceBookPrinterCartridge
  icon:
    sprite: _SpaceCats/Objects/Misc/refill_cartridge.rsi
    state: icon
  product: CrateServicePrinterInkCartridge
  cost: 1500
  category: Service
  group: market

Likely invalid or redundant comment.

Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/Circuitboards/Machine/production.yml (1)

2-11: Код компонента выглядит корректным

Определение сущности 'BookPrinterMachineCircuitboard' и её компонентов выполнено правильно.

Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml (1)

2-14: Определение сущности выполнено корректно

Компоненты и свойства 'BookPrinterInkCartridge' настроены правильно.

Resources/Prototypes/Catalog/VendingMachines/Inventories/curadrobe.yml (1)

18-19: Добавление новых предметов в инвентарь автомата

Предметы 'BookPrinterFlatpack' и 'BookPrinterInkCartridge' успешно добавлены в 'CuraDrobeInventory' с соответствующими количествами.

Content.Shared/_Cats/BookPrinter/Components/BookPrinterCartridgeComponent.cs (1)

1-17: Проверьте использование компонента в системе

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

#!/bin/bash
# Поиск использования компонента в системах и UI
echo "Поиск использования BookPrinterCartridgeComponent в системах:"
rg -l "BookPrinterCartridgeComponent" --type cs

echo -e "\nПоиск обработки заряда картриджа:"
ast-grep --pattern 'CurrentCharge' --lang cs
Content.Client/_Cats/BookPrinter/Visualizers/BookPrinterlVisualizerSystem.cs (1)

11-15: Реализация корректна

Метод правильно обрабатывает null-проверки и использует паттерн раннего возврата.

Content.Server/Database/ServerDbManager.cs (1)

313-321: LGTM: Объявление интерфейса корректно

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

Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.cs (2)

1-9: Корректное объявление миграции!

Класс миграции правильно объявлен и соответствует конвенциям именования EF Core.


62-69: Корректная реализация отката миграции!

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

Content.Server/Database/ServerDbBase.cs (1)

1517-1542: Реализация методов для работы с книжным принтером соответствует архитектуре.

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

Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.Designer.cs (2)

972-976: Убедитесь в корректности ограничения CheckConstraint

В сущности ServerBan добавлено ограничение CheckConstraint с именем "HaveEitherAddressOrUserIdOrHWId". Проверьте, правильно ли сформулировано условие "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL", чтобы гарантировать, что хотя бы одно из этих полей заполнено.


1106-1110: Проверьте ограничение CheckConstraint в ServerRoleBan

Аналогично предыдущему комментарию, убедитесь, что ограничение "HaveEitherAddressOrUserIdOrHWId" в сущности ServerRoleBan корректно определено и соответствует требованиям.

Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs (3)

1241-1269: Корректная конфигурация сущности BookPrinterEntry

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


1271-1293: Корректная конфигурация сущности StampedData

Конфигурация сущности и её связи с BookPrinterEntry реализована правильно. Индекс на внешний ключ добавлен корректно.


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

Связь один-ко-многим между BookPrinterEntry и StampedData настроена правильно с корректным поведением каскадного удаления.

Also applies to: 2021-2026

Content.Server/_Cats/BookPrinter/Components/BookPrinterComponent.cs (3)

1-5: LGTM: Корректные импорты

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


8-10: Проверьте область доступа компонента

Компонент правильно зарегистрирован и имеет ограничение доступа только для BookPrinterSystem, что соответствует принципам инкапсуляции.

#!/bin/bash
# Проверяем, что только BookPrinterSystem использует этот компонент
rg -l "BookPrinterComponent" | grep -v "BookPrinterComponent.cs" | grep -v "BookPrinterSystem"

25-30: Локализация строки штампа

Строка stamp-component-stamped-name-terminal похожа на ключ локализации. Убедитесь, что соответствующий перевод существует в файлах локализации.

#!/bin/bash
# Проверяем наличие ключа локализации в файлах
rg "stamp-component-stamped-name-terminal" Resources/Locale/
Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs (3)

1314-1343: Проверка конфигурации сущности BookPrinterEntry

Конфигурация выглядит корректной. Сущность имеет:

  • Первичный ключ Id с автоинкрементом
  • Необходимые текстовые поля с правильными ограничениями
  • Уникальный индекс по Id

1682-1688: Проверка конфигурации связи между сущностями

Связь между BookPrinterEntry и StampedData настроена корректно как один-ко-многим с каскадным удалением.


1902-1907: Проверка навигационного свойства

Навигационное свойство StampedBy корректно настроено в сущности BookPrinterEntry.

Resources/Locale/ru-RU/_Cats/bookprinter/bookprinter.ftl (4)

1-6: Корректные названия элементов интерфейса!

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


8-9: Понятные сообщения об ошибках!

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


7-7: Корректные статусные сообщения!

Статусные сообщения лаконичны и информативны.

Also applies to: 15-15


17-20: Отличные художественные описания!

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

Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.Designer.cs (2)

521-547: Проверьте корректность свойств в таблице book_printer_entry

Убедитесь, что свойства Name, Description, Content и StampState имеют необходимые ограничения, такие как максимальная длина и недопустимость NULL, соответствующие требованиям приложения.


1768-1862: Обратите внимание на навигационные свойства без соответствующего кода

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

Resources/Locale/ru-RU/_Cats/Entities/Structures/Machines/book_printer.ftl (1)

3-5: Проверьте необходимость суффикса

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

Предлагаемый вариант:

-    .suffix = Заполненный
+    .suffix = С картриджем
Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.cs (1)

63-70: LGTM: Корректная реализация отката миграции

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

Comment on lines 1 to 7
- type: entity
id: CrateServicePrinterInkCartridge
parent: CratePlastic
components:
- type: StorageFill
contents:
- id: BookPrinterInkCartridge
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Исправьте синтаксис YAML и отступы для корректной структуры.

В файле обнаружены проблемы с синтаксисом YAML:

  • На строке 1 символ - не требуется и может привести к ошибке синтаксиса. Корневой элемент должен быть словарём, а не списком.
  • Под components: отступы некорректны. Элемент - type: StorageFill должен иметь правильный отступ, чтобы быть дочерним по отношению к components:.

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

- - type: entity
+ type: entity
  id: CrateServicePrinterInkCartridge
  parent: CratePlastic
  components:
- - type: StorageFill
+   - type: StorageFill
      contents:
        - id: BookPrinterInkCartridge
📝 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
- type: entity
id: CrateServicePrinterInkCartridge
parent: CratePlastic
components:
- type: StorageFill
contents:
- id: BookPrinterInkCartridge
type: entity
id: CrateServicePrinterInkCartridge
parent: CratePlastic
components:
- type: StorageFill
contents:
- id: BookPrinterInkCartridge

Comment on lines +1 to +8
- type: entity
parent: BaseFlatpack
id: BookPrinterFlatpack
name: book printer flatpack
description: A flatpack used for constructing a book printer.
components:
- type: Flatpack
entity: BookPrinter
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Исправьте синтаксис YAML и отступы для корректной структуры.

В текущем файле имеются проблемы с синтаксисом YAML:

  • На строке 1 символ - не нужен и может вызвать ошибку синтаксиса.
  • Отступы под components: неверны. Элемент - type: Flatpack должен быть правильно отступлен, чтобы быть частью списка компонентов.

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

- - type: entity
+ type: entity
  parent: BaseFlatpack
  id: BookPrinterFlatpack
  name: book printer flatpack
  description: A flatpack used for constructing a book printer.
  components:
- - type: Flatpack
+   - type: Flatpack
      entity: BookPrinter
📝 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
- type: entity
parent: BaseFlatpack
id: BookPrinterFlatpack
name: book printer flatpack
description: A flatpack used for constructing a book printer.
components:
- type: Flatpack
entity: BookPrinter
type: entity
parent: BaseFlatpack
id: BookPrinterFlatpack
name: book printer flatpack
description: A flatpack used for constructing a book printer.
components:
- type: Flatpack
entity: BookPrinter

@@ -0,0 +1,11 @@
- type: entity
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Лишний дефис перед "type: entity"

На первой строке перед "type: entity" стоит дефис '-', что может быть ошибкой, так как верхний уровень документа YAML не является списком. Это может привести к синтаксическим ошибкам при обработке файла.

Предлагаю удалить дефис:

- - type: entity
+ type: entity
📝 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
- type: entity
type: entity

- type: entity
id: BookPrinterMachineCircuitboard
parent: BaseMachineCircuitboard
name: book printer machine board
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Необходимо локализовать поле 'name'

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

Измените поле следующим образом:

- name: book printer machine board
+ name: Loc.GetString("book-printer-machine-board-name")

И добавьте соответствующую строку в файлы локализации.

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

@@ -0,0 +1,14 @@
- type: entity
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Лишний дефис перед "type: entity"

На первой строке перед "type: entity" присутствует дефис '-', что может вызвать ошибку, поскольку верхний уровень YAML-документа не должен быть списком.

Предлагаю удалить дефис:

- - type: entity
+ type: entity
📝 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
- type: entity
type: entity

Comment on lines +10 to +14
book-printer-cartridge-component-empty = Картридж пуст.
book-printer-cartridge-component-examine = Ресурс картриджа: { $charge }%
book-printer-window-no-cartridge-loaded-text = Картридж не загружен.
book-printer-window-cartridge-empty = Картридж пуст.
book-printer-window-cartridge-charge = Ресурс картриджа: { $charge }%
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

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

Строки book-printer-cartridge-component-examine и book-printer-window-cartridge-charge содержат одинаковый текст. Рекомендуется объединить их в одну строку для упрощения поддержки.

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

book-printer-cartridge-component-empty = Картридж пуст.
-book-printer-cartridge-component-examine = Ресурс картриджа: { $charge }%
book-printer-window-no-cartridge-loaded-text = Картридж не загружен.
book-printer-window-cartridge-empty = Картридж пуст.
-book-printer-window-cartridge-charge = Ресурс картриджа: { $charge }%
+book-printer-cartridge-charge = Ресурс картриджа: { $charge }%
📝 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
book-printer-cartridge-component-empty = Картридж пуст.
book-printer-cartridge-component-examine = Ресурс картриджа: { $charge }%
book-printer-window-no-cartridge-loaded-text = Картридж не загружен.
book-printer-window-cartridge-empty = Картридж пуст.
book-printer-window-cartridge-charge = Ресурс картриджа: { $charge }%
book-printer-cartridge-component-empty = Картридж пуст.
book-printer-window-no-cartridge-loaded-text = Картридж не загружен.
book-printer-window-cartridge-empty = Картридж пуст.
book-printer-cartridge-charge = Ресурс картриджа: { $charge }%

Comment on lines +1247 to +1268
b.Property<int?>("BookPrinterEntryId")
.HasColumnType("integer")
.HasColumnName("book_printer_entry_id");

b.Property<string>("Color")
.IsRequired()
.HasColumnType("text")
.HasColumnName("color");

b.Property<string>("Name")
.IsRequired()
.HasColumnType("text")
.HasColumnName("name");

b.HasKey("Id")
.HasName("PK_stamped_data");

b.HasIndex("BookPrinterEntryId")
.HasDatabaseName("IX_stamped_data_book_printer_entry_id");

b.ToTable("stamped_data", (string)null);
});
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Уточните связь между StampedData и BookPrinterEntry

Согласно коду, StampedData имеет внешний ключ BookPrinterEntryId, который может быть NULL. Если каждая запись в StampedData должна быть связана с записью в BookPrinterEntry, рассмотрите возможность сделать этот ключ обязательным.

Comment on lines +1 to +2
ent-BookPrinter = книжный книг
.desc = Рассадник пропаганды, унижчтожитель демократии. Позволяет копировать книги, а также заносить их в базу данных.
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

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

В текущей локализации присутствуют следующие проблемы:

  • Строка "книжный книг" грамматически некорректна
  • Опечатка в слове "унижчтожитель"

Предлагаемые исправления:

-ent-BookPrinter = книжный книг
-    .desc = Рассадник пропаганды, унижчтожитель демократии. Позволяет копировать книги, а также заносить их в базу данных.
+ent-BookPrinter = принтер книг
+    .desc = Рассадник пропаганды, уничтожитель демократии. Позволяет копировать книги, а также заносить их в базу данных.
📝 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
ent-BookPrinter = книжный книг
.desc = Рассадник пропаганды, унижчтожитель демократии. Позволяет копировать книги, а также заносить их в базу данных.
ent-BookPrinter = принтер книг
.desc = Рассадник пропаганды, уничтожитель демократии. Позволяет копировать книги, а также заносить их в базу данных.

Comment on lines +50 to +59
migrationBuilder.CreateIndex(
name: "IX_book_printer_entry_book_printer_entry_id",
table: "book_printer_entry",
column: "book_printer_entry_id",
unique: true);

migrationBuilder.CreateIndex(
name: "IX_stamped_data_book_printer_entry_id",
table: "stamped_data",
column: "book_printer_entry_id");
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Проверьте необходимость уникального индекса

Создание уникального индекса по book_printer_entry_id в таблице book_printer_entry избыточно, так как это поле уже является первичным ключом и автоматически индексируется.

- migrationBuilder.CreateIndex(
-     name: "IX_book_printer_entry_book_printer_entry_id",
-     table: "book_printer_entry",
-     column: "book_printer_entry_id",
-     unique: true);
📝 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
migrationBuilder.CreateIndex(
name: "IX_book_printer_entry_book_printer_entry_id",
table: "book_printer_entry",
column: "book_printer_entry_id",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_stamped_data_book_printer_entry_id",
table: "stamped_data",
column: "book_printer_entry_id");
migrationBuilder.CreateIndex(
name: "IX_stamped_data_book_printer_entry_id",
table: "stamped_data",
column: "book_printer_entry_id");

Comment on lines +30 to +48
migrationBuilder.CreateTable(
name: "stamped_data",
columns: table => new
{
stamped_data_id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
name = table.Column<string>(type: "text", nullable: false),
color = table.Column<string>(type: "text", nullable: false),
book_printer_entry_id = table.Column<int>(type: "integer", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_stamped_data", x => x.stamped_data_id);
table.ForeignKey(
name: "FK_stamped_data_book_printer_entry_book_printer_entry_id",
column: x => x.book_printer_entry_id,
principalTable: "book_printer_entry",
principalColumn: "book_printer_entry_id");
});
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рассмотрите добавление каскадного удаления

В текущей реализации внешний ключ book_printer_entry_id в таблице stamped_data допускает null-значения и не имеет каскадного удаления. Это может привести к появлению "висячих" записей.

 table.ForeignKey(
     name: "FK_stamped_data_book_printer_entry_book_printer_entry_id",
     column: x => x.book_printer_entry_id,
     principalTable: "book_printer_entry",
-    principalColumn: "book_printer_entry_id");
+    principalColumn: "book_printer_entry_id",
+    onDelete: ReferentialAction.Cascade);
📝 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
migrationBuilder.CreateTable(
name: "stamped_data",
columns: table => new
{
stamped_data_id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
name = table.Column<string>(type: "text", nullable: false),
color = table.Column<string>(type: "text", nullable: false),
book_printer_entry_id = table.Column<int>(type: "integer", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_stamped_data", x => x.stamped_data_id);
table.ForeignKey(
name: "FK_stamped_data_book_printer_entry_book_printer_entry_id",
column: x => x.book_printer_entry_id,
principalTable: "book_printer_entry",
principalColumn: "book_printer_entry_id");
});
migrationBuilder.CreateTable(
name: "stamped_data",
columns: table => new
{
stamped_data_id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
name = table.Column<string>(type: "text", nullable: false),
color = table.Column<string>(type: "text", nullable: false),
book_printer_entry_id = table.Column<int>(type: "integer", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_stamped_data", x => x.stamped_data_id);
table.ForeignKey(
name: "FK_stamped_data_book_printer_entry_book_printer_entry_id",
column: x => x.book_printer_entry_id,
principalTable: "book_printer_entry",
principalColumn: "book_printer_entry_id",
onDelete: ReferentialAction.Cascade);
});

Copy link

@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: 21

🧹 Outside diff range and nitpick comments (32)
Resources/Prototypes/_SpaceCats/Catalog/Fills/Crates/service.yml (1)

7-7: Добавьте пустую строку в конце файла

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

Примените этот дифф для исправления:

  - id: BookPrinterInkCartridge
+
🧰 Tools
🪛 yamllint (1.35.1)

[warning] 7-7: wrong indentation: expected 4 but found 6

(indentation)


[error] 7-7: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/flatpack.yml (1)

8-8: Добавьте пустую строку в конце файла

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

Примените этот дифф для исправления:

  entity: BookPrinter
+
🧰 Tools
🪛 yamllint (1.35.1)

[error] 8-8: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Catalog/Cargo/cargo_service.yml (1)

9-9: Добавьте пустую строку в конце файла

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

Примените этот дифф для исправления:

  group: market
+
🧰 Tools
🪛 yamllint (1.35.1)

[error] 9-9: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/Circuitboards/Machine/production.yml (1)

11-11: Добавьте новую строку в конце файла

В конце файла отсутствует новая строка, что улучшит читаемость и совместимость с различными инструментами.

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

11      MatterBin: 2
+  # Добавьте новую строку в конце файла
🧰 Tools
🪛 yamllint (1.35.1)

[error] 11-11: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml (1)

14-14: Добавьте новую строку в конце файла

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

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

14      size: Normal
+  # Добавьте новую строку в конце файла
🧰 Tools
🪛 yamllint (1.35.1)

[error] 14-14: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Locale/ru-RU/_Cats/Entities/Structures/Machines/book_printer.ftl (1)

6-6: Улучшите название картриджа для ясности

Рекомендуется изменить название на "картридж для книжного принтера" для лучшего понимания пользователями.

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

- ent-BookPrinterInkCartridge = книжно-принтерный картридж
+ ent-BookPrinterInkCartridge = картридж для книжного принтера
Resources/Locale/ru-RU/_Cats/bookprinter/bookprinter.ftl (4)

1-1: Предложение заменить "Носитель" на "Книга"

В строке 1 рекомендуется заменить "Носитель:" на "Книга:", чтобы сделать интерфейс более понятным для пользователя, так как принтер работает именно с книгами.

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

-book-printer-window-book-label = Носитель:
+book-printer-window-book-label = Книга:

10-10: Уточнение сообщений о пустом картридже

Строки 10 и 13 содержат одинаковый перевод "Картридж пуст.", хотя они относятся к разным контекстам (компонент и окно). Рекомендуется уточнить эти сообщения для ясности.

Пример исправления:

-book-printer-cartridge-component-empty = Картридж пуст.
+book-printer-cartridge-component-empty = Картридж пуст (компонент).

-book-printer-window-cartridge-empty = Картридж пуст.
+book-printer-window-cartridge-empty = Картридж пуст (окно).

Also applies to: 13-13


11-11: Уточнение сообщений о заряде картриджа

Строки 11 и 14 имеют одинаковый перевод "Ресурс картриджа: { $charge }%". Возможно, стоит уточнить сообщения, чтобы различать контекст компонента и окна.

Пример исправления:

-book-printer-cartridge-component-examine = Ресурс картриджа: { $charge }%
+book-printer-cartridge-component-examine = Заряд картриджа (компонент): { $charge }%

-book-printer-window-cartridge-charge = Ресурс картриджа: { $charge }%
+book-printer-window-cartridge-charge = Заряд картриджа (окно): { $charge }%

Also applies to: 14-14


17-17: Согласованность названий для пустых носителей

В строках 17 и 19 используются разные названия для пустых носителей: "книга" и "текстовый носитель". Рекомендуется выбрать один термин для согласованности.

Пример исправления:

-book-printer-book-name-blank = книга
+book-printer-book-name-blank = текстовый носитель

# Или наоборот:

-book-printer-unknown-name-blank = текстовый носитель
+book-printer-unknown-name-blank = книга

Also applies to: 19-19

Content.Client/_Cats/BookPrinter/BookPrinterWindow.xaml (1)

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

На строке 15 используется смешение табуляции и пробелов, что приводит к несоответствию отступов. Рекомендуется использовать пробелы для отступов во всём файле для единообразия.

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

-    			<Control MinSize="10 0"/>
+                <Control MinSize="10 0"/>
Resources/Prototypes/_SpaceCats/Entities/Structures/Machines/Computers/book_printer.yml (1)

119-119: Отсутствует новая строка в конце файла

Согласно статическому анализу, в конце файла отсутствует символ новой строки.

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

      - BookPrinterInkCartridge
+ (новая строка)
🧰 Tools
🪛 yamllint (1.35.1)

[error] 119-119: no new line character at the end of file

(new-line-at-end-of-file)

Content.Shared/Paper/PaperSystem.cs (2)

210-213: Упростите избыточный блок else

В методе UpdateStampState блок else не требуется, так как если условие if не выполнится, метод и так завершится.


221-222: Измените тип параметра doNewline на не-nullable bool

Параметр doNewline имеет тип bool?, но используется только при проверке doNewline is not null && doNewline.Value. Рекомендуется заменить его на не-nullable bool с значением по умолчанию true для упрощения кода.

Content.Shared/_Cats/BookPrinter/Components/BookPrinterVisualsComponent.cs (1)

15-26: Рекомендуется улучшить определение enum.

Предлагаются следующие улучшения для enum BookPrinterVisualLayers:

  • Добавить документацию для каждого состояния
  • Явно указать числовые значения
  • Переместить None в начало enum

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

 [Serializable, NetSerializable]
 public enum BookPrinterVisualLayers : byte
 {
+    /// <summary>
+    /// Отсутствие визуального состояния
+    /// </summary>
+    None = 0,
+    /// <summary>
+    /// Базовое состояние принтера
+    /// </summary>
+    Base = 1,
+    /// <summary>
+    /// Анимация работы принтера
+    /// </summary>
+    Working = 2,
+    /// <summary>
+    /// Книга установлена в принтер
+    /// </summary>
+    Slotted = 3,
+    /// <summary>
+    /// Принтер полностью заполнен
+    /// </summary>
+    Full = 4,
+    /// <summary>
+    /// Высокий уровень заполнения
+    /// </summary>
+    High = 5,
+    /// <summary>
+    /// Средний уровень заполнения
+    /// </summary>
+    Medium = 6,
+    /// <summary>
+    /// Низкий уровень заполнения
+    /// </summary>
+    Low = 7,
-    Base,
-    Working,
-    Slotted,
-    Full,
-    High,
-    Medium,
-    Low,
-    None
 }
Content.Client/_Cats/BookPrinter/Visualizers/BookPrinterlVisualizerSystem.cs (3)

1-1: Опечатка в названии файла BookPrinterlVisualizerSystem.cs

В названии файла после "Printer" есть лишняя буква "l". Рекомендуется переименовать файл в BookPrinterVisualizerSystem.cs для соответствия соглашениям об именовании.


31-62: Рекомендуется вынести получение BookPrinterCartridgeComponent из условных блоков

В коде многократно повторяется вызов EntityManager.TryGetComponent<BookPrinterCartridgeComponent>(cartridge, out var cartridgeComp). Для избежания дублирования предлагается выполнить этот вызов один раз после проверки cartridge != null и использовать cartridgeComp в последующих условиях.

Предлагаемый рефакторинг:

+    BookPrinterCartridgeComponent? cartridgeComp = null;
+    if (cartridge is not null)
+        EntityManager.TryGetComponent(cartridge, out cartridgeComp);
...
...
...
...

31-62: Использование именованных констант вместо магических чисел

В коде используются магические числа, такие как 1.43f и 2.5f, что может затруднять понимание логики. Рекомендуется определить эти значения как константы с говорящими именами для улучшения читаемости кода.

Пример реализации:

+    private const float HighChargeDivider = 1.43f;
+    private const float MediumChargeDivider = 2.5f;
...
...
...
Content.Server/Database/ServerDbBase.cs (1)

1518-1529: Метод реализован корректно, но требуется документация.

Реализация следует хорошим практикам, включая правильное использование async/await и загрузку связанных данных. Однако отсутствует XML документация, описывающая назначение метода.

Добавьте XML документацию:

+/// <summary>
+/// Получает все записи принтера книг с информацией о пользователях, поставивших штамп.
+/// </summary>
+/// <returns>Список записей принтера книг.</returns>
 public async Task<List<BookPrinterEntry>> GetBookPrinterEntries()
Content.Shared/_Cats/BookPrinter/Components/BookPrinterCartridgeComponent.cs (2)

8-9: Добавьте XML документацию для компонента

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

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

+/// <summary>
+/// Компонент, представляющий картридж для принтера книг.
+/// Отслеживает текущий и максимальный заряд картриджа.
+/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class BookPrinterCartridgeComponent : Component

11-12: Добавьте константу для значения по умолчанию

Магическое число 20.0f следует вынести в константу.

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

+private const float DefaultCharge = 20.0f;
+
 [DataField("fullCharge"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
-public float FullCharge = 20.0f;
+public float FullCharge = DefaultCharge;
Content.Server.Database/Model.cs (2)

654-663: Рекомендуется улучшить определение сущности BookPrinterEntry.

Предлагаются следующие улучшения:

  1. Добавить валидацию длины строковых свойств
  2. Вынести значение "paper_stamp-void" в константу

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

 public class BookPrinterEntry
 {
     [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     public int Id { get; set; }
+    [Required, MaxLength(256)]
     public string Name { get; set; } = default!;
+    [Required, MaxLength(1024)]
     public string Description { get; set; } = default!;
+    [Required]
     public string Content { get; set; } = default!;
     public List<StampedData> StampedBy { get; set; } = default!;
-    public string StampState { get; set; } = "paper_stamp-void";
+    private const string DefaultStampState = "paper_stamp-void";
+    public string StampState { get; set; } = DefaultStampState;
 }

665-671: Рекомендуется добавить валидацию в StampedData.

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

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

 public class StampedData
 {
     [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     public int Id { get; set; }
+    [Required, MaxLength(256)]
     public string Name { get; set; } = default!;
+    [Required, MaxLength(32)]
     public string Color { get; set; } = default!;
 }
Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.cs (2)

13-28: Рекомендуется добавить ограничение на размер текстовых полей

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

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

     name = table.Column<string>(type: "TEXT", nullable: false),
+    name = table.Column<string>(type: "TEXT", maxLength: 100, nullable: false),
     description = table.Column<string>(type: "TEXT", nullable: false),
+    description = table.Column<string>(type: "TEXT", maxLength: 500, nullable: false),
     content = table.Column<string>(type: "TEXT", nullable: false),
+    content = table.Column<string>(type: "TEXT", maxLength: 5000, nullable: false),
     stamp_state = table.Column<string>(type: "TEXT", nullable: false)
+    stamp_state = table.Column<string>(type: "TEXT", maxLength: 50, nullable: false)

49-59: Рассмотрите добавление индекса для поиска по имени

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

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

     migrationBuilder.CreateIndex(
         name: "IX_stamped_data_book_printer_entry_id",
         table: "stamped_data",
         column: "book_printer_entry_id");
+
+    migrationBuilder.CreateIndex(
+        name: "IX_book_printer_entry_name",
+        table: "book_printer_entry",
+        column: "name");
Content.Client/_Cats/BookPrinter/BookTerminalWindow.xaml.cs (1)

73-73: Предлагаю заменить магическое число 47 на константу

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

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

+private const int MaxDescriptionLength = 47;

 public string CutDescription(string? text)
 {
     if (text is null)
         return "";
-    if (text.Length <= 47)
+    if (text.Length <= MaxDescriptionLength)
         return text;
-    return text.Substring(0, 47) + "...";
+    return text.Substring(0, MaxDescriptionLength) + "...";
 }
Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs (1)

1265-1267: Избыточный уникальный индекс на первичном ключе 'Id'.

Создание явного уникального индекса на поле 'Id' в таблице book_printer_entry избыточно, так как первичный ключ уже обеспечивает уникальность и автоматически создает индекс. Рекомендуется удалить явный индекс на 'Id' для оптимизации схемы базы данных.

Примените следующий дифф для удаления избыточного индекса:

- b.HasIndex("Id")
-     .IsUnique();
Content.Server/_Cats/BookPrinter/Components/BookPrinterComponent.cs (2)

13-18: Рекомендуется вынести пути к аудио файлам в константы!

Жёстко закодированные пути к аудио файлам могут создать проблемы при рефакторинге или изменении структуры ресурсов.

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

+private const string DEFAULT_WORK_SOUND = "/Audio/Machines/tray_eject.ogg";
+private const string DEFAULT_CLICK_SOUND = "/Audio/Machines/terminal_insert_disc.ogg";

[DataField]
-public SoundSpecifier WorkSound = new SoundPathSpecifier("/Audio/Machines/tray_eject.ogg");
+public SoundSpecifier WorkSound = new SoundPathSpecifier(DEFAULT_WORK_SOUND);

[DataField]
-public SoundSpecifier ClickSound = new SoundPathSpecifier("/Audio/Machines/terminal_insert_disc.ogg");
+public SoundSpecifier ClickSound = new SoundPathSpecifier(DEFAULT_CLICK_SOUND);

34-41: Требуется документация для временных параметров!

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

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

 [DataField, ViewVariables(VVAccess.ReadWrite)]
+/// <summary>
+/// Базовое время выполнения работы в секундах
+/// </summary>
 public float WorkTime = 8.0f;

 [DataField]
+/// <summary>
+/// Множитель скорости работы (1.0 = нормальная скорость)
+/// </summary>
 public float TimeMultiplier = 1.0f;

 [DataField, ViewVariables(VVAccess.ReadWrite)]
+/// <summary>
+/// Количество расходуемого картриджа за одну операцию
+/// </summary>
 public float CartridgeUsage = 1.0f;
Content.Shared/_Cats/BookPrinter/SharedBookPrinter.cs (2)

6-29: Необходимо исправить форматирование и улучшить конструктор

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

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

 public BookPrinterBoundUserInterfaceState(
     string? bookName, 
     string? bookDescription, 
     NetEntity? bookEntity, 
     List<SharedBookPrinterEntry>? bookEntries, 
-    bool routineAllowed = false, 
-    float? cartridgeCharge = null, 
-    float? workProgress = null, 
-    bool copyPaste = false)
+    bool routineAllowed = default, 
+    float? cartridgeCharge = default, 
+    float? workProgress = default, 
+    bool copyPaste = default)

31-59: Требуется документация для классов сообщений

Пустые классы сообщений (BookPrinterClearContainerMessage, BookPrinterUploadMessage, BookPrinterCopyPasteMessage) нуждаются в документации, объясняющей их назначение.

Добавьте XML-документацию, например:

+/// <summary>
+/// Сообщение для очистки контейнера принтера книг
+/// </summary>
 [Serializable, NetSerializable]
 public sealed class BookPrinterClearContainerMessage : BoundUserInterfaceMessage
Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs (1)

1345-1368: Рекомендуется добавить индекс для внешнего ключа book_printer_entry_id

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

 b.HasIndex("BookPrinterEntryId")
     .HasDatabaseName("IX_stamped_data_book_printer_entry_id");
+b.HasIndex("BookPrinterEntryId")
+    .HasDatabaseName("IX_stamped_data_book_printer_entry_id_lookup");
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 44e29b1 and ebd5a4f.

⛔ Files ignored due to path filters (11)
  • Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/full.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/high.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/low.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/medium.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/none.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/slotted.png is excluded by !**/*.png
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/working.png is excluded by !**/*.png
📒 Files selected for processing (31)
  • Content.Client/_Cats/BookPrinter/BookPrinterBoundUserInterface.cs (1 hunks)
  • Content.Client/_Cats/BookPrinter/BookPrinterWindow.xaml (1 hunks)
  • Content.Client/_Cats/BookPrinter/BookTerminalWindow.xaml.cs (1 hunks)
  • Content.Client/_Cats/BookPrinter/Visualizers/BookPrinterlVisualizerSystem.cs (1 hunks)
  • Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.Designer.cs (1 hunks)
  • Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.cs (1 hunks)
  • Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs (3 hunks)
  • Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.Designer.cs (1 hunks)
  • Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.cs (1 hunks)
  • Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs (3 hunks)
  • Content.Server.Database/Model.cs (2 hunks)
  • Content.Server/Database/ServerDbBase.cs (1 hunks)
  • Content.Server/Database/ServerDbManager.cs (2 hunks)
  • Content.Server/_Cats/BookPrinter/BookPrinterSystem.cs (1 hunks)
  • Content.Server/_Cats/BookPrinter/Components/BookPrinterComponent.cs (1 hunks)
  • Content.Shared/Paper/PaperSystem.cs (2 hunks)
  • Content.Shared/_Cats/BookPrinter/Components/BookPrinterCartridgeComponent.cs (1 hunks)
  • Content.Shared/_Cats/BookPrinter/Components/BookPrinterVisualsComponent.cs (1 hunks)
  • Content.Shared/_Cats/BookPrinter/SharedBookPrinter.cs (1 hunks)
  • Resources/Locale/ru-RU/_Cats/Entities/Objects/Device/flatpack.ftl (1 hunks)
  • Resources/Locale/ru-RU/_Cats/Entities/Structures/Machines/book_printer.ftl (1 hunks)
  • Resources/Locale/ru-RU/_Cats/bookprinter/bookprinter.ftl (1 hunks)
  • Resources/Prototypes/Catalog/VendingMachines/Inventories/curadrobe.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Catalog/Cargo/cargo_service.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Catalog/Fills/Crates/service.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/Circuitboards/Machine/production.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/flatpack.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Structures/Machines/Computers/book_printer.yml (1 hunks)
  • Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi/meta.json (1 hunks)
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/meta.json (1 hunks)
✅ Files skipped from review due to trivial changes (5)
  • Resources/Locale/ru-RU/_Cats/Entities/Objects/Device/flatpack.ftl
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/meta.json
  • Resources/Textures/_SpaceCats/Objects/Misc/refill_cartridge.rsi/meta.json
  • Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.Designer.cs
  • Content.Server.Database/Migrations/Postgres/20231110000509_BookTerminal.Designer.cs
🧰 Additional context used
🪛 yamllint (1.35.1)
Resources/Prototypes/_SpaceCats/Catalog/Cargo/cargo_service.yml

[error] 9-9: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/Circuitboards/Machine/production.yml

[error] 11-11: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/flatpack.yml

[error] 8-8: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Catalog/Fills/Crates/service.yml

[warning] 7-7: wrong indentation: expected 4 but found 6

(indentation)


[error] 7-7: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/Catalog/VendingMachines/Inventories/curadrobe.yml

[error] 18-18: trailing spaces

(trailing-spaces)

Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml

[error] 14-14: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Entities/Structures/Machines/Computers/book_printer.yml

[warning] 73-73: wrong indentation: expected 6 but found 7

(indentation)


[warning] 74-74: wrong indentation: expected 9 but found 8

(indentation)


[warning] 79-79: wrong indentation: expected 9 but found 8

(indentation)


[error] 119-119: no new line character at the end of file

(new-line-at-end-of-file)

🔇 Additional comments (24)
Resources/Prototypes/Catalog/VendingMachines/Inventories/curadrobe.yml (1)

19-19: Добавление BookPrinterInkCartridge в инвентарь корректно

Добавление BookPrinterInkCartridge: 2 в инвентарь выглядит корректным и не вызывает замечаний.

Content.Client/_Cats/BookPrinter/BookPrinterWindow.xaml (1)

1-45: Общий обзор интерфейса

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

Content.Client/_Cats/BookPrinter/BookPrinterBoundUserInterface.cs (1)

20-49: ⚠️ Potential issue

Потенциальный вызов исключений из-за необработанных событий

В методе Open() устанавливаются обработчики событий для кнопок, но нет проверки на то, что _window не является null. Если по какой-то причине окно не инициализируется, это может привести к NullReferenceException.

Чтобы избежать этого, убедитесь, что _window инициализировано перед использованием или добавьте проверку на null перед доступом к его свойствам.

protected override void Open()
{
    base.Open();

+   if (_window == null)
+       return;

    _window = new()
    {
        Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName,
    };

    _window.EjectButton.OnPressed += _ => SendMessage(new ItemSlotButtonPressedEvent("bookSlot"));
    // Остальные обработчики событий...
}

Likely invalid or redundant comment.

Content.Shared/Paper/PaperSystem.cs (1)

Line range hint 191-195: Код выглядит корректным

Логика метода TryStamp правильно обновляет состояние штампа.

Content.Shared/_Cats/BookPrinter/Components/BookPrinterVisualsComponent.cs (1)

8-13: LGTM! Компонент реализован корректно.

Компонент правильно настроен для сетевого взаимодействия и регистрации в системе. Использование sealed класса и автоматической генерации состояния является хорошей практикой.

Content.Server/Database/ServerDbManager.cs (1)

313-321: LGTM! Объявление региона для функционала печати книг.

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

Content.Shared/_Cats/BookPrinter/Components/BookPrinterCartridgeComponent.cs (1)

1-17: Проверьте использование компонента в системе

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

✅ Verification successful

Based on the search results, I can now generate the final response since I have found sufficient evidence of how the cartridge charge is handled in the codebase:

Система корректно обрабатывает заряд картриджа

Проверка показала, что изменения заряда картриджа обрабатываются должным образом:

  • В BookPrinterSystem.cs реализована логика проверки и расхода заряда при печати
  • Система визуализации (BookPrinterlVisualizerSystem.cs) корректно отображает уровень заряда через различные визуальные состояния
  • Компонент имеет все необходимые атрибуты для сетевой синхронизации (NetworkedComponent, AutoGenerateComponentState)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Поиск использования компонента в системах

# Поиск системы, работающей с картриджем
ast-grep --pattern 'class $_ : ISystem
{
  $$$
  BookPrinterCartridgeComponent $$$
  $$$
}'

# Поиск обработки изменений заряда
rg -A 5 "CurrentCharge|FullCharge"

Length of output: 42244

Content.Server.Database/Model.cs (2)

48-48: Корректное объявление DbSet!

Объявление свойства соответствует общему стилю кодовой базы и правильно использует null-forgiving оператор.


57-59: Корректная конфигурация индекса!

Конфигурация индекса для BookPrinterEntry соответствует лучшим практикам Entity Framework Core и согласуется с остальной кодовой базой.

Content.Server.Database/Migrations/Sqlite/20231030162802_BookTerminal.cs (3)

1-9: LGTM! Корректное объявление миграции

Класс миграции правильно унаследован и содержит необходимые атрибуты.


62-69: LGTM! Корректная реализация отката миграции

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


29-48: Проверьте необходимость nullable внешнего ключа

В таблице stamped_data внешний ключ book_printer_entry_id объявлен как nullable. Это означает, что штамп может существовать без связанной книги. Является ли это ожидаемым поведением?

✅ Verification successful

Let me gather more information about the usage of stamped_data to understand the relationship better.


Let me search for the related entity and business logic to understand if nullable foreign key is intentional.


Based on the code analysis, I can now provide a final response:

Nullable внешний ключ в таблице stamped_data является корректным

Анализ кода показывает, что это ожидаемое поведение, так как:

  • StampedData используется как коллекция штампов в BookPrinterEntry (см. public List<StampedData> StampedBy { get; set; })
  • Штампы могут быть созданы до того, как они будут привязаны к конкретной книге
  • Система позволяет управлять штампами независимо от записей книг
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Проверка использования stamped_data в исходном репозитории

# Поиск использования stamped_data в коде
rg -l "stamped_data" 

# Поиск логики, связанной с null значениями book_printer_entry_id
ast-grep --pattern 'book_printer_entry_id == null'

Length of output: 551


Script:

#!/bin/bash
# Search for any code that works with stamped_data table
rg -A 5 "stamped_data" --type cs

# Look for any entity definitions or models related to stamped data
ast-grep --pattern 'class $_ {
  $$$
  stamped_data
  $$$
}'

# Check if there are any other migrations that modify this table
fd --extension cs . Content.Server.Database/Migrations | xargs grep -l "stamped_data"

Length of output: 19110


Script:

#!/bin/bash
# Search for BookPrinterEntry entity and related code
rg -A 10 "class BookPrinterEntry" --type cs

# Look for any code that handles book printing or stamping logic
rg -A 5 "BookPrinter" --type cs

# Check for any comments or documentation about the book printing system
fd . -e md -e txt | xargs rg -i "book.*print|stamp"

Length of output: 88458

Content.Client/_Cats/BookPrinter/BookTerminalWindow.xaml.cs (3)

49-51: Убедитесь в инициализации BooksList перед использованием

Переменная BooksList проверяется на null, но нет информации об её инициализации. Проверьте, что BooksList корректно инициализируется до вызова UpdateBooksList.


128-129: ⚠️ Potential issue

Проверьте корректность условия проверки заряда картриджа

Условие state.CartridgeCharge <= -10.0f может быть неверным. Обычно заряд картриджа считается пустым при значении <= 0. Рекомендуется уточнить условие для правильного отображения статуса.

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

-else if (state.CartridgeCharge <= -10.0f)
+else if (state.CartridgeCharge <= 0.0f)
 {
     ContainerInfo.Children.Add(new Label { Text = Loc.GetString("book-printer-window-cartridge-empty"), FontColorOverride = Color.DarkRed });
     return;
 }

Likely invalid or redundant comment.


106-107: ⚠️ Potential issue

Предотвратите возможное исключение при работе с state.BookDescription

Переменная state.BookDescription может быть null. При передаче её в CutDescription без проверки может возникнуть исключение. Рекомендуется добавить проверку или использовать оператор ??.

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

 var bookSublabel = new Label
 {
-    Text = $"{CutDescription(state.BookDescription)}",
+    Text = $"{CutDescription(state.BookDescription ?? "")}",
     StyleClasses = { StyleNano.StyleClassLabelSecondaryColor }
 };

Likely invalid or redundant comment.

Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs (1)

1277-1279: Проверьте необходимость использования nullable типа для 'BookPrinterEntryId'.

Поле BookPrinterEntryId объявлено как nullable (int?), что позволяет StampedData существовать без связанной записи BookPrinterEntry. Если отношение между StampedData и BookPrinterEntry должно быть обязательным, рекомендуется сделать BookPrinterEntryId не nullable, чтобы обеспечить целостность данных.

Content.Server/_Cats/BookPrinter/Components/BookPrinterComponent.cs (3)

1-5: Импорты корректны и хорошо организованы!

Все необходимые зависимости присутствуют и правильно структурированы.


8-10: Правильное ограничение доступа к компоненту!

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


19-24: Необходима валидация WorkType!

Поле WorkType является nullable без значения по умолчанию, что может привести к неопределённому поведению. Рекомендуется добавить валидацию или значение по умолчанию.

Content.Shared/_Cats/BookPrinter/SharedBookPrinter.cs (2)

1-4: Структура пространства имен и импорты корректны!

Импорт Robust.Shared.Serialization необходим для атрибутов сериализации, используемых в классах.


96-101: Перечисление реализовано корректно!

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

Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs (3)

1314-1343: Структура таблицы book_printer_entry выглядит корректно

Сущность BookPrinterEntry правильно сконфигурирована с:

  • Автоинкрементным первичным ключом
  • Необходимыми текстовыми полями для хранения контента книги
  • Уникальным индексом по Id

1682-1688: Отношение между BookPrinterEntry и StampedData настроено корректно

Связь один-ко-многим правильно сконфигурирована с каскадным удалением по умолчанию.


1902-1907: Навигационное свойство StampedBy определено корректно

Коллекция штампов в BookPrinterEntry правильно настроена.

Comment on lines 6 to 7
contents:
- id: BookPrinterInkCartridge
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Исправьте отступы на строках 6-7

Отступы на строках 6 и 7 неверны. Ожидается отступ в 4 пробела, но обнаружено больше. Это может привести к ошибкам при разборе файла YAML.

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

-      contents:
-        - id: BookPrinterInkCartridge
+    contents:
+      - id: BookPrinterInkCartridge
📝 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
contents:
- id: BookPrinterInkCartridge
contents:
- id: BookPrinterInkCartridge
🧰 Tools
🪛 yamllint (1.35.1)

[warning] 7-7: wrong indentation: expected 4 but found 6

(indentation)


[error] 7-7: no new line character at the end of file

(new-line-at-end-of-file)

@@ -0,0 +1,7 @@
ent-BookPrinter = книжный книг
.desc = Рассадник пропаганды, унижчтожитель демократии. Позволяет копировать книги, а также заносить их в базу данных.
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Исправьте опечатку в описании

В слове "унижчтожитель" допущена опечатка. Правильное написание: "уничтожитель".

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

-     .desc = Рассадник пропаганды, унижчтожитель демократии. Позволяет копировать книги, а также заносить их в базу данных.
+     .desc = Рассадник пропаганды, уничтожитель демократии. Позволяет копировать книги, а также заносить их в базу данных.
📝 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
.desc = Рассадник пропаганды, унижчтожитель демократии. Позволяет копировать книги, а также заносить их в базу данных.
.desc = Рассадник пропаганды, уничтожитель демократии. Позволяет копировать книги, а также заносить их в базу данных.

@@ -0,0 +1,7 @@
ent-BookPrinter = книжный книг
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Исправьте название сущности

Название "книжный книг" выглядит некорректным. Рекомендуется заменить на "книжный принтер" для точного описания сущности.

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

- ent-BookPrinter = книжный книг
+ ent-BookPrinter = книжный принтер
📝 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
ent-BookPrinter = книжный книг
ent-BookPrinter = книжный принтер

@@ -15,3 +15,5 @@
ClothingShoesBootsLaceup: 2
ClothingHeadsetService: 2
PrinterDocFlatpack: 2 # Corvax-Printer
BookPrinterFlatpack: 1 # Cats
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Удалить лишние пробелы в конце строки 18

На строке 18 обнаружены лишние пробелы в конце строки. Это может привести к ошибкам при обработке файла YAML.

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

-    BookPrinterFlatpack: 1 # Cats 
+    BookPrinterFlatpack: 1 # Cats
📝 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
BookPrinterFlatpack: 1 # Cats
BookPrinterFlatpack: 1 # Cats
🧰 Tools
🪛 yamllint (1.35.1)

[error] 18-18: trailing spaces

(trailing-spaces)

Comment on lines +61 to +70
[Obsolete]
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);

if (disposing)
{
_window?.Dispose();
}
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Устаревший метод Dispose(bool disposing)

Использование атрибута [Obsolete] на методе Dispose может привести к предупреждениям при компиляции и не рекомендуется для переопределений методов базового класса.

Удалите атрибут [Obsolete] или обдумайте необходимость переопределения метода Dispose.

-[Obsolete]
protected override void Dispose(bool disposing)
{
    base.Dispose(disposing);

    if (disposing)
    {
        _window?.Dispose();
    }
}
📝 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
[Obsolete]
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
_window?.Dispose();
}
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
_window?.Dispose();
}
}


return text.Substring(0, 47) + "...";
}

Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

Формула расчёта прогресса некорректна

Текущая формула (int)(100.0f * (1 - state.WorkProgress)) инвертирует значение прогресса. Если WorkProgress представляет собой долю выполненной работы от 0 до 1, то формула показывает оставшийся процент работы вместо выполненного. Это может вводить пользователей в заблуждение, так как обычно прогресс-бары показывают процент выполнения, а не оставшееся время.

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

  • Заменить формулу на (int)(100.0f * state.WorkProgress) для отображения процента выполненной работы
  • Или добавить поясняющий комментарий, если текущее поведение намеренное
🔗 Analysis chain

Убедитесь в правильности вычисления прогресса работы

При расчёте прогресса используется выражение (int)(100.0f * (1 - state.WorkProgress)). Проверьте, соответствует ли это ожидаемому поведению: отображению оставшегося или выполненного процента работы.

Запустите следующий скрипт для проверки значений state.WorkProgress в кодовой базе:


Let me gather more context about the progress calculation and its usage.


Let me check the state handling in the terminal window implementation.


Let me check the state definition to understand how WorkProgress is defined.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Поиск использования state.WorkProgress

# Ожидается: Найти все упоминания state.WorkProgress для анализа контекста
rg 'state\.WorkProgress'

Length of output: 361


Script:

#!/bin/bash
# Search for the WorkProgress property definition and related code
ast-grep --pattern 'WorkProgress'

# Search for localization string definition
rg "book-printer-window-working"

Length of output: 394


Script:

#!/bin/bash
# Get the full content of the terminal window implementation
cat "Content.Client/_Cats/BookPrinter/BookTerminalWindow.xaml.cs"

# Search for any state-related classes or interfaces
rg -g "*.cs" "interface.*State" -A 5

Length of output: 8796


Script:

#!/bin/bash
# Search for BookPrinterBoundUserInterfaceState definition
rg -g "*.cs" "class.*BookPrinterBoundUserInterfaceState" -A 10

Length of output: 1091

Comment on lines +1442 to +1449
modelBuilder.Entity("Content.Server.Database.StampedData", b =>
{
b.HasOne("Content.Server.Database.BookPrinterEntry", null)
.WithMany("StampedBy")
.HasForeignKey("BookPrinterEntryId")
.HasConstraintName("FK_stamped_data_book_printer_entry_book_printer_entry_id");
});
// Cats-BookPrinter-End
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Настройте отношение между 'StampedData' и 'BookPrinterEntry' как обязательное.

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

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

b.HasOne("Content.Server.Database.BookPrinterEntry", null)
    .WithMany("StampedBy")
    .HasForeignKey("BookPrinterEntryId")
+   .IsRequired()
+   .OnDelete(DeleteBehavior.Cascade)
    .HasConstraintName("FK_stamped_data_book_printer_entry_book_printer_entry_id");
📝 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
modelBuilder.Entity("Content.Server.Database.StampedData", b =>
{
b.HasOne("Content.Server.Database.BookPrinterEntry", null)
.WithMany("StampedBy")
.HasForeignKey("BookPrinterEntryId")
.HasConstraintName("FK_stamped_data_book_printer_entry_book_printer_entry_id");
});
// Cats-BookPrinter-End
modelBuilder.Entity("Content.Server.Database.StampedData", b =>
{
b.HasOne("Content.Server.Database.BookPrinterEntry", null)
.WithMany("StampedBy")
.HasForeignKey("BookPrinterEntryId")
.IsRequired()
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("FK_stamped_data_book_printer_entry_book_printer_entry_id");
});
// Cats-BookPrinter-End

Comment on lines +25 to +30
[DataField, ViewVariables(VVAccess.ReadWrite)]
public string? StampedName = "stamp-component-stamped-name-terminal";

[DataField, ViewVariables(VVAccess.ReadWrite)]
public string? StampedColor = "#999999";

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендуется использовать типизированное представление цвета!

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

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

-[DataField, ViewVariables(VVAccess.ReadWrite)]
-public string? StampedColor = "#999999";
+[DataField, ViewVariables(VVAccess.ReadWrite)]
+public Color StampedColor = Color.FromHex("#999999");

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

Comment on lines +60 to +79
[Serializable, NetSerializable]
public class SharedBookPrinterEntry
{
public int Id { get; set; } = default!;
public string Name { get; set; } = default!;
public string Description { get; set; } = default!;
public string Content { get; set; } = default!;
public List<SharedStampedData> StampedBy { get; set; } = default!;
public string StampState { get; set; } = default!;

public SharedBookPrinterEntry(int id, string name, string description, string content, List<SharedStampedData> stampedBy, string stampState)
{
Id = id;
Name = name;
Description = description;
Content = content;
StampedBy = stampedBy;
StampState = stampState;
}
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендуется улучшить безопасность типов

  1. Рассмотрите возможность сделать класс неизменяемым (immutable)
  2. Использование default! может привести к проблемам с null-ссылками

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

-public class SharedBookPrinterEntry
+public sealed class SharedBookPrinterEntry
 {
-    public int Id { get; set; } = default!;
-    public string Name { get; set; } = default!;
+    public int Id { get; init; }
+    public string Name { get; init; }

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

Comment on lines +81 to +94
[Serializable, NetSerializable]
public class SharedStampedData
{
public int Id { get; set; } = default!;
public string Name { get; set; } = default!;
public string Color { get; set; } = default!;

public SharedStampedData(int id, string name, string color)
{
Id = id;
Name = name;
Color = color;
}
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Аналогичные улучшения требуются для SharedStampedData

Те же проблемы с изменяемостью и безопасностью null-ссылок, что и в SharedBookPrinterEntry.

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

-public class SharedStampedData
+public sealed class SharedStampedData
 {
-    public int Id { get; set; } = default!;
-    public string Name { get; set; } = default!;
-    public string Color { get; set; } = default!;
+    public int Id { get; init; }
+    public string Name { get; init; }
+    public string Color { get; init; }

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

Copy link

This pull request has conflicts, please resolve those before we can evaluate the pull request.

Copy link

@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: 4

🧹 Nitpick comments (7)
Content.Client/_Cats/BookPrinter/BookTerminalWindow.xaml.cs (5)

1-2: Необходимо улучшить информацию об авторских правах

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

  • Тип лицензии исходного кода
  • Дату создания/копирования
  • Ссылку на конкретный коммит оригинального кода

17-24: Добавьте XML-документацию для публичного класса и событий

Для улучшения читаемости и поддержки кода добавьте:

  • Описание класса BookPrinterWindow
  • Документацию для каждого публичного события
  • Примеры использования событий

33-47: Добавьте проверку на null для castState

Добавьте проверку на null после приведения типа:

 var castState = (BookPrinterBoundUserInterfaceState)state;
+if (castState is null)
+    return;

64-68: Упростите обработчики событий

Текущие лямбда-выражения можно упростить:

-button.OnPressed += args => OnPrintBookButtonPressed?.Invoke(args, button);
-button.OnMouseEntered += args => OnPrintBookButtonMouseEntered?.Invoke(args, button);
-button.OnMouseExited += args => OnPrintBookButtonMouseExited?.Invoke(args, button);
+button.OnPressed += (args) => OnPrintBookButtonPressed?.Invoke(args, button);
+button.OnMouseEntered += (args) => OnPrintBookButtonMouseEntered?.Invoke(args, button);
+button.OnMouseExited += (args) => OnPrintBookButtonMouseExited?.Invoke(args, button);

144-149: Улучшите обработку заряда картриджа

Рекомендуемые улучшения:

  1. Вынесите магическое число в константу
  2. Используйте string interpolation вместо конкатенации
+private const float MinimumCartridgeCharge = -10.0f;
+
-else if (state.CartridgeCharge <= -10.0f)
+else if (state.CartridgeCharge <= MinimumCartridgeCharge)
Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/flatpack.yml (1)

8-9: Добавьте перенос строки в конец файла

Отсутствует перенос строки в конце файла, что может вызвать проблемы при обработке файла некоторыми инструментами.

🧰 Tools
🪛 yamllint (1.35.1)

[error] 9-9: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Entities/Structures/Machines/Computers/book_printer.yml (1)

1-2: Улучшить формат документации

Рекомендуется добавить более подробную информацию о портировании, включая:

  • Дату портирования
  • Версию оригинального кода
  • Список внесенных изменений
-# Оригинал данного файла был сделан @temporaldarkness (discord). Прототип был взят с https://github.com/ss14-ganimed/ENT14-Master.
+# Book Printer - Прототип принтера книг
+# 
+# Оригинальный автор: @temporaldarkness (Discord)
+# Источник: https://github.com/ss14-ganimed/ENT14-Master
+# Дата портирования: Декабрь 2024
+# 
+# История изменений:
+# - Адаптировано для Space-Cats-14
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c74393d and f776e35.

📒 Files selected for processing (15)
  • Content.Client/_Cats/BookPrinter/BookPrinterBoundUserInterface.cs (1 hunks)
  • Content.Client/_Cats/BookPrinter/BookPrinterWindow.xaml (1 hunks)
  • Content.Client/_Cats/BookPrinter/BookTerminalWindow.xaml.cs (1 hunks)
  • Content.Client/_Cats/BookPrinter/Visualizers/BookPrinterlVisualizerSystem.cs (1 hunks)
  • Content.Server/_Cats/BookPrinter/BookPrinterSystem.cs (1 hunks)
  • Content.Server/_Cats/BookPrinter/Components/BookPrinterComponent.cs (1 hunks)
  • Content.Shared/_Cats/BookPrinter/Components/BookPrinterCartridgeComponent.cs (1 hunks)
  • Content.Shared/_Cats/BookPrinter/Components/BookPrinterVisualsComponent.cs (1 hunks)
  • Content.Shared/_Cats/BookPrinter/SharedBookPrinter.cs (1 hunks)
  • Resources/Prototypes/_SpaceCats/Catalog/Fills/Crates/service.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/Circuitboards/Machine/production.yml (2 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/flatpack.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml (1 hunks)
  • Resources/Prototypes/_SpaceCats/Entities/Structures/Machines/Computers/book_printer.yml (1 hunks)
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/meta.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (10)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/Circuitboards/Machine/production.yml
  • Content.Shared/_Cats/BookPrinter/Components/BookPrinterCartridgeComponent.cs
  • Content.Shared/_Cats/BookPrinter/Components/BookPrinterVisualsComponent.cs
  • Content.Client/_Cats/BookPrinter/Visualizers/BookPrinterlVisualizerSystem.cs
  • Resources/Textures/_SpaceCats/Structures/Machines/book_printer.rsi/meta.json
  • Content.Client/_Cats/BookPrinter/BookPrinterWindow.xaml
  • Content.Server/_Cats/BookPrinter/BookPrinterSystem.cs
  • Content.Shared/_Cats/BookPrinter/SharedBookPrinter.cs
  • Content.Client/_Cats/BookPrinter/BookPrinterBoundUserInterface.cs
  • Content.Server/_Cats/BookPrinter/Components/BookPrinterComponent.cs
🧰 Additional context used
🪛 yamllint (1.35.1)
Resources/Prototypes/_SpaceCats/Catalog/Fills/Crates/service.yml

[warning] 9-9: wrong indentation: expected 4 but found 6

(indentation)


[error] 10-10: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Entities/Objects/Devices/flatpack.yml

[error] 9-9: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml

[warning] 2-2: wrong indentation: expected 0 but found 2

(indentation)


[error] 14-14: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_SpaceCats/Entities/Structures/Machines/Computers/book_printer.yml

[warning] 75-75: wrong indentation: expected 6 but found 7

(indentation)


[warning] 76-76: wrong indentation: expected 9 but found 8

(indentation)


[warning] 81-81: wrong indentation: expected 9 but found 8

(indentation)


[error] 121-121: no new line character at the end of file

(new-line-at-end-of-file)

🔇 Additional comments (8)
Content.Client/_Cats/BookPrinter/BookTerminalWindow.xaml.cs (2)

90-90: Формула расчёта прогресса некорректна

Текущая формула (int)(100.0f * (1 - state.WorkProgress)) инвертирует значение прогресса. Если WorkProgress представляет собой долю выполненной работы от 0 до 1, то формула показывает оставшийся процент работы вместо выполненного.

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

-Text = Loc.GetString("book-printer-window-working", ("progress", (int)(100.0f * (1 - state.WorkProgress))))
+Text = Loc.GetString("book-printer-window-working", ("progress", (int)(100.0f * state.WorkProgress)))

108-109: Добавьте обработку случая, когда книга не найдена

Если _entMan.TryGetEntity(state.BookEntity, out var bookEntity) возвращает false, то bookEntity будет неопределён, и вызов bookPreview.SetEntity(bookEntity) может привести к ошибке.

 if (_entMan.TryGetEntity(state.BookEntity, out var bookEntity))
     bookPreview.SetEntity(bookEntity);
+else
+    Logger.Warning($"Book entity {state.BookEntity} not found");
Resources/Prototypes/_SpaceCats/Catalog/Fills/Crates/service.yml (2)

3-6: Структура сущности корректна

Определение сущности CrateServicePrinterInkCartridge соответствует стандартам прототипов и правильно наследуется от CratePlastic.


7-9: 🛠️ Refactor suggestion

Исправьте отступы в YAML структуре

Обнаружены проблемы с форматированием YAML:

  • Неправильные отступы в блоке contents
  • Отсутствует перенос строки в конце файла

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

  - type: StorageFill
    contents:
-      - id: BookPrinterInkCartridge
+    - id: BookPrinterInkCartridge

Likely invalid or redundant comment.

🧰 Tools
🪛 yamllint (1.35.1)

[warning] 9-9: wrong indentation: expected 4 but found 6

(indentation)

Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml (2)

4-5: 🛠️ Refactor suggestion

Локализуйте текстовые поля

Необходимо использовать систему локализации для полей name и description.

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

-  name: printer cartridge
-  description: A black box containing a strange black substance. You think they're called ink...
+  name: printer-cartridge-name
+  description: printer-cartridge-description

Добавьте соответствующие строки в файл локализации Resources/Locale/ru-RU/_Cats/Entities/Objects/Misc/refill_cartridge.ftl.

Likely invalid or redundant comment.


8-9: Проверьте баланс цены картриджа

Установленная цена в 150 единиц требует проверки на соответствие игровой экономике.

✅ Verification successful

Цена картриджа в 150 единиц выглядит сбалансированной

На основе анализа цен других предметов в игре:

  • Большинство базовых расходных материалов стоят от 10 до 100 единиц
  • Картриджи для оружия стоят около 10-20 единиц
  • Наборы снаряжения (gear bundles) в том же каталоге стоят от 170 до 925 единиц
  • Медицинские инструменты и расходники стоят от 30 до 750 единиц

Цена в 150 единиц для перезаряжаемого картриджа выглядит обоснованной, так как:

  1. Это выше стоимости обычных боеприпасов, что логично для многоразового предмета
  2. Находится в диапазоне цен других расходных материалов
  3. Соответствует ценовому уровню других предметов в каталоге SpaceCats
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других предметов с компонентом StaticPrice для сравнения
rg -A 1 "type: StaticPrice" | grep "price:"

Length of output: 33691

Resources/Prototypes/_SpaceCats/Entities/Structures/Machines/Computers/book_printer.yml (2)

6-7: Проверить достаточность контроля доступа

Учитывая описание устройства как потенциального инструмента пропаганды, рекомендуется:

  1. Добавить журналирование всех операций печати
  2. Рассмотреть необходимость дополнительных прав доступа
  3. Добавить возможность отслеживания происхождения напечатанных материалов

55-58: Проверить обработку состояний питания

Необходимо убедиться, что:

  1. Визуальные состояния корректно отображают статус питания
  2. При отключении питания данные сохраняются
  3. Восстановление после сбоя питания происходит корректно
✅ Verification successful

Обработка состояний питания реализована корректно

На основе анализа кода подтверждаю, что:

  1. При отключении питания система корректно очищает текущие задачи через FlushTask
  2. Все слоты блокируются при отсутствии питания через SetLockOnAllSlots
  3. Состояние UI обновляется при изменении питания через UpdateUiState
  4. Компонент ApcPowerReceiver обеспечивает базовую функциональность питания
  5. Компонент ActivatableUIRequiresPower автоматически закрывает интерфейс при отключении питания

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

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск обработчиков состояний питания
ast-grep --pattern 'class $_ {
  $$$
  OnPower$_($$$) {
    $$$
  }
  $$$
}'

Length of output: 78


Script:

#!/bin/bash
# Поиск файлов, связанных с питанием и принтером
rg -l "ApcPowerReceiver|PowerReceiver|book_printer" --type yaml

# Поиск компонентов, связанных с визуальными состояниями
rg "AppearanceComponent|SpriteComponent|PointLightComponent" --type yaml -A 3 -B 3

# Поиск обработки состояний питания
rg "OnPowerChanged|PowerStateChanged|PowerDisrupted" -A 3

Length of output: 50574


Script:

#!/bin/bash
# Поиск компонентов и систем, связанных с принтером книг
rg -l "BookPrinter" --type cs

# Поиск обработки визуальных состояний
rg "UpdateAppearance|UpdateVisualState" -A 3 Content.Server/_Cats/BookPrinter/

# Поиск обработки сохранения данных
rg "Save|Restore|FlushTask" -A 3 Content.Server/_Cats/BookPrinter/

Length of output: 3219

Comment on lines +5 to +6
name: book printer flatpack
description: A flatpack used for constructing a book printer.
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Требуется локализация текстовых полей

Поля name и description должны использовать локализованные строки вместо прямого текста.

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

-  name: book printer flatpack
-  description: A flatpack used for constructing a book printer.
+  name: book-printer-flatpack-name
+  description: book-printer-flatpack-description

Добавьте соответствующие строки в файл локализации Resources/Locale/ru-RU/_Cats/Entities/Objects/Devices/flatpack.ftl.

📝 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
name: book printer flatpack
description: A flatpack used for constructing a book printer.
name: book-printer-flatpack-name
description: book-printer-flatpack-description

Comment on lines 1 to 2
# Оригинал данного файла был сделан @temporaldarkness (discord). Прототип был взят с https://github.com/ss14-ganimed/ENT14-Master.- type: entity
id: BookPrinterInkCartridge
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Исправьте синтаксическую ошибку в заголовке файла

В первой строке комментарий объединён с определением сущности, что приведёт к ошибке парсинга.

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

# Оригинал данного файла был сделан @temporaldarkness (discord). Прототип был взят с https://github.com/ss14-ganimed/ENT14-Master.
-  id: BookPrinterInkCartridge
+- type: entity
+  id: BookPrinterInkCartridge

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

🧰 Tools
🪛 yamllint (1.35.1)

[warning] 2-2: wrong indentation: expected 0 but found 2

(indentation)

- type: ContainerFill
containers:
cartridgeSlot:
- BookPrinterInkCartridge
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Добавить пустую строку в конец файла

YAML файлы должны заканчиваться пустой строкой.

      cartridgeSlot:
      - BookPrinterInkCartridge
+
📝 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
- BookPrinterInkCartridge
- BookPrinterInkCartridge
🧰 Tools
🪛 yamllint (1.35.1)

[error] 121-121: no new line character at the end of file

(new-line-at-end-of-file)

acts: ["Destruction"]
- type: ItemSlots
slots:
bookSlot:
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Исправить отступ в определении слотов

Отступ должен быть 6 пробелов вместо 7.

    slots:
-       bookSlot:
+      bookSlot:
📝 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
bookSlot:
bookSlot:
🧰 Tools
🪛 yamllint (1.35.1)

[warning] 75-75: wrong indentation: expected 6 but found 7

(indentation)

Copy link

@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: 0

♻️ Duplicate comments (1)
Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml (1)

2-2: ⚠️ Potential issue

Исправьте отступ в определении сущности

Строка содержит лишний отступ перед "type: entity", что может привести к ошибкам при парсинге YAML.

- - type: entity
+ type: entity
🧹 Nitpick comments (1)
Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml (1)

15-15: Добавьте пустую строку в конец файла

Согласно стандартам YAML, файл должен заканчиваться пустой строкой.

  - type: Item
    size: Normal
+
🧰 Tools
🪛 yamllint (1.35.1)

[error] 15-15: no new line character at the end of file

(new-line-at-end-of-file)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f776e35 and a211162.

📒 Files selected for processing (1)
  • Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml (1 hunks)
🧰 Additional context used
🪛 yamllint (1.35.1)
Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml

[error] 15-15: no new line character at the end of file

(new-line-at-end-of-file)

🔇 Additional comments (1)
Resources/Prototypes/_SpaceCats/Entities/Objects/Misc/refill_cartridge.yml (1)

5-6: 🛠️ Refactor suggestion

Добавьте локализацию для названия и описания

Текстовые поля должны использовать систему локализации для поддержки разных языков.

- name: printer cartridge
- description: A black box containing a strange black substance. You think they're called ink...
+ name: Loc.GetString("book-printer-ink-cartridge-name")
+ description: Loc.GetString("book-printer-ink-cartridge-description")

Также необходимо добавить соответствующие строки в файл локализации Resources/Locale/ru-RU/_Cats/Entities/Structures/Machines/book_printer.ftl:

book-printer-ink-cartridge-name = картридж для принтера
book-printer-ink-cartridge-description = Чёрная коробка, содержащая странное чёрное вещество. Кажется, это называется чернила...

Likely invalid or redundant comment.

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.

1 participant