From dbdb753ab6c4d651e847699377945f42b04bb309 Mon Sep 17 00:00:00 2001 From: AI Dev Date: Sun, 11 Oct 2026 18:42:33 +0000 Subject: [PATCH 1/2] A flash dump read with a programmer earns 3 stars; ipctool's backup keeps 10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A maintainer in the user group: a dump uploaded as a file, read with a programmer or over the console and TFTP, is worth about a quarter of one ipctool makes (#458). ipctool reads the chip on the running camera and says with it what the camera is; a programmer's image is the bytes alone. Both earned 10. - reports.Points pays StarsPerRawDump (3) for a programmer's image, a dump new to the catalogue; ipctool's backup still earns StarsPerDump (10), and a known dump nothing. The two are told apart by the name the server gives a backup (RawDumpName, flash.bin; ipctool's is backup.bin), which the sender never chooses. ipctool's report joining the image later does not raise it. - Nothing already paid changes: on production no programmer image had been paid any stars (two are stored, 0 net); the six ipctool backups keep theirs. - The site says so: "How stars work" lists the two, the send form's dump button reads +3–10 ★, and the new-camera form's lede and dump hint give the programmer's 3 (en, ru, zh). Closes #458 --- data/locales/boards.en.yml | 5 ++-- data/locales/boards.ru.yml | 5 ++-- data/locales/boards.zh.yml | 5 ++-- .../apps/site/src/components/club/Club.tsx | 2 +- .../src/components/club/NewCameraForm.tsx | 4 +-- .../src/components/club/SendForm.test.tsx | 6 +++++ .../site/src/components/club/SendForm.tsx | 3 ++- frontend/apps/site/src/i18n/boards.en.json | 5 ++-- frontend/apps/site/src/i18n/boards.ru.json | 5 ++-- frontend/apps/site/src/i18n/boards.zh.json | 5 ++-- frontend/apps/site/src/lib/club.ts | 3 ++- service/internal/club/api_test.go | 14 +++++----- service/internal/club/edit_test.go | 9 +++++-- service/internal/club/newcamera_test.go | 9 ++++--- service/internal/reports/club.go | 26 ++++++++++++++----- service/internal/reports/edit.go | 2 +- service/internal/reports/handler.go | 2 +- 17 files changed, 72 insertions(+), 38 deletions(-) diff --git a/data/locales/boards.en.yml b/data/locales/boards.en.yml index 5709c699..e976047a 100644 --- a/data/locales/boards.en.yml +++ b/data/locales/boards.en.yml @@ -517,7 +517,7 @@ en: kind_yaml: 'ipctool report' no_board: 'No board named' new_link: 'Add a camera that is not in the catalogue' - new_lede: 'Name the maker and the board, and add photos of it: the board''s front and back, and the label. A maintainer adds it to the catalogue when they publish your report; each photo and file earns {n} ★, and a whole-flash dump nobody sent before {dump} ★.' + new_lede: 'Name the maker and the board, and add photos of it: the board''s front and back, and the label. A maintainer adds it to the catalogue when they publish your report; each photo and file earns {n} ★, and a whole-flash dump nobody sent before {dump} ★ from ipctool, or {raw} ★ read with a programmer.' new_dump_hint: 'Optional. Read the chip with a programmer when ipctool cannot run on the camera, for example behind a U-Boot password; a dump nobody sent before earns {n} ★.' code_get: 'Send ipctool''s report from a camera' code_add_ipctool: 'Add ipctool''s report from this camera' @@ -542,7 +542,8 @@ en: proposed: 'New: {board}' rules_title: 'How stars work' rules_item: 'Boot log, U-Boot console, photo, pinout, ipctool report' - rules_dump: 'Full flash dump the catalogue doesn''t have' + rules_dump: 'Full flash dump the catalogue doesn''t have, taken by ipctool' + rules_raw_dump: 'Full flash dump the catalogue doesn''t have, read with a programmer or over TFTP' rules_none: 'A dump the catalogue already holds, or anything not accepted' rules_note: 'Reports earn stars when a maintainer accepts them, never on upload. Cameras earn theirs once a night, from the days they kept sending pictures; stars for a camera found to be fake are taken back.' send_kinds_label: 'What you are sending' diff --git a/data/locales/boards.ru.yml b/data/locales/boards.ru.yml index ad70b71e..a7782252 100644 --- a/data/locales/boards.ru.yml +++ b/data/locales/boards.ru.yml @@ -568,7 +568,7 @@ ru: kind_yaml: 'Отчёт ipctool' no_board: 'Плата не указана' new_link: 'Добавить камеру, которой нет в каталоге' - new_lede: 'Укажите производителя и плату и приложите фото: плату с обеих сторон и наклейку. Мейнтейнер добавит её в каталог, когда опубликует ваш отчёт; каждое фото и файл приносят {n} ★, а полный дамп флеша, которого у нас ещё нет, — {dump} ★.' + new_lede: 'Укажите производителя и плату и приложите фото: плату с обеих сторон и наклейку. Мейнтейнер добавит её в каталог, когда опубликует ваш отчёт; каждое фото и файл приносят {n} ★, а полный дамп флеша, которого у нас ещё нет, — {dump} ★ от ipctool или {raw} ★, снятый программатором.' new_dump_hint: 'Необязательно. Снимите флеш программатором, если ipctool на камере не запустить, например когда U-Boot закрыт паролем; дамп, которого у нас ещё нет, приносит {n} ★.' code_get: 'Отправить отчёт ipctool с камеры' code_add_ipctool: 'Добавить отчёт ipctool с этой камеры' @@ -593,7 +593,8 @@ ru: proposed: 'Новая: {board}' rules_title: 'Как начисляются звёзды' rules_item: 'Лог загрузки, консоль U-Boot, фото, распиновка, отчёт ipctool' - rules_dump: 'Полный дамп флеш-памяти, которого нет в каталоге' + rules_dump: 'Полный дамп флеш-памяти, которого нет в каталоге, снятый ipctool' + rules_raw_dump: 'Полный дамп флеш-памяти, которого нет в каталоге, снятый программатором или по TFTP' rules_none: 'Дамп, который уже есть в каталоге, или непринятый материал' rules_note: 'Отчёты приносят звёзды, когда мейнтейнер их принимает, а не при загрузке. Камеры получают свои раз в сутки — за дни, в которые присылали снимки; звёзды камеры, оказавшейся поддельной, списываются.' send_kinds_label: 'Что вы присылаете' diff --git a/data/locales/boards.zh.yml b/data/locales/boards.zh.yml index 9ef61233..cedb4d8f 100644 --- a/data/locales/boards.zh.yml +++ b/data/locales/boards.zh.yml @@ -512,7 +512,7 @@ zh: kind_yaml: 'ipctool 报告' no_board: '未指定电路板' new_link: '添加目录中没有的摄像头' - new_lede: '填写厂商和电路板,并附上照片:电路板正反面和标签。维护者发布你的报告时会把它加入目录;每张照片和每个文件可获得 {n} ★,我们还没有的完整闪存转储可获得 {dump} ★。' + new_lede: '填写厂商和电路板,并附上照片:电路板正反面和标签。维护者发布你的报告时会把它加入目录;每张照片和每个文件可获得 {n} ★,我们还没有的完整闪存转储:由 ipctool 制作可获得 {dump} ★,用编程器读取可获得 {raw} ★。' new_dump_hint: '可选。如果摄像头上无法运行 ipctool(例如 U-Boot 设有密码),可以用编程器读取闪存芯片;我们还没有的转储可获得 {n} ★。' code_get: '从摄像头发送 ipctool 报告' code_add_ipctool: '添加这台摄像头的 ipctool 报告' @@ -537,7 +537,8 @@ zh: proposed: '新:{board}' rules_title: '星星如何计算' rules_item: '启动日志、U-Boot 控制台、照片、引脚图、ipctool 报告' - rules_dump: '目录中没有的完整闪存转储' + rules_dump: '目录中没有的完整闪存转储,由 ipctool 制作' + rules_raw_dump: '目录中没有的完整闪存转储,用编程器或通过 TFTP 读取' rules_none: '目录中已有的转储,或未通过的内容' rules_note: '报告在维护者通过时计星,上传时不计。摄像头每晚结算一次,按其持续发送画面的天数计星;被认定为伪造的摄像头,其星星会被收回。' send_kinds_label: '提交内容类型' diff --git a/frontend/apps/site/src/components/club/Club.tsx b/frontend/apps/site/src/components/club/Club.tsx index 8339269c..083ae6de 100644 --- a/frontend/apps/site/src/components/club/Club.tsx +++ b/frontend/apps/site/src/components/club/Club.tsx @@ -422,7 +422,7 @@ function Rules({ t }: { t: BoardsT }) { {([ - ['rules_item', `+${STARS.item} ★`], ['rules_dump', `+${STARS.dump} ★`], + ['rules_item', `+${STARS.item} ★`], ['rules_dump', `+${STARS.dump} ★`], ['rules_raw_dump', `+${STARS.rawDump} ★`], ['rules_join', `+${STARS.join} ★`], ['rules_month', `+${STARS.month} ★`], ['rules_rare', `+${STARS.rare} ★`], ['rules_none', '0'], ] as const).map(([k, v]) => ( diff --git a/frontend/apps/site/src/components/club/NewCameraForm.tsx b/frontend/apps/site/src/components/club/NewCameraForm.tsx index d676fda0..890c737b 100644 --- a/frontend/apps/site/src/components/club/NewCameraForm.tsx +++ b/frontend/apps/site/src/components/club/NewCameraForm.tsx @@ -82,7 +82,7 @@ export default function NewCameraForm({ locale }: { locale: Locale }) { return ( -

{t('club.new_lede', { n: STARS.item, dump: STARS.dump })}

+

{t('club.new_lede', { n: STARS.item, dump: STARS.dump, raw: STARS.rawDump })}

-

{t('club.new_dump_hint', { n: STARS.dump })}

+

{t('club.new_dump_hint', { n: STARS.rawDump })}

{dump && (