2024-06-23 14:56:19 -05:00
|
|
|
|
;;;; activity-vocabulary: Base classes for ActivityStreams.
|
2024-06-12 16:06:17 -05:00
|
|
|
|
|
|
|
|
|
;; Copyright © 2024 Jaidyn Ann <jadedctrl@posteo.at>
|
|
|
|
|
;;
|
|
|
|
|
;; This program is free software: you can redistribute it and/or
|
|
|
|
|
;; modify it under the terms of the GNU General Public License as
|
|
|
|
|
;; published by the Free Software Foundation, either version 3 of
|
|
|
|
|
;; the License, or (at your option) any later version.
|
|
|
|
|
;;
|
|
|
|
|
;; This program is distributed in the hope that it will be useful,
|
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
;;
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
|
|
|
|
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
|
2024-06-23 12:49:58 -05:00
|
|
|
|
(defpackage #:activity-servist/activity-vocabulary
|
2024-06-12 16:06:17 -05:00
|
|
|
|
(:use #:cl)
|
2024-06-23 12:49:58 -05:00
|
|
|
|
(:nicknames "AS/AV" "ACTIVITY-VOCABULARY")
|
2024-06-12 22:36:13 -05:00
|
|
|
|
(:shadow #:delete #:ignore #:listen #:read #:remove)
|
2024-06-12 21:42:47 -05:00
|
|
|
|
;; One should never USE this package, since some class-names shadow
|
|
|
|
|
;; core Common Lisp symbols! Beware! :P
|
2024-06-12 22:36:13 -05:00
|
|
|
|
(:export
|
2024-06-16 20:58:19 -05:00
|
|
|
|
;; Classes
|
2024-06-12 22:36:13 -05:00
|
|
|
|
:accept :activity :add :announce :application :arrive :article :audio
|
|
|
|
|
:collection :collection-page :create :delete :dislike :document :event :flag
|
|
|
|
|
:follow :group :ignore :ignore :image :intransitive-activity :invite :join
|
2024-06-23 14:56:19 -05:00
|
|
|
|
:leave :like :link :listen :move :note :object :offer :ordered-collection
|
|
|
|
|
:ordered-collection-page :organization :page :person :place :profile
|
|
|
|
|
:question :read :reject :relationship :remove :service :tentative-accept
|
|
|
|
|
:tentative-reject :tombstone :travel :undo :update :video :view
|
2024-06-16 20:58:19 -05:00
|
|
|
|
;; Slots
|
|
|
|
|
:activity-actor :activity-instrument :activity-object :activity-origin
|
|
|
|
|
:activity-result :activity-target
|
|
|
|
|
:collection-current :collection-first :collection-items :collection-last
|
|
|
|
|
:collection-total-items
|
|
|
|
|
:collection-page-next :collection-page-part-of :collection-page-prev
|
|
|
|
|
:link-height :link-href :link-hreflang :link-media-type :link-name
|
|
|
|
|
:link-preview :link-rel :link-width
|
|
|
|
|
:object-attachment :object-attributed-to :object-audience :object-bcc
|
|
|
|
|
:object-bto :object-cc :object-content :object-context :object-duration
|
|
|
|
|
:object-end-time :object-generator :object-icon :object-image
|
|
|
|
|
:object-in-reply-to :object-location :object-media-type :object-name
|
|
|
|
|
:object-preview :object-published :object-replies :object-start-time
|
2024-06-16 22:51:09 -05:00
|
|
|
|
:object-summary :object-tag :object-to :object-type :object-updated
|
|
|
|
|
:object-url
|
2024-06-16 20:58:19 -05:00
|
|
|
|
:ordered-collection-page-start-index
|
|
|
|
|
:place-accuracy :place-altitude :place-latitude :place-longitude
|
|
|
|
|
:place-radius :place-units
|
|
|
|
|
:profile-describes
|
|
|
|
|
:relationship-object :relationship-relationship :relationship-subject
|
|
|
|
|
:tombstone-former-type :tombstone-deleted))
|
2024-06-12 16:06:17 -05:00
|
|
|
|
|
2024-06-23 12:49:58 -05:00
|
|
|
|
(in-package #:activity-servist/activity-vocabulary)
|
2024-06-12 16:06:17 -05:00
|
|
|
|
|
2024-06-19 19:07:22 -05:00
|
|
|
|
|
2024-06-12 16:06:17 -05:00
|
|
|
|
|
|
|
|
|
;;; Macros
|
|
|
|
|
;;; ————————————————————————————————————————
|
|
|
|
|
(defmacro defclass-w-accessors (name direct-superclasses slots &rest options)
|
2024-06-12 21:42:47 -05:00
|
|
|
|
"Identical to DEFCLASS, but with one convenience: A slot definition, if being
|
|
|
|
|
simply a symbol, will default to a slot with an accessor and init-arg named after the
|
|
|
|
|
symbol. The init-arg will be “:symbol”, and the accessor will be “classname-symbol”.
|
2024-06-19 22:13:49 -05:00
|
|
|
|
For example, the following two forms are equivalent:
|
2024-06-12 21:42:47 -05:00
|
|
|
|
(defclass-w-accessors PERSON () (AGE
|
|
|
|
|
HEIGHT
|
|
|
|
|
(NAME :INIT-FORM “Unknown”)))
|
|
|
|
|
(defclass PERSON () ((AGE :INIT-ARG :AGE :ACCESSOR PERSON-AGE)
|
|
|
|
|
(HEIGHT :INIT-ARG :HEIGHT :ACCESSOR PERSON-HEIGHT)
|
2024-06-19 22:13:49 -05:00
|
|
|
|
(NAME :INIT-FORM “Unknown”)))"
|
2024-06-12 16:06:17 -05:00
|
|
|
|
`(defclass ,name ,direct-superclasses
|
|
|
|
|
,(mapcar
|
|
|
|
|
(lambda (slot)
|
|
|
|
|
(typecase slot
|
|
|
|
|
(list slot)
|
2024-06-12 21:42:47 -05:00
|
|
|
|
(t (list slot :accessor (intern (format nil "~A-~A" name slot))
|
2024-06-16 20:56:45 -05:00
|
|
|
|
:initarg (intern (symbol-name slot) "KEYWORD")
|
|
|
|
|
:initform nil))))
|
2024-06-12 16:06:17 -05:00
|
|
|
|
slots)
|
|
|
|
|
,@options))
|
|
|
|
|
|
2024-06-12 21:42:47 -05:00
|
|
|
|
(defmacro defclass-empty-children (name direct-children)
|
|
|
|
|
"For each name in the list DIRECT-CHILDREN, a subclass of NAME will be created.
|
|
|
|
|
These new subclasses have no slots of its own — they will be empty derivatives
|
|
|
|
|
of NAME."
|
|
|
|
|
(append
|
|
|
|
|
'(progn)
|
|
|
|
|
(mapcar (lambda (a)
|
|
|
|
|
`(defclass ,a (,name) ()))
|
|
|
|
|
direct-children)))
|
|
|
|
|
|
2024-06-12 16:06:17 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Core types
|
|
|
|
|
;;; ————————————————————————————————————————
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#Object
|
2024-06-23 14:56:19 -05:00
|
|
|
|
(defclass-w-accessors object (activity-servist/activity-streams:object)
|
2024-06-12 16:06:17 -05:00
|
|
|
|
(
|
|
|
|
|
attachment attributed-to audience bcc bto cc content context
|
2024-06-16 22:25:59 -05:00
|
|
|
|
duration end-time generator icon id image in-reply-to location
|
2024-06-12 16:06:17 -05:00
|
|
|
|
media-type name preview published replies start-time summary
|
2024-06-23 12:17:40 -05:00
|
|
|
|
tag to updated url))
|
2024-06-16 20:51:57 -05:00
|
|
|
|
|
2024-06-12 16:06:17 -05:00
|
|
|
|
;; https://www.w3.org/ns/activitystreams#Link
|
2024-06-23 14:56:19 -05:00
|
|
|
|
(defclass-w-accessors link (activity-servist/activity-streams:object)
|
2024-06-12 16:06:17 -05:00
|
|
|
|
(height href hreflang media-type name preview rel width))
|
|
|
|
|
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#Activity
|
2024-06-12 21:42:47 -05:00
|
|
|
|
(defclass-w-accessors activity (object)
|
2024-06-12 16:06:17 -05:00
|
|
|
|
(actor instrument object origin result target))
|
|
|
|
|
|
|
|
|
|
;; Should be ordinary Activity, sans `object`.
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#IntransitiveActivity
|
2024-06-12 21:42:47 -05:00
|
|
|
|
(defclass intransitive-activity (activity) ())
|
2024-06-12 16:06:17 -05:00
|
|
|
|
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#Collection
|
2024-06-12 21:42:47 -05:00
|
|
|
|
(defclass-w-accessors collection (object)
|
2024-06-12 16:06:17 -05:00
|
|
|
|
(current first items last total-items))
|
|
|
|
|
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#OrderedCollection
|
2024-06-23 12:17:40 -05:00
|
|
|
|
;; Funnily enough, “orderedItems” is actually a ghost! It’s only *implied*. :-P
|
|
|
|
|
;; https://jam.xwx.moe/notice/AjE1LkpLoBvWmDUmK8
|
|
|
|
|
(defclass-w-accessors ordered-collection (collection)
|
|
|
|
|
(ordered-items))
|
2024-06-12 16:06:17 -05:00
|
|
|
|
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#CollectionPage
|
2024-06-12 21:42:47 -05:00
|
|
|
|
(defclass-w-accessors collection-page (collection)
|
2024-06-16 20:51:57 -05:00
|
|
|
|
(next part-of prev))
|
2024-06-12 16:06:17 -05:00
|
|
|
|
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#OrderedCollectionPage
|
2024-06-23 12:17:40 -05:00
|
|
|
|
(defclass-w-accessors ordered-collection-page (collection-page ordered-collection)
|
2024-06-12 21:42:47 -05:00
|
|
|
|
(start-index))
|
2024-06-12 16:06:17 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Extended Activity types
|
|
|
|
|
;;; ————————————————————————————————————————
|
2024-06-12 21:42:47 -05:00
|
|
|
|
(defclass-empty-children activity
|
|
|
|
|
(accept add announce create delete dislike flag follow ignore join leave
|
|
|
|
|
like listen move offer read reject remove travel undo update view))
|
|
|
|
|
|
|
|
|
|
(defclass arrive (intransitive-activity) ())
|
|
|
|
|
(defclass ignore (block) ())
|
|
|
|
|
(defclass invite (offer) ())
|
|
|
|
|
(defclass question (intransitive-activity) ())
|
|
|
|
|
(defclass tentative-accept (accept) ())
|
|
|
|
|
(defclass tentative-reject (reject) ())
|
2024-06-12 22:21:48 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Extended Actor types
|
|
|
|
|
;;; ————————————————————————————————————————
|
2024-06-16 20:56:45 -05:00
|
|
|
|
(defclass-empty-children object
|
2024-06-12 22:21:48 -05:00
|
|
|
|
(application group organization person service))
|
2024-06-12 22:29:27 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Extended Object types
|
|
|
|
|
;;; ————————————————————————————————————————
|
|
|
|
|
(defclass-empty-children object
|
|
|
|
|
(article document event note))
|
|
|
|
|
|
|
|
|
|
(defclass-empty-children document
|
|
|
|
|
(audio image page video))
|
|
|
|
|
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#Place
|
|
|
|
|
(defclass-w-accessors place (object)
|
|
|
|
|
(accuracy altitude latitude longitude radius units))
|
|
|
|
|
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#Profile
|
|
|
|
|
(defclass-w-accessors profile (object)
|
|
|
|
|
(describes))
|
|
|
|
|
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#Relationship
|
|
|
|
|
(defclass-w-accessors relationship (object)
|
|
|
|
|
(object relationship subject))
|
|
|
|
|
|
|
|
|
|
;; https://www.w3.org/ns/activitystreams#Tombstone
|
|
|
|
|
(defclass-w-accessors tombstone (object)
|
|
|
|
|
(former-type deleted))
|
2024-06-12 22:30:01 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Extended Link types
|
|
|
|
|
;;; ————————————————————————————————————————
|
|
|
|
|
(defclass-empty-children link
|
|
|
|
|
(mention))
|
2024-06-16 20:51:57 -05:00
|
|
|
|
|
|
|
|
|
|
2024-06-19 22:13:49 -05:00
|
|
|
|
|
|
|
|
|
;;; Defining YASON:ENCODE-SLOTS
|
|
|
|
|
;;; ————————————————————————————————————————
|
2024-06-21 18:15:47 -05:00
|
|
|
|
;; On-the-fly define YASON:ENCODE-SLOTS for each of our distinct AP classes.
|
2024-06-23 14:56:19 -05:00
|
|
|
|
(as/as:define-class-encoders
|
|
|
|
|
(mapcar #'find-class
|
|
|
|
|
'(object link activity collection collection-page ordered-collection
|
|
|
|
|
ordered-collection-page place profile relationship tombstone)))
|