Compare commits
178 Commits
Author | SHA1 | Date |
---|---|---|
|
4b7215036b | |
|
e65fadfba6 | |
|
fd407094a2 | |
|
76e12d7093 | |
|
2a9219ce7e | |
|
cacc2c3a5b | |
|
ceda771700 | |
|
c6ad04e6ee | |
|
9671407556 | |
|
c35dab8350 | |
|
c772d7b60e | |
|
e1b61b5041 | |
|
db95855ab6 | |
|
5dce94a4a3 | |
|
7adad67dd9 | |
|
5275ab73ac | |
|
a50d28e9a2 | |
|
57238020a3 | |
|
d37e720a11 | |
|
ad0773d5a7 | |
|
bfe77f1b18 | |
|
10947148a1 | |
|
ec49399d39 | |
|
b4d6e37c96 | |
|
719f8a7664 | |
|
c3a5df62e5 | |
|
8b197134ab | |
|
d43b1c72db | |
|
2fa3bff89c | |
|
fe526f8e94 | |
|
28919cdaa8 | |
|
ff846a63cb | |
|
7857b17b8b | |
|
f65cc6bac6 | |
|
453d8fc272 | |
|
a99fdc0742 | |
|
22754226f2 | |
|
66d41fec46 | |
|
ff43aea4ab | |
|
83819c5f33 | |
|
9b13db149b | |
|
795bf14e51 | |
|
47adbe0281 | |
|
14d2e53cfc | |
|
f8ed45dcc4 | |
|
d100d1a2b6 | |
|
ff649fd2eb | |
|
7f80bff4e1 | |
|
3446bbf5d6 | |
|
14a1d92442 | |
|
c3e00e2e31 | |
|
1b514df555 | |
|
416675a667 | |
|
4d5b331a0f | |
|
2b265a5831 | |
|
08ae30835c | |
|
707771c7bf | |
|
6b070dec98 | |
|
d2a4d835de | |
|
acbcb6224e | |
|
188033a0c1 | |
|
41a580b32b | |
|
915c85e9e9 | |
|
5ddea09924 | |
|
c48c1a66f2 | |
|
ed989935ac | |
|
a6f70263b8 | |
|
d0bac6779f | |
|
565317115c | |
|
9da01c0398 | |
|
62d28c523a | |
|
d16454e169 | |
|
12c0b896db | |
|
ecb49c7e00 | |
|
bc58a977f0 | |
|
f97608ecfa | |
|
bd07dc6f9c | |
|
1273518a5c | |
|
5f73020056 | |
|
ac3538aed2 | |
|
231663b07e | |
|
72efbb515d | |
|
740890e402 | |
|
22d1232240 | |
|
0998ee5ef9 | |
|
e4937c954f | |
|
f7af97ad73 | |
|
c49518981b | |
|
f159f0c391 | |
|
2a7d02fba8 | |
|
a5e7f12fd1 | |
|
dc09d3db5b | |
|
4922fc79fe | |
|
39af18fe35 | |
|
61a2d4aeef | |
|
338274e368 | |
|
919f67b123 | |
|
581e4a96bb | |
|
7874ca7830 | |
|
d9fa878136 | |
|
b1afd2533d | |
|
b2b58990df | |
|
dbce486c9b | |
|
9b0c68f2bf | |
|
f293d54a63 | |
|
449bb65303 | |
|
4922f79bf2 | |
|
bbac2b7c51 | |
|
d4e1f68235 | |
|
9090515a99 | |
|
86ebbf90a2 | |
|
57bf54ed32 | |
|
a79d0157fc | |
|
3a36744d72 | |
|
5cebe53c3f | |
|
8f5d40ff7f | |
|
8a6bef8c2c | |
|
51c9180128 | |
|
69109ffc91 | |
|
ae7ffc2908 | |
|
d614696260 | |
|
6ca1b9b7dc | |
|
26f43a1682 | |
|
920421edf1 | |
|
fb689bcac0 | |
|
81d2f923b1 | |
|
622c4c1baf | |
|
f69dcc9e98 | |
|
8fe607d43e | |
|
6ae56a05b4 | |
|
385245f421 | |
|
909b4edc86 | |
|
f7ccda7004 | |
|
0b72c80d94 | |
|
14593ccf17 | |
|
8448d8e720 | |
|
ea0c3c5250 | |
|
42b263897b | |
|
a98351905b | |
|
de78019cb3 | |
|
6543ea4b51 | |
|
570aa32edf | |
|
2d56af7d5e | |
|
d9a1872d1e | |
|
667150d18a | |
|
95b9dd868d | |
|
5714d29d95 | |
|
b17d09490f | |
|
c626462c0b | |
|
e8eab3b947 | |
|
761246c03b | |
|
77b86bd8c0 | |
|
9c278db9b3 | |
|
ca9e0a71e1 | |
|
9d1726acd5 | |
|
41dfc410f1 | |
|
c857e7d379 | |
|
c341b8936e | |
|
d8739e14ae | |
|
f24fae28e9 | |
|
3705ae8d78 | |
|
3f09180b85 | |
|
892a05e9fb | |
|
a766ff001c | |
|
8b3eaf1e73 | |
|
9301586082 | |
|
4302093684 | |
|
b806dbfeb8 | |
|
e9ac12efe3 | |
|
91ef34faa4 | |
|
5e6bf432a8 | |
|
a2aa33cf27 | |
|
c3cdf6233a | |
|
318eda9101 | |
|
5ddc0f20fe | |
|
2287a4753c | |
|
d3d9f0f4e4 | |
|
7558c73648 |
346
.drone.yml
346
.drone.yml
|
@ -1,192 +1,225 @@
|
|||
pipeline:
|
||||
gcc6:
|
||||
kind: pipeline
|
||||
name: x86_64
|
||||
|
||||
platform:
|
||||
os: linux
|
||||
arch: amd64
|
||||
|
||||
volumes:
|
||||
- name: debian-package-cache
|
||||
host:
|
||||
path: /var/cache/debian-package-cache
|
||||
|
||||
trigger:
|
||||
event:
|
||||
exclude:
|
||||
- tag
|
||||
|
||||
steps:
|
||||
- name: gcc6
|
||||
image: debian:stretch-slim
|
||||
pull: true
|
||||
when:
|
||||
event: [push, pull_request]
|
||||
environment:
|
||||
- LANG=C.utf8
|
||||
- CXX=g++-6
|
||||
- CXXFLAGS=-pipe -O2
|
||||
secrets:
|
||||
- mastodon_cpp_access_token
|
||||
CXX: g++-6
|
||||
CXXFLAGS: -pipe -O2
|
||||
MASTODON_CPP_ACCESS_TOKEN:
|
||||
from_secret: mastodon_cpp_access_token
|
||||
commands:
|
||||
- rm /etc/apt/apt.conf.d/docker-clean
|
||||
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
|
||||
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list
|
||||
- rm -f /etc/apt/apt.conf.d/docker-clean
|
||||
- rm -f /var/cache/apt/archives/lock
|
||||
- apt-get update -q
|
||||
- apt-get install -qy build-essential cmake pkg-config
|
||||
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen catch
|
||||
- apt-get install -qy -t sid libcurlpp-dev
|
||||
- apt-get install -qy build-essential cmake
|
||||
- apt-get install -qy libpoco-dev libjsoncpp-dev doxygen catch
|
||||
- rm -rf build && mkdir -p build && cd build
|
||||
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="[pleroma]" ..
|
||||
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="~[api]" ..
|
||||
- make VERBOSE=1
|
||||
- make install DESTDIR=install
|
||||
- ctest
|
||||
- cd tests && ctest
|
||||
volumes:
|
||||
- /var/cache/debian-package-cache:/var/cache/apt/archives
|
||||
- name: debian-package-cache
|
||||
path: /var/cache/apt/archives
|
||||
|
||||
gcc7:
|
||||
- name: gcc9
|
||||
image: debian:stretch-slim
|
||||
pull: true
|
||||
when:
|
||||
event: [push, pull_request]
|
||||
environment:
|
||||
- LANG=C.utf8
|
||||
- CXX=g++-7
|
||||
- CXXFLAGS=-pipe -O2
|
||||
secrets:
|
||||
- mastodon_cpp_access_token
|
||||
CXX: g++-9
|
||||
CXXFLAGS: -pipe -O2
|
||||
MASTODON_CPP_ACCESS_TOKEN:
|
||||
from_secret: mastodon_cpp_access_token
|
||||
commands:
|
||||
- rm /etc/apt/apt.conf.d/docker-clean
|
||||
- rm -f /etc/apt/apt.conf.d/docker-clean
|
||||
- rm -f /var/cache/apt/archives/lock
|
||||
- apt-get update -q
|
||||
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
|
||||
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list
|
||||
- echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
|
||||
- apt-get install -qy gnupg
|
||||
- gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
|
||||
- gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
|
||||
- apt-get update -q
|
||||
- apt-get install -qy build-essential cmake pkg-config
|
||||
- apt-get install -qy -t xenial g++-7
|
||||
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen catch
|
||||
- apt-get install -qy -t sid libcurlpp-dev
|
||||
- apt-get install -qy build-essential cmake
|
||||
- apt-get install -qy -t xenial g++-9
|
||||
- apt-get install -qy libpoco-dev libjsoncpp-dev doxygen catch
|
||||
- rm -rf build && mkdir -p build && cd build
|
||||
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="[pleroma]" ..
|
||||
- cmake -DWITH_EXAMPLES=YES ..
|
||||
- make VERBOSE=1
|
||||
- make install DESTDIR=install
|
||||
- ctest
|
||||
volumes:
|
||||
- /var/cache/debian-package-cache:/var/cache/apt/archives
|
||||
- name: debian-package-cache
|
||||
path: /var/cache/apt/archives
|
||||
|
||||
gcc8:
|
||||
- name: clang5
|
||||
image: debian:stretch-slim
|
||||
pull: true
|
||||
when:
|
||||
event: [push, pull_request]
|
||||
environment:
|
||||
- LANG=C.utf8
|
||||
- CXX=g++-8
|
||||
- CXXFLAGS=-pipe -O2
|
||||
secrets:
|
||||
- mastodon_cpp_access_token
|
||||
CXX: clang++-5.0
|
||||
CXXFLAGS: -pipe -O2
|
||||
MASTODON_CPP_ACCESS_TOKEN:
|
||||
from_secret: mastodon_cpp_access_token
|
||||
commands:
|
||||
- rm /etc/apt/apt.conf.d/docker-clean
|
||||
- apt-get update -q
|
||||
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
|
||||
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list
|
||||
- echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
|
||||
- apt-get install -qy gnupg
|
||||
- gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
|
||||
- gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
|
||||
- apt-get update -q
|
||||
- apt-get install -qy build-essential cmake pkg-config
|
||||
- apt-get install -qy -t xenial g++-8
|
||||
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen catch
|
||||
- apt-get install -qy -t sid libcurlpp-dev
|
||||
- rm -rf build && mkdir -p build && cd build
|
||||
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="[pleroma]" ..
|
||||
- make VERBOSE=1
|
||||
- make install DESTDIR=install
|
||||
- ctest
|
||||
volumes:
|
||||
- /var/cache/debian-package-cache:/var/cache/apt/archives
|
||||
|
||||
clang5:
|
||||
image: debian:stretch-slim
|
||||
pull: true
|
||||
when:
|
||||
event: [push, pull_request]
|
||||
environment:
|
||||
- LANG=C.utf8
|
||||
- CXX=clang++-5.0
|
||||
- CXXFLAGS=-pipe -O2
|
||||
secrets:
|
||||
- mastodon_cpp_access_token
|
||||
commands:
|
||||
- rm /etc/apt/apt.conf.d/docker-clean
|
||||
- rm -f /etc/apt/apt.conf.d/docker-clean
|
||||
- rm -f /var/cache/apt/archives/lock
|
||||
- apt-get update -q
|
||||
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
|
||||
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/stretch.list
|
||||
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list
|
||||
- apt-get update -q
|
||||
- apt-get install -qy build-essential cmake pkg-config
|
||||
- apt-get install -qy build-essential cmake
|
||||
- apt-get install -qy -t stretch-backports clang-5.0
|
||||
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen catch
|
||||
- apt-get install -qy -t sid libcurlpp-dev
|
||||
- apt-get install -qy libpoco-dev libjsoncpp-dev doxygen catch
|
||||
- rm -rf build && mkdir -p build && cd build
|
||||
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="[pleroma]" ..
|
||||
- cmake -DWITH_EXAMPLES=YES ..
|
||||
- make VERBOSE=1
|
||||
- make install DESTDIR=install
|
||||
- ctest
|
||||
volumes:
|
||||
- /var/cache/debian-package-cache:/var/cache/apt/archives
|
||||
- name: debian-package-cache
|
||||
path: /var/cache/apt/archives
|
||||
|
||||
clang6:
|
||||
image: debian:stretch-slim
|
||||
- name: clang7
|
||||
image: debian:buster-slim
|
||||
pull: true
|
||||
when:
|
||||
event: [push, pull_request]
|
||||
environment:
|
||||
- LANG=C.utf8
|
||||
- CXX=clang++-6.0
|
||||
- CXXFLAGS=-pipe -O2
|
||||
secrets:
|
||||
- mastodon_cpp_access_token
|
||||
LANG: C.utf8
|
||||
CXX: clang++
|
||||
CXXFLAGS: -pipe -O2
|
||||
MASTODON_CPP_ACCESS_TOKEN:
|
||||
from_secret: mastodon_cpp_access_token
|
||||
commands:
|
||||
- rm /etc/apt/apt.conf.d/docker-clean
|
||||
- rm -f /etc/apt/apt.conf.d/docker-clean
|
||||
- rm -f /var/cache/apt/archives/lock
|
||||
- apt-get update -q
|
||||
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
|
||||
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/stretch.list
|
||||
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list
|
||||
- apt-get update -q
|
||||
- apt-get install -qy build-essential cmake pkg-config
|
||||
- apt-get install -qy -t stretch-backports clang-6.0
|
||||
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen catch
|
||||
- apt-get install -qy -t sid libcurlpp-dev
|
||||
- apt-get install -qy build-essential cmake clang
|
||||
- apt-get install -qy libpoco-dev libjsoncpp-dev doxygen catch
|
||||
- rm -rf build && mkdir -p build && cd build
|
||||
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="[pleroma]" ..
|
||||
- cmake -DWITH_EXAMPLES=YES ..
|
||||
- make VERBOSE=1
|
||||
- make install DESTDIR=install
|
||||
- ctest
|
||||
volumes:
|
||||
- /var/cache/debian-package-cache:/var/cache/apt/archives
|
||||
- name: debian-package-cache
|
||||
path: /var/cache/apt/archives
|
||||
|
||||
package_deb:
|
||||
image: debian:stretch-slim
|
||||
pull: true
|
||||
- name: notification
|
||||
image: drillster/drone-email
|
||||
pull: always
|
||||
settings:
|
||||
host: cryptoparty-celle.de
|
||||
from: drone@tzend.de
|
||||
username:
|
||||
from_secret: email_username
|
||||
password:
|
||||
from_secret: email_password
|
||||
when:
|
||||
event: tag
|
||||
environment:
|
||||
- LANG=C.utf8
|
||||
- CXXFLAGS=-pipe -O2
|
||||
commands:
|
||||
- rm /etc/apt/apt.conf.d/docker-clean
|
||||
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
|
||||
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list
|
||||
- apt-get update -q
|
||||
- apt-get install -qy build-essential cmake pkg-config
|
||||
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen
|
||||
- apt-get install -qy -t sid libcurlpp-dev
|
||||
- apt-get install -qy file
|
||||
- rm -rf build && mkdir -p build && cd build
|
||||
- cmake -DWITH_EXAMPLES=NO -DWITH_TESTS=NO ..
|
||||
- make package
|
||||
- cmake -DWITH_DEB=YES ..
|
||||
- make package
|
||||
- cp -v mastodon-cpp-${DRONE_TAG}_x86_64.tar.gz ..
|
||||
- cp -v libmastodon-cpp_${DRONE_TAG}-0_amd64.deb ..
|
||||
volumes:
|
||||
- /var/cache/debian-package-cache:/var/cache/apt/archives
|
||||
status: [ changed, failure ]
|
||||
|
||||
package_rpm:
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
name: packages x86_64
|
||||
|
||||
platform:
|
||||
os: linux
|
||||
arch: amd64
|
||||
|
||||
volumes:
|
||||
- name: debian-package-cache
|
||||
host:
|
||||
path: /var/cache/debian-package-cache
|
||||
- name: centos-package-cache
|
||||
host:
|
||||
path: /var/cache/centos-package-cache
|
||||
|
||||
trigger:
|
||||
event:
|
||||
- tag
|
||||
|
||||
steps:
|
||||
- name: Debian stretch
|
||||
image: debian:stretch-slim
|
||||
pull: always
|
||||
environment:
|
||||
CXXFLAGS: -pipe -O2
|
||||
LANG: C.utf8
|
||||
commands:
|
||||
- rm -f /etc/apt/apt.conf.d/docker-clean
|
||||
- rm -f /var/cache/apt/archives/lock
|
||||
- apt-get update -q
|
||||
- apt-get install -qy build-essential cmake lsb-release
|
||||
- apt-get install -qy libpoco-dev libjsoncpp-dev file
|
||||
- rm -rf build && mkdir -p build && cd build
|
||||
- cmake -DWITH_DEB=YES -DWITH_DOC=NO ..
|
||||
- make package
|
||||
- cp -v libmastodon-cpp_${DRONE_TAG}-0_stretch_amd64.deb ..
|
||||
volumes:
|
||||
- name: debian-package-cache
|
||||
path: /var/cache/apt/archives
|
||||
|
||||
- name: Debian buster
|
||||
image: debian:buster-slim
|
||||
pull: always
|
||||
environment:
|
||||
CXXFLAGS: -pipe -O2
|
||||
LANG: C.utf8
|
||||
commands:
|
||||
- rm -f /etc/apt/apt.conf.d/docker-clean
|
||||
- rm -f /var/cache/apt/archives/lock
|
||||
- apt-get update -q
|
||||
- apt-get install -qy build-essential cmake lsb-release
|
||||
- apt-get install -qy libpoco-dev libjsoncpp-dev file
|
||||
- rm -rf build && mkdir -p build && cd build
|
||||
- cmake -DWITH_DEB=YES -DWITH_DOC=NO ..
|
||||
- make package
|
||||
- cp -v libmastodon-cpp_${DRONE_TAG}-0_buster_amd64.deb ..
|
||||
volumes:
|
||||
- name: debian-package-cache
|
||||
path: /var/cache/apt/archives
|
||||
|
||||
- name: Ubuntu bionic
|
||||
image: ubuntu:bionic
|
||||
pull: always
|
||||
environment:
|
||||
CXXFLAGS: -pipe -O2
|
||||
LANG: C.utf8
|
||||
commands:
|
||||
- rm -f /etc/apt/apt.conf.d/docker-clean
|
||||
- rm -f /var/cache/apt/archives/lock
|
||||
- apt-get update -q
|
||||
- apt-get install -qy build-essential cmake lsb-release
|
||||
- apt-get install -qy libpoco-dev libjsoncpp-dev file
|
||||
- rm -rf build && mkdir -p build && cd build
|
||||
- cmake -DWITH_DEB=YES -DWITH_DOC=NO ..
|
||||
- make package
|
||||
- cp -v libmastodon-cpp_${DRONE_TAG}-0_bionic_amd64.deb ..
|
||||
volumes:
|
||||
- name: debian-package-cache
|
||||
path: /var/cache/apt/archives
|
||||
|
||||
- name: CentOS 7
|
||||
image: centos:7
|
||||
pull: true
|
||||
when:
|
||||
event: tag
|
||||
pull: always
|
||||
environment:
|
||||
- LANG=C.utf8
|
||||
- CXXFLAGS=-pipe -O2
|
||||
CXX: /opt/rh/devtoolset-6/root/usr/bin/g++
|
||||
CXXFLAGS: -pipe -O2
|
||||
LANG: C.utf8
|
||||
commands:
|
||||
- sed -i 's/keepcache=0/keepcache=1/' /etc/yum.conf
|
||||
- curl -s -o /var/cache/yum/epel-release-latest-7.noarch.rpm http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
|
||||
|
@ -194,42 +227,43 @@ pipeline:
|
|||
- yum install -qy centos-release-scl
|
||||
- yum install -qy devtoolset-6
|
||||
- scl enable devtoolset-6 bash
|
||||
- yum install -qy libcurl-devel doxygen rpm-build
|
||||
- yum install -qy poco-devel openssl-devel doxygen rpm-build
|
||||
- yum --enablerepo=epel install -qy cmake3 jsoncpp-devel
|
||||
- curl -s -o /var/cache/yum/curlpp-devel-0.7.3-5.el6.x86_64.rpm https://download.fedoraproject.org/pub/epel/6/x86_64/Packages/c/curlpp-devel-0.7.3-5.el6.x86_64.rpm
|
||||
- curl -s -o /var/cache/yum/curlpp-0.7.3-5.el6.x86_64.rpm https://download.fedoraproject.org/pub/epel/6/x86_64/Packages/c/curlpp-0.7.3-5.el6.x86_64.rpm
|
||||
- yum localinstall -qy /var/cache/yum/curlpp-*
|
||||
- rm -rf build && mkdir -p build && cd build
|
||||
- cmake3 -DWITH_EXAMPLES=NO -DWITH_TESTS=NO ..
|
||||
- make package
|
||||
- cmake3 -DWITH_RPM=YES ..
|
||||
- cmake3 -DWITH_RPM=YES -DWITH_DOC=NO ..
|
||||
- make package
|
||||
- cp -v libmastodon-cpp-${DRONE_TAG}-0.x86_64.rpm ..
|
||||
volumes:
|
||||
- /var/cache/centos-package-cache:/var/cache/yum/
|
||||
- name: centos-package-cache
|
||||
path: /var/cache/yum
|
||||
|
||||
gitea_release:
|
||||
- name: gitea_release
|
||||
image: plugins/gitea-release
|
||||
pull: true
|
||||
when:
|
||||
event: tag
|
||||
pull: always
|
||||
settings:
|
||||
base_url: https://schlomp.space
|
||||
secrets: [ gitea_token ]
|
||||
api_key:
|
||||
from_secret: gitea_token
|
||||
title: ${DRONE_TAG}
|
||||
prerelease: true
|
||||
files:
|
||||
- mastodon-cpp-${DRONE_TAG}_x86_64.tar.gz
|
||||
- libmastodon-cpp_${DRONE_TAG}-0_amd64.deb
|
||||
- libmastodon-cpp_${DRONE_TAG}-0_stretch_amd64.deb
|
||||
- libmastodon-cpp_${DRONE_TAG}-0_buster_amd64.deb
|
||||
- libmastodon-cpp_${DRONE_TAG}-0_bionic_amd64.deb
|
||||
- libmastodon-cpp-${DRONE_TAG}-0.x86_64.rpm
|
||||
checksum:
|
||||
- sha256
|
||||
- sha512
|
||||
|
||||
notify:
|
||||
- name: notification
|
||||
image: drillster/drone-email
|
||||
pull: always
|
||||
settings:
|
||||
host: cryptoparty-celle.de
|
||||
from: drone@tzend.de
|
||||
username:
|
||||
from_secret: email_username
|
||||
password:
|
||||
from_secret: email_password
|
||||
when:
|
||||
status: [ changed, failure ]
|
||||
image: drillster/drone-email
|
||||
pull: true
|
||||
host: cryptoparty-celle.de
|
||||
secrets: [ email_username, email_password ]
|
||||
from: drone@tzend.de
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
# Configuration file for EditorConfig.
|
||||
# More information is available under <https://editorconfig.org/>.
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
max_line_length = 80
|
||||
|
||||
[*.?pp]
|
||||
indent_size = 4
|
||||
tab_width = 4
|
||||
|
||||
[{CMakeLists.txt,*.cmake}]
|
||||
indent_size = 2
|
||||
tab_width = 2
|
153
CMakeLists.txt
153
CMakeLists.txt
|
@ -1,127 +1,86 @@
|
|||
cmake_minimum_required (VERSION 3.6)
|
||||
project (mastodon-cpp
|
||||
VERSION 0.105.0
|
||||
LANGUAGES CXX
|
||||
)
|
||||
|
||||
set(WITH_EASY "YES" CACHE STRING "WITH_EASY defaults to \"YES\"")
|
||||
set(WITH_EXAMPLES "NO" CACHE STRING "WITH_EXAMPLES defaults to \"NO\"")
|
||||
set(WITH_TESTS "NO" CACHE STRING "WITH_TESTS defaults to \"NO\"")
|
||||
set(WITH_DOC "YES" CACHE STRING "WITH_DOC defaults to \"YES\"")
|
||||
set(WITH_DEB "NO" CACHE STRING "WITH_DEB defaults to \"NO\"")
|
||||
set(WITH_RPM "NO" CACHE STRING "WITH_RPM defaults to \"NO\"")
|
||||
# Support version 3.6 and above, but use policy settings up to 3.14.
|
||||
# 3.6 is needed because of IMPORTED_TARGET in pkg_check_modules().
|
||||
cmake_minimum_required(VERSION 3.6...3.14)
|
||||
# Ranges are supported from 3.12, set policy to current for < 3.12.
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.12)
|
||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||
endif()
|
||||
|
||||
include(GNUInstallDirs)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(CURLPP REQUIRED curlpp)
|
||||
if(WITH_EASY)
|
||||
pkg_check_modules(JSONCPP REQUIRED jsoncpp)
|
||||
|
||||
project (mastodon-cpp
|
||||
VERSION 0.111.5
|
||||
LANGUAGES CXX)
|
||||
|
||||
# DESCRIPTION was introduced in version 3.9.
|
||||
if(NOT (${CMAKE_VERSION} VERSION_LESS 3.9))
|
||||
set(PROJECT_DESCRIPTION
|
||||
"C++ wrapper for the Mastodon API.")
|
||||
endif()
|
||||
|
||||
option(WITH_EASY "Compile Easy interface." YES)
|
||||
option(WITH_EXAMPLES "Compile examples." NO)
|
||||
option(WITH_TESTS "Compile tests." NO)
|
||||
option(WITH_DOC "Generate HTML documentation." YES)
|
||||
option(WITH_DEB "Prepare for the building of .deb packages." NO)
|
||||
option(WITH_RPM "Prepare for the building of .rpm packages." NO)
|
||||
option(BUILD_SHARED_LIBS "Build shared libraries." YES)
|
||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type, Release or Debug.")
|
||||
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
set(CMAKE_CXX_FLAGS_DEBUG
|
||||
"${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Wpedantic -ftrapv -fsanitize=undefined -g -Og -fno-omit-frame-pointer")
|
||||
|
||||
# Do not complain about compatibility-wrapper
|
||||
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
|
||||
set(DEBUG_CXXFLAGS
|
||||
"-Wall"
|
||||
"-Wextra"
|
||||
"-Wpedantic"
|
||||
"-ftrapv"
|
||||
"-fsanitize=undefined"
|
||||
"-g"
|
||||
"-Og"
|
||||
"-fno-omit-frame-pointer"
|
||||
"-Wno-deprecated-declarations")
|
||||
set(DEBUG_LDFLAGS
|
||||
"-fsanitize=undefined")
|
||||
add_compile_options("$<$<CONFIG:Debug>:${DEBUG_CXXFLAGS}>")
|
||||
# add_link_options was introduced in version 3.13.
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.13)
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${DEBUG_LDFLAGS}")
|
||||
else()
|
||||
add_link_options("$<$<CONFIG:Debug>:${DEBUG_LDFLAGS}>")
|
||||
endif()
|
||||
|
||||
include_directories(${PROJECT_SOURCE_DIR}/src)
|
||||
include_directories(${PROJECT_BINARY_DIR})
|
||||
|
||||
include_directories(${CURL_INCLUDE_DIRS})
|
||||
include_directories(${CURLPP_INCLUDE_DIRS})
|
||||
include_directories(${JSONCPP_INCLUDE_DIRS})
|
||||
|
||||
link_directories(${CURL_LIBRARY_DIRS})
|
||||
link_directories(${CURLPP_LIBRARY_DIRS})
|
||||
link_directories(${JSONCPP_LIBRARY_DIRS})
|
||||
|
||||
# Write version in header
|
||||
configure_file (
|
||||
"${PROJECT_SOURCE_DIR}/src/version.hpp.in"
|
||||
"${PROJECT_BINARY_DIR}/version.hpp"
|
||||
)
|
||||
|
||||
# Announce that we are compiling mastodon-cpp (used to figure out where the
|
||||
# headers are)
|
||||
add_definitions(-DMASTODON_CPP=1)
|
||||
|
||||
# Turn on debug output.
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
add_definitions(-DDEBUG=1)
|
||||
add_definitions("-DDEBUG=1")
|
||||
endif()
|
||||
|
||||
if(NOT WITH_EASY)
|
||||
add_definitions(-DWITHOUT_EASY=1)
|
||||
add_definitions("-DWITHOUT_EASY=1")
|
||||
endif()
|
||||
|
||||
# Compile library
|
||||
if(WITH_EASY)
|
||||
file(GLOB sources src/*.cpp src/api/*.cpp
|
||||
src/easy/*.cpp src/easy/entities/*.cpp)
|
||||
else()
|
||||
file(GLOB sources src/*.cpp src/api/*.cpp)
|
||||
endif()
|
||||
add_library(${PROJECT_NAME} SHARED ${sources})
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR}
|
||||
)
|
||||
add_subdirectory("src")
|
||||
|
||||
if(WITH_EASY)
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
${CURLPP_LIBRARIES} pthread ${JSONCPP_LIBRARIES})
|
||||
else()
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
${CURLPP_LIBRARIES} pthread)
|
||||
endif()
|
||||
|
||||
# Compile examples
|
||||
if(WITH_EXAMPLES)
|
||||
file(GLOB sources_examples examples/*.cpp)
|
||||
foreach(src ${sources_examples})
|
||||
get_filename_component(bin ${src} NAME_WE)
|
||||
add_executable(${bin} ${src})
|
||||
target_link_libraries(${bin} pthread ${JSONCPP_LIBRARIES} ${PROJECT_NAME})
|
||||
endforeach()
|
||||
add_subdirectory("examples")
|
||||
endif()
|
||||
|
||||
# Compile tests
|
||||
if(WITH_TESTS)
|
||||
include(tests.CMakeLists.txt)
|
||||
add_subdirectory("tests")
|
||||
endif()
|
||||
|
||||
# Install library and header files
|
||||
install(TARGETS ${PROJECT_NAME} LIBRARY
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
install(FILES src/mastodon-cpp.hpp src/return_types.hpp src/types.hpp
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
|
||||
if(WITH_EASY)
|
||||
file(GLOB easy_header src/easy/*.hpp)
|
||||
install(FILES ${easy_header}
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy)
|
||||
file(GLOB easy_entities_header src/easy/entities/*.hpp)
|
||||
install(FILES ${easy_entities_header}
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy/entities)
|
||||
endif()
|
||||
|
||||
# Compile & install documentation
|
||||
if(WITH_DOC)
|
||||
add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/doc/html
|
||||
COMMAND ./build_doc.sh WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
|
||||
COMMAND "./build_doc.sh" WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
|
||||
add_custom_target(doc DEPENDS doc/html)
|
||||
add_dependencies(${PROJECT_NAME} doc)
|
||||
|
||||
install(DIRECTORY ${PROJECT_SOURCE_DIR}/doc/html
|
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}-${PROJECT_VERSION})
|
||||
file(GLOB examples examples/example*.cpp)
|
||||
install(FILES ${examples}
|
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}-${PROJECT_VERSION}/examples)
|
||||
DESTINATION "${CMAKE_INSTALL_DOCDIR}/${PROJECT_NAME}")
|
||||
endif()
|
||||
|
||||
# Packages
|
||||
include(packages.CMakeLists.txt)
|
||||
add_subdirectory("cmake")
|
||||
add_subdirectory("pkg-config")
|
||||
|
||||
include("cmake/packages.cmake")
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
:contact-coc: tastytea@tastytea.de
|
||||
|
||||
== Code of Conduct
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, education, ethnicity, gender identity and expression, level of
|
||||
experience, nationality, personal appearance, race, religion, sex
|
||||
characteristics, sexual identity and orientation or socio-economic status.
|
||||
|
||||
=== Examples
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Using welcoming and inclusive language.
|
||||
* Being respectful of differing viewpoints and experiences.
|
||||
* Gracefully accepting constructive criticism.
|
||||
* Focusing on what is best for the community.
|
||||
* Showing empathy towards other community members.
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances.
|
||||
* Trolling, insulting/derogatory comments, and personal attacks.
|
||||
* Public or private harassment.
|
||||
* Publishing others’ private information, such as a physical or electronic
|
||||
address, without explicit permission.
|
||||
|
||||
=== Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at {contact-coc}.
|
||||
|
||||
All complaints will be reviewed and investigated and will result in a response
|
||||
that is deemed necessary and appropriate to the circumstances. The project team
|
||||
is obligated to maintain confidentiality with regard to the reporter of an
|
||||
incident.
|
||||
|
||||
=== Attribution
|
||||
|
||||
This Code of Conduct is adapted from the Contributor Covenant, version 1.4,
|
||||
available at
|
||||
https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
|
||||
For answers to common questions about this code of conduct, see
|
||||
https://www.contributor-covenant.org/faq
|
|
@ -0,0 +1,29 @@
|
|||
:project: mastodon-cpp
|
||||
:uri-base: https://schlomp.space/tastytea/{project}
|
||||
:uri-coc: {uri-base}/src/branch/master/CODE_OF_CONDUCT.adoc
|
||||
:contact-email: tastytea@tastytea.de
|
||||
:contact-xmpp: {contact-email}
|
||||
:contact-fediverse: https://likeable.space/users/tastytea
|
||||
|
||||
== How to contribute
|
||||
|
||||
Read the link:{uri-coc}[Code of Conduct].
|
||||
|
||||
=== Reporting bugs or suggesting enhancements
|
||||
|
||||
Before reporting a bug, please
|
||||
https://schlomp.space/tastytea/{project}/issues[perform a search] to see if the
|
||||
problem has already been reported. If it has, add a comment to the existing
|
||||
issue instead of opening a new one. Same for enhancements.
|
||||
|
||||
You can also contact me via mailto:{contact-email}[E-Mail],
|
||||
link:xmpp:{contact-xmpp}[XMPP] or the {contact-fediverse}[Fediverse] if you
|
||||
don't want to open an account.
|
||||
|
||||
=== Pull requests
|
||||
|
||||
Please use similar coding conventions as the rest of the project. The basic rule
|
||||
to remember is to write code in the same style as the existing/surrounding code.
|
||||
|
||||
You can also send me your patches via mailto:{contact-email}[E-Mail], ideally
|
||||
using `git format-patch` or `git send-email`.
|
|
@ -1,16 +0,0 @@
|
|||
# How to contribute
|
||||
|
||||
## Reporting bugs or suggesting enhancements
|
||||
|
||||
Before reporting a bug , please
|
||||
[perform a search](https://schlomp.space/tastytea/mastodon-cpp/issues)
|
||||
to see if the problem has already been reported. If it has, add a comment to the
|
||||
existing issue instead of opening a new one. Same for enhancements.
|
||||
|
||||
You can also contact me via the Fediverse if you don't want to open an account.
|
||||
My account is [@tastytea@likeable.space](https://likeable.space/users/tastytea).
|
||||
|
||||
## Pull requests
|
||||
|
||||
Please use similar coding conventions as the rest of the project. The basic rule
|
||||
to remember is to write code in the same style as the existing/surrounding code.
|
3
Doxyfile
3
Doxyfile
|
@ -1,8 +1,7 @@
|
|||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = "mastodon-cpp"
|
||||
PROJECT_NUMBER = 0.0.0
|
||||
INPUT = README.md src/ src/api/ src/easy/ src/easy/entities/
|
||||
USE_MDFILE_AS_MAINPAGE = README.md
|
||||
INPUT = src/ src/api/ src/easy/ src/easy/entities/
|
||||
CREATE_SUBDIRS = NO
|
||||
ALLOW_UNICODE_NAMES = YES
|
||||
OUTPUT_LANGUAGE = English
|
||||
|
|
147
LICENSE
147
LICENSE
|
@ -1,23 +1,21 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
|
@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
|
|||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
@ -72,7 +60,7 @@ modification follow.
|
|||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
|
|||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
|
@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||
Copyright (C) <year> <name of author>
|
||||
|
||||
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
|
||||
it under the terms of the GNU Affero 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.
|
||||
GNU Affero 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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
|
|
@ -0,0 +1,494 @@
|
|||
= mastodon-cpp
|
||||
:toc: preamble
|
||||
:project: mastodon-cpp
|
||||
:uri-base: https://schlomp.space/tastytea/{project}
|
||||
:uri-branch-main: {uri-base}/src/branch/master
|
||||
:uri-mastodonpp: https://schlomp.space/tastytea/mastodonpp
|
||||
|
||||
[IMPORTANT]
|
||||
This project has become too complicated to maintain by myself and I can't find
|
||||
the energy to add features. **You can find a complete rewrite, with cleaner and
|
||||
much easier to understand code at link:{uri-mastodonpp}[mastodonpp].** I
|
||||
recommend switching to it. You can still report bugs here and I will respond,
|
||||
but I won't put too much work in it. If you want to take over maintainership,
|
||||
get in touch.
|
||||
|
||||
*{project}* is a C++ wrapper for the Mastodon API. You submit an API call
|
||||
and get the raw JSON that you can then transform into easy to use abstractions.
|
||||
|
||||
== Usage
|
||||
|
||||
The HTML reference can be generated with `build_doc.sh`, if doxygen is
|
||||
installed. It is also available at
|
||||
https://doc.schlomp.space/{project}/annotated.html[doc.schlomp.space/{project}/].
|
||||
There are more {uri-branch-main}/examples[examples] in `examples/`.
|
||||
|
||||
=== Examples
|
||||
|
||||
.Print own account as JSON to stdout.
|
||||
====
|
||||
[source,c++]
|
||||
----
|
||||
#include <iostream>
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
Mastodon::API masto("social.example.com", "auth_token");
|
||||
std::cout << masto.get(Mastodon::API::v1::accounts_verify_credentials);
|
||||
std::cout << std::endl;
|
||||
}
|
||||
----
|
||||
====
|
||||
|
||||
.Use the `Easy` interface to get the last posts from the federated timeline.
|
||||
====
|
||||
[source,c++]
|
||||
----
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/all.hpp>
|
||||
|
||||
using Mastodon;
|
||||
|
||||
int main()
|
||||
{
|
||||
Easy::API masto("social.example", "");
|
||||
return_call ret = masto.get(API::v1::timelines_public);
|
||||
|
||||
for (const std::string &str : Easy::json_array_to_vector(ret.answer))
|
||||
{
|
||||
Easy::Status status(str);
|
||||
std::cout << " " << status.account().acct() << " wrote:\n";
|
||||
std::cout << status.content() << '\n';
|
||||
}
|
||||
}
|
||||
----
|
||||
====
|
||||
|
||||
=== Compiling your project
|
||||
|
||||
A project consisting of one file can be compiled as follows:
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
g++ --std=c++14 -lmastodon-cpp example.cpp
|
||||
----
|
||||
|
||||
=== List of types
|
||||
|
||||
Learn more at <https://doc.schlomp.space/mastodon-cpp/namespaceMastodon.html>
|
||||
and <https://doc.schlomp.space/mastodon-cpp/namespaceMastodon_1_1Easy.html>.
|
||||
|
||||
Not included in this list are entities.
|
||||
|
||||
==== Return types
|
||||
|
||||
* `Mastodon::return_call`: Contains the response from `Mastodon::API` calls.
|
||||
|
||||
==== Other types
|
||||
|
||||
* `Mastodon::parameters`: Vector of `Mastodon::param` with custom `find()`, for
|
||||
specifying parameters to an `Mastodon::API` call.
|
||||
* `Mastodon::http_method`: HTTP method of an `Mastodon::API` call.
|
||||
* `Mastodon::Easy::event_type`: Event types returned in streams.
|
||||
* `Mastodon::Easy::visibility_type`: Describes the visibility of a post.
|
||||
* `Mastodon::Easy::attachment_type`: Describes the type of attachment.
|
||||
* `Mastodon::Easy::card_type`: Describes the type of card.
|
||||
* `Mastodon::Easy::notification_type`: The type of the notification.
|
||||
* `Mastodon::Easy::context_type`: Describes the context of a filter.
|
||||
* `Mastodon::Easy::stream_event_type`: Type and data of an events returned in
|
||||
streams.
|
||||
* `Mastodon::Easy::alert_type`, used for push subscriptions.
|
||||
* `Mastodon::Easy::time_type`: Type for time, can be converted to `time_point`
|
||||
and `string`.
|
||||
* `Mastodon::Easy::account_field_type`: Type for fields in accounts.
|
||||
* `Mastodon::Easy::urls_type`: Type for URLs returned by `Instance::urls()`.
|
||||
* `Mastodon::Easy::stats_type`: Type for statistics returned by
|
||||
`Instance::stats()`.
|
||||
* `Mastodon::Easy::poll_options_type`: Type for poll options returned by
|
||||
`Poll::options()`.
|
||||
|
||||
=== Error codes
|
||||
|
||||
[options="header",cols=">,<"]
|
||||
|===================================================
|
||||
| Code | Explanation
|
||||
| 0 | No error
|
||||
| 1 | Invalid argument
|
||||
| 10 | URL changed (HTTP 301 or 308)
|
||||
| 11 | Connection timed out
|
||||
| 12 | Connection refused (check http_error_code)
|
||||
| 13 | No route to host / Could not resolve host
|
||||
| 14 | Encryption error
|
||||
| 127 | Unknown error
|
||||
|===================================================
|
||||
|
||||
If you use a debug build, you get more verbose error messages.
|
||||
|
||||
=== Useful links
|
||||
|
||||
* https://docs.joinmastodon.org/[Mastodon documentation]
|
||||
* https://git.pleroma.social/pleroma/pleroma/tree/develop/docs/api[Pleroma documentation]
|
||||
* https://glitch-soc.github.io/docs/#whats-different[glitch-soc documentation]
|
||||
|
||||
== Install
|
||||
|
||||
=== Upgrading from versions below 0.100.0
|
||||
|
||||
Starting with version `0.100.0`, large parts of the library have been rewritten.
|
||||
Upgrading from previous versions will require extensive code changes.
|
||||
|
||||
=== Packages
|
||||
|
||||
Every https://schlomp.space/tastytea/{project}/releases[release] includes
|
||||
packages for Debian and Centos. Gentoo packages are available in my overlay.
|
||||
|
||||
==== Gentoo
|
||||
|
||||
Add my https://schlomp.space/tastytea/overlay[repository] and
|
||||
install it from there.
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
eselect repository enable tastytea
|
||||
echo 'dev-cpp/mastodon-cpp ~amd64' >> /etc/portage/package.accept_keywords/mastodon-cpp
|
||||
emaint sync -r tastytea
|
||||
emerge -a dev-cpp/mastodon-cpp
|
||||
----
|
||||
|
||||
==== DEB and RPM
|
||||
|
||||
Prebuilt DEB and RPM packages for x86_64(amd64) are provided with each release.
|
||||
`.deb` packages are built on Debian stretch and `.rpm` packages are built on
|
||||
CentOS 7. These packages are automatically built and not tested.
|
||||
|
||||
=== From source
|
||||
|
||||
==== Dependencies
|
||||
|
||||
* Tested OS: Linux
|
||||
* C++ compiler (tested: https://gcc.gnu.org/[gcc] 6/8/9,
|
||||
https://llvm.org/[clang] 5/7)
|
||||
* https://cmake.org/[cmake] (at least: 3.6)
|
||||
* https://pocoproject.org/[POCO] (tested: 1.9 / 1.7)
|
||||
* Optional
|
||||
** Easy interface & Examples:
|
||||
https://github.com/open-source-parsers/jsoncpp[jsoncpp] (tested: 1.8 / 1.7)
|
||||
** Documentation: https://www.stack.nl/~dimitri/doxygen/[doxygen] (tested: 1.8)
|
||||
** DEB package: https://packages.qa.debian.org/dpkg[dpkg] (tested: 1.18)
|
||||
** RPM package: http://www.rpm.org[rpm-build] (tested: 4.11)
|
||||
** Tests: https://github.com/catchorg/Catch2[catch] (tested: 2.5 / 1.2)
|
||||
|
||||
.Install dependencies in Debian stretch.
|
||||
====
|
||||
[source,shell]
|
||||
----
|
||||
apt-get install build-essential cmake libpoco-dev libjsoncpp-dev doxygen
|
||||
----
|
||||
====
|
||||
|
||||
==== Get sourcecode
|
||||
|
||||
===== Release
|
||||
|
||||
Download the current release at
|
||||
https://schlomp.space/tastytea/{project}/releases[schlomp.space].
|
||||
|
||||
===== Development version
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
git clone https://schlomp.space/tastytea/mastodon-cpp.git
|
||||
----
|
||||
|
||||
==== Compile
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
mkdir build
|
||||
cd build/
|
||||
cmake ..
|
||||
cmake --build . -- -j$(nproc --ignore=1)
|
||||
----
|
||||
|
||||
.cmake options:
|
||||
* `-DCMAKE_BUILD_TYPE=Debug` for a debug build.
|
||||
* `-DWITH_EASY=NO` to not build the Easy abstractions and to get rid of the
|
||||
jsoncpp-dependency (not recommended).
|
||||
* `-DWITH_EXAMPLES=YES` if you want to compile the examples.
|
||||
* `-DWITH_TESTS=YES` if you want to compile the tests.
|
||||
* `-DEXTRA_TEST_ARGS` to run only some tests
|
||||
(https://github.com/catchorg/Catch2/blob/master/docs/command-line.md#specifying-which-tests-to-run[format]).
|
||||
** Possible tags: `[api]`, `[auth]`, `[mastodon]`, `[glitch-soc]`,
|
||||
`[pleroma]`, `[upload]`, `[entity]`.
|
||||
* `-DWITH_DOC=NO` if you don't want to compile the HTML reference.
|
||||
* One of:
|
||||
** `-DWITH_DEB=YES` if you want to be able to generate a deb-package.
|
||||
** `-DWITH_RPM=YES` if you want to be able to generate an rpm-package.
|
||||
|
||||
.Run only tests for glitch-soc features that don't upload any files.
|
||||
====
|
||||
[source,shell]
|
||||
----
|
||||
cmake -DWITH_TESTS=YES -DEXTRA_TEST_ARGS=[glitch-soc]~[upload] ..
|
||||
----
|
||||
====
|
||||
|
||||
==== Tests
|
||||
|
||||
You can run the tests with `ctest` inside the build directory. You need to set
|
||||
the environment variable `MASTODON_CPP_ACCESS_TOKEN` to an access token with the
|
||||
scopes _read_, _write_ and _follow_ for tests tagged with `[auth]`.
|
||||
You can select the instance to use with `MASTODON_CPP_INSTANCE`, the default is
|
||||
_likeable.space_. You can select the user ID with `MASTODON_CPP_USER_ID`, the
|
||||
default is _9hnrrVPriLiLVAhfVo_. You can select the status ID with
|
||||
`MASTODON_CPP_STATUS_ID`, the default is _9hwnuJMq3eTdO4s1PU_. You can select
|
||||
the filter ID with `MASTODON_CPP_FILTER_ID`. You can select the list ID with
|
||||
`MASTODON_CPP_LIST_ID`, the default is _2_. You can select the media ID with
|
||||
`MASTODON_CPP_MEDIA_ID`, the default is _2127742613_.
|
||||
|
||||
.Requirements for the test-user:
|
||||
* Have at least 1 follower.
|
||||
* Follow at least 1 account.
|
||||
* Have at least 1 account endorsed.
|
||||
* Have at least 1 public or unlisted status.
|
||||
* Have at least 1 post favourited.
|
||||
* Have no follow requests.
|
||||
* Have at least 1 list with at least one account in it.
|
||||
* have at least 1 account muted.
|
||||
|
||||
include::{uri-base}/raw/branch/master/CONTRIBUTING.adoc[]
|
||||
|
||||
== Status of implementation
|
||||
|
||||
You can still use unsupported calls by using `API::get` and the others with
|
||||
strings and you can use unsupported fields in an `Entity` by converting it to
|
||||
`Json::Value`.
|
||||
|
||||
=== Mastodon API
|
||||
|
||||
==== Calls
|
||||
|
||||
* Accounts
|
||||
** [x] GET /api/v1/accounts/:id
|
||||
** [x] POST /api/v1/accounts
|
||||
** [x] GET /api/v1/accounts/verify_credentials
|
||||
** [x] PATCH /api/v1/accounts/update_credentials
|
||||
** [x] GET /api/v1/accounts/:id/followers
|
||||
** [x] GET /api/v1/accounts/:id/following
|
||||
** [x] GET /api/v1/accounts/:id/statuses
|
||||
** [x] POST /api/v1/accounts/:id/follow
|
||||
** [x] POST /api/v1/accounts/:id/unfollow
|
||||
** [x] GET /api/v1/accounts/relationships
|
||||
** [x] GET /api/v1/accounts/search
|
||||
* Apps
|
||||
** [x] POST /api/v1/apps
|
||||
** [x] GET /api/v1/apps/verify_credentials
|
||||
* Blocks
|
||||
** [x] GET /api/v1/blocks
|
||||
** [x] POST /api/v1/accounts/:id/block
|
||||
** [x] POST /api/v1/accounts/:id/unblock
|
||||
* Custom emoji
|
||||
** [x] GET /api/v1/custom_emojis
|
||||
* Domain blocks
|
||||
** [x] GET /api/v1/domain_blocks
|
||||
** [x] POST /api/v1/domain_blocks
|
||||
** [x] DELETE /api/v1/domain_blocks
|
||||
* Endorsements
|
||||
** [x] GET /api/v1/endorsements
|
||||
** [x] POST /api/v1/accounts/:id/pin
|
||||
** [x] POST /api/v1/accounts/:id/unpin
|
||||
* Favourites
|
||||
** [x] GET /api/v1/favourites
|
||||
** [x] POST /api/v1/statuses/:id/favourite
|
||||
** [x] POST /api/v1/statuses/:id/unfavourite
|
||||
* Filters
|
||||
** [x] GET /api/v1/filters
|
||||
** [x] POST /api/v1/filters
|
||||
** [x] GET /api/v1/filters/:id
|
||||
** [x] PUT /api/v1/filters/:id
|
||||
** [x] DELETE /api/v1/filters/:id
|
||||
* Follow requests
|
||||
** [x] GET /api/v1/follow_requests
|
||||
** [x] POST /api/v1/follow_requests/:id/authorize
|
||||
** [x] POST /api/v1/follow_requests/:id/reject
|
||||
* Follow suggestions
|
||||
** [x] GET /api/v1/suggestions
|
||||
** [x] DELETE /api/v1/suggestions/:account_id
|
||||
* Instances
|
||||
** [x] GET /api/v1/instance
|
||||
* Lists
|
||||
** [x] GET /api/v1/lists
|
||||
** [x] GET /api/v1/accounts/:id/lists
|
||||
** [x] GET /api/v1/lists/:id/accounts
|
||||
** [x] GET /api/v1/lists/:id
|
||||
** [x] POST /api/v1/lists
|
||||
** [x] PUT /api/v1/lists/:id
|
||||
** [x] DELETE /api/v1/lists/:id
|
||||
** [x] POST /api/v1/lists/:id/accounts
|
||||
** [x] DELETE /api/v1/lists/:id/accounts
|
||||
* Media attachments
|
||||
** [x] POST /api/v1/media
|
||||
** [x] PUT /api/v1/media/:id
|
||||
* Mutes
|
||||
** [x] GET /api/v1/mutes
|
||||
** [x] POST /api/v1/accounts/:id/mute
|
||||
** [x] POST /api/v1/accounts/:id/unmute
|
||||
** [x] POST /api/v1/statuses/:id/mute
|
||||
** [x] POST /api/v1/statuses/:id/unmute
|
||||
* Notifications
|
||||
** [x] GET /api/v1/notifications
|
||||
** [x] GET /api/v1/notifications/:id
|
||||
** [x] POST /api/v1/notifications/clear
|
||||
** [x] POST /api/v1/notifications/dismiss
|
||||
** [x] POST /api/v1/push/subscription
|
||||
** [x] GET /api/v1/push/subscription
|
||||
** [x] PUT /api/v1/push/subscription
|
||||
** [x] DELETE /api/v1/push/subscription
|
||||
* Polls
|
||||
** [x] GET /api/v1/polls/:id
|
||||
** [x] POST /api/v1/polls/:id/votes
|
||||
* Reports
|
||||
** [x] POST /api/v1/reports
|
||||
* Scheduled Statuses
|
||||
** [ ] GET /api/v1/scheduled_statuses
|
||||
** [ ] GET /api/v1/scheduled_statuses/:id
|
||||
** [ ] PUT /api/v1/scheduled_statuses/:id
|
||||
** [ ] DELETE /api/v1/scheduled_statuses/:id
|
||||
* Search
|
||||
** [x] GET /api/v2/search
|
||||
* Statuses
|
||||
** [x] GET /api/v1/statuses/:id
|
||||
** [x] GET /api/v1/statuses/:id/context
|
||||
** [x] GET /api/v1/statuses/:id/card
|
||||
** [x] GET /api/v1/statuses/:id/reblogged_by
|
||||
** [x] GET /api/v1/statuses/:id/favourited_by
|
||||
** [x] POST /api/v1/statuses
|
||||
** [x] DELETE /api/v1/statuses/:id
|
||||
** [x] POST /api/v1/statuses/:id/reblog
|
||||
** [x] POST /api/v1/statuses/:id/unreblog
|
||||
** [x] POST /api/v1/statuses/:id/pin
|
||||
** [x] POST /api/v1/statuses/:id/unpin
|
||||
* Timelines
|
||||
** [x] GET /api/v1/timelines/home
|
||||
** [x] GET /api/v1/conversations
|
||||
** [x] GET /api/v1/timelines/public
|
||||
** [x] GET /api/v1/timelines/tag/:hashtag
|
||||
** [x] GET /api/v1/timelines/list/:list_id
|
||||
* Streaming API
|
||||
** [x] GET /api/v1/streaming/health
|
||||
** [x] GET /api/v1/streaming/user
|
||||
** [x] GET /api/v1/streaming/public
|
||||
** [x] GET /api/v1/streaming/public/local
|
||||
** [x] GET /api/v1/streaming/hashtag
|
||||
** [x] GET /api/v1/streaming/hashtag/local
|
||||
** [x] GET /api/v1/streaming/list
|
||||
** [x] GET /api/v1/streaming/direct
|
||||
|
||||
==== Entities
|
||||
|
||||
* [x] Account
|
||||
* [x] Application
|
||||
* [x] Attachment
|
||||
* [x] Card
|
||||
* [x] Context
|
||||
* [x] Conversation
|
||||
* [x] Emoji
|
||||
* [x] Filter
|
||||
* [x] Instance
|
||||
* [x] List
|
||||
* [x] Mention
|
||||
* [x] Notification
|
||||
* [x] Poll
|
||||
* [x] PushSubscription
|
||||
* [x] Relationship
|
||||
* [x] Results
|
||||
* [x] Status
|
||||
* [ ] ScheduledStatus
|
||||
* [x] Tag
|
||||
* [ ] Token
|
||||
|
||||
=== glitch-soc API
|
||||
|
||||
==== Calls
|
||||
|
||||
* [x] GET /api/v1/bookmarks
|
||||
* [x] POST /api/v1/statuses/:id/bookmark
|
||||
* [x] POST /api/v1/statuses/:id/unbookmark
|
||||
|
||||
==== Entities
|
||||
|
||||
* [x] `max_toot_chars` in Instance
|
||||
|
||||
=== Pleroma API
|
||||
|
||||
==== Calls
|
||||
|
||||
* [ ] `preview` and `content_type` in POST /api/v1/statuses
|
||||
* [ ] `no_rich_text`, `hide_followers`, `hide_follows`, `hide_favorites` and
|
||||
`show_role` in /api/v1/update_credentials
|
||||
* [ ] GET /api/pleroma/emoji
|
||||
* [ ] POST /api/pleroma/follow_import
|
||||
* [ ] GET /api/pleroma/captcha
|
||||
* [ ] POST /api/pleroma/delete_account
|
||||
* [ ] POST /api/account/register
|
||||
* [ ] POST /api/v1/pleroma/flavour/:flavour
|
||||
* [ ] GET /api/v1/pleroma/flavour
|
||||
* [ ] POST /api/pleroma/notifications/read
|
||||
* [ ] POST /api/v1/pleroma/accounts/:id/subscribe
|
||||
* [ ] POST /api/v1/pleroma/accounts/:id/unsubscribe
|
||||
* [ ] GET /api/v1/pleroma/accounts/:id/favourites
|
||||
* [ ] PUT /api/pleroma/notification_settings
|
||||
* [ ] GET /api/pleroma/healthcheck
|
||||
* Admin API
|
||||
** [ ] GET /api/pleroma/admin/users
|
||||
** [ ] DELETE /api/pleroma/admin/user
|
||||
** [ ] POST /api/pleroma/admin/user
|
||||
** [ ] POST /api/pleroma/admin/user/follow
|
||||
** [ ] POST /api/pleroma/admin/user/unfollow
|
||||
** [ ] PATCH /api/pleroma/admin/users/:nickname/toggle_activation
|
||||
** [ ] PUT /api/pleroma/admin/users/tag
|
||||
** [ ] DELETE /api/pleroma/admin/users/tag
|
||||
** [ ] GET /api/pleroma/admin/permission_group/:nickname
|
||||
** [ ] GET /api/pleroma/admin/permission_group/:nickname/:permission_group
|
||||
** [ ] POST /api/pleroma/admin/permission_group/:nickname/:permission_group
|
||||
** [ ] DELETE /api/pleroma/admin/permission_group/:nickname/:permission_group
|
||||
** [ ] PUT /api/pleroma/admin/activation_status/:nickname
|
||||
** [ ] GET /api/pleroma/admin/users/:nickname
|
||||
** [ ] POST /api/pleroma/admin/relay
|
||||
** [ ] DELETE /api/pleroma/admin/relay
|
||||
** [ ] GET /api/pleroma/admin/invite_token
|
||||
** [ ] GET /api/pleroma/admin/invites
|
||||
** [ ] POST /api/pleroma/admin/revoke_invite
|
||||
** [ ] POST /api/pleroma/admin/email_invite
|
||||
** [ ] GET /api/pleroma/admin/password_reset
|
||||
|
||||
==== Entities
|
||||
|
||||
* `pleroma` object in:
|
||||
** [ ] Status
|
||||
** [ ] Attachment
|
||||
** [ ] Account
|
||||
** [ ] Source
|
||||
** [ ] Notification
|
||||
|
||||
== Blocked instances
|
||||
|
||||
Instances that are frequently used to hurt marginalized people are blocked from
|
||||
using this library.
|
||||
|
||||
.List of blocked instances:
|
||||
* https://en.wikipedia.org/wiki/Gab_(social_network)[Gab]
|
||||
* https://en.wikipedia.org/wiki/Kiwi_Farms[Kiwi Farms]
|
||||
|
||||
== Copyright
|
||||
|
||||
[source,text]
|
||||
----
|
||||
Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>.
|
||||
License AGPLv3: <https://www.gnu.org/licenses/agpl-3.0.html>.
|
||||
This program comes with ABSOLUTELY NO WARRANTY. This is free software,
|
||||
and you are welcome to redistribute it under certain conditions.
|
||||
----
|
358
README.md
358
README.md
|
@ -1,358 +0,0 @@
|
|||
**mastodon-cpp** is a C++ wrapper for the Mastodon API. You submit an API call
|
||||
and get the raw JSON or easy to use abstractions.
|
||||
|
||||
**The ABI will be unstable in versions < 1.0.0**
|
||||
|
||||
[Subscribe to mastodon-cpp releases](https://rss.schlomp.space/?repo=tastytea/mastodon-cpp).
|
||||
|
||||
# Usage
|
||||
|
||||
The HTML reference can be generated with `build_doc.sh`, if doxygen is
|
||||
installed. It is also available at
|
||||
[doc.schlomp.space/mastodon-cpp/](https://doc.schlomp.space/mastodon-cpp/annotated.html).
|
||||
There are [examples](https://schlomp.space/tastytea/mastodon-cpp/src/branch/master/examples)
|
||||
in `examples/`.
|
||||
|
||||
## Most basic example
|
||||
|
||||
```c++
|
||||
#include <iostream>
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
Mastodon::API masto("social.example.com", "auth_token");
|
||||
std::cout << masto.get(Mastodon::API::v1::accounts_verify_credentials);
|
||||
std::cout << std::endl;
|
||||
}
|
||||
```
|
||||
|
||||
## Another simple example
|
||||
|
||||
Using the `Easy` interface.
|
||||
|
||||
```c++
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/all.hpp>
|
||||
|
||||
using Mastodon;
|
||||
|
||||
int main()
|
||||
{
|
||||
Easy::API masto("social.example", "");
|
||||
return_call ret = masto.get(API::v1::timelines_public);
|
||||
|
||||
for (const std::string &str : Easy::json_array_to_vector(ret.answer))
|
||||
{
|
||||
Easy::Status status(str);
|
||||
std::cout << " " << status.account().acct() << " wrote:\n";
|
||||
std::cout << status.content() << '\n';
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Compiling your project
|
||||
|
||||
A project consisting of one file can be compiled as follows:
|
||||
|
||||
``` shellsession
|
||||
g++ -std=c++14 -lmastodon-cpp example.cpp
|
||||
```
|
||||
|
||||
## List of types
|
||||
|
||||
Learn more at <https://doc.schlomp.space/mastodon-cpp/namespaceMastodon.html>
|
||||
and <https://doc.schlomp.space/mastodon-cpp/namespaceMastodon_1_1Easy.html>.
|
||||
|
||||
### Return types
|
||||
|
||||
* `Mastodon::return_call`: Contains the response from `Mastodon::API` calls.
|
||||
* `Mastodon::Easy::return_entity`: Contains the response from
|
||||
`Mastodon::Easy::API` calls that return a single `Mastodon::Easy::Entity`.
|
||||
* `Mastodon::Easy::return_entities_vector`: Contains the response from
|
||||
`Mastodon::Easy::API` calls that return multiple `Mastodon::Easy::Entity`.
|
||||
|
||||
### Other types
|
||||
|
||||
* `Mastodon::param`: A single parameter to an `Mastodon::API` call. Normally you
|
||||
don't need this.
|
||||
* `Mastodon::parameters`: All parameters to an `Mastodon::API` call.
|
||||
* `Mastodon::http_method`: HTTP method of an `Mastodon::API` call.
|
||||
* `Mastodon::Easy::event_type`: Event types returned in streams.
|
||||
* `Mastodon::Easy::visibility_type`: Describes the visibility of a post.
|
||||
* `Mastodon::Easy::attachment_type`: Describes the type of attachment.
|
||||
* `Mastodon::Easy::card_type`: Describes the type of card.
|
||||
* `Mastodon::Easy::notification_type`: The type of the notification.
|
||||
* `Mastodon::Easy::context_type`: Describes the context of a filter.
|
||||
* `Mastodon::Easy::stream_event`: Type and data of an events returned in
|
||||
streams.
|
||||
* `Mastodon::Easy::alert_type`: Type for a single alert.
|
||||
* `Mastodon::Easy::alerts`: Vector of `Mastodon::Easy::alert_type`, used for
|
||||
push subscriptions.
|
||||
* `Mastodon::Easy::time`: Type for time, can be converted to `time_point` and
|
||||
`string`.
|
||||
|
||||
## Error codes
|
||||
|
||||
| Code | Explanation |
|
||||
| --------: |:-------------------------------------------|
|
||||
| 0 | No error |
|
||||
| 22 | Invalid argument |
|
||||
| 78 | URL changed (HTTP 301 or 308) |
|
||||
| 110 | Connection timed out |
|
||||
| 111 | Connection refused (check http_error_code) |
|
||||
| 113 | No route to host / Could not resolve host |
|
||||
| 192 | curlpp runtime error |
|
||||
| 193 | curlpp logic error |
|
||||
| 255 | Unknown error |
|
||||
|
||||
If you use a debug build, you get more verbose error messages.
|
||||
|
||||
## Useful links
|
||||
|
||||
* [Mastodon documentation](https://docs.joinmastodon.org/)
|
||||
* [Pleroma documentation](https://git.pleroma.social/pleroma/pleroma/tree/develop/docs/api)
|
||||
* [glitch-soc documentation](https://glitch-soc.github.io/docs/#whats-different)
|
||||
|
||||
# Install
|
||||
|
||||
## Upgrading from versions below 0.100.0
|
||||
|
||||
Starting with version `0.100.0`, large parts of the library have been rewritten.
|
||||
Upgrading from previous versions will require extensive code changes. You can
|
||||
keep using the old version, it is archived in the branch
|
||||
[pre-0.100.0](https://schlomp.space/tastytea/mastodon-cpp/src/branch/pre-0.100.0).
|
||||
It will receive bug-fixes for a while but no new features.
|
||||
|
||||
## Packages
|
||||
|
||||
Every [release](https://schlomp.space/tastytea/mastodon-cpp/releases) includes
|
||||
packages for Debian and Centos. Gentoo packages are available in my overlay.
|
||||
|
||||
### Gentoo
|
||||
|
||||
Add my [repository](https://schlomp.space/tastytea/overlay) and
|
||||
install it from there.
|
||||
|
||||
```shellsession
|
||||
eselect repository enable tastytea
|
||||
echo 'dev-cpp/mastodon-cpp ~amd64' >> /etc/portage/package.accept_keywords/mastodon-cpp
|
||||
emaint sync -r tastytea
|
||||
emerge -a dev-cpp/mastodon-cpp
|
||||
```
|
||||
|
||||
### DEB and RPM
|
||||
|
||||
Prebuilt DEB and RPM packages for x86_64(amd64) are provided with each release.
|
||||
`.deb` packages are built on Debian stretch and `.rpm` packages are built on
|
||||
CentOS 7. These packages are automatically built and not tested.
|
||||
|
||||
To use the DEB`.deb` package on Debian stretch, you will need
|
||||
[libcurlpp0](https://packages.debian.org/libcurlpp0) from sid.
|
||||
|
||||
To use the `.rpm` package on CentOS 7, you will need
|
||||
[libcurlpp](https://download.fedoraproject.org/pub/epel/6/x86_64/Packages/c/)
|
||||
from EPEL 6.
|
||||
|
||||
## From source
|
||||
|
||||
### Dependencies
|
||||
|
||||
* Tested OS: Linux
|
||||
* C++ compiler (tested: [gcc](https://gcc.gnu.org/) 6/7/8,
|
||||
[clang](https://llvm.org/) 5/6)
|
||||
* [cmake](https://cmake.org/) (at least: 3.6)
|
||||
* [pkgconfig](https://pkgconfig.freedesktop.org/wiki/) (tested: 0.29 / 0.27)
|
||||
* [curlpp](http://www.curlpp.org/) (tested: 0.8)
|
||||
* Optional
|
||||
* Easy interface & Examples: [jsoncpp](https://github.com/open-source-parsers/jsoncpp) (tested: 1.8 / 1.7)
|
||||
* Documentation: [doxygen](https://www.stack.nl/~dimitri/doxygen/) (tested: 1.8)
|
||||
* DEB package: [dpkg](https://packages.qa.debian.org/dpkg) (tested: 1.18)
|
||||
* RPM package: [rpm-build](http://www.rpm.org) (tested: 4.11)
|
||||
* Tests: [catch](https://github.com/catchorg/Catch2) (tested: 2.5 / 1.2)
|
||||
|
||||
### Get sourcecode
|
||||
|
||||
#### Release
|
||||
|
||||
Download the current release at
|
||||
[schlomp.space](https://schlomp.space/tastytea/mastodon-cpp/releases).
|
||||
|
||||
#### Development version
|
||||
|
||||
```shellsession
|
||||
git clone https://schlomp.space/tastytea/mastodon-cpp.git
|
||||
```
|
||||
|
||||
### Compile
|
||||
|
||||
```shellsession
|
||||
mkdir build
|
||||
cd build/
|
||||
cmake ..
|
||||
cmake --build . -- -j$(nproc --ignore=1)
|
||||
```
|
||||
|
||||
cmake options:
|
||||
|
||||
* `-DCMAKE_BUILD_TYPE=Debug` for a debug build
|
||||
* `-DWITH_EASY=NO` to not build the Easy abstractions and to get rid of the
|
||||
jsoncpp-dependency (not recommended)
|
||||
* `-DWITH_EXAMPLES=YES` if you want to compile the examples
|
||||
* `-DWITH_TESTS=YES` if you want to compile the tests
|
||||
* `-DEXTRA_TEST_ARGS` to run only some tests
|
||||
* Possible values: `[api]`, `[mastodon]`, `[glitch-soc]`, `[pleroma]`
|
||||
* Example: `-DEXTRA_TEST_ARGS=[pleroma]![mastodon]` to run the tests for features
|
||||
in Pleroma that are not in Mastodon.
|
||||
* `-DWITH_DOC=NO` if you don't want to compile the HTML reference
|
||||
* One of:
|
||||
* `-DWITH_DEB=YES` if you want to be able to generate a deb-package
|
||||
* `-DWITH_RPM=YES` if you want to be able to generate an rpm-package
|
||||
|
||||
Install with `make install`.
|
||||
|
||||
### Tests
|
||||
|
||||
You can run the tests with `ctest` inside the build directory. You need to set
|
||||
the environment variable `MASTODON_CPP_ACCESS_TOKEN` to an access token with the
|
||||
scopes *read*, *write* and *follow* for some tests.
|
||||
You can select the instance to use with `MASTODON_CPP_INSTANCE`, the default is
|
||||
*likeable.space*. You can select the user ID with `MASTODON_CPP_USER_ID`, the
|
||||
default is *9hnrrVPriLiLVAhfVo*. You can select the status ID with
|
||||
`MASTODON_CPP_STATUS_ID`, the default is *9hwnuJMq3eTdO4s1PU*. You can select
|
||||
the filter ID with `MASTODON_CPP_FILTER_ID`.
|
||||
|
||||
Requirements for the test-user:
|
||||
|
||||
* Have at least 1 follower.
|
||||
* Follow at least 1 account.
|
||||
* Have at least 1 account endorsed.
|
||||
* Have at least 1 public or unlisted status.
|
||||
* Have at least 1 post favourited.
|
||||
* Have no follow requests.
|
||||
|
||||
### Packages
|
||||
|
||||
#### DEB and RPM
|
||||
|
||||
Compile with `-DWITH_DEB=ON` or `-DWITH_RPM=ON`.
|
||||
Run `make package` from the build directory to generate a DEB/RPM package.
|
||||
|
||||
#### Other
|
||||
|
||||
Run `make package` from the build directory to generate a tar.gz archive.
|
||||
|
||||
# Status of implementation
|
||||
|
||||
~~Feature complete as of Mastodon 2.6.1~~
|
||||
|
||||
* [x] GET /api/v1/accounts/:id
|
||||
* [x] POST /api/v1/accounts
|
||||
* [x] GET /api/v1/accounts/verify_credentials
|
||||
* [x] PATCH /api/v1/accounts/update_credentials
|
||||
* [x] GET /api/v1/accounts/:id/followers
|
||||
* [x] GET /api/v1/accounts/:id/following
|
||||
* [x] GET /api/v1/accounts/:id/statuses
|
||||
* [x] POST /api/v1/accounts/:id/follow
|
||||
* [x] POST /api/v1/accounts/:id/unfollow
|
||||
* [x] GET /api/v1/accounts/relationships
|
||||
* [x] GET /api/v1/accounts/search
|
||||
* [x] POST /api/v1/apps
|
||||
* [x] GET /api/v1/apps/verify_credentials
|
||||
* [x] GET /api/v1/blocks
|
||||
* [x] POST /api/v1/accounts/:id/block
|
||||
* [x] POST /api/v1/accounts/:id/unblock
|
||||
* [x] GET /api/v1/custom_emojis
|
||||
* [x] GET /api/v1/domain_blocks
|
||||
* [x] POST /api/v1/domain_blocks
|
||||
* [x] DELETE /api/v1/domain_blocks
|
||||
* [x] GET /api/v1/endorsements
|
||||
* [x] POST /api/v1/accounts/:id/pin
|
||||
* [x] POST /api/v1/accounts/:id/unpin
|
||||
* [x] GET /api/v1/favourites
|
||||
* [x] POST /api/v1/statuses/:id/favourite
|
||||
* [x] POST /api/v1/statuses/:id/unfavourite
|
||||
* [x] GET /api/v1/filters
|
||||
* [x] POST /api/v1/filters
|
||||
* [x] GET /api/v1/filters/:id
|
||||
* [x] PUT /api/v1/filters/:id
|
||||
* [x] DELETE /api/v1/filters/:id
|
||||
* [x] GET /api/v1/follow_requests
|
||||
* [x] POST /api/v1/follow_requests/:id/authorize
|
||||
* [x] POST /api/v1/follow_requests/:id/reject
|
||||
* [x] GET /api/v1/suggestions
|
||||
* [x] DELETE /api/v1/suggestions/:account_id
|
||||
* [x] GET /api/v1/instance
|
||||
* [x] GET /api/v1/lists
|
||||
* [x] GET /api/v1/accounts/:id/lists
|
||||
* [x] GET /api/v1/lists/:id/accounts
|
||||
* [x] GET /api/v1/lists/:id
|
||||
* [x] POST /api/v1/lists
|
||||
* [x] PUT /api/v1/lists/:id
|
||||
* [x] DELETE /api/v1/lists/:id
|
||||
* [x] POST /api/v1/lists/:id/accounts
|
||||
* [x] DELETE /api/v1/lists/:id/accounts
|
||||
* [x] POST /api/v1/media
|
||||
* [x] PUT /api/v1/media/:id
|
||||
* [x] GET /api/v1/mutes
|
||||
* [x] POST /api/v1/accounts/:id/mute
|
||||
* [x] POST /api/v1/accounts/:id/unmute
|
||||
* [x] POST /api/v1/statuses/:id/mute
|
||||
* [x] POST /api/v1/statuses/:id/unmute
|
||||
* [x] GET /api/v1/notifications
|
||||
* [x] GET /api/v1/notifications/:id
|
||||
* [x] POST /api/v1/notifications/clear
|
||||
* [x] POST /api/v1/notifications/dismiss
|
||||
* [x] POST /api/v1/push/subscription
|
||||
* [x] GET /api/v1/push/subscription
|
||||
* [x] PUT /api/v1/push/subscription
|
||||
* [x] DELETE /api/v1/push/subscription
|
||||
* [x] ~~GET /api/v1/reports~~ (Deprecated)
|
||||
* [x] POST /api/v1/reports
|
||||
* [ ] GET /api/v1/scheduled_statuses
|
||||
* [ ] GET /api/v1/scheduled_statuses/:id
|
||||
* [ ] PUT /api/v1/scheduled_statuses/:id
|
||||
* [ ] DELETE /api/v1/scheduled_statuses/:id
|
||||
* [x] ~~GET /api/v1/search~~ (Deprecated)
|
||||
* [x] GET /api/v2/search
|
||||
* [x] GET /api/v1/statuses/:id
|
||||
* [x] GET /api/v1/statuses/:id/context
|
||||
* [x] GET /api/v1/statuses/:id/card
|
||||
* [x] GET /api/v1/statuses/:id/reblogged_by
|
||||
* [x] GET /api/v1/statuses/:id/favourited_by
|
||||
* [x] POST /api/v1/statuses
|
||||
* [x] DELETE /api/v1/statuses/:id
|
||||
* [x] POST /api/v1/statuses/:id/reblog
|
||||
* [x] POST /api/v1/statuses/:id/unreblog
|
||||
* [x] POST /api/v1/statuses/:id/pin
|
||||
* [x] POST /api/v1/statuses/:id/unpin
|
||||
* [x] GET /api/v1/timelines/home
|
||||
* [ ] GET /api/v1/conversations
|
||||
* [x] GET /api/v1/timelines/public
|
||||
* [x] GET /api/v1/timelines/tag/:hashtag
|
||||
* [x] GET /api/v1/timelines/list/:list_id
|
||||
* [x] GET /api/v1/streaming/user
|
||||
* [x] GET /api/v1/streaming/public
|
||||
* [x] GET /api/v1/streaming/public/local
|
||||
* [x] GET /api/v1/streaming/hashtag
|
||||
* [ ] GET /api/v1/streaming/hashtag/local
|
||||
* [x] GET /api/v1/streaming/list
|
||||
* [ ] GET /api/v1/streaming/direct
|
||||
|
||||
## Glitch-Soc support
|
||||
|
||||
* [x] max_toot_chars in /api/v1/instance
|
||||
* [x] GET /api/v1/bookmarks
|
||||
* [x] POST /api/v1/statuses/:id/bookmark
|
||||
* [x] POST /api/v1/statuses/:id/unbookmark
|
||||
|
||||
# Copyright
|
||||
|
||||
``` text
|
||||
Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>.
|
||||
License GPLv3: GNU GPL version 3 <https://www.gnu.org/licenses/gpl-3.0.html>.
|
||||
This program comes with ABSOLUTELY NO WARRANTY. This is free software,
|
||||
and you are welcome to redistribute it under certain conditions.
|
||||
```
|
|
@ -0,0 +1,19 @@
|
|||
include(CMakePackageConfigHelpers)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake"
|
||||
VERSION ${PACKAGE_VERSION}
|
||||
COMPATIBILITY ExactVersion) # TODO: Set to SameMajorVersion when stable.
|
||||
|
||||
install(EXPORT ${PROJECT_NAME}Targets
|
||||
FILE "${PROJECT_NAME}Targets.cmake"
|
||||
NAMESPACE "${PROJECT_NAME}::"
|
||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
|
||||
|
||||
configure_file("${PROJECT_NAME}Config.cmake.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" @ONLY)
|
||||
|
||||
install(FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
|
|
@ -0,0 +1,7 @@
|
|||
include(CMakeFindDependencyMacro)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
find_dependency(jsoncpp CONFIG REQUIRED)
|
||||
find_package(Poco COMPONENTS Foundation Net NetSSL CONFIG REQUIRED)
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
|
|
@ -0,0 +1,46 @@
|
|||
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
|
||||
set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR})
|
||||
set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR})
|
||||
set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH})
|
||||
set(CPACK_PACKAGE_VERSION ${mastodon-cpp_VERSION})
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
|
||||
if(CPACK_PACKAGE_DESCRIPTION_SUMMARY STREQUAL "") # CMake < 3.9
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "C++ wrapper for the Mastodon API.")
|
||||
endif()
|
||||
set(CPACK_PACKAGE_CONTACT "tastytea <tastytea@tastytea.de>")
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
||||
set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.adoc")
|
||||
|
||||
execute_process(COMMAND uname -m
|
||||
OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(CPACK_PACKAGE_FILE_NAME
|
||||
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_PACKAGE_ARCHITECTURE}")
|
||||
set(CPACK_GENERATOR "TGZ")
|
||||
|
||||
if (WITH_DEB)
|
||||
set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}")
|
||||
set(CPACK_GENERATOR "DEB")
|
||||
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE
|
||||
"https://schlomp.space/tastytea/${PROJECT_NAME}")
|
||||
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||
execute_process(COMMAND dpkg --print-architecture
|
||||
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
execute_process(COMMAND lsb_release --codename --short
|
||||
OUTPUT_VARIABLE DEBIAN_CODENAME
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(CPACK_PACKAGE_FILE_NAME
|
||||
"${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_${DEBIAN_CODENAME}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
|
||||
endif()
|
||||
|
||||
if (WITH_RPM)
|
||||
set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}")
|
||||
set(CPACK_GENERATOR "RPM")
|
||||
set(CPACK_RPM_PACKAGE_LICENSE "AGPL-3")
|
||||
set(CPACK_RPM_PACKAGE_URL "https://schlomp.space/tastytea/${PROJECT_NAME}")
|
||||
set(CPACK_RPM_PACKAGE_REQUIRES "poco-netssl >= 1.6, jsoncpp >= 1.7.4")
|
||||
set(CPACK_PACKAGE_FILE_NAME
|
||||
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.${CPACK_PACKAGE_ARCHITECTURE}")
|
||||
endif()
|
||||
|
||||
include(CPack)
|
|
@ -0,0 +1,11 @@
|
|||
file(GLOB sources_examples *.cpp)
|
||||
foreach(src ${sources_examples})
|
||||
get_filename_component(bin ${src} NAME_WE)
|
||||
add_executable(${bin} ${src})
|
||||
target_link_libraries(${bin} PRIVATE ${PROJECT_NAME})
|
||||
endforeach()
|
||||
|
||||
if(WITH_DOC)
|
||||
install(FILES ${sources_examples}
|
||||
DESTINATION "${CMAKE_INSTALL_DOCDIR}/${PROJECT_NAME}/examples")
|
||||
endif()
|
|
@ -8,13 +8,8 @@
|
|||
#include <string>
|
||||
#include <cstdint>
|
||||
#include <regex>
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/all.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/all.hpp>
|
||||
#endif
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/all.hpp"
|
||||
|
||||
using std::cout;
|
||||
using std::cerr;
|
||||
|
|
|
@ -10,13 +10,8 @@
|
|||
#include <mutex>
|
||||
#include <chrono>
|
||||
#include <vector>
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/all.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/all.hpp>
|
||||
#endif
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/all.hpp"
|
||||
|
||||
using std::cout;
|
||||
using std::cerr;
|
||||
|
@ -51,11 +46,12 @@ int main(int argc, char *argv[])
|
|||
// Acquire lock for the stream variable to avoid simultaneous access.
|
||||
std::lock_guard<std::mutex> lock(ptr->get_mutex());
|
||||
// Parse event stream into a vector.
|
||||
std::vector<Easy::stream_event> events = Easy::parse_stream(stream);
|
||||
std::vector<Easy::stream_event_type> events
|
||||
= Easy::parse_stream(stream);
|
||||
// Clear the stream buffer.
|
||||
stream.clear();
|
||||
|
||||
for (const Easy::stream_event &event : events)
|
||||
for (const Easy::stream_event_type &event : events)
|
||||
{
|
||||
// Print out some information about the events.
|
||||
switch (event.type)
|
||||
|
|
|
@ -0,0 +1,91 @@
|
|||
// This file is part of mastodon-cpp.
|
||||
// Get 2 pages of 5 favourites each.
|
||||
|
||||
// Don't compile this if the Easy-interface is turned off
|
||||
#ifndef WITHOUT_EASY
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/all.hpp"
|
||||
|
||||
using std::cout;
|
||||
using std::cerr;
|
||||
using std::endl;
|
||||
using std::string;
|
||||
using std::vector;
|
||||
using namespace Mastodon;
|
||||
|
||||
void print_favs(Easy::API &masto, const string &max_id = "")
|
||||
{
|
||||
// Set up parameters.
|
||||
Mastodon::parameters params =
|
||||
{
|
||||
{ "limit", { "5" } },
|
||||
{ "exclude_types", { "follow", "reblog", "mention" } }
|
||||
};
|
||||
// Set max_id if given.
|
||||
if (!max_id.empty())
|
||||
{
|
||||
params.push_back({ "max_id", { max_id } });
|
||||
}
|
||||
|
||||
// Retrieve the last 5 favourites.
|
||||
return_call ret = masto.get(API::v1::notifications, params);
|
||||
// If no error was returned.
|
||||
if (ret)
|
||||
{
|
||||
// Convert answer to vector of strings, loop through vector.
|
||||
for (const string &str : Easy::json_array_to_vector(ret.answer))
|
||||
{
|
||||
// Construct Mastodon::Easy::Notification from string.
|
||||
const Easy::Notification notif(str);
|
||||
cout << notif.created_at().strtime("%F %T: ");
|
||||
cout << notif.account().display_name() << " favourited a status.\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Print error message.
|
||||
cerr << ret.error_message << endl;
|
||||
// Print HTTP status code, if there is one.
|
||||
if (ret.http_error_code != 0)
|
||||
{
|
||||
cerr << "HTTP status code: "
|
||||
<< std::to_string(ret.http_error_code) << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
const vector<string> args(argv, argv + argc);
|
||||
if (args.size() < 3)
|
||||
{
|
||||
std::cerr << "usage: " << args[0] << " <instance> <auth token>\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Construct a Mastodon::Easy object.
|
||||
Easy::API masto(args[1], args[2]);
|
||||
print_favs(masto);
|
||||
|
||||
cout << "\nLink header is: " << masto.get_header("link") << "\n\n";
|
||||
|
||||
// Get the max_id for pagination.
|
||||
// See <https://docs.joinmastodon.org/api/rest/notifications/#pagination>
|
||||
print_favs(masto, masto.get_link().max_id());
|
||||
// The same: print_favs(masto, masto.get_link().next());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
#include <iostream>
|
||||
int main()
|
||||
{
|
||||
std::cout << "mastodon-cpp was compiled without Easy support.\n";
|
||||
return 255;
|
||||
}
|
||||
#endif // WITHOUT_EASY
|
|
@ -0,0 +1,48 @@
|
|||
// This file is part of mastodon-cpp.
|
||||
// Prints shortcode + URL for each custom emoji.
|
||||
|
||||
// Don't compile this if the Easy-interface is turned off
|
||||
#ifndef WITHOUT_EASY
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/all.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::vector;
|
||||
using namespace Mastodon;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
const vector<string> args(argv, argv + argc);
|
||||
if (args.size() < 2)
|
||||
{
|
||||
std::cerr << "usage: " << args[0] << " <instance>\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Construct a Mastodon::Easy object.
|
||||
Easy::API masto(args[1], "");
|
||||
const return_call ret = masto.get(API::v1::custom_emojis);
|
||||
|
||||
// Convert JSON array into vector of strings.
|
||||
for (const string &str : Easy::json_array_to_vector(ret))
|
||||
{
|
||||
// Construct Emoji object from string.
|
||||
const Easy::Emoji emoji(str);
|
||||
std::cout << ':' << emoji.shortcode() << ": <" << emoji.url() << ">\n";
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
#include <iostream>
|
||||
int main()
|
||||
{
|
||||
std::cout << "mastodon-cpp was compiled without Easy support.\n";
|
||||
return 255;
|
||||
}
|
||||
#endif // WITHOUT_EASY
|
|
@ -1,54 +0,0 @@
|
|||
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
|
||||
set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR})
|
||||
set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR})
|
||||
set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH})
|
||||
set(CPACK_PACKAGE_VERSION ${mastodon-cpp_VERSION})
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "C++ wrapper for the Mastodon API")
|
||||
set(CPACK_PACKAGE_CONTACT "tastytea <tastytea@tastytea.de>")
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
||||
set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.md")
|
||||
list(APPEND CPACK_SOURCE_IGNORE_FILES "/\\\\.git"
|
||||
"/.gitignore"
|
||||
"/build/"
|
||||
"/doc/"
|
||||
"\\\\.sublime-"
|
||||
"/update_doc.sh"
|
||||
"/.drone.yml"
|
||||
"/ISSUE_TEMPLATE.md$")
|
||||
execute_process(COMMAND uname -m
|
||||
OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(CPACK_PACKAGE_FILE_NAME
|
||||
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_PACKAGE_ARCHITECTURE}")
|
||||
set(CPACK_GENERATOR "TGZ")
|
||||
set(CPACK_SOURCE_GENERATOR "TGZ")
|
||||
|
||||
if (WITH_DEB)
|
||||
set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}")
|
||||
set(CPACK_GENERATOR "DEB")
|
||||
set(CPACK_SOURCE_GENERATOR "DEB")
|
||||
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://schlomp.space/tastytea/mastodon-cpp")
|
||||
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||
execute_process(COMMAND dpkg --print-architecture
|
||||
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(CPACK_PACKAGE_FILE_NAME
|
||||
"${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
|
||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME
|
||||
"${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_src")
|
||||
endif()
|
||||
|
||||
if (WITH_RPM)
|
||||
set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}")
|
||||
set(CPACK_GENERATOR "RPM")
|
||||
set(CPACK_SOURCE_GENERATOR "RPM")
|
||||
set(CPACK_RPM_PACKAGE_LICENSE "GPL-3")
|
||||
set(CPACK_RPM_PACKAGE_URL "https://schlomp.space/tastytea/mastodon-cpp")
|
||||
set(CPACK_RPM_PACKAGE_REQUIRES "curlpp >= 0.8.1 jsoncpp, >= 1.7.4")
|
||||
set(CPACK_PACKAGE_FILE_NAME
|
||||
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.${CPACK_PACKAGE_ARCHITECTURE}")
|
||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME
|
||||
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.src")
|
||||
endif()
|
||||
|
||||
include(CPack)
|
|
@ -0,0 +1,7 @@
|
|||
include(GNUInstallDirs)
|
||||
|
||||
configure_file("${PROJECT_NAME}.pc.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc" @ONLY)
|
||||
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
|
||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
|
@ -0,0 +1,12 @@
|
|||
name=@PROJECT_NAME@
|
||||
prefix=@CMAKE_INSTALL_PREFIX@
|
||||
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
|
||||
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
|
||||
|
||||
Name: ${name}
|
||||
Description: @PROJECT_DESCRIPTION@
|
||||
Version: @PROJECT_VERSION@
|
||||
Cflags: -I${includedir}
|
||||
Libs: -L${libdir} -l${name} -lpthread -lPocoNet
|
||||
Requires: jsoncpp
|
||||
Libs.private: -lPocoFoundation -lPocoNetSSL
|
|
@ -0,0 +1,71 @@
|
|||
include(GNUInstallDirs)
|
||||
|
||||
if(WITH_EASY)
|
||||
find_package(jsoncpp CONFIG REQUIRED)
|
||||
endif()
|
||||
# Some distributions do not contain Poco*Config.cmake recipes.
|
||||
find_package(Poco COMPONENTS Foundation Net NetSSL CONFIG)
|
||||
|
||||
if(WITH_EASY)
|
||||
file(GLOB_RECURSE sources *.cpp *.hpp)
|
||||
else()
|
||||
file(GLOB sources *.cpp api/*.cpp *.hpp api/*.hpp)
|
||||
endif()
|
||||
|
||||
# Write version in header
|
||||
configure_file ("version.hpp.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/version.hpp")
|
||||
|
||||
add_library(${PROJECT_NAME} ${sources})
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR})
|
||||
|
||||
target_include_directories(${PROJECT_NAME}
|
||||
PRIVATE
|
||||
"$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>"
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>"
|
||||
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||
|
||||
if(WITH_EASY)
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
PUBLIC pthread jsoncpp_lib)
|
||||
endif()
|
||||
|
||||
# If no Poco*Config.cmake recipes are found, look for headers in standard dirs.
|
||||
if(PocoNetSSL_FOUND)
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
PRIVATE Poco::Foundation Poco::Net Poco::NetSSL)
|
||||
else()
|
||||
find_file(Poco_h NAMES "Poco/Poco.h"
|
||||
PATHS "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
|
||||
if("${Poco_h}" STREQUAL "Poco_h-NOTFOUND")
|
||||
message(FATAL_ERROR "Could not find POCO.")
|
||||
else()
|
||||
message(WARNING
|
||||
"Your distribution of POCO doesn't contain the *Config.cmake recipes, "
|
||||
"but the files seem to be in the standard directories. "
|
||||
"Let's hope this works.")
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
PRIVATE PocoFoundation PocoNet PocoNetSSL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
install(TARGETS ${PROJECT_NAME}
|
||||
EXPORT "${PROJECT_NAME}Targets"
|
||||
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
||||
|
||||
install(FILES mastodon-cpp.hpp return_types.hpp types.hpp
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
|
||||
if(WITH_EASY)
|
||||
file(GLOB easy_header easy/*.hpp)
|
||||
install(FILES ${easy_header}
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy)
|
||||
file(GLOB easy_entities_header easy/entities/*.hpp)
|
||||
install(FILES ${easy_entities_header}
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy/entities)
|
||||
endif()
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -78,7 +78,7 @@ return_call API::del(const Mastodon::API::v1 &call,
|
|||
default:
|
||||
{
|
||||
ttdebug << "ERROR: Invalid argument.\n";
|
||||
return { 22, "Invalid argument", 0, "" };
|
||||
return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,5 +88,5 @@ return_call API::del(const Mastodon::API::v1 &call,
|
|||
return_call API::del(const std::string &call, const parameters ¶ms)
|
||||
{
|
||||
|
||||
return _http.request(http_method::DELETE, call, maptoformdata(params));
|
||||
return _http.request(http_method::DELETE, call, *maptoformdata(params));
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -86,11 +86,6 @@ const return_call API::get(const Mastodon::API::v1 &call,
|
|||
strcall = "/api/v1/notifications";
|
||||
break;
|
||||
}
|
||||
case v1::reports:
|
||||
{
|
||||
strcall = "/api/v1/reports";
|
||||
break;
|
||||
}
|
||||
case v1::timelines_home:
|
||||
{
|
||||
strcall = "/api/v1/timelines/home";
|
||||
|
@ -151,11 +146,6 @@ const return_call API::get(const Mastodon::API::v1 &call,
|
|||
strcall = "/api/v1/notifications/" + strid;
|
||||
break;
|
||||
}
|
||||
case v1::search:
|
||||
{
|
||||
strcall = "/api/v1/search";
|
||||
break;
|
||||
}
|
||||
case v1::statuses_id:
|
||||
{
|
||||
strcall = "/api/v1/statuses/" + strid;
|
||||
|
@ -192,7 +182,7 @@ const return_call API::get(const Mastodon::API::v1 &call,
|
|||
else
|
||||
{
|
||||
ttdebug << "ERROR: Invalid argument.\n";
|
||||
return { 22, "Invalid argument", 0, "" };
|
||||
return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -236,10 +226,25 @@ const return_call API::get(const Mastodon::API::v1 &call,
|
|||
strcall = "/api/v1/suggestions";
|
||||
break;
|
||||
}
|
||||
case v1::polls_id:
|
||||
{
|
||||
strcall = "/api/v1/polls/" + strid;
|
||||
break;
|
||||
}
|
||||
case v1::conversations:
|
||||
{
|
||||
strcall = "/api/v1/conversations";
|
||||
break;
|
||||
}
|
||||
case v1::streaming_health:
|
||||
{
|
||||
strcall = "/api/v1/streaming/health";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
ttdebug << "ERROR: Invalid argument.\n";
|
||||
return { 22, "Invalid argument", 0, "" };
|
||||
return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -276,7 +281,7 @@ const return_call API::get(const Mastodon::API::v2 &call,
|
|||
default:
|
||||
{
|
||||
ttdebug << "ERROR: Invalid argument.\n";
|
||||
return { 22, "Invalid argument", 0, "" };
|
||||
return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
|||
|
||||
using namespace Mastodon;
|
||||
using std::cerr;
|
||||
using std::to_string;
|
||||
|
||||
void API::get_stream(const Mastodon::API::v1 &call,
|
||||
const parameters ¶ms,
|
||||
|
@ -30,27 +31,50 @@ void API::get_stream(const Mastodon::API::v1 &call,
|
|||
|
||||
switch (call)
|
||||
{
|
||||
case v1::streaming_user:
|
||||
case Mastodon::API::v1::streaming_user:
|
||||
{
|
||||
strcall = "/api/v1/streaming/user";
|
||||
break;
|
||||
}
|
||||
case v1::streaming_public:
|
||||
{
|
||||
strcall = "/api/v1/streaming/public";
|
||||
break;
|
||||
}
|
||||
case v1::streaming_public_local:
|
||||
{
|
||||
strcall = "/api/v1/streaming/public/local";
|
||||
break;
|
||||
}
|
||||
case v1::streaming_hashtag:
|
||||
{
|
||||
strcall = "/api/v1/streaming/hashtag";
|
||||
break;
|
||||
}
|
||||
case v1::streaming_hashtag_local:
|
||||
{
|
||||
strcall = "/api/v1/streaming/hashtag/local";
|
||||
break;
|
||||
}
|
||||
case v1::streaming_list:
|
||||
{
|
||||
strcall = "/api/v1/streaming/list";
|
||||
break;
|
||||
default:
|
||||
ttdebug << "ERROR: Invalid call.\n";
|
||||
stream = "event: ERROR\ndata: {\"error_code\":22}\n";
|
||||
return;
|
||||
}
|
||||
case v1::streaming_direct:
|
||||
{
|
||||
strcall = "/api/v1/streaming/direct";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
const uint8_t err = static_cast<uint8_t>(error::INVALID_ARGUMENT);
|
||||
ttdebug << "ERROR: Invalid call.\n";
|
||||
stream = "event: ERROR\ndata: "
|
||||
"{\"error_code\":" + to_string(err) + "}\n";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (params.size() > 0)
|
||||
{
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -32,10 +32,9 @@ return_call API::patch(const Mastodon::API::v1 &call,
|
|||
break;
|
||||
default:
|
||||
ttdebug << "ERROR: Invalid argument.\n";
|
||||
return { 22, "Invalid argument", 0, "" };
|
||||
return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
|
||||
break;
|
||||
}
|
||||
|
||||
return _http.request(http_method::PATCH,
|
||||
strcall, maptoformdata(params));
|
||||
return _http.request(http_method::PATCH, strcall, *maptoformdata(params));
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -195,10 +195,15 @@ return_call API::post(const Mastodon::API::v1 &call,
|
|||
strcall = "/api/v1/filters";
|
||||
break;
|
||||
}
|
||||
case v1::polls_id_votes:
|
||||
{
|
||||
strcall = "/api/v1/polls/" + strid + "/votes";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
ttdebug << "ERROR: Invalid argument.\n";
|
||||
return { 22, "Invalid argument", 0, ""};
|
||||
return { error::INVALID_ARGUMENT, "Invalid argument", 0, ""};
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -214,5 +219,5 @@ return_call API::post(const Mastodon::API::v1 &call)
|
|||
return_call API::post(const string &call, const parameters ¶ms)
|
||||
{
|
||||
|
||||
return _http.request(http_method::POST, call, maptoformdata(params));
|
||||
return _http.request(http_method::POST, call, *maptoformdata(params));
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -58,7 +58,7 @@ return_call API::put(const Mastodon::API::v1 &call,
|
|||
default:
|
||||
{
|
||||
ttdebug << "ERROR: Invalid argument.\n";
|
||||
return { 22, "Invalid argument", 0, "" };
|
||||
return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -68,5 +68,5 @@ return_call API::put(const Mastodon::API::v1 &call,
|
|||
return_call API::put(const string &call, const parameters ¶ms)
|
||||
{
|
||||
|
||||
return _http.request(http_method::PUT, call, maptoformdata(params));
|
||||
return _http.request(http_method::PUT, call, *maptoformdata(params));
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
|
|
@ -2,62 +2,40 @@
|
|||
* Copyright © 2018 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef MASTODON_CPP_EASY_ALL_HPP
|
||||
#define MASTODON_CPP_EASY_ALL_HPP
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/account.hpp"
|
||||
#include "easy/entities/application.hpp"
|
||||
#include "easy/entities/attachment.hpp"
|
||||
#include "easy/entities/card.hpp"
|
||||
#include "easy/entities/context.hpp"
|
||||
#include "easy/entities/emoji.hpp"
|
||||
#include "easy/entities/instance.hpp"
|
||||
#include "easy/entities/list.hpp"
|
||||
#include "easy/entities/mention.hpp"
|
||||
#include "easy/entities/notification.hpp"
|
||||
#include "easy/entities/relationship.hpp"
|
||||
#include "easy/entities/report.hpp"
|
||||
#include "easy/entities/results.hpp"
|
||||
#include "easy/entities/status.hpp"
|
||||
#include "easy/entities/tag.hpp"
|
||||
#include "easy/entities/token.hpp"
|
||||
#include "easy/entities/pushsubscription.hpp"
|
||||
#include "easy/entities/filter.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/easy/easy.hpp>
|
||||
#include <mastodon-cpp/easy/entities/account.hpp>
|
||||
#include <mastodon-cpp/easy/entities/application.hpp>
|
||||
#include <mastodon-cpp/easy/entities/attachment.hpp>
|
||||
#include <mastodon-cpp/easy/entities/card.hpp>
|
||||
#include <mastodon-cpp/easy/entities/context.hpp>
|
||||
#include <mastodon-cpp/easy/entities/emoji.hpp>
|
||||
#include <mastodon-cpp/easy/entities/instance.hpp>
|
||||
#include <mastodon-cpp/easy/entities/list.hpp>
|
||||
#include <mastodon-cpp/easy/entities/mention.hpp>
|
||||
#include <mastodon-cpp/easy/entities/notification.hpp>
|
||||
#include <mastodon-cpp/easy/entities/relationship.hpp>
|
||||
#include <mastodon-cpp/easy/entities/report.hpp>
|
||||
#include <mastodon-cpp/easy/entities/results.hpp>
|
||||
#include <mastodon-cpp/easy/entities/status.hpp>
|
||||
#include <mastodon-cpp/easy/entities/tag.hpp>
|
||||
#include <mastodon-cpp/easy/entities/token.hpp>
|
||||
#include <mastodon-cpp/easy/entities/pushsubscription.hpp>
|
||||
#include <mastodon-cpp/easy/entities/filter.hpp>
|
||||
#endif
|
||||
#include "easy.hpp"
|
||||
#include "entities/account.hpp"
|
||||
#include "entities/application.hpp"
|
||||
#include "entities/attachment.hpp"
|
||||
#include "entities/card.hpp"
|
||||
#include "entities/context.hpp"
|
||||
#include "entities/emoji.hpp"
|
||||
#include "entities/instance.hpp"
|
||||
#include "entities/list.hpp"
|
||||
#include "entities/mention.hpp"
|
||||
#include "entities/notification.hpp"
|
||||
#include "entities/relationship.hpp"
|
||||
#include "entities/results.hpp"
|
||||
#include "entities/status.hpp"
|
||||
#include "entities/tag.hpp"
|
||||
#include "entities/token.hpp"
|
||||
#include "entities/pushsubscription.hpp"
|
||||
#include "entities/filter.hpp"
|
||||
#include "entities/poll.hpp"
|
||||
#include "entities/conversation.hpp"
|
||||
|
||||
#endif // MASTODON_CPP_EASY_ALL_HPP
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -49,13 +49,14 @@ const std::vector<string> Easy::json_array_to_vector(const string &json)
|
|||
return {};
|
||||
}
|
||||
|
||||
const vector<Easy::stream_event> Easy::parse_stream(
|
||||
const vector<Easy::stream_event_type> Easy::parse_stream(
|
||||
const std::string &streamdata)
|
||||
{
|
||||
string stream = streamdata;
|
||||
std::regex reevent("event: (update|notification|delete|ERROR)\ndata: (.*)\n");
|
||||
std::regex reevent("event: (update|notification|delete|filters_changed"
|
||||
"|ERROR)\ndata: (.*)\n");
|
||||
std::smatch match;
|
||||
std::vector<stream_event> vec = {};
|
||||
std::vector<stream_event_type> vec = {};
|
||||
|
||||
while (std::regex_search(stream, match, reevent))
|
||||
{
|
||||
|
@ -63,14 +64,16 @@ const vector<Easy::stream_event> Easy::parse_stream(
|
|||
const string &data = match[2].str();
|
||||
event_type type = event_type::Undefined;
|
||||
|
||||
if (event.compare("update") == 0)
|
||||
if (event == "update")
|
||||
type = event_type::Update;
|
||||
else if (event.compare("notification") == 0)
|
||||
else if (event == "notification")
|
||||
type = event_type::Notification;
|
||||
else if (event.compare("delete") == 0)
|
||||
else if (event == "delete")
|
||||
type = event_type::Delete;
|
||||
else if (event.compare("ERROR") == 0)
|
||||
else if (event == "ERROR")
|
||||
type = event_type::Error;
|
||||
else if (event == "filters_changed")
|
||||
type = event_type::Filters_changed;
|
||||
|
||||
vec.push_back({ type, data });
|
||||
stream = match.suffix().str();
|
||||
|
@ -79,6 +82,16 @@ const vector<Easy::stream_event> Easy::parse_stream(
|
|||
return vec;
|
||||
}
|
||||
|
||||
const Easy::time_type Easy::string_to_time(const string &strtime)
|
||||
{
|
||||
std::stringstream sstime(strtime);
|
||||
struct std::tm tm = {};
|
||||
tm.tm_isdst = -1; // Detect daylight saving time.
|
||||
sstime >> std::get_time(&tm, "%Y-%m-%dT%T");
|
||||
std::time_t time = timegm(&tm); // Assume time is UTC.
|
||||
return { system_clock::from_time_t(time) };
|
||||
}
|
||||
|
||||
const Easy::Link Easy::API::get_link() const
|
||||
{
|
||||
return Link(get_header("Link"));
|
||||
|
@ -88,8 +101,8 @@ Easy::Link::Link(const string &link_header)
|
|||
: _next()
|
||||
, _prev()
|
||||
{
|
||||
std::regex renext("max_id=([[:digit:]]*)");
|
||||
std::regex reprev("since_id=([[:digit:]]*)");
|
||||
std::regex renext("max_id=([[:alnum:]]*)");
|
||||
std::regex reprev("(?:since|min)_id=([[:alnum:]]*)");
|
||||
std::smatch match;
|
||||
|
||||
if (std::regex_search(link_header, match, renext))
|
||||
|
@ -121,3 +134,8 @@ const string Easy::Link::since_id() const
|
|||
{
|
||||
return _prev;
|
||||
}
|
||||
|
||||
const string Easy::Link::min_id() const
|
||||
{
|
||||
return _prev;
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -24,20 +24,11 @@
|
|||
#include <ostream>
|
||||
#include <jsoncpp/json/json.h>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/return_types_easy.hpp"
|
||||
#include "easy/types_easy.hpp"
|
||||
#include "easy/entities/notification.hpp"
|
||||
#include "easy/entities/status.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/return_types_easy.hpp>
|
||||
#include <mastodon-cpp/easy/types_easy.hpp>
|
||||
#include <mastodon-cpp/easy/entities/notification.hpp>
|
||||
#include <mastodon-cpp/easy/entities/status.hpp>
|
||||
#endif
|
||||
#include "../mastodon-cpp.hpp"
|
||||
#include "return_types_easy.hpp"
|
||||
#include "types_easy.hpp"
|
||||
#include "entities/notification.hpp"
|
||||
#include "entities/status.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::vector;
|
||||
|
@ -98,6 +89,13 @@ namespace Easy
|
|||
*/
|
||||
const string since_id() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns min_id.
|
||||
*
|
||||
* @since 0.111.0
|
||||
*/
|
||||
const string min_id() const;
|
||||
|
||||
private:
|
||||
string _next;
|
||||
string _prev;
|
||||
|
@ -112,7 +110,7 @@ namespace Easy
|
|||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const std::vector<string> json_array_to_vector(const string &json);
|
||||
const vector<string> json_array_to_vector(const string &json);
|
||||
|
||||
/*!
|
||||
* @brief Split stream into a vector of events
|
||||
|
@ -123,7 +121,14 @@ namespace Easy
|
|||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const std::vector<stream_event> parse_stream(const std::string &streamdata);
|
||||
const vector<stream_event_type> parse_stream(const std::string &streamdata);
|
||||
|
||||
/*!
|
||||
* @brief Convert ISO 8601 time string to Easy::time.
|
||||
*
|
||||
* @param strtime Time string as returned by Mastodon.
|
||||
*/
|
||||
const Easy::time_type string_to_time(const string &strtime);
|
||||
|
||||
/*!
|
||||
* @brief Child of Mastodon::API with abstract methods.
|
||||
|
@ -162,6 +167,7 @@ namespace Easy
|
|||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
[[deprecated("Will go away in 1.0.0 with no replacement.")]]
|
||||
const return_entity<Easy::Status> send_post(const Status &status);
|
||||
|
||||
/*!
|
||||
|
@ -169,6 +175,7 @@ namespace Easy
|
|||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
[[deprecated("Will go away in 1.0.0 with no replacement.")]]
|
||||
const return_entity<Easy::Status> send_toot(const Status &status);
|
||||
|
||||
/*!
|
||||
|
@ -182,6 +189,7 @@ namespace Easy
|
|||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
[[deprecated("Will go away in 1.0.0 with no replacement.")]]
|
||||
const return_entity_vector<Easy::Notification> get_notifications(
|
||||
const uint16_t limit = 20, const string since_id = "",
|
||||
const string max_id = "");
|
||||
|
|
|
@ -2,30 +2,30 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <array>
|
||||
#include <algorithm>
|
||||
#include "account.hpp"
|
||||
#include "debug.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
using Account = Easy::Account;
|
||||
|
||||
bool Account::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"id",
|
||||
"username",
|
||||
"acct",
|
||||
|
@ -42,9 +42,7 @@ bool Account::valid() const
|
|||
"header",
|
||||
"header_static",
|
||||
"emojis"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const string Account::acct() const
|
||||
|
@ -57,12 +55,6 @@ const string Account::avatar() const
|
|||
return get_string("avatar");
|
||||
}
|
||||
|
||||
Account Account::avatar(const string &avatar)
|
||||
{
|
||||
set("avatar", Json::Value(avatar));
|
||||
return *this;
|
||||
}
|
||||
|
||||
const string Account::avatar_static() const
|
||||
{
|
||||
return get_string("avatar_static");
|
||||
|
@ -73,7 +65,7 @@ bool Account::bot() const
|
|||
return get_bool("bot");
|
||||
}
|
||||
|
||||
const Easy::time Account::created_at() const
|
||||
const Easy::time_type Account::created_at() const
|
||||
{
|
||||
return get_time("created_at");
|
||||
}
|
||||
|
@ -83,25 +75,17 @@ const string Account::display_name() const
|
|||
return get_string("display_name");
|
||||
}
|
||||
|
||||
Account Account::display_name(const string &display_name)
|
||||
const std::vector<Easy::Emoji> Account::emojis()
|
||||
{
|
||||
set("display_name", Json::Value(display_name));
|
||||
return *this;
|
||||
}
|
||||
|
||||
const std::vector<Account::fields_pair> Account::fields() const
|
||||
{
|
||||
const Json::Value &node = get("fields");
|
||||
const Json::Value &node = get("emojis");
|
||||
|
||||
if (node.isArray())
|
||||
{
|
||||
std::vector<Account::fields_pair> vec;
|
||||
std::vector<Easy::Emoji> vec;
|
||||
std::transform(node.begin(), node.end(), std::back_inserter(vec),
|
||||
[](const Json::Value &value)
|
||||
{
|
||||
return Account::fields_pair
|
||||
(value["name"].asString(),
|
||||
value["value"].asString());
|
||||
return Easy::Emoji(value);
|
||||
});
|
||||
return vec;
|
||||
}
|
||||
|
@ -109,19 +93,28 @@ const std::vector<Account::fields_pair> Account::fields() const
|
|||
return {};
|
||||
}
|
||||
|
||||
Account Account::fields(std::vector<Account::fields_pair> &fields)
|
||||
const vector<Easy::account_field_type> Account::fields() const
|
||||
{
|
||||
Json::Value jsonarray(Json::arrayValue);
|
||||
const Json::Value &node = get("fields");
|
||||
|
||||
for (const fields_pair &field : fields)
|
||||
if (node.isArray())
|
||||
{
|
||||
Json::Value jsonkeyval(Json::objectValue);
|
||||
jsonkeyval["name"] = field.first;
|
||||
jsonkeyval["value"] = field.second;
|
||||
jsonarray.append(jsonkeyval);
|
||||
vector<Easy::account_field_type> vec;
|
||||
std::transform(node.begin(), node.end(), std::back_inserter(vec),
|
||||
[](const Json::Value &value)
|
||||
{
|
||||
return Easy::account_field_type(
|
||||
{
|
||||
value["name"].asString(),
|
||||
value["value"].asString(),
|
||||
Easy::string_to_time(
|
||||
value["verified_at"].asString())
|
||||
});
|
||||
});
|
||||
return vec;
|
||||
}
|
||||
set("fields", jsonarray);
|
||||
return *this;
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
std::uint64_t Account::followers_count() const
|
||||
|
@ -139,12 +132,6 @@ const string Account::header() const
|
|||
return get_string("header");
|
||||
}
|
||||
|
||||
Account Account::header(const string &header)
|
||||
{
|
||||
set("header", Json::Value(header));
|
||||
return *this;
|
||||
}
|
||||
|
||||
const string Account::header_static() const
|
||||
{
|
||||
return get_string("header_static");
|
||||
|
@ -160,12 +147,6 @@ bool Account::locked() const
|
|||
return get_bool("locked");
|
||||
}
|
||||
|
||||
Account Account::locked(const bool &locked)
|
||||
{
|
||||
set("locked", Json::Value(locked));
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool Account::has_moved() const
|
||||
{
|
||||
if (get("moved").isObject())
|
||||
|
@ -180,8 +161,7 @@ const Account Account::moved() const
|
|||
{
|
||||
if (has_moved())
|
||||
{
|
||||
// TODO: Find an account with moved-node and test
|
||||
return Account(get("moved").toStyledString());
|
||||
return Account(get("moved"));
|
||||
}
|
||||
|
||||
return Account();
|
||||
|
@ -192,25 +172,18 @@ const string Account::note() const
|
|||
return get_string("note");
|
||||
}
|
||||
|
||||
Account Account::note(const string ¬e)
|
||||
{
|
||||
set("note", Json::Value(note));
|
||||
return *this;
|
||||
}
|
||||
|
||||
Easy::visibility_type Account::privacy() const
|
||||
{
|
||||
const string strprivacy = get_string("source.privacy");
|
||||
if (strprivacy.compare("public") == 0)
|
||||
const string strprivacy = get_string("privacy");
|
||||
if (strprivacy == "public")
|
||||
return visibility_type::Public;
|
||||
else if (strprivacy.compare("unlisted") == 0)
|
||||
else if (strprivacy == "unlisted")
|
||||
return visibility_type::Unlisted;
|
||||
else if (strprivacy.compare("private") == 0)
|
||||
else if (strprivacy == "private")
|
||||
return visibility_type::Private;
|
||||
else if (strprivacy.compare("direct") == 0)
|
||||
else if (strprivacy == "direct")
|
||||
return visibility_type::Direct;
|
||||
|
||||
ttdebug << "Could not get data: source.privacy\n";
|
||||
return visibility_type::Undefined;
|
||||
}
|
||||
|
||||
|
@ -219,131 +192,11 @@ bool Account::sensitive() const
|
|||
return get_bool("source.sensitive");
|
||||
}
|
||||
|
||||
bool Account::Source::valid() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
const std::vector<Account::fields_pair> Account::Source::fields() const
|
||||
{
|
||||
const Json::Value &node = get("fields");
|
||||
|
||||
if (node.isArray())
|
||||
{
|
||||
std::vector<Account::fields_pair> vec;
|
||||
std::transform(node.begin(), node.end(), std::back_inserter(vec),
|
||||
[](const Json::Value &value)
|
||||
{
|
||||
return Account::fields_pair
|
||||
(value["name"].asString(),
|
||||
value["value"].asString());
|
||||
});
|
||||
return vec;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
Account::Source Account::Source::fields
|
||||
(std::vector<Account::fields_pair> &fields)
|
||||
{
|
||||
Json::Value jsonarray(Json::arrayValue);
|
||||
|
||||
for (const fields_pair &field : fields)
|
||||
{
|
||||
Json::Value jsonkeyval(Json::objectValue);
|
||||
jsonkeyval["name"] = field.first;
|
||||
jsonkeyval["value"] = field.second;
|
||||
jsonarray.append(jsonkeyval);
|
||||
}
|
||||
set("fields", jsonarray);
|
||||
return *this;
|
||||
}
|
||||
|
||||
const string Account::Source::note() const
|
||||
{
|
||||
return get_string("note");
|
||||
}
|
||||
|
||||
Account::Source Account::Source::note(const string ¬e)
|
||||
{
|
||||
set("note", Json::Value(note));
|
||||
return *this;
|
||||
}
|
||||
|
||||
Easy::visibility_type Account::Source::privacy() const
|
||||
{
|
||||
const string strprivacy = get_string("privacy");
|
||||
if (strprivacy.compare("public") == 0)
|
||||
return visibility_type::Public;
|
||||
else if (strprivacy.compare("unlisted") == 0)
|
||||
return visibility_type::Unlisted;
|
||||
else if (strprivacy.compare("private") == 0)
|
||||
return visibility_type::Private;
|
||||
else if (strprivacy.compare("direct") == 0)
|
||||
return visibility_type::Direct;
|
||||
|
||||
ttdebug << "Could not get data: source.privacy\n";
|
||||
return visibility_type::Undefined;
|
||||
}
|
||||
|
||||
Account::Source Account::Source::privacy(const Easy::visibility_type &privacy)
|
||||
{
|
||||
string strprivacy = "";
|
||||
switch (privacy)
|
||||
{
|
||||
case visibility_type::Public:
|
||||
{
|
||||
strprivacy = "public";
|
||||
break;
|
||||
}
|
||||
case visibility_type::Unlisted:
|
||||
{
|
||||
strprivacy = "unlisted";
|
||||
break;
|
||||
}
|
||||
case visibility_type::Private:
|
||||
{
|
||||
strprivacy = "private";
|
||||
break;
|
||||
}
|
||||
case visibility_type::Direct:
|
||||
{
|
||||
strprivacy = "direct";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
strprivacy = "undefined";
|
||||
break;
|
||||
}
|
||||
}
|
||||
set("privacy", Json::Value(strprivacy));
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool Account::Source::sensitive() const
|
||||
{
|
||||
return get_bool("sensitive");
|
||||
}
|
||||
|
||||
Account::Source Account::Source::sensitive(const bool &sensitive)
|
||||
{
|
||||
set("source", Json::Value(sensitive));
|
||||
return *this;
|
||||
}
|
||||
|
||||
const Account::Source Account::source() const
|
||||
{
|
||||
return Account::Source(get("source"));
|
||||
}
|
||||
|
||||
Account Account::source(const Account::Source &source)
|
||||
{
|
||||
set("source", Json::Value(source.to_object()));
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::uint64_t Account::statuses_count() const
|
||||
{
|
||||
return get_uint64("statuses_count");
|
||||
|
@ -358,3 +211,66 @@ const string Account::username() const
|
|||
{
|
||||
return get_string("username");
|
||||
}
|
||||
|
||||
bool Account::Source::valid() const
|
||||
{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"note",
|
||||
"fields"
|
||||
});
|
||||
}
|
||||
|
||||
const vector<Easy::account_field_type> Account::Source::fields() const
|
||||
{
|
||||
const Json::Value &node = get("fields");
|
||||
|
||||
if (node.isArray())
|
||||
{
|
||||
vector<Easy::account_field_type> vec;
|
||||
std::transform(node.begin(), node.end(), std::back_inserter(vec),
|
||||
[](const Json::Value &value)
|
||||
{
|
||||
return Easy::account_field_type(
|
||||
{
|
||||
value["name"].asString(),
|
||||
value["value"].asString(),
|
||||
Easy::string_to_time(
|
||||
value["verified_at"].asString())
|
||||
});
|
||||
});
|
||||
return vec;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
const string Account::Source::language() const
|
||||
{
|
||||
return get_string("language");
|
||||
}
|
||||
|
||||
const string Account::Source::note() const
|
||||
{
|
||||
return get_string("note");
|
||||
}
|
||||
|
||||
Easy::visibility_type Account::Source::privacy() const
|
||||
{
|
||||
const string strprivacy = get_string("privacy");
|
||||
if (strprivacy == "public")
|
||||
return visibility_type::Public;
|
||||
else if (strprivacy == "unlisted")
|
||||
return visibility_type::Unlisted;
|
||||
else if (strprivacy == "private")
|
||||
return visibility_type::Private;
|
||||
else if (strprivacy == "direct")
|
||||
return visibility_type::Direct;
|
||||
|
||||
return visibility_type::Undefined;
|
||||
}
|
||||
|
||||
bool Account::Source::sensitive() const
|
||||
{
|
||||
return get_bool("sensitive");
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -22,17 +22,13 @@
|
|||
#include <vector>
|
||||
#include <utility>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
#include "emoji.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint64_t;
|
||||
using std::vector;
|
||||
|
||||
namespace Mastodon
|
||||
{
|
||||
|
@ -48,13 +44,6 @@ namespace Easy
|
|||
public:
|
||||
using Entity::Entity;
|
||||
|
||||
/*!
|
||||
* @brief Describes a field. Format: name, value
|
||||
*
|
||||
* @since 0.16.1
|
||||
*/
|
||||
using fields_pair = std::pair<const string, const string>;
|
||||
|
||||
virtual bool valid() const override;
|
||||
|
||||
/*!
|
||||
|
@ -68,130 +57,98 @@ namespace Easy
|
|||
const string acct() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns URL of avatar
|
||||
* @brief Returns URL of avatar.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string avatar() const;
|
||||
|
||||
/*!
|
||||
* @brief Sets avatar
|
||||
*
|
||||
* Filename or base64-encoded
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
Account avatar(const string &avatar);
|
||||
|
||||
/*!
|
||||
* @brief Returns URL of static avatar
|
||||
* @brief Returns URL of static avatar.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string avatar_static() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the account performs automated actions
|
||||
* @brief Returns true if the account performs automated actions.
|
||||
*
|
||||
* @since 0.16.0
|
||||
*/
|
||||
bool bot() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns time of creation
|
||||
* @brief Returns time of creation.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const Easy::time created_at() const;
|
||||
const Easy::time_type created_at() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns display name
|
||||
* @brief Returns display name.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string display_name() const;
|
||||
|
||||
/*!
|
||||
* @brief Sets display name
|
||||
* @brief Returns emojis.
|
||||
*
|
||||
* @since 0.18.5
|
||||
* @since 0.106.0
|
||||
*/
|
||||
Account display_name(const string &display_name);
|
||||
const std::vector<Easy::Emoji> emojis();
|
||||
|
||||
/*!
|
||||
* @brief Returns metadata fields
|
||||
* @brief Returns metadata fields.
|
||||
*
|
||||
* @since 0.16.1
|
||||
*/
|
||||
const std::vector<fields_pair> fields() const;
|
||||
const vector<Easy::account_field_type> fields() const;
|
||||
|
||||
/*!
|
||||
* @brief Sets metadata fields
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
Account fields(std::vector<fields_pair> &fields);
|
||||
|
||||
/*!
|
||||
* @brief Returns number of followers
|
||||
* @brief Returns number of followers.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
uint64_t followers_count() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns number of people this account follows
|
||||
* @brief Returns number of people this account follows.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
uint64_t following_count() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns URL of header image
|
||||
* @brief Returns URL of header image.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string header() const;
|
||||
|
||||
/*!
|
||||
* @brief Sets header image
|
||||
*
|
||||
* Filename or base64-encoded.
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
Account header(const string &header);
|
||||
|
||||
/*!
|
||||
* @brief Returns URL of static header image
|
||||
* @brief Returns URL of static header image.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string header_static() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns account-ID
|
||||
* @brief Returns account-ID.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string id() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the account is locked
|
||||
* @brief Returns true if the account is locked.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
bool locked() const;
|
||||
|
||||
/*!
|
||||
* @brief Sets locked state
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
Account locked(const bool &locked);
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the account has been moved
|
||||
* @brief Returns true if the account has been moved. (Deprecated)
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
|
@ -199,42 +156,35 @@ namespace Easy
|
|||
|
||||
/*!
|
||||
* @brief If the owner decided to switch accounts, new account is in
|
||||
* this attribute
|
||||
* this attribute.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const Account moved() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns note
|
||||
* @brief Returns account description, or biography.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string note() const;
|
||||
|
||||
/*!
|
||||
* @brief Sets note
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
Account note(const string ¬e);
|
||||
|
||||
/*!
|
||||
* @brief Returns default privacy of new toots
|
||||
* @brief Returns default privacy of new toots.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
visibility_type privacy() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns if media is marked as sensitive by default
|
||||
* @brief Returns if media is marked as sensitive by default.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
bool sensitive() const;
|
||||
|
||||
/*!
|
||||
* @brief Class to hold source attribute
|
||||
* @brief Class to hold source attribute.
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
|
@ -246,60 +196,39 @@ namespace Easy
|
|||
virtual bool valid() const override;
|
||||
|
||||
/*!
|
||||
* @brief Returns metadata fields
|
||||
* @brief Returns metadata fields.
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
const std::vector<fields_pair> fields() const;
|
||||
const vector<Easy::account_field_type> fields() const;
|
||||
|
||||
/*!
|
||||
* @brief Sets metadata fields
|
||||
* @brief Returns the language as ISO 6391 string.
|
||||
*
|
||||
* @since 0.18.5
|
||||
* @since 0.106.0
|
||||
*/
|
||||
Source fields(std::vector<fields_pair> &fields);
|
||||
const string language() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns note in plain text
|
||||
* @brief Returns account description in plain text.
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
const string note() const;
|
||||
|
||||
/*!
|
||||
* @brief Sets note
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
Source note(const string ¬e);
|
||||
|
||||
/*!
|
||||
* @brief Returns default privacy of new toots
|
||||
* @brief Returns default privacy of new toots.
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
visibility_type privacy() const;
|
||||
|
||||
/*!
|
||||
* @brief Sets default privacy of new toots
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
Source privacy(const visibility_type &privacy);
|
||||
|
||||
/*!
|
||||
* @brief Returns if media is marked as sensitive by default
|
||||
* @brief Returns if media is marked as sensitive by default.
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
bool sensitive() const;
|
||||
|
||||
/*!
|
||||
* @brief Sets if media is marked as sensitive by default
|
||||
*
|
||||
* @since 0.18.5
|
||||
*/
|
||||
Source sensitive(const bool &sensitive);
|
||||
};
|
||||
|
||||
/*!
|
||||
|
@ -309,13 +238,6 @@ namespace Easy
|
|||
*/
|
||||
const Source source() const;
|
||||
|
||||
/*!
|
||||
* @brief Set source.
|
||||
*
|
||||
* @since before 0.100.0
|
||||
*/
|
||||
Account source(const Source &source);
|
||||
|
||||
/*!
|
||||
* @brief Returns number of statuses
|
||||
*
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -19,14 +19,8 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -23,30 +23,13 @@ using Attachment = Easy::Attachment;
|
|||
|
||||
bool Attachment::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"id",
|
||||
"type",
|
||||
"url",
|
||||
"preview_url"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
}
|
||||
|
||||
double Attachment::aspect() const
|
||||
{
|
||||
return get_double("meta.original.aspect");
|
||||
}
|
||||
|
||||
double Attachment::aspect_small() const
|
||||
{
|
||||
return get_double("meta.small.aspect");
|
||||
}
|
||||
|
||||
uint64_t Attachment::bitrate() const
|
||||
{
|
||||
return get_uint64("meta.original.bitrate");
|
||||
});
|
||||
}
|
||||
|
||||
const string Attachment::description() const
|
||||
|
@ -60,13 +43,6 @@ Attachment Attachment::description(const string &description)
|
|||
return *this;
|
||||
}
|
||||
|
||||
const std::chrono::duration<double> Attachment::duration() const
|
||||
{
|
||||
const double sec = get_double("meta.original.duration");
|
||||
|
||||
return std::chrono::duration<double>(sec);
|
||||
}
|
||||
|
||||
const string Attachment::file() const
|
||||
{
|
||||
return get_string("file");
|
||||
|
@ -102,40 +78,16 @@ Attachment Attachment::focus(const std::array<double, 2> &focus)
|
|||
return *this;
|
||||
}
|
||||
|
||||
double Attachment::framerate() const
|
||||
{
|
||||
string strframes = get_string("meta.original.frame_rate");
|
||||
|
||||
if (!strframes.empty())
|
||||
{
|
||||
std::size_t pos = strframes.find('/');
|
||||
if (pos != std::string::npos)
|
||||
{
|
||||
std::uint16_t frames = std::stoul(strframes.substr(0, pos));
|
||||
std::uint16_t divider = std::stoul(strframes.substr(pos + 1));
|
||||
|
||||
return frames / divider;
|
||||
}
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
uint64_t Attachment::height() const
|
||||
{
|
||||
return get_uint64("meta.original.height");
|
||||
}
|
||||
|
||||
uint64_t Attachment::height_small() const
|
||||
{
|
||||
return get_uint64("meta.small.height");
|
||||
}
|
||||
|
||||
const string Attachment::id() const
|
||||
{
|
||||
return get_string("id");
|
||||
}
|
||||
|
||||
const Attachment::Meta Attachment::meta() const
|
||||
{
|
||||
return Meta(get("meta"));
|
||||
}
|
||||
|
||||
const string Attachment::preview_url() const
|
||||
{
|
||||
return get_string("preview_url");
|
||||
|
@ -146,16 +98,6 @@ const string Attachment::remote_url() const
|
|||
return get_string("remote_url");
|
||||
}
|
||||
|
||||
const string Attachment::size() const
|
||||
{
|
||||
return get_string("meta.original.size");
|
||||
}
|
||||
|
||||
const string Attachment::size_small() const
|
||||
{
|
||||
return get_string("meta.small.size");
|
||||
}
|
||||
|
||||
const string Attachment::text_url() const
|
||||
{
|
||||
return get_string("text_url");
|
||||
|
@ -182,12 +124,78 @@ const string Attachment::url() const
|
|||
return get_string("url");
|
||||
}
|
||||
|
||||
uint64_t Attachment::width() const
|
||||
bool Attachment::Meta::valid() const
|
||||
{
|
||||
return get_uint64("meta.original.width");
|
||||
return true;
|
||||
}
|
||||
|
||||
uint64_t Attachment::width_small() const
|
||||
double Attachment::Meta::aspect() const
|
||||
{
|
||||
return get_uint64("meta.small.width");
|
||||
return get_double("original.aspect");
|
||||
}
|
||||
|
||||
double Attachment::Meta::aspect_small() const
|
||||
{
|
||||
return get_double("small.aspect");
|
||||
}
|
||||
|
||||
uint64_t Attachment::Meta::bitrate() const
|
||||
{
|
||||
return get_uint64("original.bitrate");
|
||||
}
|
||||
|
||||
const std::chrono::duration<double> Attachment::Meta::duration() const
|
||||
{
|
||||
const double sec = get_double("original.duration");
|
||||
|
||||
return std::chrono::duration<double>(sec);
|
||||
}
|
||||
|
||||
double Attachment::Meta::frame_rate() const
|
||||
{
|
||||
string strframes = get_string("original.frame_rate");
|
||||
|
||||
if (!strframes.empty())
|
||||
{
|
||||
std::size_t pos = strframes.find('/');
|
||||
if (pos != std::string::npos)
|
||||
{
|
||||
std::uint16_t frames = std::stoul(strframes.substr(0, pos));
|
||||
std::uint16_t divider = std::stoul(strframes.substr(pos + 1));
|
||||
|
||||
return frames / divider;
|
||||
}
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
uint64_t Attachment::Meta::height() const
|
||||
{
|
||||
return get_uint64("original.height");
|
||||
}
|
||||
|
||||
uint64_t Attachment::Meta::height_small() const
|
||||
{
|
||||
return get_uint64("small.height");
|
||||
}
|
||||
|
||||
const string Attachment::Meta::size() const
|
||||
{
|
||||
return get_string("original.size");
|
||||
}
|
||||
|
||||
const string Attachment::Meta::size_small() const
|
||||
{
|
||||
return get_string("small.size");
|
||||
}
|
||||
|
||||
uint64_t Attachment::Meta::width() const
|
||||
{
|
||||
return get_uint64("original.width");
|
||||
}
|
||||
|
||||
uint64_t Attachment::Meta::width_small() const
|
||||
{
|
||||
return get_uint64("small.width");
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -22,14 +22,8 @@
|
|||
#include <chrono>
|
||||
#include <array>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint64_t;
|
||||
|
@ -48,29 +42,98 @@ namespace Easy
|
|||
public:
|
||||
using Entity::Entity;
|
||||
|
||||
/*!
|
||||
* @brief Metadata for attachments.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
class Meta : public Entity
|
||||
{
|
||||
public:
|
||||
using Entity::Entity;
|
||||
|
||||
virtual bool valid() const override;
|
||||
|
||||
/*!
|
||||
* @brief Aspect of original image
|
||||
* @brief Aspect of original image.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
* @since 0.106.0
|
||||
*/
|
||||
double aspect() const;
|
||||
|
||||
/*!
|
||||
* @brief Aspect of preview image
|
||||
* @brief Aspect of preview image.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
* @since 0.106.0
|
||||
*/
|
||||
double aspect_small() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the bitrate of a video
|
||||
* @brief Returns the bitrate of a video.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
* @since 0.106.0
|
||||
*/
|
||||
uint64_t bitrate() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the duration of a video in seconds.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
const std::chrono::duration<double> duration() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the framerate of a video in frames per second.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
double frame_rate() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the height of the original image.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
uint64_t height() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the height of the preview image.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
uint64_t height_small() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the size of the original image.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
const string size() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the size of the preview image.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
const string size_small() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the width of the original image.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
uint64_t width() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the width of the preview image
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
uint64_t width_small() const;
|
||||
};
|
||||
|
||||
virtual bool valid() const override;
|
||||
|
||||
/*!
|
||||
* @brief Returns the image description
|
||||
*
|
||||
|
@ -85,13 +148,6 @@ namespace Easy
|
|||
*/
|
||||
Attachment description(const string &description);
|
||||
|
||||
/*!
|
||||
* @brief Returns the duration of a video in seconds
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const std::chrono::duration<double> duration() const;
|
||||
|
||||
/*!
|
||||
* @brief Gets file to upload
|
||||
*
|
||||
|
@ -126,27 +182,6 @@ namespace Easy
|
|||
*/
|
||||
Attachment focus(const std::array<double, 2> &focus);
|
||||
|
||||
/*!
|
||||
* @brief Returns the framerate of a video in frames per second
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
double framerate() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the height of the original image
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
uint64_t height() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the height of the preview image
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
uint64_t height_small() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the ID of the attachment
|
||||
*
|
||||
|
@ -154,6 +189,13 @@ namespace Easy
|
|||
*/
|
||||
const string id() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns metadata about the attachment.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
const Meta meta() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the URL of the preview image
|
||||
*
|
||||
|
@ -168,20 +210,6 @@ namespace Easy
|
|||
*/
|
||||
const string remote_url() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the size of the original image
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string size() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the size of the preview image
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string size_small() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns shorter URL for the image
|
||||
*
|
||||
|
@ -202,22 +230,6 @@ namespace Easy
|
|||
* @since before 0.11.0
|
||||
*/
|
||||
const string url() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the width of the original image
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
uint64_t width() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the width of the preview image
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
uint64_t width_small() const;
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -22,15 +22,13 @@ using Card = Easy::Card;
|
|||
|
||||
bool Card::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"url",
|
||||
"title",
|
||||
"description",
|
||||
"type"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const string Card::author_name() const
|
||||
|
@ -48,6 +46,11 @@ const string Card::description() const
|
|||
return get_string("description");
|
||||
}
|
||||
|
||||
const string Card::embed_url() const
|
||||
{
|
||||
return get_string("embed_url");
|
||||
}
|
||||
|
||||
uint64_t Card::height() const
|
||||
{
|
||||
return get_uint64("height");
|
||||
|
@ -81,16 +84,15 @@ const string Card::title() const
|
|||
Easy::card_type Card::type() const
|
||||
{
|
||||
const string strtype = get_string("type");
|
||||
if (strtype.compare("link") == 0)
|
||||
if (strtype == "link")
|
||||
return card_type::Link;
|
||||
else if (strtype.compare("photo") == 0)
|
||||
else if (strtype == "photo")
|
||||
return card_type::Photo;
|
||||
else if (strtype.compare("video") == 0)
|
||||
else if (strtype == "video")
|
||||
return card_type::Video;
|
||||
else if (strtype.compare("rich") == 0)
|
||||
else if (strtype == "rich")
|
||||
return card_type::Rich;
|
||||
|
||||
ttdebug << "Could not get data: type\n";
|
||||
else
|
||||
return card_type::Undefined;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,14 +20,8 @@
|
|||
#include <string>
|
||||
#include <cstdint>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint64_t;
|
||||
|
@ -69,6 +63,15 @@ namespace Easy
|
|||
*/
|
||||
const string description() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the embed URL.
|
||||
*
|
||||
* This is an undocumented attribute and may vanish at any time.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
const string embed_url() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the height of the card
|
||||
*
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -23,13 +23,11 @@ using Context = Easy::Context;
|
|||
|
||||
bool Context::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"ancestors",
|
||||
"descendants"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const std::vector<Easy::Status> Context::ancestors() const
|
||||
|
@ -44,7 +42,6 @@ const std::vector<Easy::Status> Context::ancestors() const
|
|||
return vec;
|
||||
}
|
||||
|
||||
ttdebug << "Could not get data: ancestors\n";
|
||||
return {};
|
||||
}
|
||||
|
||||
|
@ -60,6 +57,5 @@ const std::vector<Easy::Status> Context::descendants() const
|
|||
return vec;
|
||||
}
|
||||
|
||||
ttdebug << "Could not get data: descendants\n";
|
||||
return {};
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,16 +20,9 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#include "easy/entities/status.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#include <mastodon-cpp/easy/entities/status.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
#include "status.hpp"
|
||||
|
||||
using std::string;
|
||||
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
/* This file is part of mastodon-cpp.
|
||||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <algorithm>
|
||||
#include "conversation.hpp"
|
||||
#include "debug.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
using Conversation = Easy::Conversation;
|
||||
|
||||
bool Conversation::valid() const
|
||||
{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"id",
|
||||
"accounts",
|
||||
"unread"
|
||||
});
|
||||
}
|
||||
|
||||
const string Conversation::id() const
|
||||
{
|
||||
return get_string("id");
|
||||
}
|
||||
|
||||
const std::vector<Easy::Account> Conversation::accounts() const
|
||||
{
|
||||
const Json::Value node = get("accounts");
|
||||
if (node.isArray())
|
||||
{
|
||||
std::vector<Easy::Account> vec;
|
||||
std::transform(node.begin(), node.end(), std::back_inserter(vec),
|
||||
[](const Json::Value &value)
|
||||
{ return Easy::Account(value); });
|
||||
return vec;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
const Easy::Status Conversation::last_status() const
|
||||
{
|
||||
const Json::Value &node = get("last_status");
|
||||
if (!node.isNull())
|
||||
{
|
||||
return Easy::Status(node);
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
bool Conversation::unread() const
|
||||
{
|
||||
return get_bool("unread");
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
/* This file is part of mastodon-cpp.
|
||||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef MASTODON_CPP_EASY_CONVERSATION_HPP
|
||||
#define MASTODON_CPP_EASY_CONVERSATION_HPP
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
#include "account.hpp"
|
||||
#include "status.hpp"
|
||||
|
||||
using std::string;
|
||||
|
||||
namespace Mastodon
|
||||
{
|
||||
namespace Easy
|
||||
{
|
||||
/*!
|
||||
* @brief Class to hold conversations.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
class Conversation : public Entity
|
||||
{
|
||||
public:
|
||||
using Entity::Entity;
|
||||
|
||||
virtual bool valid() const override;
|
||||
|
||||
/*!
|
||||
* @brief Returns the id of the conversation.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
const string id() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the participating accounts.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
const std::vector<Account> accounts() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the last status.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
const Status last_status() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if unread.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
bool unread() const;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif // MASTODON_CPP_EASY_CONVERSATION_HPP
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -22,15 +22,13 @@ using Emoji = Easy::Emoji;
|
|||
|
||||
bool Emoji::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"shortcode",
|
||||
"static_url",
|
||||
"url",
|
||||
"visible_in_picker"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const string Emoji::shortcode() const
|
||||
|
@ -47,3 +45,8 @@ const string Emoji::url() const
|
|||
{
|
||||
return get_string("url");
|
||||
}
|
||||
|
||||
bool Emoji::visible_in_picker() const
|
||||
{
|
||||
return get_bool("visible_in_picker");
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -19,14 +19,8 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
|
||||
|
@ -35,7 +29,7 @@ namespace Mastodon
|
|||
namespace Easy
|
||||
{
|
||||
/*!
|
||||
* @brief Class to hold emojis
|
||||
* @brief Class to hold emojis.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
|
@ -47,25 +41,32 @@ namespace Easy
|
|||
virtual bool valid() const override;
|
||||
|
||||
/*!
|
||||
* @brief Returns the shortcode of the emoji
|
||||
* @brief Returns the shortcode of the emoji.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string shortcode() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the URL to the emoji static image
|
||||
* @brief Returns the URL to the emoji static image.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string static_url() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the URL to the emoji image
|
||||
* @brief Returns the URL to the emoji image.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string url() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns if the emoji is visible in the picker.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
bool visible_in_picker() const;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -24,11 +24,14 @@ using Filter = Easy::Filter;
|
|||
|
||||
bool Filter::valid() const
|
||||
{
|
||||
return Entity::check_valid({ "id",
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"id",
|
||||
"phrase",
|
||||
"context",
|
||||
"irreversible",
|
||||
"whole_word" });
|
||||
"whole_word"
|
||||
});
|
||||
}
|
||||
|
||||
const string Filter::id() const
|
||||
|
@ -68,7 +71,7 @@ const vector<Easy::context_type> Filter::context() const
|
|||
return {};
|
||||
}
|
||||
|
||||
const Easy::time Filter::expires_at() const
|
||||
const Easy::time_type Filter::expires_at() const
|
||||
{
|
||||
return get_time("expires_at");
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -19,14 +19,8 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
|
||||
|
@ -72,7 +66,7 @@ namespace Easy
|
|||
*
|
||||
* @since 0.104.0
|
||||
*/
|
||||
const Easy::time expires_at() const;
|
||||
const Easy::time_type expires_at() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns if the phrase should disappear irreversibly.
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -24,18 +24,17 @@ using Instance = Easy::Instance;
|
|||
|
||||
bool Instance::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"uri",
|
||||
"title",
|
||||
"description",
|
||||
"email",
|
||||
"version",
|
||||
"urls",
|
||||
"stats",
|
||||
"languages"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const Easy::Account Instance::contact_account() const
|
||||
|
@ -43,10 +42,9 @@ const Easy::Account Instance::contact_account() const
|
|||
const Json::Value node = get("contact_account");
|
||||
if (node.isObject())
|
||||
{
|
||||
return Easy::Account(node.toStyledString());
|
||||
return Easy::Account(node);
|
||||
}
|
||||
|
||||
ttdebug << "Could not get data: contact_account\n";
|
||||
return Easy::Account();
|
||||
}
|
||||
|
||||
|
@ -65,6 +63,15 @@ const std::vector<string> Instance::languages() const
|
|||
return get_vector("languages");
|
||||
}
|
||||
|
||||
const Easy::stats_type Instance::stats() const
|
||||
{
|
||||
Easy::stats_type s;
|
||||
s.user_count = get_uint64("stats.user_count");
|
||||
s.status_count = get_uint64("stats.status_count");
|
||||
s.domain_count = get_uint64("stats.domain_count");
|
||||
return s;
|
||||
}
|
||||
|
||||
const string Instance::title() const
|
||||
{
|
||||
return get_string("title");
|
||||
|
@ -75,14 +82,19 @@ const string Instance::uri() const
|
|||
return get_string("uri");
|
||||
}
|
||||
|
||||
const Easy::urls_type Instance::urls() const
|
||||
{
|
||||
return { get_string("urls.streaming_api") };
|
||||
}
|
||||
|
||||
const string Instance::version() const
|
||||
{
|
||||
return get_string("version");
|
||||
}
|
||||
|
||||
const string Instance::streaming_api() const
|
||||
const string Instance::thumbnail() const
|
||||
{
|
||||
return get_string("urls.streaming_api");
|
||||
return get_string("thumbnail");
|
||||
}
|
||||
|
||||
uint64_t Instance::max_toot_chars() const
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -22,16 +22,9 @@
|
|||
|
||||
using std::uint64_t;
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entities/account.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entities/account.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
#include "account.hpp"
|
||||
|
||||
using std::string;
|
||||
|
||||
|
@ -40,7 +33,7 @@ namespace Mastodon
|
|||
namespace Easy
|
||||
{
|
||||
/*!
|
||||
* @brief Class to hold instances
|
||||
* @brief Class to hold instances.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
|
@ -52,14 +45,14 @@ namespace Easy
|
|||
virtual bool valid() const override;
|
||||
|
||||
/*!
|
||||
* @brief Returns the Account of the admin or another contact person
|
||||
* @brief Returns the Account of the admin or another contact person.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const Account contact_account() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the description of the instance
|
||||
* @brief Returns the description of the instance.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
|
@ -67,7 +60,7 @@ namespace Easy
|
|||
|
||||
/*!
|
||||
* @brief Returns the email address which can be used to contact the
|
||||
* instance administrator
|
||||
* instance administrator.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
|
@ -75,40 +68,54 @@ namespace Easy
|
|||
|
||||
/*!
|
||||
* @brief Returns a vector of ISO 6391 language codes the instance has
|
||||
* chosen to advertise
|
||||
* chosen to advertise.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const std::vector<string> languages() const;
|
||||
const vector<string> languages() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the title of the instance
|
||||
* @brief Returns the thumbnail of the instance.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
const string thumbnail() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the title of the instance.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string title() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the URI of the instance
|
||||
* @brief Returns the URI of the instance.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string uri() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the version used by the instance
|
||||
* @brief Returns the URL for the streaming API and possibly others.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
const Easy::urls_type urls() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns statistics about the instance.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
const Easy::stats_type stats() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the version used by the instance.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string version() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the URL for the streaming API
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string streaming_api() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the maximum chars a post can have
|
||||
*
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -23,13 +23,11 @@ using std::uint64_t;
|
|||
|
||||
bool List::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"id",
|
||||
"title"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const string List::id() const
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -21,14 +21,8 @@
|
|||
#include <vector>
|
||||
#include <cstdint>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint64_t;
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -21,15 +21,13 @@ using Mention = Easy::Mention;
|
|||
|
||||
bool Mention::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"url",
|
||||
"username",
|
||||
"acct",
|
||||
"id"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const string Mention::acct() const
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,14 +20,8 @@
|
|||
#include <string>
|
||||
#include <cstdint>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint64_t;
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -22,15 +22,13 @@ using Notification = Easy::Notification;
|
|||
|
||||
bool Notification::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"id",
|
||||
"type",
|
||||
"created_at",
|
||||
"account"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const Easy::Account Notification::account() const
|
||||
|
@ -45,7 +43,7 @@ const Easy::Account Notification::account() const
|
|||
return Easy::Account();
|
||||
}
|
||||
|
||||
const Easy::time Notification::created_at() const
|
||||
const Easy::time_type Notification::created_at() const
|
||||
{
|
||||
return get_time("created_at");
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,18 +20,10 @@
|
|||
#include <string>
|
||||
#include <cstdint>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entities/account.hpp"
|
||||
#include "easy/entities/status.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entities/account.hpp>
|
||||
#include <mastodon-cpp/easy/entities/status.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
#include "account.hpp"
|
||||
#include "status.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint64_t;
|
||||
|
@ -64,7 +56,7 @@ namespace Easy
|
|||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const Easy::time created_at() const;
|
||||
const Easy::time_type created_at() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns notification ID
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
/* This file is part of mastodon-cpp.
|
||||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "poll.hpp"
|
||||
#include "debug.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
using Poll = Easy::Poll;
|
||||
|
||||
bool Poll::valid() const
|
||||
{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"id",
|
||||
"expired",
|
||||
"expired",
|
||||
"multiple",
|
||||
"votes_count",
|
||||
"options"
|
||||
});
|
||||
}
|
||||
|
||||
const string Poll::id() const
|
||||
{
|
||||
return get_string("id");
|
||||
}
|
||||
|
||||
const Easy::time_type Poll::expires_at() const
|
||||
{
|
||||
return get_time("expires_at");
|
||||
}
|
||||
|
||||
bool Poll::expired() const
|
||||
{
|
||||
return get_bool("expired");
|
||||
}
|
||||
|
||||
bool Poll::multiple() const
|
||||
{
|
||||
return get_bool("multiple");
|
||||
}
|
||||
|
||||
uint64_t Poll::votes_count() const
|
||||
{
|
||||
return get_uint64("votes_count");
|
||||
}
|
||||
|
||||
const vector<Easy::poll_options_type> Poll::options() const
|
||||
{
|
||||
const Json::Value &node = get("options");
|
||||
|
||||
if (node.isArray())
|
||||
{
|
||||
vector<Easy::poll_options_type> vec_options;
|
||||
std::transform(node.begin(), node.end(), std::back_inserter(vec_options),
|
||||
[](const Json::Value &value)
|
||||
{
|
||||
return Easy::poll_options_type(
|
||||
{
|
||||
value["title"].asString(),
|
||||
value["votes_count"].asUInt64()
|
||||
});
|
||||
});
|
||||
return vec_options;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
bool Poll::voted() const
|
||||
{
|
||||
return get_bool("voted");
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
/* This file is part of mastodon-cpp.
|
||||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef MASTODON_CPP_EASY_POLL_HPP
|
||||
#define MASTODON_CPP_EASY_POLL_HPP
|
||||
|
||||
#include <string>
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint64_t;
|
||||
|
||||
namespace Mastodon
|
||||
{
|
||||
namespace Easy
|
||||
{
|
||||
/*!
|
||||
* @brief Class to hold polls.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
class Poll : public Entity
|
||||
{
|
||||
public:
|
||||
using Entity::Entity;
|
||||
|
||||
virtual bool valid() const override;
|
||||
|
||||
/*!
|
||||
* @brief Returns poll ID.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
const string id() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns time when the poll expires.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
const Easy::time_type expires_at() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if poll has expired.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
bool expired() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true or false.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
bool multiple() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the number of votes.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
uint64_t votes_count() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns poll options and their votes count.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
const vector<poll_options_type> options() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns whether you voted or not.
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
bool voted() const;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif // MASTODON_CPP_EASY_POLL_HPP
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -26,14 +26,13 @@ const string PushSubscription::id() const
|
|||
|
||||
bool PushSubscription::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"id",
|
||||
"endpoint",
|
||||
"server_key"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
"server_key",
|
||||
"alerts"
|
||||
});
|
||||
}
|
||||
|
||||
const string PushSubscription::endpoint() const
|
||||
|
@ -46,9 +45,9 @@ const string PushSubscription::server_key() const
|
|||
return get_string("server_key");
|
||||
}
|
||||
|
||||
const Easy::alerts PushSubscription::alerts() const
|
||||
const vector<Easy::alert_type> PushSubscription::alerts() const
|
||||
{
|
||||
Easy::alerts alerts;
|
||||
vector<Easy::alert_type> alerts;
|
||||
const Json::Value node = get("alerts");
|
||||
for (auto it = node.begin(); it != node.end(); ++it)
|
||||
{
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -18,19 +18,15 @@
|
|||
#define MASTODON_CPP_EASY_PUSHSUBSCRIPTION_HPP
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::vector;
|
||||
|
||||
namespace Mastodon
|
||||
{
|
||||
|
@ -69,13 +65,12 @@ namespace Easy
|
|||
*/
|
||||
const string server_key() const;
|
||||
|
||||
// TODO: Look up what the data looks like
|
||||
/*!
|
||||
* @brief Returns a vector of Easy::alert_type.
|
||||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
const Easy::alerts alerts() const;
|
||||
const vector<Easy::alert_type> alerts() const;
|
||||
|
||||
protected:
|
||||
/*!
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -21,8 +21,8 @@ using Relationship = Easy::Relationship;
|
|||
|
||||
bool Relationship::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"id",
|
||||
"following",
|
||||
"followed_by",
|
||||
|
@ -30,10 +30,10 @@ bool Relationship::valid() const
|
|||
"muting",
|
||||
"muting_notifications",
|
||||
"requested",
|
||||
"domain_blocking"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
"domain_blocking",
|
||||
"showing_reblogs",
|
||||
"endorsed"
|
||||
});
|
||||
}
|
||||
|
||||
bool Relationship::blocking() const
|
||||
|
@ -85,3 +85,8 @@ bool Relationship::showing_notifications() const
|
|||
{
|
||||
return get_bool("showing_notifications");
|
||||
}
|
||||
|
||||
bool Relationship::showing_reblogs() const
|
||||
{
|
||||
return get_bool("showing_reblogs");
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,14 +20,8 @@
|
|||
#include <string>
|
||||
#include <cstdint>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint64_t;
|
||||
|
@ -49,74 +43,81 @@ namespace Easy
|
|||
virtual bool valid() const override;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the user is blocking the account
|
||||
* @brief Returns true if the user is blocking the account.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
bool blocking() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the user is blocking the account's domain
|
||||
* @brief Returns true if the user is blocking the account's domain.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
bool domain_blocking() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the account is endorsed by the user
|
||||
* @brief Returns true if the account is endorsed by the user.
|
||||
*
|
||||
* @since 0.19.0
|
||||
*/
|
||||
bool endorsed() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the user is being followed by the account
|
||||
* @brief Returns true if the user is being followed by the account.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
bool followed_by() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the user is being following the account
|
||||
* @brief Returns true if the user is being following the account.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
bool following() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the target account ID
|
||||
* @brief Returns the target account ID.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string id() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the user is muting the account
|
||||
* @brief Returns true if the user is muting the account.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
bool muting() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the user is also muting notifications
|
||||
* @brief Returns true if the user is also muting notifications.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
bool muting_notifications() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the user has requested to follow the account
|
||||
* @brief Returns true if the user has requested to follow the account.
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
bool requested() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the user is showing notifications
|
||||
* @brief Returns true if the user is showing notifications.
|
||||
*
|
||||
* @since 0.19.0
|
||||
*/
|
||||
bool showing_notifications() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if the user is showing reblogs.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
bool showing_reblogs() const;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,41 +0,0 @@
|
|||
/* This file is part of mastodon-cpp.
|
||||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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, version 3.
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "report.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
using Report = Easy::Report;
|
||||
|
||||
bool Report::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
"id",
|
||||
"action_taken"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
}
|
||||
|
||||
bool Report::action_taken() const
|
||||
{
|
||||
return get_bool("action_taken");
|
||||
}
|
||||
|
||||
const string Report::id() const
|
||||
{
|
||||
return get_string("id");
|
||||
}
|
|
@ -1,68 +0,0 @@
|
|||
/* This file is part of mastodon-cpp.
|
||||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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, version 3.
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef MASTODON_CPP_EASY_REPORT_HPP
|
||||
#define MASTODON_CPP_EASY_REPORT_HPP
|
||||
|
||||
#include <string>
|
||||
#include <cstdint>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
|
||||
using std::string;
|
||||
|
||||
namespace Mastodon
|
||||
{
|
||||
namespace Easy
|
||||
{
|
||||
/*!
|
||||
* @brief Class to hold reports
|
||||
*
|
||||
* before 0.11.0
|
||||
*/
|
||||
class Report : public Entity
|
||||
{
|
||||
public:
|
||||
using Entity::Entity;
|
||||
|
||||
virtual bool valid() const override;
|
||||
|
||||
/*!
|
||||
* @brief Returns true if an action was taken in response to the
|
||||
* report
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
bool action_taken() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the ID of the report
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string id() const;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif // MASTODON_CPP_EASY_REPORT_HPP
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -23,14 +23,12 @@ using Results = Easy::Results;
|
|||
|
||||
bool Results::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"accounts",
|
||||
"statuses",
|
||||
"hashtags"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const std::vector<Easy::Account> Results::accounts() const
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,20 +20,11 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#include "easy/entities/account.hpp"
|
||||
#include "easy/entities/status.hpp"
|
||||
#include "easy/entities/tag.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#include <mastodon-cpp/easy/entities/account.hpp>
|
||||
#include <mastodon-cpp/easy/entities/status.hpp>
|
||||
#include <mastodon-cpp/easy/entities/tag.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
#include "account.hpp"
|
||||
#include "status.hpp"
|
||||
#include "tag.hpp"
|
||||
|
||||
using std::string;
|
||||
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -24,8 +24,8 @@ using Status = Easy::Status;
|
|||
|
||||
bool Status::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"id",
|
||||
"uri",
|
||||
"account",
|
||||
|
@ -42,9 +42,7 @@ bool Status::valid() const
|
|||
"mentions",
|
||||
"tags",
|
||||
"application"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const Easy::Account Status::account() const
|
||||
|
@ -80,7 +78,7 @@ const Easy::Card Status::card() const
|
|||
return Easy::Card();
|
||||
}
|
||||
|
||||
const Easy::time Status::created_at() const
|
||||
const Easy::time_type Status::created_at() const
|
||||
{
|
||||
return get_time("created_at");
|
||||
}
|
||||
|
@ -171,7 +169,6 @@ const std::vector<Easy::Attachment> Status::media_attachments() const
|
|||
Status Status::media_attachments
|
||||
(const std::vector<Attachment> &media_attachments)
|
||||
{
|
||||
// FIXME: Needs writable Easy::Attachment()
|
||||
Json::Value jsonarray(Json::arrayValue);
|
||||
|
||||
for (const Attachment &att : media_attachments)
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -21,28 +21,15 @@
|
|||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#include "easy/entities/account.hpp"
|
||||
#include "easy/entities/emoji.hpp"
|
||||
#include "easy/entities/attachment.hpp"
|
||||
#include "easy/entities/mention.hpp"
|
||||
#include "easy/entities/tag.hpp"
|
||||
#include "easy/entities/application.hpp"
|
||||
#include "easy/entities/card.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#include <mastodon-cpp/easy/entities/account.hpp>
|
||||
#include <mastodon-cpp/easy/entities/emoji.hpp>
|
||||
#include <mastodon-cpp/easy/entities/attachment.hpp>
|
||||
#include <mastodon-cpp/easy/entities/mention.hpp>
|
||||
#include <mastodon-cpp/easy/entities/tag.hpp>
|
||||
#include <mastodon-cpp/easy/entities/application.hpp>
|
||||
#include <mastodon-cpp/easy/entities/card.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
#include "account.hpp"
|
||||
#include "emoji.hpp"
|
||||
#include "attachment.hpp"
|
||||
#include "mention.hpp"
|
||||
#include "tag.hpp"
|
||||
#include "application.hpp"
|
||||
#include "card.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint64_t;
|
||||
|
@ -89,7 +76,7 @@ namespace Easy
|
|||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const Easy::time created_at() const;
|
||||
const Easy::time_type created_at() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns content of status
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -25,13 +25,11 @@ using Tag = Easy::Tag;
|
|||
|
||||
bool Tag::valid() const
|
||||
{
|
||||
const std::vector<string> attributes =
|
||||
{{
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"name",
|
||||
"url"
|
||||
}};
|
||||
|
||||
return Entity::check_valid(attributes);
|
||||
});
|
||||
}
|
||||
|
||||
const string Tag::name() const
|
||||
|
@ -72,12 +70,12 @@ bool Tag::History::valid() const
|
|||
return Entity::check_valid(attributes);
|
||||
}
|
||||
|
||||
uint64_t Tag::History::accounts()
|
||||
uint64_t Tag::History::accounts() const
|
||||
{
|
||||
return stouint64(get_string("accounts"));
|
||||
return get_uint64("accounts");
|
||||
}
|
||||
|
||||
const Easy::time Tag::History::day()
|
||||
const Easy::time_type Tag::History::day() const
|
||||
{
|
||||
const Json::Value node = get("day");
|
||||
|
||||
|
@ -88,10 +86,10 @@ const Easy::time Tag::History::day()
|
|||
}
|
||||
|
||||
ttdebug << "Could not get data: day\n";
|
||||
return Easy::time();
|
||||
return Easy::time_type();
|
||||
}
|
||||
|
||||
uint64_t Tag::History::uses()
|
||||
uint64_t Tag::History::uses() const
|
||||
{
|
||||
return stouint64(get_string("uses"));
|
||||
return get_uint64("uses");
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,14 +20,8 @@
|
|||
#include <string>
|
||||
#include <cstdint>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint64_t;
|
||||
|
@ -61,21 +55,21 @@ namespace Easy
|
|||
*
|
||||
* @since 0.16.0
|
||||
*/
|
||||
uint64_t accounts();
|
||||
uint64_t accounts() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the day.
|
||||
*
|
||||
* @since 0.16.0
|
||||
*/
|
||||
const Easy::time day();
|
||||
const Easy::time_type day() const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the number of accounts using that hashtag.
|
||||
* @brief Returns the number of statuses with that hashtag.
|
||||
*
|
||||
* @since 0.16.0
|
||||
*/
|
||||
uint64_t uses();
|
||||
uint64_t uses() const;
|
||||
};
|
||||
|
||||
using Entity::Entity;
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -21,10 +21,13 @@ using Token = Easy::Token;
|
|||
|
||||
bool Token::valid() const
|
||||
{
|
||||
return Entity::check_valid({"access_token",
|
||||
return Entity::check_valid(
|
||||
{
|
||||
"access_token",
|
||||
"token_type",
|
||||
"scope",
|
||||
"created_at"});
|
||||
"created_at"
|
||||
});
|
||||
}
|
||||
|
||||
const string Token::access_token() const
|
||||
|
@ -42,7 +45,7 @@ const string Token::scope() const
|
|||
return get_string("scope");
|
||||
}
|
||||
|
||||
const Easy::time Token::created_at() const
|
||||
const Easy::time_type Token::created_at() const
|
||||
{
|
||||
return get_time("created_at");
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -19,14 +19,8 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/entity.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#include <mastodon-cpp/easy/entity.hpp>
|
||||
#endif
|
||||
#include "../../mastodon-cpp.hpp"
|
||||
#include "../entity.hpp"
|
||||
|
||||
using std::string;
|
||||
|
||||
|
@ -72,7 +66,7 @@ namespace Easy
|
|||
*
|
||||
* @since 0.103.0
|
||||
*/
|
||||
const Easy::time created_at() const;
|
||||
const Easy::time_type created_at() const;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
|||
#include <regex>
|
||||
#include <algorithm>
|
||||
#include "easy/entity.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "debug.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
@ -100,7 +101,7 @@ const Json::Value Easy::Entity::to_object() const
|
|||
|
||||
bool Easy::Entity::check_valid(const std::vector<string> &attributes) const
|
||||
{
|
||||
for (const string &attribute: attributes)
|
||||
for (const string &attribute : attributes)
|
||||
{
|
||||
get(attribute);
|
||||
if (!was_set())
|
||||
|
@ -226,19 +227,14 @@ bool Easy::Entity::get_bool(const string &key) const
|
|||
return false;
|
||||
}
|
||||
|
||||
const Easy::time Easy::Entity::get_time(const string &key) const
|
||||
const Easy::time_type Easy::Entity::get_time(const string &key) const
|
||||
{
|
||||
const Json::Value node = get(key);
|
||||
|
||||
if (node.isString())
|
||||
{
|
||||
std::stringstream sstime(node.asString());
|
||||
struct std::tm tm = {};
|
||||
tm.tm_isdst = -1; // Detect daylight saving time.
|
||||
sstime >> std::get_time(&tm, "%Y-%m-%dT%T");
|
||||
std::time_t time = timegm(&tm); // Assume time is UTC.
|
||||
_was_set = true;
|
||||
return { system_clock::from_time_t(time) };
|
||||
return Easy::string_to_time(node.asString());
|
||||
}
|
||||
|
||||
_was_set = false;
|
||||
|
@ -313,29 +309,3 @@ std::uint64_t Easy::Entity::stouint64(const string &str) const
|
|||
return stoull(str);
|
||||
}
|
||||
}
|
||||
|
||||
// Easy::GenericEntity::GenericEntity(const string &json)
|
||||
// : Entity(json)
|
||||
// {}
|
||||
|
||||
// Easy::GenericEntity::GenericEntity()
|
||||
// : Entity()
|
||||
// {}
|
||||
|
||||
// bool Easy::GenericEntity::valid() const
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
|
||||
// template<typename T> GenericEntity<T>::GenericEntity(const string &json)
|
||||
// : Entity(json)
|
||||
// {}
|
||||
|
||||
// template<typename T> GenericEntity<T>::GenericEntity()
|
||||
// : Entity()
|
||||
// {}
|
||||
|
||||
// template<typename T> bool GenericEntity<T>::valid() const
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,12 +20,7 @@
|
|||
#include <string>
|
||||
#include <jsoncpp/json/json.h>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "easy/types_easy.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/easy/types_easy.hpp>
|
||||
#endif
|
||||
#include "types_easy.hpp"
|
||||
|
||||
using std::string;
|
||||
|
||||
|
@ -90,7 +85,7 @@ namespace Easy
|
|||
void from_string(const string &json);
|
||||
|
||||
/*!
|
||||
* @brief Returns the JSON of the Entity as string.
|
||||
* @brief Returns the JSON of the Entity as formatted string.
|
||||
*
|
||||
* @return JSON string
|
||||
*
|
||||
|
@ -190,7 +185,6 @@ namespace Easy
|
|||
*/
|
||||
double get_double(const string &key) const;
|
||||
|
||||
// TODO: Maybe an enum would be better?
|
||||
/*!
|
||||
* @brief Returns the value of key as bool
|
||||
*
|
||||
|
@ -203,7 +197,7 @@ namespace Easy
|
|||
*
|
||||
* Returns clocks epoch if the value does not exist or is null.
|
||||
*/
|
||||
const Easy::time get_time(const string &key) const;
|
||||
const Easy::time_type get_time(const string &key) const;
|
||||
|
||||
/*!
|
||||
* @brief Returns the value of key as vector
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -26,13 +26,14 @@
|
|||
#include "easy/entities/mention.hpp"
|
||||
#include "easy/entities/notification.hpp"
|
||||
#include "easy/entities/relationship.hpp"
|
||||
#include "easy/entities/report.hpp"
|
||||
#include "easy/entities/results.hpp"
|
||||
#include "easy/entities/status.hpp"
|
||||
#include "easy/entities/tag.hpp"
|
||||
#include "easy/entities/token.hpp"
|
||||
#include "easy/entities/pushsubscription.hpp"
|
||||
#include "easy/entities/filter.hpp"
|
||||
#include "easy/entities/poll.hpp"
|
||||
#include "easy/entities/conversation.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
|
@ -51,6 +52,16 @@ Easy::return_entity<T>::return_entity(const uint8_t ec, const string &em,
|
|||
http_error_code = hec;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Easy::return_entity<T>::return_entity(const error ec, const string &em,
|
||||
const uint16_t hec, const T &ent)
|
||||
: entity(ent)
|
||||
{
|
||||
error_code = static_cast<uint8_t>(ec);
|
||||
error_message = em;
|
||||
http_error_code = hec;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Easy::return_entity<T>::return_entity::operator const T() const
|
||||
{
|
||||
|
@ -63,14 +74,6 @@ Easy::return_entity<T>::return_entity::operator const string() const
|
|||
return entity.to_string();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
std::ostream &Easy::operator <<(std::ostream &out,
|
||||
const Easy::return_entity<T> &ret)
|
||||
{
|
||||
out << ret.entity.to_string();
|
||||
return out;
|
||||
}
|
||||
|
||||
// Explicit instantiations, so it can be used from outside.
|
||||
template struct Easy::return_entity<Easy::Account>;
|
||||
template struct Easy::return_entity<Easy::Application>;
|
||||
|
@ -83,13 +86,14 @@ template struct Easy::return_entity<Easy::List>;
|
|||
template struct Easy::return_entity<Easy::Mention>;
|
||||
template struct Easy::return_entity<Easy::Notification>;
|
||||
template struct Easy::return_entity<Easy::Relationship>;
|
||||
template struct Easy::return_entity<Easy::Report>;
|
||||
template struct Easy::return_entity<Easy::Results>;
|
||||
template struct Easy::return_entity<Easy::Status>;
|
||||
template struct Easy::return_entity<Easy::Tag>;
|
||||
template struct Easy::return_entity<Easy::Token>;
|
||||
template struct Easy::return_entity<Easy::PushSubscription>;
|
||||
template struct Easy::return_entity<Easy::Filter>;
|
||||
template struct Easy::return_entity<Easy::Poll>;
|
||||
template struct Easy::return_entity<Easy::Conversation>;
|
||||
|
||||
|
||||
template<typename T>
|
||||
|
@ -128,10 +132,11 @@ template struct Easy::return_entity_vector<Easy::List>;
|
|||
template struct Easy::return_entity_vector<Easy::Mention>;
|
||||
template struct Easy::return_entity_vector<Easy::Notification>;
|
||||
template struct Easy::return_entity_vector<Easy::Relationship>;
|
||||
template struct Easy::return_entity_vector<Easy::Report>;
|
||||
template struct Easy::return_entity_vector<Easy::Results>;
|
||||
template struct Easy::return_entity_vector<Easy::Status>;
|
||||
template struct Easy::return_entity_vector<Easy::Tag>;
|
||||
template struct Easy::return_entity_vector<Easy::Token>;
|
||||
template struct Easy::return_entity_vector<Easy::PushSubscription>;
|
||||
template struct Easy::return_entity_vector<Easy::Filter>;
|
||||
template struct Easy::return_entity_vector<Easy::Poll>;
|
||||
template struct Easy::return_entity_vector<Easy::Conversation>;
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -21,12 +21,7 @@
|
|||
#include <vector>
|
||||
#include <ostream>
|
||||
#include <cstdint>
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "mastodon-cpp.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/mastodon-cpp.hpp>
|
||||
#endif
|
||||
#include "../mastodon-cpp.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::vector;
|
||||
|
@ -36,18 +31,14 @@ namespace Mastodon
|
|||
{
|
||||
namespace Easy
|
||||
{
|
||||
template <typename T>
|
||||
struct return_entity;
|
||||
template <typename T> // https://stackoverflow.com/a/4661372/5965450
|
||||
std::ostream &operator <<(std::ostream&, const return_entity<T>&);
|
||||
|
||||
/*!
|
||||
* @brief Return types for calls that return a single `Easy::Entity`.
|
||||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
template <typename T>
|
||||
struct return_entity : return_base
|
||||
template <typename T> struct
|
||||
[[deprecated("Will go away in 1.0.0 with no replacement.")]]
|
||||
return_entity : return_base
|
||||
{
|
||||
/*!
|
||||
* @brief Mastodon::Easy::Entity
|
||||
|
@ -71,6 +62,19 @@ namespace Easy
|
|||
return_entity(const uint8_t ec, const string &em,
|
||||
const uint16_t hec, const T &ent);
|
||||
|
||||
/*!
|
||||
* @brief Return type for easy Mastodon::Easy::API.
|
||||
*
|
||||
* @param ec Error code
|
||||
* @param em Error message
|
||||
* @param hec HTTP error code
|
||||
* @param ent Answer
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
return_entity(const error ec, const string &em,
|
||||
const uint16_t hec, const T &ent);
|
||||
|
||||
/*!
|
||||
* @brief Same as return_entity::entity.
|
||||
*
|
||||
|
@ -79,20 +83,24 @@ namespace Easy
|
|||
operator const T() const;
|
||||
|
||||
/*!
|
||||
* @brief Mastodon::Easy::Entity as string.
|
||||
* @brief Mastodon::Easy::Entity as formatted string.
|
||||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
operator const string() const;
|
||||
|
||||
// FIXME: Can't get it to work, don't know why.
|
||||
/*!
|
||||
* @brief Mastodon::Easy::Entity as string.
|
||||
* @brief Mastodon::Easy::Entity as formatted string.
|
||||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
friend std::ostream &operator <<<T>(std::ostream &out,
|
||||
const return_entity<T> &ret);
|
||||
friend std::ostream &operator <<(std::ostream &out,
|
||||
const return_entity<T> &ret)
|
||||
{
|
||||
// Could only get it to work by implementing it here.
|
||||
out << ret.entity.to_string();
|
||||
return out;
|
||||
}
|
||||
};
|
||||
|
||||
/*!
|
||||
|
@ -100,8 +108,9 @@ namespace Easy
|
|||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
template <typename T>
|
||||
struct return_entity_vector : return_base
|
||||
template <typename T> struct
|
||||
[[deprecated("Will go away in 1.0.0 with no replacement.")]]
|
||||
return_entity_vector : return_base
|
||||
{
|
||||
/*!
|
||||
* @brief std::vector of Mastodon::Easy::Entity.
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -39,7 +39,8 @@ const return_entity<Status> API::send_post(const Status &status)
|
|||
else
|
||||
{
|
||||
ttdebug << "ERROR: Easy::Status::content can not be empty.\n";
|
||||
return { 22, "Easy::Status::content can not be empty", 0, Status() };
|
||||
return { error::INVALID_ARGUMENT,
|
||||
"Easy::Status::content can not be empty", 0, Status() };
|
||||
}
|
||||
|
||||
if (!status.in_reply_to_id().empty())
|
||||
|
@ -94,8 +95,9 @@ const return_entity<Status> API::send_post(const Status &status)
|
|||
else
|
||||
{
|
||||
ttdebug << "ERROR: Easy::Attachment::file can not be empty.\n";
|
||||
return { 22, "Easy::Attachment::file can not be empty",
|
||||
0, Status() };
|
||||
return { error::INVALID_ARGUMENT,
|
||||
"Easy::Attachment::file can not be empty", 0,
|
||||
Status() };
|
||||
}
|
||||
if (!att.description().empty())
|
||||
{
|
||||
|
|
|
@ -2,34 +2,36 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "types_easy.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
Easy::time::operator const system_clock::time_point() const
|
||||
namespace Mastodon
|
||||
{
|
||||
namespace Easy
|
||||
{
|
||||
time_type::operator const system_clock::time_point() const
|
||||
{
|
||||
return timepoint;
|
||||
}
|
||||
}
|
||||
|
||||
Easy::time::operator const string() const
|
||||
{
|
||||
time_type::operator const string() const
|
||||
{
|
||||
return strtime("%FT%T%z", true);
|
||||
}
|
||||
}
|
||||
|
||||
const string Easy::time::strtime(const string &format, const bool &local) const
|
||||
{
|
||||
const string time_type::strtime(const string &format, const bool &local) const
|
||||
{
|
||||
constexpr std::uint16_t bufsize = 1024;
|
||||
std::time_t time = system_clock::to_time_t(timepoint);
|
||||
std::tm *tm;
|
||||
|
@ -46,12 +48,14 @@ const string Easy::time::strtime(const string &format, const bool &local) const
|
|||
std::strftime(buffer, bufsize, format.c_str(), tm);
|
||||
|
||||
return static_cast<const string>(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
std::ostream &Mastodon::Easy::operator <<(std::ostream &out,
|
||||
const Easy::time &t)
|
||||
{
|
||||
std::ostream &operator <<(std::ostream &out,
|
||||
const time_type &t)
|
||||
{
|
||||
const string s = t; // Converts using operator const string().
|
||||
out << s;
|
||||
return out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,11 +20,11 @@
|
|||
#include <string>
|
||||
#include <utility>
|
||||
#include <chrono>
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
|
||||
using std::string;
|
||||
using std::chrono::system_clock;
|
||||
using std::vector;
|
||||
using std::uint64_t;
|
||||
|
||||
namespace Mastodon
|
||||
{
|
||||
|
@ -41,6 +41,7 @@ namespace Easy
|
|||
Notification,
|
||||
Delete,
|
||||
Error,
|
||||
Filters_changed,
|
||||
Undefined
|
||||
};
|
||||
|
||||
|
@ -121,11 +122,14 @@ namespace Easy
|
|||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
typedef struct stream_event
|
||||
typedef struct stream_event_type
|
||||
{
|
||||
event_type type = event_type::Undefined;
|
||||
string data;
|
||||
} stream_event;
|
||||
} stream_event_type;
|
||||
|
||||
[[deprecated("Replaced by Mastodon::Easy::stream_event_type")]]
|
||||
typedef stream_event_type stream_event;
|
||||
|
||||
/*!
|
||||
* @brief Type of notification and 'push is requested or not'.
|
||||
|
@ -138,21 +142,12 @@ namespace Easy
|
|||
bool pushreq = false;
|
||||
} alert_type;
|
||||
|
||||
/*!
|
||||
* @brief Vector of Easy::alert_type.
|
||||
*
|
||||
* Used in PushSubscription::alerts().
|
||||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
typedef vector<alert_type> alerts;
|
||||
|
||||
/*!
|
||||
* @brief Type for time. Converts to time_point and string.
|
||||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
struct time
|
||||
struct time_type
|
||||
{
|
||||
system_clock::time_point timepoint = system_clock::time_point();
|
||||
|
||||
|
@ -171,7 +166,7 @@ namespace Easy
|
|||
* @since 0.100.0
|
||||
*/
|
||||
friend std::ostream &operator <<(std::ostream &out,
|
||||
const Easy::time &t);
|
||||
const Easy::time_type &t);
|
||||
|
||||
/*!
|
||||
* @brief Converts time to a string.
|
||||
|
@ -195,6 +190,50 @@ namespace Easy
|
|||
const string strtime(const string &format,
|
||||
const bool &local = true) const;
|
||||
};
|
||||
|
||||
[[deprecated("Replaced by Mastodon::Easy::time_type")]]
|
||||
typedef time_type time;
|
||||
|
||||
/*!
|
||||
* @brief Describes an account-field.
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
typedef struct account_field_type
|
||||
{
|
||||
const string name;
|
||||
const string value;
|
||||
Easy::time_type verified_at;
|
||||
} account_field_type;
|
||||
|
||||
/*!
|
||||
* @brief URLs returned by Instance::urls().
|
||||
*
|
||||
* @since 0.106.0
|
||||
*/
|
||||
typedef struct urls_type
|
||||
{
|
||||
string streaming_api;
|
||||
} urls_type;
|
||||
|
||||
/*!
|
||||
* @brief Statistics returned by Instance::stats().
|
||||
*/
|
||||
typedef struct stats_type
|
||||
{
|
||||
uint64_t user_count = 0;
|
||||
uint64_t status_count = 0;
|
||||
uint64_t domain_count = 0;
|
||||
} stats_type;
|
||||
|
||||
/*!
|
||||
* @brief Poll options returned by Poll::options().
|
||||
*/
|
||||
typedef struct poll_options_type
|
||||
{
|
||||
string title;
|
||||
uint64_t votes_count = 0;
|
||||
} poll_options_type;
|
||||
}
|
||||
}
|
||||
#endif // MASTODON_CPP_EASY_TYPES_EASY_HPP
|
||||
|
|
379
src/http.cpp
379
src/http.cpp
|
@ -2,33 +2,49 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
#include <functional> // std::bind
|
||||
#include <list>
|
||||
#include <cstring> // std::strncmp
|
||||
#include <exception>
|
||||
#include <thread>
|
||||
#include <curlpp/Options.hpp>
|
||||
#include <curlpp/Exception.hpp>
|
||||
#include <curlpp/Infos.hpp>
|
||||
#include <regex>
|
||||
#include <Poco/Net/HTTPSClientSession.h>
|
||||
#include <Poco/Net/HTTPRequest.h>
|
||||
#include <Poco/Net/HTTPResponse.h>
|
||||
#include <Poco/StreamCopier.h>
|
||||
#include <Poco/URI.h>
|
||||
#include <Poco/Environment.h>
|
||||
#include <Poco/Exception.h>
|
||||
#include <Poco/Net/NetException.h>
|
||||
#include <Poco/Net/SSLException.h>
|
||||
#include "debug.hpp"
|
||||
#include "mastodon-cpp.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
namespace curlopts = curlpp::options;
|
||||
using std::cerr;
|
||||
using std::istream;
|
||||
using std::make_unique;
|
||||
using std::move;
|
||||
using std::regex;
|
||||
using std::regex_search;
|
||||
using std::smatch;
|
||||
using Poco::Net::HTTPSClientSession;
|
||||
using Poco::Net::HTTPRequest;
|
||||
using Poco::Net::HTTPResponse;
|
||||
using Poco::Net::HTTPMessage;
|
||||
using Poco::StreamCopier;
|
||||
using Poco::Environment;
|
||||
|
||||
API::http::http(const API &api, const string &instance,
|
||||
const string &access_token)
|
||||
|
@ -37,21 +53,95 @@ API::http::http(const API &api, const string &instance,
|
|||
, _access_token(access_token)
|
||||
, _cancel_stream(false)
|
||||
{
|
||||
curlpp::initialize();
|
||||
Poco::Net::initializeSSL();
|
||||
|
||||
try
|
||||
{
|
||||
string env_proxy = Environment::get("http_proxy");
|
||||
size_t pos;
|
||||
|
||||
// Only keep text between // and /.
|
||||
if ((pos = env_proxy.find("//")) != string::npos)
|
||||
{
|
||||
env_proxy = env_proxy.substr(pos + 2);
|
||||
}
|
||||
if ((pos = env_proxy.find('/')) != string::npos)
|
||||
{
|
||||
env_proxy = env_proxy.substr(0, pos);
|
||||
}
|
||||
|
||||
if ((pos = env_proxy.find('@')) != string::npos)
|
||||
{
|
||||
string hostport = env_proxy.substr(pos + 1);
|
||||
string userpw = env_proxy.substr(0, pos);
|
||||
set_proxy(hostport, userpw);
|
||||
}
|
||||
else
|
||||
{
|
||||
set_proxy(env_proxy);
|
||||
}
|
||||
}
|
||||
catch (const std::exception &)
|
||||
{
|
||||
// No proxy found, no problem.
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
API::http::~http()
|
||||
{
|
||||
curlpp::terminate();
|
||||
Poco::Net::uninitializeSSL();
|
||||
}
|
||||
|
||||
void API::http::set_proxy(const string &hostport, const string &userpw)
|
||||
{
|
||||
try
|
||||
{
|
||||
HTTPSClientSession::ProxyConfig proxyconfig;
|
||||
size_t pos = hostport.find(':');
|
||||
|
||||
proxyconfig.host = hostport.substr(0, pos);
|
||||
if (pos != string::npos)
|
||||
{
|
||||
proxyconfig.port = std::stoi(hostport.substr(pos + 1));
|
||||
}
|
||||
|
||||
if (!userpw.empty())
|
||||
{
|
||||
string username;
|
||||
|
||||
pos = userpw.find(':');
|
||||
Poco::URI::decode(userpw.substr(0, pos), username);
|
||||
proxyconfig.username = username;
|
||||
|
||||
if (pos != string::npos)
|
||||
{
|
||||
string password;
|
||||
Poco::URI::decode(userpw.substr(pos + 1), password);
|
||||
proxyconfig.password = password;
|
||||
}
|
||||
}
|
||||
|
||||
HTTPSClientSession::setGlobalProxyConfig(proxyconfig);
|
||||
ttdebug << "Set proxy to " << hostport << ".\n";
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
if (parent.exceptions())
|
||||
{
|
||||
std::rethrow_exception(std::current_exception());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return_call API::http::request(const http_method &meth, const string &path)
|
||||
{
|
||||
return request(meth, path, curlpp::Forms());
|
||||
HTMLForm form;
|
||||
return request(meth, path, form);
|
||||
}
|
||||
|
||||
return_call API::http::request(const http_method &meth, const string &path,
|
||||
const curlpp::Forms &formdata)
|
||||
HTMLForm &formdata)
|
||||
{
|
||||
string answer;
|
||||
return request_common(meth, path, formdata, answer);
|
||||
|
@ -63,8 +153,9 @@ void API::http::request_stream(const string &path, string &stream)
|
|||
_streamthread = std::thread(
|
||||
[&, path] // path is captured by value because it may be
|
||||
{ // deleted before we access it.
|
||||
HTMLForm form;
|
||||
ret = request_common(http_method::GET_STREAM, path,
|
||||
curlpp::Forms(), stream);
|
||||
form, stream);
|
||||
ttdebug << "Remaining content of the stream: " << stream << '\n';
|
||||
if (!ret)
|
||||
{
|
||||
|
@ -78,149 +169,181 @@ void API::http::request_stream(const string &path, string &stream)
|
|||
|
||||
return_call API::http::request_common(const http_method &meth,
|
||||
const string &path,
|
||||
const curlpp::Forms &formdata,
|
||||
HTMLForm &formdata,
|
||||
string &answer)
|
||||
{
|
||||
using namespace std::placeholders; // _1, _2, _3
|
||||
|
||||
ttdebug << "Path is: " << path << '\n';
|
||||
|
||||
try
|
||||
{
|
||||
curlpp::Easy request;
|
||||
std::list<string> headers;
|
||||
|
||||
request.setOpt<curlopts::Url>("https://" + _instance + path);
|
||||
ttdebug << "User-Agent: " << parent.get_useragent() << "\n";
|
||||
request.setOpt<curlopts::UserAgent>(parent.get_useragent());
|
||||
|
||||
{
|
||||
string proxy;
|
||||
string userpw;
|
||||
parent.get_proxy(proxy, userpw);
|
||||
if (!proxy.empty())
|
||||
{
|
||||
request.setOpt<curlopts::Proxy>(proxy);
|
||||
if (!userpw.empty())
|
||||
{
|
||||
request.setOpt<curlopts::ProxyUserPwd>(userpw);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!_access_token.empty())
|
||||
{
|
||||
headers.push_back("Authorization: Bearer " + _access_token);
|
||||
}
|
||||
if (meth != http_method::GET_STREAM)
|
||||
{
|
||||
headers.push_back("Connection: close");
|
||||
// Get headers from server
|
||||
request.setOpt<curlpp::options::Header>(true);
|
||||
}
|
||||
|
||||
request.setOpt<curlopts::HttpHeader>(headers);
|
||||
request.setOpt<curlopts::FollowLocation>(true);
|
||||
request.setOpt<curlopts::WriteFunction>
|
||||
(std::bind(&http::callback_write, this, _1, _2, _3, &answer));
|
||||
request.setOpt<curlopts::ProgressFunction>
|
||||
(std::bind(&http::callback_progress, this, _1, _2, _3, _4));
|
||||
request.setOpt<curlopts::NoProgress>(0);
|
||||
if (!formdata.empty())
|
||||
{
|
||||
request.setOpt<curlopts::HttpPost>(formdata);
|
||||
}
|
||||
string method;
|
||||
|
||||
switch (meth)
|
||||
{
|
||||
case http_method::GET:
|
||||
case http_method::GET_STREAM:
|
||||
break;
|
||||
case http_method::PATCH:
|
||||
request.setOpt<curlopts::CustomRequest>("PATCH");
|
||||
break;
|
||||
case http_method::POST:
|
||||
request.setOpt<curlopts::CustomRequest>("POST");
|
||||
break;
|
||||
case http_method::PUT:
|
||||
request.setOpt<curlopts::CustomRequest>("PUT");
|
||||
break;
|
||||
case http_method::DELETE:
|
||||
request.setOpt<curlopts::CustomRequest>("DELETE");
|
||||
{
|
||||
method = HTTPRequest::HTTP_GET;
|
||||
break;
|
||||
}
|
||||
case http_method::PUT:
|
||||
{
|
||||
method = HTTPRequest::HTTP_PUT;
|
||||
break;
|
||||
}
|
||||
case http_method::POST:
|
||||
{
|
||||
method = HTTPRequest::HTTP_POST;
|
||||
break;
|
||||
}
|
||||
case http_method::PATCH:
|
||||
{
|
||||
// POCO in CentOS 7 (1.6.1) doesn't have HTTPRequest::HTTP_PATCH.
|
||||
method = "PATCH";
|
||||
break;
|
||||
}
|
||||
case http_method::DELETE:
|
||||
{
|
||||
method = HTTPRequest::HTTP_DELETE;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//request.setOpt<curlopts::Verbose>(true);
|
||||
HTTPSClientSession session(_instance);
|
||||
HTTPRequest request(method, path, HTTPMessage::HTTP_1_1);
|
||||
request.set("User-Agent", parent.get_useragent());
|
||||
|
||||
if (!_access_token.empty())
|
||||
{
|
||||
request.set("Authorization", " Bearer " + _access_token);
|
||||
}
|
||||
|
||||
if (!formdata.empty())
|
||||
{
|
||||
ttdebug << "Size of HTMLForm is " << formdata.size() << '\n';
|
||||
formdata.prepareSubmit(request);
|
||||
formdata.write(session.sendRequest(request));
|
||||
}
|
||||
else
|
||||
{
|
||||
session.sendRequest(request);
|
||||
}
|
||||
|
||||
HTTPResponse response;
|
||||
istream &body_stream = session.receiveResponse(response);
|
||||
|
||||
const uint16_t http_code = response.getStatus();
|
||||
ttdebug << "Response code: " << http_code << '\n';
|
||||
|
||||
answer.clear();
|
||||
request.perform();
|
||||
uint16_t http_code = curlpp::infos::ResponseCode::get(request);
|
||||
ttdebug << "Response code: " << http_code << '\n';
|
||||
// Work around "HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK"
|
||||
size_t pos = answer.find("\r\n\r\n", 25);
|
||||
_headers = answer.substr(0, pos);
|
||||
// Only return body
|
||||
answer = answer.substr(pos + 4);
|
||||
StreamCopier::copyToString(body_stream, answer);
|
||||
|
||||
if (http_code == 200 || http_code == 302 || http_code == 307)
|
||||
{ // OK or Found or Temporary Redirect
|
||||
return { 0, "", http_code, answer };
|
||||
}
|
||||
else if (http_code == 301 || http_code == 308)
|
||||
{ // Moved Permanently or Permanent Redirect
|
||||
// return new URL
|
||||
answer = curlpp::infos::EffectiveUrl::get(request);
|
||||
return { 78, "Remote address changed", http_code, answer };
|
||||
}
|
||||
else if (http_code == 0)
|
||||
std::ostringstream headers_stream;
|
||||
response.write(headers_stream);
|
||||
_headers = headers_stream.str();
|
||||
|
||||
switch (http_code)
|
||||
{
|
||||
return { 255, "Unknown error", http_code, answer };
|
||||
case HTTPResponse::HTTP_OK:
|
||||
{
|
||||
return { error::OK, "", http_code, answer };
|
||||
}
|
||||
// Not using the constants because some are too new for Debian stretch.
|
||||
case 301: // HTTPResponse::HTTP_MOVED_PERMANENTLY
|
||||
case 308: // HTTPResponse::HTTP_PERMANENT_REDIRECT
|
||||
case 302: // HTTPResponse::HTTP_FOUND
|
||||
case 303: // HTTPResponse::HTTP_SEE_OTHER
|
||||
case 307: // HTTPResponse::HTTP_TEMPORARY_REDIRECT
|
||||
{
|
||||
ttdebug << "HTTP redirect.\n";
|
||||
string location = response.get("Location");
|
||||
|
||||
if (location.substr(0, 4) == "http")
|
||||
{ // Remove protocol and instance from path.
|
||||
size_t pos1 = location.find("//") + 2;
|
||||
size_t pos2 = location.find('/', pos1);
|
||||
|
||||
if (location.substr(pos1, pos2 - pos1) != _instance)
|
||||
{ // Return new location if the domain changed.
|
||||
ttdebug << "New location is on another domain.\n";
|
||||
return { error::URL_CHANGED, "Remote address changed",
|
||||
http_code, location };
|
||||
}
|
||||
|
||||
location = location.substr(pos2);
|
||||
}
|
||||
|
||||
if (http_code == 301 || http_code == 308)
|
||||
{ // Return new location for permanent redirects.
|
||||
return { error::URL_CHANGED, "Remote address changed",
|
||||
http_code, location };
|
||||
}
|
||||
else
|
||||
{
|
||||
return { 111, "Connection refused", http_code, answer };
|
||||
ttdebug << "Following temporary redirect: " << location << '\n';
|
||||
return request_common(meth, location, formdata, answer);
|
||||
}
|
||||
}
|
||||
catch (curlpp::RuntimeError &e)
|
||||
default:
|
||||
{
|
||||
const string what = e.what();
|
||||
// This error is thrown if http.cancel_stream() is used.
|
||||
if ((what.compare(0, 16, "Callback aborted") == 0) ||
|
||||
(what.compare(0, 19, "Failed writing body") == 0))
|
||||
{
|
||||
ttdebug << "Request was cancelled by user\n";
|
||||
return { 0, "Request was cancelled by user", 0, "" };
|
||||
return { error::CONNECTION_REFUSED, "Connection refused",
|
||||
http_code, answer };
|
||||
}
|
||||
else if (what.compare(what.size() - 20, 20, "Connection timed out") == 0)
|
||||
{
|
||||
ttdebug << what << "\n";
|
||||
return { 110, "Connection timed out", 0, "" };
|
||||
}
|
||||
else if (what.compare(0, 23, "Could not resolve host:") == 0)
|
||||
{
|
||||
ttdebug << what << "\n";
|
||||
return { 113, "Could not resolve host", 0, "" };
|
||||
}
|
||||
|
||||
catch (const Poco::Net::DNSException &e)
|
||||
{
|
||||
if (parent.exceptions())
|
||||
{
|
||||
std::rethrow_exception(std::current_exception());
|
||||
e.rethrow();
|
||||
}
|
||||
else
|
||||
|
||||
ttdebug << e.displayText() << "\n";
|
||||
return { error::DNS, e.displayText(), 0, "" };
|
||||
}
|
||||
catch (const Poco::Net::ConnectionRefusedException &e)
|
||||
{
|
||||
ttdebug << "curlpp::RuntimeError: " << e.what() << std::endl;
|
||||
return { 192, e.what(), 0, "" };
|
||||
if (parent.exceptions())
|
||||
{
|
||||
e.rethrow();
|
||||
}
|
||||
|
||||
ttdebug << e.displayText() << "\n";
|
||||
return { error::CONNECTION_REFUSED, e.displayText(), 0, "" };
|
||||
}
|
||||
catch (curlpp::LogicError &e)
|
||||
catch (const Poco::Net::SSLException &e)
|
||||
{
|
||||
if (parent.exceptions())
|
||||
{
|
||||
e.rethrow();
|
||||
}
|
||||
|
||||
ttdebug << e.displayText() << "\n";
|
||||
return { error::ENCRYPTION, e.displayText(), 0, "" };
|
||||
}
|
||||
catch (const Poco::Net::NetException &e)
|
||||
{
|
||||
if (parent.exceptions())
|
||||
{
|
||||
e.rethrow();
|
||||
}
|
||||
|
||||
ttdebug << "Unknown network error: " << e.displayText() << std::endl;
|
||||
return { error::UNKNOWN, e.displayText(), 0, "" };
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
if (parent.exceptions())
|
||||
{
|
||||
std::rethrow_exception(std::current_exception());
|
||||
}
|
||||
|
||||
ttdebug << "curlpp::LogicError: " << e.what() << std::endl;
|
||||
return { 193, e.what(), 0, "" };
|
||||
ttdebug << "Unknown error: " << e.what() << std::endl;
|
||||
return { error::UNKNOWN, e.what(), 0, "" };
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -229,26 +352,6 @@ void API::http::get_headers(string &headers) const
|
|||
headers = _headers;
|
||||
}
|
||||
|
||||
size_t API::http::callback_write(char* data, size_t size, size_t nmemb,
|
||||
string *str)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
str->append(data, size * nmemb);
|
||||
// ttdebug << "Received " << size * nmemb << " Bytes\n";
|
||||
return size * nmemb;
|
||||
}
|
||||
|
||||
double API::http::callback_progress(double /* dltotal */, double /* dlnow */,
|
||||
double /* ultotal */, double /* ulnow */)
|
||||
{
|
||||
if (_cancel_stream)
|
||||
{
|
||||
// This throws the runtime error: Callback aborted
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void API::http::cancel_stream()
|
||||
{
|
||||
_cancel_stream = true;
|
||||
|
|
|
@ -2,30 +2,34 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <sstream>
|
||||
#include <regex>
|
||||
#include <locale>
|
||||
#include <codecvt>
|
||||
#include <utility>
|
||||
#include <iostream>
|
||||
#include <exception>
|
||||
#include <algorithm>
|
||||
#include <Poco/Net/FilePartSource.h>
|
||||
#include <Poco/URI.h>
|
||||
#include "version.hpp"
|
||||
#include "debug.hpp"
|
||||
#include "mastodon-cpp.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
using std::make_unique;
|
||||
using Poco::Net::FilePartSource;
|
||||
|
||||
API::API(const string &instance, const string &access_token)
|
||||
: _instance(instance)
|
||||
|
@ -33,9 +37,25 @@ API::API(const string &instance, const string &access_token)
|
|||
, _useragent(string("mastodon-cpp/") + global::version)
|
||||
, _http(*this, instance, access_token)
|
||||
, _exceptions(false)
|
||||
, _proxy("")
|
||||
, _proxy_userpw("")
|
||||
{}
|
||||
{
|
||||
bool fash = false;
|
||||
const std::regex re_gab("(?:\\.|^)gab\\.[^\\.]+$");
|
||||
const std::regex re_kiwifarms("(?:\\.|^)kiwifarms\\.[^\\.]+$");
|
||||
|
||||
for (const std::regex &re : { re_gab, re_kiwifarms })
|
||||
{
|
||||
if (std::regex_search(_instance, re))
|
||||
{
|
||||
fash = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fash)
|
||||
{
|
||||
throw std::runtime_error("Fascist instance detected: " + _instance);
|
||||
}
|
||||
}
|
||||
|
||||
API::~API()
|
||||
{}
|
||||
|
@ -91,9 +111,12 @@ const string API::maptostr(const parameters &map, const bool &firstparam)
|
|||
return result;
|
||||
}
|
||||
|
||||
const curlpp::Forms API::maptoformdata(const parameters &map)
|
||||
unique_ptr<HTMLForm> API::maptoformdata(const parameters &map)
|
||||
{
|
||||
curlpp::Forms formdata;
|
||||
ttdebug << "Transforming Mastodon::parameters to Poco::Net::HTMLForm.\n";
|
||||
|
||||
unique_ptr<HTMLForm> formdata =
|
||||
make_unique<HTMLForm>(HTMLForm::ENCODING_MULTIPART);
|
||||
|
||||
if (map.size() == 0)
|
||||
{
|
||||
|
@ -102,41 +125,58 @@ const curlpp::Forms API::maptoformdata(const parameters &map)
|
|||
|
||||
for (const auto &it : map)
|
||||
{
|
||||
if (it.values.size() == 1)
|
||||
{ // If the file is not base64-encoded, treat as filename
|
||||
if ((it.key == "avatar" ||
|
||||
it.key == "header" ||
|
||||
it.key == "file") &&
|
||||
it.values.front().substr(0, 4).compare("data") != 0)
|
||||
{
|
||||
ttdebug << it.key << ": Filename detected.\n";
|
||||
formdata.push_back(
|
||||
new curlpp::FormParts::File(it.key, it.values.front()));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Append [] to array keys.
|
||||
string key = it.key;
|
||||
if (key == "account_ids"
|
||||
ttdebug << "Processing \"" + key + "\".\n";
|
||||
|
||||
// TODO: Test nested parameters.
|
||||
if (const size_t pos = key.find('.') != string::npos)
|
||||
{ // Nested parameters.
|
||||
key.replace(pos, 1, "[");
|
||||
key += ']';
|
||||
}
|
||||
|
||||
if (it.values.size() == 1)
|
||||
{ // If the file is not base64-encoded, treat as filename.
|
||||
if ((key == "avatar" ||
|
||||
key == "header" ||
|
||||
key == "file") &&
|
||||
it.values.front().substr(0, 5) != "data:")
|
||||
{
|
||||
ttdebug << key << ": Filename detected.\n";
|
||||
|
||||
try
|
||||
{
|
||||
formdata->addPart(key,
|
||||
new FilePartSource(it.values.front()));
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
if (exceptions())
|
||||
{
|
||||
std::rethrow_exception(std::current_exception());
|
||||
}
|
||||
|
||||
// TODO: Proper error handling without exceptions.
|
||||
std::cerr << "Error: Could not open file: "
|
||||
<< it.values.front() << std::endl;
|
||||
}
|
||||
}
|
||||
else if (key == "account_ids"
|
||||
|| key == "exclude_types"
|
||||
|| key == "media_ids"
|
||||
|| key == "context")
|
||||
{
|
||||
key += "[]";
|
||||
}
|
||||
formdata.push_back(
|
||||
new curlpp::FormParts::Content(key, it.values.front()));
|
||||
}
|
||||
|
||||
formdata->add(key, it.values.front());
|
||||
}
|
||||
else
|
||||
{
|
||||
std::transform(it.values.begin(), it.values.end(),
|
||||
std::back_inserter(formdata),
|
||||
[&it](const string &s)
|
||||
for (const string &value : it.values)
|
||||
{
|
||||
return new curlpp::FormParts::Content
|
||||
(it.key + "[]", s);
|
||||
});
|
||||
formdata->add(key + "[]", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -226,11 +266,18 @@ return_call API::register_app2(const string &client_id,
|
|||
return ret;
|
||||
}
|
||||
|
||||
const string API::get_header(const std::string &header) const
|
||||
const string API::get_header(std::string header) const
|
||||
{
|
||||
string headers;
|
||||
string headers_lower;
|
||||
_http.get_headers(headers);
|
||||
size_t startpos = headers.find(header + ':');
|
||||
headers_lower.resize(headers.size());
|
||||
|
||||
std::transform(headers.begin(), headers.end(),
|
||||
headers_lower.begin(), ::tolower);
|
||||
std::transform(header.begin(), header.end(), header.begin(), ::tolower);
|
||||
|
||||
size_t startpos = headers_lower.find(header + ':');
|
||||
if (startpos != std::string::npos)
|
||||
{
|
||||
startpos = headers.find(':', startpos) + 2;
|
||||
|
@ -252,22 +299,9 @@ bool API::exceptions() const
|
|||
return _exceptions;
|
||||
}
|
||||
|
||||
void API::set_proxy(const string &proxy, const string &userpw)
|
||||
void API::set_proxy(const string &hostport, const string &userpw)
|
||||
{
|
||||
_proxy = proxy;
|
||||
_proxy_userpw = userpw;
|
||||
}
|
||||
|
||||
void API::get_proxy(string &proxy, string &userpw) const
|
||||
{
|
||||
if (!_proxy.empty())
|
||||
{
|
||||
proxy = _proxy;
|
||||
if (!_proxy_userpw.empty())
|
||||
{
|
||||
userpw = _proxy_userpw;
|
||||
}
|
||||
}
|
||||
_http.set_proxy(hostport, userpw);
|
||||
}
|
||||
|
||||
const parameters API::delete_params(const parameters ¶ms,
|
||||
|
@ -281,7 +315,7 @@ const parameters API::delete_params(const parameters ¶ms,
|
|||
std::copy_if(params.begin(), params.end(), newparams.begin(),
|
||||
[&keys](const param &p)
|
||||
{
|
||||
return std::any_of(keys.begin(), keys.end(),
|
||||
return std::all_of(keys.begin(), keys.end(),
|
||||
[&p](const string &k)
|
||||
{
|
||||
return (k != p.key);
|
||||
|
@ -293,11 +327,16 @@ const parameters API::delete_params(const parameters ¶ms,
|
|||
|
||||
const string Mastodon::urlencode(const std::string &str)
|
||||
{
|
||||
return curlpp::escape(str);
|
||||
string out;
|
||||
Poco::URI::encode(str, "", out);
|
||||
return out;
|
||||
}
|
||||
|
||||
const string Mastodon::urldecode(const std::string &str)
|
||||
{
|
||||
return curlpp::unescape(str);
|
||||
string out;
|
||||
Poco::URI::decode(str, out);
|
||||
return out;
|
||||
}
|
||||
|
||||
const string Mastodon::unescape_html(const string &html)
|
||||
|
@ -308,7 +347,7 @@ const string Mastodon::unescape_html(const string &html)
|
|||
// Used to convert int to utf-8 char
|
||||
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> u8c;
|
||||
// Matches numbered entities between 1 and 8 digits, decimal or hexadecimal
|
||||
std::regex re_entity("&#(x)?(\\d{1,8});");
|
||||
std::regex re_entity("&#(x)?([[:alnum:]]{1,8});");
|
||||
std::smatch match;
|
||||
|
||||
while (std::regex_search(buffer, match, re_entity))
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -25,20 +25,15 @@
|
|||
#include <ostream>
|
||||
#include <thread>
|
||||
#include <cstdint>
|
||||
#include <curlpp/cURLpp.hpp>
|
||||
#include <curlpp/Easy.hpp>
|
||||
#include <Poco/Net/HTMLForm.h>
|
||||
|
||||
// If we are compiling mastodon-cpp, use another include path
|
||||
#ifdef MASTODON_CPP
|
||||
#include "return_types.hpp"
|
||||
#include "types.hpp"
|
||||
#else
|
||||
#include <mastodon-cpp/return_types.hpp>
|
||||
#include <mastodon-cpp/types.hpp>
|
||||
#endif
|
||||
#include "return_types.hpp"
|
||||
#include "types.hpp"
|
||||
|
||||
using std::string;
|
||||
using std::uint8_t;
|
||||
using std::unique_ptr;
|
||||
using Poco::Net::HTMLForm;
|
||||
|
||||
/*!
|
||||
* @example example01_get_public_timeline.cpp
|
||||
|
@ -54,22 +49,20 @@ namespace Mastodon
|
|||
/*!
|
||||
* @brief Interface to the Mastodon API.
|
||||
*
|
||||
* All input is expected to be UTF-8. Binary data must be
|
||||
* base64-encoded or a filename.
|
||||
* It appears that media attachements can not be base64 encoded.
|
||||
* All input is expected to be UTF-8. Binary data must be a
|
||||
* filename.
|
||||
*
|
||||
* @section error Error codes
|
||||
* | Code | Explanation |
|
||||
* | --------: |:-------------------------------------------|
|
||||
* | 0 | No error |
|
||||
* | 22 | Invalid argument |
|
||||
* | 78 | URL changed (HTTP 301 or 308) |
|
||||
* | 110 | Connection timed out |
|
||||
* | 111 | Connection refused (check http_error_code) |
|
||||
* | 113 | No route to host / Could not resolve host |
|
||||
* | 192 | curlpp runtime error |
|
||||
* | 193 | curlpp logic error |
|
||||
* | 255 | Unknown error |
|
||||
* | 1 | Invalid argument |
|
||||
* | 10 | URL changed (HTTP 301 or 308) |
|
||||
* | 11 | Connection timed out |
|
||||
* | 12 | Connection refused (check http_error_code) |
|
||||
* | 13 | No route to host / Could not resolve host |
|
||||
* | 14 | Encryption error |
|
||||
* | 127 | Unknown error |
|
||||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
|
@ -109,7 +102,7 @@ namespace Mastodon
|
|||
*/
|
||||
return_call request(const http_method &meth,
|
||||
const string &path,
|
||||
const curlpp::Forms &formdata);
|
||||
HTMLForm &formdata);
|
||||
|
||||
/*!
|
||||
* @brief HTTP Request for streams.
|
||||
|
@ -149,6 +142,16 @@ namespace Mastodon
|
|||
*/
|
||||
std::mutex &get_mutex();
|
||||
|
||||
/*!
|
||||
* @brief Set proxy. Do not call this directly.
|
||||
*
|
||||
* @param hostport host[:port]
|
||||
* @param userpw user[:password] (optional)
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
void set_proxy(const string &hostport, const string &userpw = "");
|
||||
|
||||
private:
|
||||
const API &parent;
|
||||
const string _instance;
|
||||
|
@ -160,7 +163,7 @@ namespace Mastodon
|
|||
|
||||
return_call request_common(const http_method &meth,
|
||||
const string &path,
|
||||
const curlpp::Forms &formdata,
|
||||
HTMLForm &formdata,
|
||||
string &answer);
|
||||
size_t callback_write(char* data, size_t size, size_t nmemb,
|
||||
string *oss);
|
||||
|
@ -223,8 +226,8 @@ namespace Mastodon
|
|||
|
||||
lists,
|
||||
accounts_id_lists,
|
||||
lists_id,
|
||||
lists_id_accounts,
|
||||
lists_id,
|
||||
|
||||
media,
|
||||
media_id,
|
||||
|
@ -241,37 +244,39 @@ namespace Mastodon
|
|||
notifications_dismiss,
|
||||
push_subscription,
|
||||
|
||||
polls_id,
|
||||
polls_id_votes,
|
||||
|
||||
reports,
|
||||
|
||||
// scheduled_statuses,
|
||||
// scheduled_statuses_id,
|
||||
|
||||
search,
|
||||
|
||||
statuses,
|
||||
statuses_id,
|
||||
statuses_id_context,
|
||||
statuses_id_card,
|
||||
statuses_id_reblogged_by,
|
||||
statuses_id_favourited_by,
|
||||
statuses,
|
||||
statuses_id_reblog,
|
||||
statuses_id_unreblog,
|
||||
statuses_id_pin,
|
||||
statuses_id_unpin,
|
||||
|
||||
timelines_home,
|
||||
// timelines_conversations,
|
||||
conversations,
|
||||
timelines_public,
|
||||
timelines_tag_hashtag,
|
||||
timelines_list_list_id,
|
||||
|
||||
streaming_health,
|
||||
streaming_user,
|
||||
streaming_public,
|
||||
streaming_public_local,
|
||||
streaming_hashtag,
|
||||
// streaming_hashtag_local,
|
||||
streaming_hashtag_local,
|
||||
streaming_list,
|
||||
// streaming_direct,
|
||||
streaming_direct,
|
||||
|
||||
// Glitch-Soc
|
||||
bookmarks,
|
||||
|
@ -406,7 +411,7 @@ namespace Mastodon
|
|||
string &access_token);
|
||||
|
||||
/*!
|
||||
* @brief Gets the header from the last answer.
|
||||
* @brief Gets the header from the last answer. Case insensitive.
|
||||
*
|
||||
* @param header The header to get
|
||||
*
|
||||
|
@ -414,13 +419,12 @@ namespace Mastodon
|
|||
*
|
||||
* @since before 0.11.0
|
||||
*/
|
||||
const string get_header(const string &header) const;
|
||||
const string get_header(string header) const;
|
||||
|
||||
/*!
|
||||
* @brief Turn exceptions on or off. Defaults to off.
|
||||
*
|
||||
* This applies to exceptions from curlpp. curlpp::RuntimeError
|
||||
* and curlpp::LogicError.
|
||||
* Most exceptions will be thrown at you to handle if on.
|
||||
*
|
||||
* @param value true for on, false for off
|
||||
*
|
||||
|
@ -446,28 +450,18 @@ namespace Mastodon
|
|||
/*!
|
||||
* @brief Sets the proxy.
|
||||
*
|
||||
* Since mastodon-cpp is built on libcurl, it respects the same
|
||||
* proxy environment variables. See `man curl`.
|
||||
* Both the username and the password will be URL decoded
|
||||
* before use.
|
||||
*
|
||||
* @param proxy See `man 3 CURLOPT_PROXY`
|
||||
* @param userpw See `man 3 CURLOPT_PROXYUSERPWD` (optional)
|
||||
* @param hostport host[:port]
|
||||
* @param userpw username[:password] (optional)
|
||||
*
|
||||
* @since 0.15.0
|
||||
*/
|
||||
void set_proxy(const string &proxy, const string &userpw = "");
|
||||
void set_proxy(const string &hostport, const string &userpw = "");
|
||||
|
||||
/*!
|
||||
* @brief For internal use
|
||||
*
|
||||
* @param proxy URL
|
||||
* @param userpw username:password
|
||||
*
|
||||
* @since 0.15.1
|
||||
*/
|
||||
void get_proxy(string &proxy, string &userpw) const;
|
||||
|
||||
/*!
|
||||
* @brief Make a GET request which doesn't require parameters.
|
||||
* @brief Make a GET request that doesn't require parameters.
|
||||
*
|
||||
* @param call A call defined in Mastodon::API::v1
|
||||
*
|
||||
|
@ -476,7 +470,7 @@ namespace Mastodon
|
|||
const return_call get(const Mastodon::API::v1 &call);
|
||||
|
||||
/*!
|
||||
* @brief Make a GET request which requires parameters.
|
||||
* @brief Make a GET request that requires parameters.
|
||||
*
|
||||
* @param call A call defined in Mastodon::API::v1
|
||||
* @param parameters A Mastodon::parametermap containing
|
||||
|
@ -488,7 +482,7 @@ namespace Mastodon
|
|||
const parameters ¶meters);
|
||||
|
||||
/*!
|
||||
* @brief Make a GET request which requires parameters.
|
||||
* @brief Make a GET request that requires parameters.
|
||||
*
|
||||
* @param call A call defined in Mastodon::API::v2
|
||||
* @param parameters A Mastodon::parametermap containing
|
||||
|
@ -521,7 +515,7 @@ namespace Mastodon
|
|||
*/
|
||||
void get_stream(const Mastodon::API::v1 &call,
|
||||
const parameters ¶meters,
|
||||
std::unique_ptr<Mastodon::API::http> &ptr,
|
||||
unique_ptr<Mastodon::API::http> &ptr,
|
||||
string &stream);
|
||||
|
||||
/*!
|
||||
|
@ -534,7 +528,7 @@ namespace Mastodon
|
|||
* @since 0.100.0
|
||||
*/
|
||||
void get_stream(const Mastodon::API::v1 &call,
|
||||
std::unique_ptr<Mastodon::API::http> &ptr,
|
||||
unique_ptr<Mastodon::API::http> &ptr,
|
||||
string &stream);
|
||||
|
||||
/*!
|
||||
|
@ -547,13 +541,13 @@ namespace Mastodon
|
|||
* @since 0.100.0
|
||||
*/
|
||||
void get_stream(const string &call,
|
||||
std::unique_ptr<Mastodon::API::http> &ptr,
|
||||
unique_ptr<Mastodon::API::http> &ptr,
|
||||
string &stream);
|
||||
|
||||
/*!
|
||||
* @brief Make a PATCH request.
|
||||
*
|
||||
* Binary data must be base64-encoded or a filename.
|
||||
* Binary data must be a filename.
|
||||
*
|
||||
* @param call A call defined in Mastodon::API::v1
|
||||
* @param parameters A Mastodon::parametermap containing
|
||||
|
@ -565,7 +559,7 @@ namespace Mastodon
|
|||
const parameters ¶meters);
|
||||
|
||||
/*!
|
||||
* @brief Make a POST request which doesn't require parameters.
|
||||
* @brief Make a POST request that doesn't require parameters.
|
||||
*
|
||||
* @param call A call defined in Mastodon::API::v1
|
||||
*
|
||||
|
@ -574,9 +568,9 @@ namespace Mastodon
|
|||
return_call post(const Mastodon::API::v1 &call);
|
||||
|
||||
/*!
|
||||
* @brief Make a POST request which requires parameters.
|
||||
* @brief Make a POST request that requires parameters.
|
||||
*
|
||||
* Binary data must be base64-encoded or a filename.
|
||||
* Binary data must be a filename.
|
||||
*
|
||||
* @param call A call defined in Mastodon::API::v1
|
||||
* @param parameters A Mastodon::parametermap containing
|
||||
|
@ -590,7 +584,7 @@ namespace Mastodon
|
|||
/*!
|
||||
* @brief Make a custom POST request.
|
||||
*
|
||||
* Binary data must be base64-encoded or a filename.
|
||||
* Binary data must be a filename.
|
||||
*
|
||||
* @param call String in the form `/api/v1/example`
|
||||
* @param parameters A Mastodon::parametermap containing
|
||||
|
@ -602,7 +596,7 @@ namespace Mastodon
|
|||
const parameters ¶meters);
|
||||
|
||||
/*!
|
||||
* @brief Make a PUT request which requires a parameters.
|
||||
* @brief Make a PUT request that requires parameters.
|
||||
*
|
||||
* @param call A call defined in Mastodon::API::v1
|
||||
* @param parameters A Mastodon::parametermap containing
|
||||
|
@ -625,7 +619,7 @@ namespace Mastodon
|
|||
return_call put(const string &call, const parameters ¶meters);
|
||||
|
||||
/*!
|
||||
* @brief Make a DELETE request which requires parameters.
|
||||
* @brief Make a DELETE request that requires parameters.
|
||||
*
|
||||
* @param call A call defined in Mastodon::API::v1
|
||||
* @param parameters A Mastodon::parametermap containing
|
||||
|
@ -653,8 +647,6 @@ namespace Mastodon
|
|||
string _useragent;
|
||||
http _http;
|
||||
bool _exceptions;
|
||||
string _proxy;
|
||||
string _proxy_userpw;
|
||||
|
||||
/*!
|
||||
* @brief Converts map of parameters into a string.
|
||||
|
@ -672,9 +664,9 @@ namespace Mastodon
|
|||
*
|
||||
* @param map Map of parameters
|
||||
*
|
||||
* @return Form data as curlpp::Forms
|
||||
* @return Form data as Poco::Net::HTMLForm.
|
||||
*/
|
||||
const curlpp::Forms maptoformdata(const parameters &map);
|
||||
unique_ptr<HTMLForm> maptoformdata(const parameters &map);
|
||||
|
||||
/*!
|
||||
* @brief Delete Mastodon::param from Mastodon::parameters.
|
||||
|
@ -691,13 +683,12 @@ namespace Mastodon
|
|||
};
|
||||
|
||||
/*!
|
||||
* @brief Percent-encodes a string. This is done automatically, unless
|
||||
* you make a custom request.
|
||||
* @brief Percent-encodes a string.
|
||||
*
|
||||
* Calls curlpp::escape(str).
|
||||
*
|
||||
* The only time you should use this, is if you use
|
||||
* get(const string &call, string &answer).
|
||||
* This is done automatically where necessary. The only time you
|
||||
* should use this, is if you use get(const string &call, string
|
||||
* &answer).
|
||||
*
|
||||
* See RFC 3986 section 2.1 for more info.
|
||||
*
|
||||
|
@ -712,8 +703,6 @@ namespace Mastodon
|
|||
/*!
|
||||
* @brief Decodes a percent-encoded string.
|
||||
*
|
||||
* Calls curlpp::unescape(str).
|
||||
*
|
||||
* See RFC 3986 section 2.1 for more info.
|
||||
*
|
||||
* @param str The string to decode.
|
||||
|
|
|
@ -2,24 +2,24 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "return_types.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
return_base::operator bool()
|
||||
namespace Mastodon
|
||||
{
|
||||
return_base::operator bool() const
|
||||
{
|
||||
if (error_code == 0)
|
||||
{
|
||||
return true;
|
||||
|
@ -28,32 +28,42 @@ return_base::operator bool()
|
|||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return_base::operator uint8_t()
|
||||
{
|
||||
return_base::operator uint8_t() const
|
||||
{
|
||||
return error_code;
|
||||
}
|
||||
}
|
||||
|
||||
return_call::operator const string() const
|
||||
{
|
||||
return_call::operator const string() const
|
||||
{
|
||||
return answer;
|
||||
}
|
||||
}
|
||||
|
||||
std::ostream &Mastodon::operator <<(std::ostream &out, const return_call &ret)
|
||||
{
|
||||
std::ostream &operator <<(std::ostream &out, const return_call &ret)
|
||||
{
|
||||
out << ret.answer;
|
||||
return out;
|
||||
}
|
||||
}
|
||||
|
||||
return_call::return_call()
|
||||
{}
|
||||
return_call::return_call()
|
||||
{}
|
||||
|
||||
return_call::return_call(const uint8_t ec, const string &em,
|
||||
return_call::return_call(const uint8_t ec, const string &em,
|
||||
const uint16_t hec, const string &a)
|
||||
: answer(a)
|
||||
{
|
||||
{
|
||||
error_code = ec;
|
||||
error_message = em;
|
||||
http_error_code = hec;
|
||||
}
|
||||
|
||||
return_call::return_call(const error ec, const string &em,
|
||||
const uint16_t hec, const string &a)
|
||||
: answer(a)
|
||||
{
|
||||
error_code = static_cast<uint8_t>(ec);
|
||||
error_message = em;
|
||||
http_error_code = hec;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
|||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include "types.hpp"
|
||||
|
||||
using std::uint8_t;
|
||||
using std::uint16_t;
|
||||
|
@ -59,14 +60,14 @@ namespace Mastodon
|
|||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
operator bool();
|
||||
operator bool() const;
|
||||
|
||||
/*!
|
||||
* @brief Same as return_base::error_code.
|
||||
*
|
||||
* @since 0.100.0
|
||||
*/
|
||||
operator uint8_t();
|
||||
operator uint8_t() const;
|
||||
} return_base;
|
||||
|
||||
/*!
|
||||
|
@ -113,6 +114,19 @@ namespace Mastodon
|
|||
return_call(const uint8_t ec, const string &em,
|
||||
const uint16_t hec, const string &a);
|
||||
|
||||
/*!
|
||||
* @brief Return type for Mastodon::API.
|
||||
*
|
||||
* @param ec Error code
|
||||
* @param em Error message
|
||||
* @param hec HTTP error code
|
||||
* @param a Answer
|
||||
*
|
||||
* @since 0.110.0
|
||||
*/
|
||||
return_call(const error ec, const string &em,
|
||||
const uint16_t hec, const string &a);
|
||||
|
||||
/*!
|
||||
* @brief Same es return_call::answer.
|
||||
*
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -93,6 +93,18 @@ namespace Mastodon
|
|||
DELETE,
|
||||
GET_STREAM
|
||||
};
|
||||
|
||||
enum class error
|
||||
{
|
||||
OK = 0,
|
||||
INVALID_ARGUMENT = 1,
|
||||
URL_CHANGED = 10,
|
||||
CONNECTION_TIMEOUT = 11,
|
||||
CONNECTION_REFUSED = 12,
|
||||
DNS = 13,
|
||||
ENCRYPTION = 14,
|
||||
UNKNOWN = 127
|
||||
};
|
||||
}
|
||||
|
||||
#endif // MASTODON_CPP_TYPES_HPP
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
include(CTest)
|
||||
file(GLOB sources_tests tests/test_*.cpp)
|
||||
|
||||
file(GLOB_RECURSE sources_tests test_*.cpp)
|
||||
|
||||
configure_file("test.gif" "${CMAKE_CURRENT_BINARY_DIR}" COPYONLY)
|
||||
|
||||
find_package(Catch2)
|
||||
if(Catch2_FOUND) # Catch 2.x
|
||||
include(Catch)
|
||||
add_executable(all_tests tests/main.cpp ${sources_tests})
|
||||
target_link_libraries(all_tests ${PROJECT_NAME} Catch2::Catch2)
|
||||
add_executable(all_tests main.cpp ${sources_tests})
|
||||
target_link_libraries(all_tests PRIVATE ${PROJECT_NAME} Catch2::Catch2)
|
||||
target_include_directories(all_tests PRIVATE "/usr/include/catch2")
|
||||
catch_discover_tests(all_tests EXTRA_ARGS "${EXTRA_TEST_ARGS}")
|
||||
else() # Catch 1.x
|
||||
|
@ -13,8 +16,8 @@ else() # Catch 1.x
|
|||
message(STATUS "Catch 1.x found.")
|
||||
foreach(src ${sources_tests})
|
||||
get_filename_component(bin ${src} NAME_WE)
|
||||
add_executable(${bin} tests/main.cpp ${src})
|
||||
target_link_libraries(${bin} ${PROJECT_NAME})
|
||||
add_executable(${bin} main.cpp ${src})
|
||||
target_link_libraries(${bin} PRIVATE ${PROJECT_NAME})
|
||||
add_test(${bin} ${bin} "${EXTRA_TEST_ARGS}")
|
||||
endforeach()
|
||||
else()
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
|||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/token.hpp"
|
||||
#include "environment_variables.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
|||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/account.hpp"
|
||||
#include "environment_variables.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -19,12 +19,12 @@
|
|||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/relationship.hpp"
|
||||
#include "environment_variables.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/block can be called successfully",
|
||||
"[api][mastodon][pleroma][glitch-soc]")
|
||||
"[api][auth][mastodon][pleroma][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,12 +20,12 @@
|
|||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/relationship.hpp"
|
||||
#include "environment_variables.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/follow can be called successfully",
|
||||
"[api][mastodon][pleroma][glitch-soc]")
|
||||
"[api][auth][mastodon][pleroma][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,12 +20,12 @@
|
|||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/account.hpp"
|
||||
#include "environment_variables.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/followers can be called successfully",
|
||||
"[api][mastodon][pleroma][glitch-soc]")
|
||||
"[api][auth][mastodon][pleroma][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,12 +20,12 @@
|
|||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/account.hpp"
|
||||
#include "environment_variables.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/following can be called successfully",
|
||||
"[api][mastodon][pleroma][glitch-soc]")
|
||||
"[api][auth][mastodon][pleroma][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
/* This file is part of mastodon-cpp.
|
||||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <exception>
|
||||
#include <string>
|
||||
#include <catch.hpp>
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/lists can be called successfully",
|
||||
"[api][auth][mastodon][pleroma][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
||||
GIVEN ("instance = " + instance + ", user ID = " + user_id)
|
||||
{
|
||||
Mastodon::Easy::API masto(instance, access_token);
|
||||
return_call ret;
|
||||
bool exception = false;
|
||||
|
||||
WHEN ("GET /api/v1/accounts/" + user_id + "/lists is called")
|
||||
{
|
||||
try
|
||||
{
|
||||
ret = masto.get(API::v1::accounts_id_lists,
|
||||
{{ "id", { user_id }}});
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
exception = true;
|
||||
WARN(e.what());
|
||||
}
|
||||
|
||||
THEN("No exception is thrown")
|
||||
AND_THEN ("No unexpected errors are returned")
|
||||
AND_THEN ("The answer makes sense")
|
||||
{
|
||||
REQUIRE_FALSE(exception);
|
||||
|
||||
REQUIRE(ret.error_code == 0);
|
||||
REQUIRE(ret.http_error_code == 200);
|
||||
|
||||
REQUIRE(ret.answer == "[]");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
/* This file is part of mastodon-cpp.
|
||||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <exception>
|
||||
#include <string>
|
||||
#include <catch.hpp>
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/relationship.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/mute can be called successfully",
|
||||
"[api][auth][mastodon][pleroma][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
||||
GIVEN ("instance = " + instance)
|
||||
{
|
||||
Mastodon::Easy::API masto(instance, access_token);
|
||||
return_call ret;
|
||||
Easy::Relationship relationship;
|
||||
bool exception = false;
|
||||
|
||||
WHEN ("POST /api/v1/accounts/" + user_id + "/mute is called")
|
||||
{
|
||||
try
|
||||
{
|
||||
ret = masto.post(API::v1::accounts_id_mute,
|
||||
{
|
||||
{ "id", { user_id } }
|
||||
});
|
||||
relationship.from_string(ret);
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
exception = true;
|
||||
WARN(e.what());
|
||||
}
|
||||
|
||||
THEN("No exception is thrown")
|
||||
AND_THEN ("No unexpected errors are returned")
|
||||
AND_THEN ("Answer is valid")
|
||||
AND_THEN ("The answer makes sense")
|
||||
{
|
||||
REQUIRE_FALSE(exception);
|
||||
|
||||
REQUIRE(ret.error_code == 0);
|
||||
REQUIRE(ret.http_error_code == 200);
|
||||
|
||||
REQUIRE(relationship.valid());
|
||||
|
||||
REQUIRE(relationship.muting());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,12 +20,12 @@
|
|||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/relationship.hpp"
|
||||
#include "environment_variables.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/pin can be called successfully",
|
||||
"[api][mastodon][glitch-soc]")
|
||||
"[api][auth][mastodon][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,12 +20,12 @@
|
|||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/status.hpp"
|
||||
#include "environment_variables.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/statuses can be called successfully",
|
||||
"[api][mastodon][pleroma][glitch-soc]")
|
||||
"[api][auth][mastodon][pleroma][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -19,12 +19,12 @@
|
|||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/relationship.hpp"
|
||||
#include "environment_variables.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/unblock can be called successfully",
|
||||
"[api][mastodon][pleroma][glitch-soc]")
|
||||
"[api][auth][mastodon][pleroma][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
|
@ -2,15 +2,15 @@
|
|||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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.
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
@ -20,12 +20,12 @@
|
|||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/relationship.hpp"
|
||||
#include "environment_variables.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/unfollow can be called successfully",
|
||||
"[api][mastodon][pleroma][glitch-soc]")
|
||||
"[api][auth][mastodon][pleroma][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
/* This file is part of mastodon-cpp.
|
||||
* Copyright © 2019 tastytea <tastytea@tastytea.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <exception>
|
||||
#include <string>
|
||||
#include <catch.hpp>
|
||||
#include "mastodon-cpp.hpp"
|
||||
#include "easy/easy.hpp"
|
||||
#include "easy/entities/relationship.hpp"
|
||||
#include "../environment_variables.hpp"
|
||||
|
||||
using namespace Mastodon;
|
||||
|
||||
SCENARIO ("/api/v1/accounts/:id/unmute can be called successfully",
|
||||
"[api][auth][mastodon][pleroma][glitch-soc]")
|
||||
{
|
||||
REQUIRE (access_token != nullptr);
|
||||
|
||||
GIVEN ("instance = " + instance)
|
||||
{
|
||||
Mastodon::Easy::API masto(instance, access_token);
|
||||
return_call ret;
|
||||
Easy::Relationship relationship;
|
||||
bool exception = false;
|
||||
|
||||
WHEN ("POST /api/v1/accounts/" + user_id + "/unmute is called")
|
||||
{
|
||||
try
|
||||
{
|
||||
ret = masto.post(API::v1::accounts_id_unmute,
|
||||
{
|
||||
{ "id", { user_id } }
|
||||
});
|
||||
relationship.from_string(ret);
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
exception = true;
|
||||
WARN(e.what());
|
||||
}
|
||||
|
||||
THEN("No exception is thrown")
|
||||
AND_THEN ("No unexpected errors are returned")
|
||||
AND_THEN ("Answer is valid")
|
||||
AND_THEN ("The answer makes sense")
|
||||
{
|
||||
REQUIRE_FALSE(exception);
|
||||
|
||||
REQUIRE(ret.error_code == 0);
|
||||
REQUIRE(ret.http_error_code == 200);
|
||||
|
||||
REQUIRE(relationship.valid());
|
||||
|
||||
REQUIRE(!relationship.muting());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue