summaryrefslogtreecommitdiff
path: root/src/config.lisp
blob: 03ded9804a294d14fb508044eeb7b8adcc07d012 (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
;; SPDX-License-Identifier: EUPL-1.2
;; SPDX-FileCopyrightText: 2025 Uko Kokņevičs <perkontevs@gmail.com>
(defpackage :ukkoclot/config
  (:documentation "Stuff for loading the configuration of the bot")
  (:nicknames :conf)
  (:use :c2cl :iterate)
  (:export
   #:*config*
   #:config
   #:make-config
   #:config-p
   #:copy-config
   #:load-config
   #:print-default
   #:bot-name
   #:bot-token
   #:db-path
   #:dev-group
   #:owner))
(in-package :ukkoclot/config)

(defstruct config
  (bot-name "Ukko's Clot" :type string)
  (bot-token "123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi" :type string)
  (db-path #P"./data.db" :type (or pathname string))
  (dev-group -1001234567890 :type integer)
  (owner 12345678 :type integer))

(defvar *config* (make-config)
  "Bot's configuration")

(defun bot-name (&optional (config *config*))
  "Get the desired name for the bot"
  (config-bot-name config))

(defun bot-token (&optional (config *config*))
  "Get the API token for the bot"
  (config-bot-token config))

(defun db-path (&optional (config *config*))
  "Get the path to the bot's database"
  (config-db-path config))

(defun dev-group (&optional (config *config*))
  "Get the ID of the dev/testing group"
  (config-dev-group config))

(defun owner (&optional (config *config*))
  "Get the ID of the bot's owner"
  (config-owner config))

(defun load-config (filename &optional (config *config*))
  "Load config from the given `filename'."
  (prog1 config
    (let ((data (with-open-file (f filename) (read f))))
      (iter
        (for (kw-name value) on data by #'cddr)
        (let ((name (intern (symbol-name kw-name) :ukkoclot/config)))
          (setf (slot-value config name) value))))))

(defun serialize (config)
  "Serializes the config to a plist."
  (iter
    (for slot in (class-direct-slots (class-of config)))
    (appending
     (let* ((name (slot-definition-name slot))
            (kw-name (intern (symbol-name name) :keyword)))
       (list kw-name (slot-value config name))))))

(defun print-default (filename)
  "Prints the default config to the given `filename'."
  (with-open-file (f filename :direction :output :if-exists :supersede)
    (format f ";; lint:suppress in-package spdx-license-identifier~%")
    (format f ";; Copy this file to config.lisp and modify it there~%")
    (let ((data (serialize (make-config))))
      (format f "~<(~;~@{~(~W~) ~W~^ ~_~}~;)~:>~%" data))))