;; SPDX-License-Identifier: EUPL-1.2 ;; SPDX-FileCopyrightText: 2025 Uko Kokņevičs (defpackage :ukkoclot/tg/user (:use :c2cl :ukkoclot/tg/type-macros) (:import-from :ukkoclot/strings :escape-xml) (:export #:user #:make-user #:user-p #:copy-user #:user-id #:user-is-bot #:user-first-name #:user-last-name #:user-username #:user-language-code #:user-is-premium #:user-added-to-attachment-menu #:user-can-join-groups #:user-can-read-all-group-messages #:user-supports-inline-queries #:user-can-connect-to-business #:user-format-name)) (in-package :ukkoclot/tg/user) (define-tg-type user (id integer) (is-bot boolean) (first-name string) (last-name (or string null) nil) (username (or string null) nil) (language-code (or string null) nil) (is-premium boolean nil) (added-to-attachment-menu boolean nil) (can-join-groups boolean nil) (can-read-all-group-messages boolean nil) (supports-inline-queries boolean nil) (can-connect-to-business boolean nil)) (defun user-format-name% (user out) (format out "" (user-id user)) (escape-xml (user-first-name user) out) (when (user-last-name user) (write-char #\Space out) (escape-xml (user-last-name user) out)) (write-string "" out) (when (user-username user) (write-string " @" out) (escape-xml (user-username user) out)) (format out " [~A]" (user-id user))) (defun user-format-name (user &optional out) (if out (user-format-name% user out) (with-output-to-string (stream) (user-format-name% user stream))))