summaryrefslogtreecommitdiff
path: root/src/tg/user.lisp
blob: 2549d66370acf0c47fa669357479a64fde6f869a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
;; SPDX-License-Identifier: EUPL-1.2
;; SPDX-FileCopyrightText: 2025 Uko Kokņevičs <perkontevs@gmail.com>
(defpackage :ukkoclot/src/tg/user
  (:use :c2cl :ukkoclot/src/tg/type-macros)
  (:import-from :ukkoclot/src/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/src/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 "<a href=\"tg://user?id=~A\"><i>" (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 "</i>" out)

  (when (user-username user)
    (write-string " @" out)
    (escape-xml (user-username user) out))

  (format out "</a> [<code>~A</code>]" (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))))