Source Code


(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-FOUND (err u404))
(define-constant ERR-ALREADY-LOGGED-TODAY (err u403))

(define-constant BLOCKS-PER-DAY u144) 

(define-map DiaryEntries 
    { user: principal, id: uint } 
    { content: (string-utf8 280), height: uint }
)

(define-map UserStreaks 
    principal 
    { current-streak: uint, last-log-height: uint, total-entries: uint }
)



(define-public (log-entry (content (string-utf8 280)))
    (let 
        (
            (caller tx-sender)
            (current-stats (default-to { current-streak: u0, last-log-height: u0, total-entries: u0 } (map-get? UserStreaks caller)))
            (last-height (get last-log-height current-stats))
            (current-streak (get current-streak current-stats))
            (new-id (+ (get total-entries current-stats) u1))

            (current-height burn-block-height)
            
            (diff (- current-height last-height))
        )

        (let 
            (
                (new-streak 
                    (if (is-eq last-height u0)
                        u1 
                        (if (< diff BLOCKS-PER-DAY)
                            current-streak 
                            (if (< diff (* BLOCKS-PER-DAY u2))
                                (+ current-streak u1)
                                u1 
                            )
                        )
                    )
                )
            )
            
       
            (map-insert DiaryEntries 
                { user: caller, id: new-id } 
                { content: content, height: current-height }
            )

   
            (map-set UserStreaks 
                caller 
                { 
                    current-streak: new-streak, 
                    last-log-height: current-height, 
                    total-entries: new-id 
                }
            )

      
            (print { event: "journal-logged", user: caller, streak: new-streak, id: new-id })
            
            (ok new-streak)
        )
    )
)



(define-read-only (get-user-stats (user principal))
    (ok (default-to { current-streak: u0, last-log-height: u0, total-entries: u0 } (map-get? UserStreaks user)))
)

(define-read-only (get-entry (user principal) (id uint))
    (ok (map-get? DiaryEntries { user: user, id: id }))
)

(define-read-only (get-current-streak (user principal))
    (let 
        ((stats (default-to { current-streak: u0, last-log-height: u0, total-entries: u0 } (map-get? UserStreaks user))))
        (ok (get current-streak stats))
    )
)

Functions (4)

FunctionAccessArgs
log-entrypubliccontent: (string-utf8 280
get-user-statsread-onlyuser: principal
get-entryread-onlyuser: principal, id: uint
get-current-streakread-onlyuser: principal