botbook/src/06-gbdialog/keyword-compress.md

6.5 KiB

COMPRESS

The COMPRESS keyword creates ZIP archives from files and directories in the bot's storage, enabling bots to bundle multiple files for download or transfer.


Syntax

COMPRESS files TO "archive.zip"
result = COMPRESS files TO "archive.zip"
COMPRESS "folder/" TO "archive.zip"

Parameters

Parameter Type Description
files Array/String List of file paths or a single folder path
TO Clause Destination path for the archive

Description

COMPRESS creates a ZIP archive containing the specified files or directory contents. The archive is stored in the bot's drive storage and can be downloaded, emailed, or transferred.

Use cases include:

  • Bundling multiple documents for download
  • Creating backups
  • Packaging exports for users
  • Archiving old files
  • Preparing files for email attachments

Examples

Compress Multiple Files

' Create archive from list of files
files = ["report.pdf", "data.csv", "images/logo.png"]
COMPRESS files TO "package.zip"

TALK "Files compressed into package.zip"

Compress a Folder

' Compress entire folder contents
COMPRESS "documents/project/" TO "project-backup.zip"

TALK "Project folder compressed"

Compress with Result

' Get compression result details
result = COMPRESS files TO "exports/archive.zip"

TALK "Archive created: " + result.filename
TALK "Size: " + FORMAT(result.size / 1024, "#,##0") + " KB"
TALK "Files included: " + result.file_count

Compress for Download

' Create archive and send to user
files = LIST "reports/" FILTER "*.pdf"
file_paths = []

FOR EACH file IN files
    file_paths = APPEND(file_paths, "reports/" + file.name)
NEXT

result = COMPRESS file_paths TO "all-reports.zip"

DOWNLOAD "all-reports.zip" AS "Your Reports.zip"
TALK "Here are all your reports in a single download!"

Compress with Timestamp

' Create dated archive
timestamp = FORMAT(NOW(), "YYYYMMDD-HHmmss")
archive_name = "backup-" + timestamp + ".zip"

COMPRESS "data/" TO "backups/" + archive_name

TALK "Backup created: " + archive_name

Common Use Cases

Create Document Package

' Bundle documents for a customer
customer_files = [
    "contracts/" + customer_id + "/agreement.pdf",
    "contracts/" + customer_id + "/terms.pdf",
    "invoices/" + customer_id + "/latest.pdf"
]

result = COMPRESS customer_files TO "temp/customer-package.zip"

DOWNLOAD "temp/customer-package.zip" AS "Your Documents.zip"
TALK "Here's your complete document package!"

Archive Old Data

' Archive and remove old files
old_files = LIST "logs/" FILTER "*" WHERE modified < DATEADD(NOW(), -90, "day")
file_paths = []

FOR EACH file IN old_files
    file_paths = APPEND(file_paths, "logs/" + file.name)
NEXT

IF LEN(file_paths) > 0 THEN
    archive_name = "logs-archive-" + FORMAT(NOW(), "YYYYMM") + ".zip"
    COMPRESS file_paths TO "archives/" + archive_name
    
    ' Remove original files
    FOR EACH path IN file_paths
        DELETE FILE path
    NEXT
    
    TALK "Archived " + LEN(file_paths) + " old log files"
END IF

Export User Data

' GDPR data export
user_folder = "users/" + user.id + "/"

COMPRESS user_folder TO "exports/user-data-" + user.id + ".zip"

link = DOWNLOAD "exports/user-data-" + user.id + ".zip" AS LINK
TALK "Your data export is ready: " + link
TALK "This link expires in 24 hours."

Email Attachment Bundle

' Create attachment for email
attachments = [
    "reports/summary.pdf",
    "reports/details.xlsx",
    "reports/charts.png"
]

COMPRESS attachments TO "temp/report-bundle.zip"

SEND MAIL recipient_email, "Monthly Report Bundle", 
    "Please find attached the complete monthly report package.",
    "temp/report-bundle.zip"

TALK "Report bundle sent to " + recipient_email

Return Value

Returns an object with archive details:

Property Description
result.path Full path to the archive
result.filename Archive filename
result.size Archive size in bytes
result.file_count Number of files in archive
result.created_at Creation timestamp

Error Handling

ON ERROR RESUME NEXT

result = COMPRESS files TO "archive.zip"

IF ERROR THEN
    PRINT "Compression failed: " + ERROR_MESSAGE
    
    IF INSTR(ERROR_MESSAGE, "not found") > 0 THEN
        TALK "One or more files could not be found."
    ELSE IF INSTR(ERROR_MESSAGE, "storage") > 0 THEN
        TALK "Not enough storage space for the archive."
    ELSE
        TALK "Sorry, I couldn't create the archive. Please try again."
    END IF
ELSE
    TALK "Archive created successfully!"
END IF

Common Errors

Error Cause Solution
FILE_NOT_FOUND Source file doesn't exist Verify file paths
STORAGE_FULL Insufficient space Clean up storage
EMPTY_ARCHIVE No files to compress Check file list
PERMISSION_DENIED Access blocked Check permissions

Compression Options

The default compression uses standard ZIP format with deflate compression. This balances file size reduction with compatibility.


Size Limits

Limit Default Notes
Max archive size 500 MB Configurable
Max files per archive 10,000 Practical limit
Max single file 100 MB Per file in archive

Configuration

No specific configuration required. Uses bot's standard drive settings from config.csv:

name,value
drive-provider,seaweedfs
drive-url,http://localhost:8333
drive-bucket,my-bot

Implementation Notes

  • Implemented in Rust under src/file/archive.rs
  • Uses standard ZIP format for compatibility
  • Preserves directory structure in archive
  • Supports recursive folder compression
  • Progress tracking for large archives
  • Atomic operation (creates temp file, then moves)

  • EXTRACT — Extract archive contents
  • LIST — List files to compress
  • DOWNLOAD — Send archive to user
  • DELETE FILE — Remove files after archiving
  • COPY — Copy files before archiving

Summary

COMPRESS creates ZIP archives from files and folders. Use it to bundle documents for download, create backups, package exports, and prepare email attachments. The archive preserves directory structure and can be immediately downloaded or processed. Combine with LIST to dynamically select files and DOWNLOAD to deliver archives to users.