//put this wherever you want

/**
 * return -1 or the command number if the player has it
 */
short int is_command(const CHAR_DATA *ch, const char* command) {
    if (!ch || !command || command[0] == '\0')
        return -1;
    short int cmd = -1;
    for (cmd = 0;cmd_table[cmd].name[0] != '\0';cmd ++)
        if (command[0] == cmd_table[cmd].name[0] && !str_prefix(command, cmd_table[cmd].name) && cmd_table[cmd].level <= ch->level)
            return cmd;
    return -1;
}
void save_queue(CHAR_DATA *ch, bool_t isLast) {
    if (!ch || !ch->desc)
        return;
    if (isLast)
        sprintf(ch->desc->resume, "%s\n\r%s", ch->desc->inlast, ch->desc->inbuf);
    else
        sprintf(ch->desc->resume, "%s", ch->desc->inbuf);
    ch->desc->inbuf[0] = '\0';
}

bool_t do_resume(CHAR_DATA *ch, char *argument) {
    if ( !ch || !ch->desc)
        return FALSE;
    if (argument[0] != '\0') {
        if ( !str_cmp(argument, "list")) {
            if (ch->desc->resume[0] == '\0')
                send_to_char("Your todo list is empty.\n\r", ch);
            else
                chprintf(ch, "Your todo list:\n\r%s", ch->desc->resume);
            return TRUE;
        }
        if ( !str_cmp(argument, "clear")) {
            if (ch->position != POS_DEAD)
                send_to_char(ch->desc->resume[0] == '\0' ? "Your todo list was already empty.\n\r" : "Ok, todo list cleared.\n\r", ch);
            ch->desc->resume[0] = '\0';
            return TRUE;
        }
        send_to_char("Valid arguments: <list> <clear>\n\r", ch);
        return FALSE;
    }
    if (ch->desc->resume[0] == '\0') {
        send_to_char("Your todo list is empty.\n\r", ch);
        return FALSE;
    }
    strcpy(ch->desc->inbuf, ch->desc->resume);
    ch->desc->resume[0] = '\0';
    return TRUE;
}

/*
* Pick off one line from a string and return the rest.
*/
char *one_line(char *argument, char *arg_first) {
    if (!argument)
        return &str_empty[0];
    int i, k;
    /*
     * Look for at least one new line.
     */
    for (i = 0;argument[i] != '\n' && argument[i] != '\r';i ++) {
        if (argument[i] == '\0') {
            for (k = 0; k <= i; k++)
            arg_first[k] = argument[k];
            argument[0] = '\0';
            return argument;
        }
    }

    /*
     * Canonical input processing.
     */
    for (i = 0, k = 0;argument[i] != '\n' && argument[i] != '\r';i ++) {
        if (k >= MAX_STRING_LENGTH - 3) {
            /* skip the rest of the line */
            for (;argument[i] != '\0';i ++) {
                if (argument[i] == '\n' || argument[i] == '\r')
                    break;
            }
            argument[i] = '\n';
            argument[i + 1] = '\r';
            argument[i + 2] = '\0';
            break;
        }

        if (argument[i] == '\b' && k > 0)
            --k;
        else if ((xisascii(argument[i])&& xisprint(argument[i])) || argument[i] == '\t')
            arg_first[k ++] = argument[i];
    }

    // Finish off the line.
    arg_first[k] = '\0';

    // Shift the input buffer.
    short int offset = argument[i+1] != '\n' && argument[i+1] != '\r' ? 1 : 2;
    for (k = 0;(argument[k] = argument[i + k + offset]) != '\0';k ++)
        ;
    return argument;
}

in nanny look for this line:  (descIt is the d variable)

if (descIt && descIt->character && descIt->character->wait > 0) {
    --descIt->character->wait;
    if ( !descIt->inbuf || descIt->inbuf[0] == '\0')
        continue;
    //check if we find a command we can execute right away even lagged
    char* commandList = str_dup(descIt->inbuf);
    descIt->inbuf[0] = '\0';
    char commandLine[MAX_INPUT_LENGTH];
    commandLine[0] = '\0';
    char command[MAX_INPUT_LENGTH];
    while (commandLine[0] == '\0' && commandList[0] != '\0')
        commandList = one_line(commandList, commandLine);
    short int cmd;
    while (commandLine[0] != '\0') {
        one_argument(commandLine, command);
        if ( !str_cmp(command, "!!")) {
            save_queue(descIt->character, FALSE);
            break;
        }
        cmd = is_command(descIt->character, command);
        if (cmd != -1 && cmd_table[cmd].wait == 0)
            interpret(descIt->character, commandLine, FALSE);
        else
            sprintf(descIt->inbuf, "%s%s\n\r", descIt->inbuf[0] != '\0' ? descIt->inbuf : "", commandLine);
        do {
            commandList = one_line(commandList, commandLine);
        } while (commandLine[0] == '\0' && commandList[0] != '\0');
    }
    free_string( &commandList);
    continue;
}