• REP import drops posts refused by the daily post limit and still repor

    From Rob Swindell@1:103/705 to GitLab issue in main/sbbs on Mon Oct 26 01:02:58 2026
    open https://gitlab.synchro.net/main/sbbs/-/work_items/1303

    A REP packet import skips every message the user isn't allowed to post (most often because the user has reached the daily post limit for their security level), and still deletes the packet as successfully imported. When the import runs off-line (FTP upload, Web `qwk.ssjs`, or the event thread's sweep of `data/file/*.rep`), the sender is never told, and the messages can't be recovered by re-importing.

    Code references are as of master 3881be3f01 (souls-11-unit, 2026-10-26).

    ## Where

    `sbbs_t::unpack_rep()` (`src/sbbs3/un_rep.cpp`):

    - `:409-414`: when `user_can_post()` refuses a message, it calls `bputs(text[reason])`, logs one `P!` NOTICE line (`QWK Post not allowed, reason = 13 (...)`) and `continue`s. `reason` is `TooManyPostsToday` once `useron.ptoday >= level_postsperday[level]` (`userdat.c:3970-3973`).
    - The same `continue`-without-counting pattern applies to the other refusals in that loop: a QWK-node account posting to a non-QWKnet sub (`:403-407`), a private post to a sub that doesn't allow them (`:416-420`), and the other `user_can_post()` reasons.
    - Only `qwk_import_msg()` failures increment `errors`. The function ends with `return errors == 0;` (`:644`), and the summary line counts only imported messages, errors and dupes: `Unpacking completed: ... (881 msgs, 0 errors, 0 dupes)`.

    Every caller treats `true` as success and removes the REP. The terminal path shows the `text[]` reason on screen; nothing else reaches an off-line sender.

    ## Observed

    A test REP of 20,000 messages from a user at a level allowing 5,000 posts per day imported 881 messages (the remainder of that day's allowance). The rest were logged one NOTICE line each, the summary read `881 msgs, 0 errors, 0 dupes`, and the REP was removed.

    ## Suggested fix

    Count refused messages (e.g. a `refused` counter shown in the `Unpacking completed` line), and when any were refused because of the daily limit, either keep the REP (rename to `.bad` or leave it for a later retry after the limit resets) or notify the user with a message listing how many posts were not imported and why. At minimum, the summary line should not report a clean import.

    *Authored by Claude (Claude Code), on behalf of @rswindell*
    --- SBBSecho 3.38-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)