mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-11-22 03:36:39 +00:00
Compare commits
6 commits
a22f32f469
...
2628fdc043
Author | SHA1 | Date | |
---|---|---|---|
2628fdc043 | |||
8a93300ac4 | |||
e9299e1174 | |||
f301ec65f1 | |||
ea1bf5f8a3 | |||
c8fb4c17f1 |
|
@ -167,3 +167,11 @@ Links to the set contact account and/or email address will appear on the footer
|
||||||
The selected **contact user** must be an active (not suspended) admin and/or moderator on the instance.
|
The selected **contact user** must be an active (not suspended) admin and/or moderator on the instance.
|
||||||
|
|
||||||
If you're on a single-user instance and you give admin privileges to your main account, you can just fill in your own username here; you don't need to make a separate admin account just for this.
|
If you're on a single-user instance and you give admin privileges to your main account, you can just fill in your own username here; you don't need to make a separate admin account just for this.
|
||||||
|
|
||||||
|
### Instance Custom CSS
|
||||||
|
|
||||||
|
custom CSS allows you to further customize the way your instance looks when visited through a browser.
|
||||||
|
|
||||||
|
This custom CSS will be applied to all pages of your instance. Users themes and CSS still take precedence over this customization.
|
||||||
|
|
||||||
|
See the [Custom CSS](./custom_css.md) page for some tips on writing custom CSS for your instance.
|
||||||
|
|
|
@ -206,6 +206,13 @@ definitions:
|
||||||
example: A cute drawing of a smiling sloth.
|
example: A cute drawing of a smiling sloth.
|
||||||
type: string
|
type: string
|
||||||
x-go-name: AvatarDescription
|
x-go-name: AvatarDescription
|
||||||
|
avatar_media_id:
|
||||||
|
description: |-
|
||||||
|
Database ID of the media attachment for this account's avatar image.
|
||||||
|
Omitted if no avatar uploaded for this account (ie., default avatar).
|
||||||
|
example: 01JAJ3XCD66K3T99JZESCR137W
|
||||||
|
type: string
|
||||||
|
x-go-name: AvatarMediaID
|
||||||
avatar_static:
|
avatar_static:
|
||||||
description: |-
|
description: |-
|
||||||
Web location of a static version of the account's avatar.
|
Web location of a static version of the account's avatar.
|
||||||
|
@ -277,6 +284,13 @@ definitions:
|
||||||
example: A sunlit field with purple flowers.
|
example: A sunlit field with purple flowers.
|
||||||
type: string
|
type: string
|
||||||
x-go-name: HeaderDescription
|
x-go-name: HeaderDescription
|
||||||
|
header_media_id:
|
||||||
|
description: |-
|
||||||
|
Database ID of the media attachment for this account's header image.
|
||||||
|
Omitted if no header uploaded for this account (ie., default header).
|
||||||
|
example: 01JAJ3XCD66K3T99JZESCR137W
|
||||||
|
type: string
|
||||||
|
x-go-name: HeaderMediaID
|
||||||
header_static:
|
header_static:
|
||||||
description: |-
|
description: |-
|
||||||
Web location of a static version of the account's header.
|
Web location of a static version of the account's header.
|
||||||
|
@ -1550,6 +1564,10 @@ definitions:
|
||||||
$ref: '#/definitions/instanceV1Configuration'
|
$ref: '#/definitions/instanceV1Configuration'
|
||||||
contact_account:
|
contact_account:
|
||||||
$ref: '#/definitions/account'
|
$ref: '#/definitions/account'
|
||||||
|
custom_css:
|
||||||
|
description: Custom CSS for the instance.
|
||||||
|
type: string
|
||||||
|
x-go-name: CustomCSS
|
||||||
debug:
|
debug:
|
||||||
description: Whether or not instance is running in DEBUG mode. Omitted if false.
|
description: Whether or not instance is running in DEBUG mode. Omitted if false.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
@ -1730,6 +1748,10 @@ definitions:
|
||||||
$ref: '#/definitions/instanceV2Configuration'
|
$ref: '#/definitions/instanceV2Configuration'
|
||||||
contact:
|
contact:
|
||||||
$ref: '#/definitions/instanceV2Contact'
|
$ref: '#/definitions/instanceV2Contact'
|
||||||
|
custom_css:
|
||||||
|
description: Instance Custom Css
|
||||||
|
type: string
|
||||||
|
x-go-name: CustomCSS
|
||||||
debug:
|
debug:
|
||||||
description: Whether or not instance is running in DEBUG mode. Omitted if false.
|
description: Whether or not instance is running in DEBUG mode. Omitted if false.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
@ -2211,6 +2233,13 @@ definitions:
|
||||||
example: A cute drawing of a smiling sloth.
|
example: A cute drawing of a smiling sloth.
|
||||||
type: string
|
type: string
|
||||||
x-go-name: AvatarDescription
|
x-go-name: AvatarDescription
|
||||||
|
avatar_media_id:
|
||||||
|
description: |-
|
||||||
|
Database ID of the media attachment for this account's avatar image.
|
||||||
|
Omitted if no avatar uploaded for this account (ie., default avatar).
|
||||||
|
example: 01JAJ3XCD66K3T99JZESCR137W
|
||||||
|
type: string
|
||||||
|
x-go-name: AvatarMediaID
|
||||||
avatar_static:
|
avatar_static:
|
||||||
description: |-
|
description: |-
|
||||||
Web location of a static version of the account's avatar.
|
Web location of a static version of the account's avatar.
|
||||||
|
@ -2282,6 +2311,13 @@ definitions:
|
||||||
example: A sunlit field with purple flowers.
|
example: A sunlit field with purple flowers.
|
||||||
type: string
|
type: string
|
||||||
x-go-name: HeaderDescription
|
x-go-name: HeaderDescription
|
||||||
|
header_media_id:
|
||||||
|
description: |-
|
||||||
|
Database ID of the media attachment for this account's header image.
|
||||||
|
Omitted if no header uploaded for this account (ie., default header).
|
||||||
|
example: 01JAJ3XCD66K3T99JZESCR137W
|
||||||
|
type: string
|
||||||
|
x-go-name: HeaderMediaID
|
||||||
header_static:
|
header_static:
|
||||||
description: |-
|
description: |-
|
||||||
Web location of a static version of the account's header.
|
Web location of a static version of the account's header.
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 229 KiB |
8
go.mod
8
go.mod
|
@ -46,14 +46,14 @@ require (
|
||||||
github.com/mitchellh/mapstructure v1.5.0
|
github.com/mitchellh/mapstructure v1.5.0
|
||||||
github.com/ncruces/go-sqlite3 v0.19.0
|
github.com/ncruces/go-sqlite3 v0.19.0
|
||||||
github.com/oklog/ulid v1.3.1
|
github.com/oklog/ulid v1.3.1
|
||||||
github.com/prometheus/client_golang v1.20.4
|
github.com/prometheus/client_golang v1.20.5
|
||||||
github.com/spf13/cobra v1.8.1
|
github.com/spf13/cobra v1.8.1
|
||||||
github.com/spf13/viper v1.19.0
|
github.com/spf13/viper v1.19.0
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.9.0
|
||||||
github.com/superseriousbusiness/activity v1.9.0-gts
|
github.com/superseriousbusiness/activity v1.9.0-gts
|
||||||
github.com/superseriousbusiness/httpsig v1.2.0-SSB
|
github.com/superseriousbusiness/httpsig v1.2.0-SSB
|
||||||
github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8
|
github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8
|
||||||
github.com/tdewolff/minify/v2 v2.20.37
|
github.com/tdewolff/minify/v2 v2.21.0
|
||||||
github.com/technologize/otel-go-contrib v1.1.1
|
github.com/technologize/otel-go-contrib v1.1.1
|
||||||
github.com/tetratelabs/wazero v1.8.1
|
github.com/tetratelabs/wazero v1.8.1
|
||||||
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80
|
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80
|
||||||
|
@ -63,7 +63,7 @@ require (
|
||||||
github.com/uptrace/bun/dialect/sqlitedialect v1.2.1
|
github.com/uptrace/bun/dialect/sqlitedialect v1.2.1
|
||||||
github.com/uptrace/bun/extra/bunotel v1.2.1
|
github.com/uptrace/bun/extra/bunotel v1.2.1
|
||||||
github.com/wagslane/go-password-validator v0.3.0
|
github.com/wagslane/go-password-validator v0.3.0
|
||||||
github.com/yuin/goldmark v1.7.6
|
github.com/yuin/goldmark v1.7.8
|
||||||
go.opentelemetry.io/otel v1.29.0
|
go.opentelemetry.io/otel v1.29.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0
|
||||||
|
@ -197,7 +197,7 @@ require (
|
||||||
github.com/subosito/gotenv v1.6.0 // indirect
|
github.com/subosito/gotenv v1.6.0 // indirect
|
||||||
github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe // indirect
|
github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe // indirect
|
||||||
github.com/superseriousbusiness/go-png-image-structure/v2 v2.0.1-SSB // indirect
|
github.com/superseriousbusiness/go-png-image-structure/v2 v2.0.1-SSB // indirect
|
||||||
github.com/tdewolff/parse/v2 v2.7.15 // indirect
|
github.com/tdewolff/parse/v2 v2.7.17 // indirect
|
||||||
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect
|
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect
|
||||||
github.com/toqueteos/webbrowser v1.2.0 // indirect
|
github.com/toqueteos/webbrowser v1.2.0 // indirect
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||||
|
|
16
go.sum
generated
16
go.sum
generated
|
@ -462,8 +462,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
|
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
|
||||||
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
|
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
|
||||||
github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI=
|
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
|
||||||
github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||||
|
@ -539,10 +539,10 @@ github.com/superseriousbusiness/httpsig v1.2.0-SSB h1:BinBGKbf2LSuVT5+MuH0XynHN9
|
||||||
github.com/superseriousbusiness/httpsig v1.2.0-SSB/go.mod h1:+rxfATjFaDoDIVaJOTSP0gj6UrbicaYPEptvCLC9F28=
|
github.com/superseriousbusiness/httpsig v1.2.0-SSB/go.mod h1:+rxfATjFaDoDIVaJOTSP0gj6UrbicaYPEptvCLC9F28=
|
||||||
github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8 h1:nTIhuP157oOFcscuoK1kCme1xTeGIzztSw70lX9NrDQ=
|
github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8 h1:nTIhuP157oOFcscuoK1kCme1xTeGIzztSw70lX9NrDQ=
|
||||||
github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8/go.mod h1:uYC/W92oVRJ49Vh1GcvTqpeFqHi+Ovrl2sMllQWRAEo=
|
github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8/go.mod h1:uYC/W92oVRJ49Vh1GcvTqpeFqHi+Ovrl2sMllQWRAEo=
|
||||||
github.com/tdewolff/minify/v2 v2.20.37 h1:Q97cx4STXCh1dlWDlNHZniE8BJ2EBL0+2b0n92BJQhw=
|
github.com/tdewolff/minify/v2 v2.21.0 h1:nAPP1UVx0aK1xsQh/JiG3xyEnnqWw+agPstn+V6Pkto=
|
||||||
github.com/tdewolff/minify/v2 v2.20.37/go.mod h1:L1VYef/jwKw6Wwyk5A+T0mBjjn3mMPgmjjA688RNsxU=
|
github.com/tdewolff/minify/v2 v2.21.0/go.mod h1:hGcthJ6Vj51NG+9QRIfN/DpWj5loHnY3bfhThzWWq08=
|
||||||
github.com/tdewolff/parse/v2 v2.7.15 h1:hysDXtdGZIRF5UZXwpfn3ZWRbm+ru4l53/ajBRGpCTw=
|
github.com/tdewolff/parse/v2 v2.7.17 h1:uC10p6DaQQORDy72eaIyD+AvAkaIUOouQ0nWp4uD0D0=
|
||||||
github.com/tdewolff/parse/v2 v2.7.15/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA=
|
github.com/tdewolff/parse/v2 v2.7.17/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA=
|
||||||
github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
|
github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
|
||||||
github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03u/dMQK9g+Iw9ewps4mCl1nB8Sscbo=
|
github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03u/dMQK9g+Iw9ewps4mCl1nB8Sscbo=
|
||||||
github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8=
|
github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8=
|
||||||
|
@ -621,8 +621,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
github.com/yuin/goldmark v1.7.6 h1:cZgJxVh5mL5cu8KOnwxvFJy5TFB0BHUskZZyq7TYbDg=
|
github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic=
|
||||||
github.com/yuin/goldmark v1.7.6/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
|
github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
|
||||||
gitlab.com/NyaaaWhatsUpDoc/sqlite v1.33.1-concurrency-workaround h1:pFMJnlc1PuH+jcVz4vz53vcpnoZG+NqFBr3qikDmEB4=
|
gitlab.com/NyaaaWhatsUpDoc/sqlite v1.33.1-concurrency-workaround h1:pFMJnlc1PuH+jcVz4vz53vcpnoZG+NqFBr3qikDmEB4=
|
||||||
gitlab.com/NyaaaWhatsUpDoc/sqlite v1.33.1-concurrency-workaround/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k=
|
gitlab.com/NyaaaWhatsUpDoc/sqlite v1.33.1-concurrency-workaround/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k=
|
||||||
go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
|
go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
|
||||||
|
|
|
@ -96,6 +96,7 @@ func (suite *AccountsGetTestSuite) TestAccountsGetFromTop() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -154,6 +155,7 @@ func (suite *AccountsGetTestSuite) TestAccountsGetFromTop() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -208,6 +210,7 @@ func (suite *AccountsGetTestSuite) TestAccountsGetFromTop() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 0,
|
"statuses_count": 0,
|
||||||
|
@ -252,9 +255,11 @@ func (suite *AccountsGetTestSuite) TestAccountsGetFromTop() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -302,6 +307,7 @@ func (suite *AccountsGetTestSuite) TestAccountsGetFromTop() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 0,
|
"statuses_count": 0,
|
||||||
|
@ -348,6 +354,7 @@ func (suite *AccountsGetTestSuite) TestAccountsGetFromTop() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 1,
|
"statuses_count": 1,
|
||||||
|
@ -393,6 +400,7 @@ func (suite *AccountsGetTestSuite) TestAccountsGetFromTop() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -439,6 +447,7 @@ func (suite *AccountsGetTestSuite) TestAccountsGetFromTop() {
|
||||||
"header": "http://localhost:8080/fileserver/062G5WYKY35KKD12EMSM3F8PJ8/header/original/01PFPMWK2FF0D9WMHEJHR07C3R.jpg",
|
"header": "http://localhost:8080/fileserver/062G5WYKY35KKD12EMSM3F8PJ8/header/original/01PFPMWK2FF0D9WMHEJHR07C3R.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/062G5WYKY35KKD12EMSM3F8PJ8/header/small/01PFPMWK2FF0D9WMHEJHR07C3R.webp",
|
"header_static": "http://localhost:8080/fileserver/062G5WYKY35KKD12EMSM3F8PJ8/header/small/01PFPMWK2FF0D9WMHEJHR07C3R.webp",
|
||||||
"header_description": "tweet from thoughts of dog: i drank. all the water. in my bowl. earlier. but just now. i returned. to the same bowl. and it was. full again.. the bowl. is haunted",
|
"header_description": "tweet from thoughts of dog: i drank. all the water. in my bowl. earlier. but just now. i returned. to the same bowl. and it was. full again.. the bowl. is haunted",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3R",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 0,
|
"statuses_count": 0,
|
||||||
|
@ -484,6 +493,7 @@ func (suite *AccountsGetTestSuite) TestAccountsGetFromTop() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 0,
|
"statuses_count": 0,
|
||||||
|
@ -568,6 +578,7 @@ func (suite *AccountsGetTestSuite) TestAccountsMinID() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 0,
|
"statuses_count": 0,
|
||||||
|
|
|
@ -183,6 +183,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetAll() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -228,6 +229,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetAll() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -286,6 +288,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetAll() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -340,6 +343,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetAll() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -407,6 +411,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetAll() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -465,6 +470,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetAll() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -512,6 +518,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetAll() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -657,6 +664,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetCreatedByAccount() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -715,6 +723,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetCreatedByAccount() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -762,6 +771,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetCreatedByAccount() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -907,6 +917,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetTargetAccount() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -965,6 +976,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetTargetAccount() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -1012,6 +1024,7 @@ func (suite *ReportsGetTestSuite) TestReportsGetTargetAccount() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
|
|
@ -97,6 +97,7 @@ func (suite *GetTestSuite) TestGet() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 1,
|
"statuses_count": 1,
|
||||||
|
|
|
@ -175,6 +175,7 @@ func validateInstanceUpdate(form *apimodel.InstanceSettingsUpdateRequest) error
|
||||||
form.ContactEmail == nil &&
|
form.ContactEmail == nil &&
|
||||||
form.ShortDescription == nil &&
|
form.ShortDescription == nil &&
|
||||||
form.Description == nil &&
|
form.Description == nil &&
|
||||||
|
form.CustomCSS == nil &&
|
||||||
form.Terms == nil &&
|
form.Terms == nil &&
|
||||||
form.Avatar == nil &&
|
form.Avatar == nil &&
|
||||||
form.AvatarDescription == nil &&
|
form.AvatarDescription == nil &&
|
||||||
|
|
|
@ -174,6 +174,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch1() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -314,6 +315,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch2() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -454,6 +456,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch3() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -645,6 +648,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch6() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -811,6 +815,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch8() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -988,6 +993,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch9() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
|
|
@ -148,7 +148,7 @@ func (suite *MutesTestSuite) TestIndefinitelyMutedAccountSerializesMuteExpiratio
|
||||||
|
|
||||||
// Fetch all muted accounts for the logged-in account.
|
// Fetch all muted accounts for the logged-in account.
|
||||||
// The expected body contains `"mute_expires_at":null`.
|
// The expected body contains `"mute_expires_at":null`.
|
||||||
_, err = suite.getMutedAccounts(http.StatusOK, `[{"id":"01F8MH5ZK5VRH73AKHQM6Y9VNX","username":"foss_satan","acct":"foss_satan@fossbros-anonymous.io","display_name":"big gerald","locked":false,"discoverable":true,"bot":false,"created_at":"2021-09-26T10:52:36.000Z","note":"i post about like, i dunno, stuff, or whatever!!!!","url":"http://fossbros-anonymous.io/@foss_satan","avatar":"","avatar_static":"","header":"http://localhost:8080/assets/default_header.webp","header_static":"http://localhost:8080/assets/default_header.webp","followers_count":0,"following_count":0,"statuses_count":3,"last_status_at":"2021-09-11","emojis":[],"fields":[],"mute_expires_at":null}]`)
|
_, err = suite.getMutedAccounts(http.StatusOK, `[{"id":"01F8MH5ZK5VRH73AKHQM6Y9VNX","username":"foss_satan","acct":"foss_satan@fossbros-anonymous.io","display_name":"big gerald","locked":false,"discoverable":true,"bot":false,"created_at":"2021-09-26T10:52:36.000Z","note":"i post about like, i dunno, stuff, or whatever!!!!","url":"http://fossbros-anonymous.io/@foss_satan","avatar":"","avatar_static":"","header":"http://localhost:8080/assets/default_header.webp","header_static":"http://localhost:8080/assets/default_header.webp","header_description":"Flat gray background (default header).","followers_count":0,"following_count":0,"statuses_count":3,"last_status_at":"2021-09-11","emojis":[],"fields":[],"mute_expires_at":null}]`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
suite.FailNow(err.Error())
|
suite.FailNow(err.Error())
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,6 +127,7 @@ func (suite *ReportGetTestSuite) TestGetReport1() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
|
|
@ -153,6 +153,7 @@ func (suite *ReportsGetTestSuite) TestGetReports() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -243,6 +244,7 @@ func (suite *ReportsGetTestSuite) TestGetReports4() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -317,6 +319,7 @@ func (suite *ReportsGetTestSuite) TestGetReports6() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -375,6 +378,7 @@ func (suite *ReportsGetTestSuite) TestGetReports7() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
|
|
@ -109,9 +109,11 @@ func (suite *StatusHistoryTestSuite) TestGetHistory() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
|
|
@ -127,9 +127,11 @@ func (suite *StatusMuteTestSuite) TestMuteUnmuteStatus() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -212,9 +214,11 @@ func (suite *StatusMuteTestSuite) TestMuteUnmuteStatus() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
|
|
@ -68,6 +68,10 @@ type Account struct {
|
||||||
// Description of this account's avatar, for alt text.
|
// Description of this account's avatar, for alt text.
|
||||||
// example: A cute drawing of a smiling sloth.
|
// example: A cute drawing of a smiling sloth.
|
||||||
AvatarDescription string `json:"avatar_description,omitempty"`
|
AvatarDescription string `json:"avatar_description,omitempty"`
|
||||||
|
// Database ID of the media attachment for this account's avatar image.
|
||||||
|
// Omitted if no avatar uploaded for this account (ie., default avatar).
|
||||||
|
// example: 01JAJ3XCD66K3T99JZESCR137W
|
||||||
|
AvatarMediaID string `json:"avatar_media_id,omitempty"`
|
||||||
// Web location of the account's header image.
|
// Web location of the account's header image.
|
||||||
// example: https://example.org/media/some_user/header/original/header.jpeg
|
// example: https://example.org/media/some_user/header/original/header.jpeg
|
||||||
Header string `json:"header"`
|
Header string `json:"header"`
|
||||||
|
@ -78,6 +82,10 @@ type Account struct {
|
||||||
// Description of this account's header, for alt text.
|
// Description of this account's header, for alt text.
|
||||||
// example: A sunlit field with purple flowers.
|
// example: A sunlit field with purple flowers.
|
||||||
HeaderDescription string `json:"header_description,omitempty"`
|
HeaderDescription string `json:"header_description,omitempty"`
|
||||||
|
// Database ID of the media attachment for this account's header image.
|
||||||
|
// Omitted if no header uploaded for this account (ie., default header).
|
||||||
|
// example: 01JAJ3XCD66K3T99JZESCR137W
|
||||||
|
HeaderMediaID string `json:"header_media_id,omitempty"`
|
||||||
// Number of accounts following this account, according to our instance.
|
// Number of accounts following this account, according to our instance.
|
||||||
FollowersCount int `json:"followers_count"`
|
FollowersCount int `json:"followers_count"`
|
||||||
// Number of account's followed by this account, according to our instance.
|
// Number of account's followed by this account, according to our instance.
|
||||||
|
|
|
@ -33,6 +33,8 @@ type InstanceSettingsUpdateRequest struct {
|
||||||
ShortDescription *string `form:"short_description" json:"short_description" xml:"short_description"`
|
ShortDescription *string `form:"short_description" json:"short_description" xml:"short_description"`
|
||||||
// Longer description of the instance, max 5,000 chars. HTML formatting accepted.
|
// Longer description of the instance, max 5,000 chars. HTML formatting accepted.
|
||||||
Description *string `form:"description" json:"description" xml:"description"`
|
Description *string `form:"description" json:"description" xml:"description"`
|
||||||
|
// Custom CSS for the instance.
|
||||||
|
CustomCSS *string `form:"custom_css" json:"custom_css,omitempty" xml:"custom_css"`
|
||||||
// Terms and conditions of the instance, max 5,000 chars. HTML formatting accepted.
|
// Terms and conditions of the instance, max 5,000 chars. HTML formatting accepted.
|
||||||
Terms *string `form:"terms" json:"terms" xml:"terms"`
|
Terms *string `form:"terms" json:"terms" xml:"terms"`
|
||||||
// Image to use as the instance thumbnail.
|
// Image to use as the instance thumbnail.
|
||||||
|
|
|
@ -38,6 +38,8 @@ type InstanceV1 struct {
|
||||||
//
|
//
|
||||||
// This should be displayed on the 'about' page for an instance.
|
// This should be displayed on the 'about' page for an instance.
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
|
// Custom CSS for the instance.
|
||||||
|
CustomCSS string `json:"custom_css,omitempty"`
|
||||||
// Raw (unparsed) version of description.
|
// Raw (unparsed) version of description.
|
||||||
DescriptionText string `json:"description_text,omitempty"`
|
DescriptionText string `json:"description_text,omitempty"`
|
||||||
// A shorter description of the instance.
|
// A shorter description of the instance.
|
||||||
|
|
|
@ -53,6 +53,8 @@ type InstanceV2 struct {
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
// Raw (unparsed) version of description.
|
// Raw (unparsed) version of description.
|
||||||
DescriptionText string `json:"description_text,omitempty"`
|
DescriptionText string `json:"description_text,omitempty"`
|
||||||
|
// Instance Custom Css
|
||||||
|
CustomCSS string `json:"custom_css,omitempty"`
|
||||||
// Basic anonymous usage data for this instance.
|
// Basic anonymous usage data for this instance.
|
||||||
Usage InstanceV2Usage `json:"usage"`
|
Usage InstanceV2Usage `json:"usage"`
|
||||||
// An image used to represent this instance.
|
// An image used to represent this instance.
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
// GoToSocial
|
||||||
|
// Copyright (C) GoToSocial Authors admin@gotosocial.org
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
//
|
||||||
|
// 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, 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 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/>.
|
||||||
|
|
||||||
|
package migrations
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/uptrace/bun"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
up := func(ctx context.Context, db *bun.DB) error {
|
||||||
|
_, err := db.ExecContext(ctx, "ALTER TABLE ? ADD COLUMN ? TEXT", bun.Ident("instances"), bun.Ident("custom_css"))
|
||||||
|
if err != nil && !(strings.Contains(err.Error(), "already exists") || strings.Contains(err.Error(), "duplicate column name") || strings.Contains(err.Error(), "SQLSTATE 42701")) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
down := func(ctx context.Context, db *bun.DB) error {
|
||||||
|
_, err := db.ExecContext(ctx, "ALTER TABLE ? DROP COLUMN ?", bun.Ident("instances"), bun.Ident("custom_css"))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := Migrations.Register(up, down); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
|
@ -34,6 +34,7 @@ type Instance struct {
|
||||||
ShortDescriptionText string `bun:""` // Raw text version of short description (before parsing).
|
ShortDescriptionText string `bun:""` // Raw text version of short description (before parsing).
|
||||||
Description string `bun:""` // Longer description of this instance.
|
Description string `bun:""` // Longer description of this instance.
|
||||||
DescriptionText string `bun:""` // Raw text version of long description (before parsing).
|
DescriptionText string `bun:""` // Raw text version of long description (before parsing).
|
||||||
|
CustomCSS string `bun:",nullzero"` // Custom CSS for the instance.
|
||||||
Terms string `bun:""` // Terms and conditions of this instance.
|
Terms string `bun:""` // Terms and conditions of this instance.
|
||||||
TermsText string `bun:""` // Raw text version of terms (before parsing).
|
TermsText string `bun:""` // Raw text version of terms (before parsing).
|
||||||
ContactEmail string `bun:""` // Contact email address for this instance
|
ContactEmail string `bun:""` // Contact email address for this instance
|
||||||
|
|
|
@ -227,6 +227,17 @@ func (p *Processor) InstancePatch(ctx context.Context, form *apimodel.InstanceSe
|
||||||
columns = append(columns, []string{"description", "description_text"}...)
|
columns = append(columns, []string{"description", "description_text"}...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// validate & update site custom css if it's set on the form
|
||||||
|
if form.CustomCSS != nil {
|
||||||
|
customCSS := *form.CustomCSS
|
||||||
|
if err := validate.InstanceCustomCSS(customCSS); err != nil {
|
||||||
|
return nil, gtserror.NewErrorBadRequest(err, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
instance.CustomCSS = text.SanitizeToPlaintext(customCSS)
|
||||||
|
columns = append(columns, []string{"custom_css"}...)
|
||||||
|
}
|
||||||
|
|
||||||
// Validate & update site
|
// Validate & update site
|
||||||
// terms if set on the form.
|
// terms if set on the form.
|
||||||
if form.Terms != nil {
|
if form.Terms != nil {
|
||||||
|
|
|
@ -76,6 +76,7 @@ func (suite *NotificationTestSuite) TestStreamNotification() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
|
|
@ -87,6 +87,7 @@ func (suite *StatusUpdateTestSuite) TestStreamNotification() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
|
|
@ -117,6 +117,9 @@ func (c *Converter) ensureAvatar(account *apimodel.Account) {
|
||||||
|
|
||||||
account.Avatar = avatar
|
account.Avatar = avatar
|
||||||
account.AvatarStatic = avatar
|
account.AvatarStatic = avatar
|
||||||
|
|
||||||
|
const defaultAviDesc = "Grayed-out line drawing of a cute sloth (default avatar)."
|
||||||
|
account.AvatarDescription = defaultAviDesc
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensureHeader ensures that the given account has a value set
|
// ensureHeader ensures that the given account has a value set
|
||||||
|
@ -134,4 +137,7 @@ func (c *Converter) ensureHeader(account *apimodel.Account) {
|
||||||
h := config.GetProtocol() + "://" + config.GetHost() + defaultHeaderPath
|
h := config.GetProtocol() + "://" + config.GetHost() + defaultHeaderPath
|
||||||
account.Header = h
|
account.Header = h
|
||||||
account.HeaderStatic = h
|
account.HeaderStatic = h
|
||||||
|
|
||||||
|
const defaultHeaderDesc = "Flat gray background (default header)."
|
||||||
|
account.HeaderDescription = defaultHeaderDesc
|
||||||
}
|
}
|
||||||
|
|
|
@ -270,21 +270,25 @@ func (c *Converter) accountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A
|
||||||
// - Emojis
|
// - Emojis
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
aviID string
|
||||||
aviURL string
|
aviURL string
|
||||||
aviURLStatic string
|
aviURLStatic string
|
||||||
aviDesc string
|
aviDesc string
|
||||||
|
headerID string
|
||||||
headerURL string
|
headerURL string
|
||||||
headerURLStatic string
|
headerURLStatic string
|
||||||
headerDesc string
|
headerDesc string
|
||||||
)
|
)
|
||||||
|
|
||||||
if a.AvatarMediaAttachment != nil {
|
if a.AvatarMediaAttachment != nil {
|
||||||
|
aviID = a.AvatarMediaAttachmentID
|
||||||
aviURL = a.AvatarMediaAttachment.URL
|
aviURL = a.AvatarMediaAttachment.URL
|
||||||
aviURLStatic = a.AvatarMediaAttachment.Thumbnail.URL
|
aviURLStatic = a.AvatarMediaAttachment.Thumbnail.URL
|
||||||
aviDesc = a.AvatarMediaAttachment.Description
|
aviDesc = a.AvatarMediaAttachment.Description
|
||||||
}
|
}
|
||||||
|
|
||||||
if a.HeaderMediaAttachment != nil {
|
if a.HeaderMediaAttachment != nil {
|
||||||
|
headerID = a.HeaderMediaAttachmentID
|
||||||
headerURL = a.HeaderMediaAttachment.URL
|
headerURL = a.HeaderMediaAttachment.URL
|
||||||
headerURLStatic = a.HeaderMediaAttachment.Thumbnail.URL
|
headerURLStatic = a.HeaderMediaAttachment.Thumbnail.URL
|
||||||
headerDesc = a.HeaderMediaAttachment.Description
|
headerDesc = a.HeaderMediaAttachment.Description
|
||||||
|
@ -367,9 +371,11 @@ func (c *Converter) accountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A
|
||||||
Avatar: aviURL,
|
Avatar: aviURL,
|
||||||
AvatarStatic: aviURLStatic,
|
AvatarStatic: aviURLStatic,
|
||||||
AvatarDescription: aviDesc,
|
AvatarDescription: aviDesc,
|
||||||
|
AvatarMediaID: aviID,
|
||||||
Header: headerURL,
|
Header: headerURL,
|
||||||
HeaderStatic: headerURLStatic,
|
HeaderStatic: headerURLStatic,
|
||||||
HeaderDescription: headerDesc,
|
HeaderDescription: headerDesc,
|
||||||
|
HeaderMediaID: headerID,
|
||||||
FollowersCount: followersCount,
|
FollowersCount: followersCount,
|
||||||
FollowingCount: followingCount,
|
FollowingCount: followingCount,
|
||||||
StatusesCount: statusesCount,
|
StatusesCount: statusesCount,
|
||||||
|
@ -1523,6 +1529,7 @@ func (c *Converter) InstanceToAPIV1Instance(ctx context.Context, i *gtsmodel.Ins
|
||||||
Title: i.Title,
|
Title: i.Title,
|
||||||
Description: i.Description,
|
Description: i.Description,
|
||||||
DescriptionText: i.DescriptionText,
|
DescriptionText: i.DescriptionText,
|
||||||
|
CustomCSS: i.CustomCSS,
|
||||||
ShortDescription: i.ShortDescription,
|
ShortDescription: i.ShortDescription,
|
||||||
ShortDescriptionText: i.ShortDescriptionText,
|
ShortDescriptionText: i.ShortDescriptionText,
|
||||||
Email: i.ContactEmail,
|
Email: i.ContactEmail,
|
||||||
|
@ -1644,6 +1651,7 @@ func (c *Converter) InstanceToAPIV2Instance(ctx context.Context, i *gtsmodel.Ins
|
||||||
SourceURL: instanceSourceURL,
|
SourceURL: instanceSourceURL,
|
||||||
Description: i.Description,
|
Description: i.Description,
|
||||||
DescriptionText: i.DescriptionText,
|
DescriptionText: i.DescriptionText,
|
||||||
|
CustomCSS: i.CustomCSS,
|
||||||
Usage: apimodel.InstanceV2Usage{}, // todo: not implemented
|
Usage: apimodel.InstanceV2Usage{}, // todo: not implemented
|
||||||
Languages: config.GetInstanceLanguages().TagStrs(),
|
Languages: config.GetInstanceLanguages().TagStrs(),
|
||||||
Rules: c.InstanceRulesToAPIRules(i.Rules),
|
Rules: c.InstanceRulesToAPIRules(i.Rules),
|
||||||
|
|
|
@ -60,9 +60,11 @@ func (suite *InternalToFrontendTestSuite) TestAccountToFrontend() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -110,9 +112,11 @@ func (suite *InternalToFrontendTestSuite) TestAccountToFrontendAliasedAndMoved()
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -155,6 +159,7 @@ func (suite *InternalToFrontendTestSuite) TestAccountToFrontendAliasedAndMoved()
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -205,9 +210,11 @@ func (suite *InternalToFrontendTestSuite) TestAccountToFrontendWithEmojiStruct()
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -252,9 +259,11 @@ func (suite *InternalToFrontendTestSuite) TestAccountToFrontendWithEmojiIDs() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -295,9 +304,11 @@ func (suite *InternalToFrontendTestSuite) TestAccountToFrontendSensitive() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -352,6 +363,7 @@ func (suite *InternalToFrontendTestSuite) TestAccountToFrontendPublicPunycode()
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 0,
|
"statuses_count": 0,
|
||||||
|
@ -390,6 +402,7 @@ func (suite *InternalToFrontendTestSuite) TestLocalInstanceAccountToFrontendPubl
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 0,
|
"statuses_count": 0,
|
||||||
|
@ -428,6 +441,7 @@ func (suite *InternalToFrontendTestSuite) TestLocalInstanceAccountToFrontendBloc
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 0,
|
"statuses_count": 0,
|
||||||
|
@ -486,6 +500,7 @@ func (suite *InternalToFrontendTestSuite) TestStatusToFrontend() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -663,6 +678,7 @@ func (suite *InternalToFrontendTestSuite) TestWarnFilteredStatusToFrontend() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -847,9 +863,11 @@ func (suite *InternalToFrontendTestSuite) TestWarnFilteredBoostToFrontend() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -977,6 +995,7 @@ func (suite *InternalToFrontendTestSuite) TestWarnFilteredBoostToFrontend() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -1232,6 +1251,7 @@ func (suite *InternalToFrontendTestSuite) TestStatusToFrontendUnknownAttachments
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 1,
|
"statuses_count": 1,
|
||||||
|
@ -1395,6 +1415,7 @@ func (suite *InternalToFrontendTestSuite) TestStatusToWebStatus() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 1,
|
"statuses_count": 1,
|
||||||
|
@ -1527,6 +1548,7 @@ func (suite *InternalToFrontendTestSuite) TestStatusToFrontendUnknownLanguage()
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -1668,9 +1690,11 @@ func (suite *InternalToFrontendTestSuite) TestStatusToFrontendPartialInteraction
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -1777,6 +1801,7 @@ func (suite *InternalToFrontendTestSuite) TestStatusToAPIStatusPendingApproval()
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -1987,6 +2012,7 @@ func (suite *InternalToFrontendTestSuite) TestInstanceV1ToFrontend() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -2127,6 +2153,7 @@ func (suite *InternalToFrontendTestSuite) TestInstanceV2ToFrontend() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -2247,6 +2274,7 @@ func (suite *InternalToFrontendTestSuite) TestReportToFrontend1() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -2290,6 +2318,7 @@ func (suite *InternalToFrontendTestSuite) TestReportToFrontend2() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -2366,6 +2395,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontend1() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -2411,6 +2441,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontend1() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -2469,6 +2500,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontend1() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -2523,6 +2555,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontend1() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -2600,6 +2633,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontend2() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -2658,6 +2692,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontend2() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -2705,6 +2740,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontend2() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -2863,6 +2899,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontendSuspendedLoca
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 3,
|
"statuses_count": 3,
|
||||||
|
@ -2908,6 +2945,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontendSuspendedLoca
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 0,
|
"followers_count": 0,
|
||||||
"following_count": 0,
|
"following_count": 0,
|
||||||
"statuses_count": 0,
|
"statuses_count": 0,
|
||||||
|
@ -2955,6 +2993,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontendSuspendedLoca
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -3009,6 +3048,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontendSuspendedLoca
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -3155,6 +3195,7 @@ func (suite *InternalToFrontendTestSuite) TestIntReqToAPI() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -3210,6 +3251,7 @@ func (suite *InternalToFrontendTestSuite) TestIntReqToAPI() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -3302,6 +3344,7 @@ func (suite *InternalToFrontendTestSuite) TestIntReqToAPI() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 4,
|
"statuses_count": 4,
|
||||||
|
@ -3414,9 +3457,11 @@ func (suite *InternalToFrontendTestSuite) TestConversationToAPISelfConvo() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -3465,9 +3510,11 @@ func (suite *InternalToFrontendTestSuite) TestConversationToAPISelfConvo() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -3569,6 +3616,7 @@ func (suite *InternalToFrontendTestSuite) TestConversationToAPI() {
|
||||||
"avatar_static": "",
|
"avatar_static": "",
|
||||||
"header": "http://localhost:8080/assets/default_header.webp",
|
"header": "http://localhost:8080/assets/default_header.webp",
|
||||||
"header_static": "http://localhost:8080/assets/default_header.webp",
|
"header_static": "http://localhost:8080/assets/default_header.webp",
|
||||||
|
"header_description": "Flat gray background (default header).",
|
||||||
"followers_count": 1,
|
"followers_count": 1,
|
||||||
"following_count": 1,
|
"following_count": 1,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
@ -3628,9 +3676,11 @@ func (suite *InternalToFrontendTestSuite) TestConversationToAPI() {
|
||||||
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
"avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg",
|
||||||
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
"avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.webp",
|
||||||
"avatar_description": "a green goblin looking nasty",
|
"avatar_description": "a green goblin looking nasty",
|
||||||
|
"avatar_media_id": "01F8MH58A357CV5K7R7TJMSH6S",
|
||||||
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
"header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg",
|
||||||
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
"header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.webp",
|
||||||
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
"header_description": "A very old-school screenshot of the original team fortress mod for quake",
|
||||||
|
"header_media_id": "01PFPMWK2FF0D9WMHEJHR07C3Q",
|
||||||
"followers_count": 2,
|
"followers_count": 2,
|
||||||
"following_count": 2,
|
"following_count": 2,
|
||||||
"statuses_count": 8,
|
"statuses_count": 8,
|
||||||
|
|
|
@ -189,6 +189,16 @@ func CustomCSS(customCSS string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func InstanceCustomCSS(customCSS string) error {
|
||||||
|
|
||||||
|
maximumCustomCSSLength := config.GetAccountsCustomCSSLength()
|
||||||
|
if length := len([]rune(customCSS)); length > maximumCustomCSSLength {
|
||||||
|
return fmt.Errorf("custom_css must be less than %d characters, but submitted custom_css was %d characters", maximumCustomCSSLength, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// EmojiShortcode just runs the given shortcode through the regular expression
|
// EmojiShortcode just runs the given shortcode through the regular expression
|
||||||
// for emoji shortcodes, to figure out whether it's a valid shortcode, ie., 2-30 characters,
|
// for emoji shortcodes, to figure out whether it's a valid shortcode, ie., 2-30 characters,
|
||||||
// a-zA-Z, numbers, and underscores.
|
// a-zA-Z, numbers, and underscores.
|
||||||
|
|
|
@ -54,7 +54,7 @@ func (m *Module) aboutGETHandler(c *gin.Context) {
|
||||||
Template: "about.tmpl",
|
Template: "about.tmpl",
|
||||||
Instance: instance,
|
Instance: instance,
|
||||||
OGMeta: apiutil.OGBase(instance),
|
OGMeta: apiutil.OGBase(instance),
|
||||||
Stylesheets: []string{cssAbout},
|
Stylesheets: []string{cssAbout, instanceCustomCSSPath},
|
||||||
Extra: map[string]any{
|
Extra: map[string]any{
|
||||||
"showStrap": true,
|
"showStrap": true,
|
||||||
"blocklistExposed": config.GetInstanceExposeSuspendedWeb(),
|
"blocklistExposed": config.GetInstanceExposeSuspendedWeb(),
|
||||||
|
|
|
@ -127,8 +127,9 @@ func (m *Module) confirmEmailPOSTHandler(c *gin.Context) {
|
||||||
// Serve page informing user that their
|
// Serve page informing user that their
|
||||||
// email address is now confirmed.
|
// email address is now confirmed.
|
||||||
page := apiutil.WebPage{
|
page := apiutil.WebPage{
|
||||||
Template: "confirmed_email.tmpl",
|
Template: "confirmed_email.tmpl",
|
||||||
Instance: instance,
|
Instance: instance,
|
||||||
|
Stylesheets: []string{instanceCustomCSSPath},
|
||||||
Extra: map[string]any{
|
Extra: map[string]any{
|
||||||
"email": user.Email,
|
"email": user.Email,
|
||||||
"username": user.Account.Username,
|
"username": user.Account.Username,
|
||||||
|
|
|
@ -55,3 +55,22 @@ func (m *Module) customCSSGETHandler(c *gin.Context) {
|
||||||
c.Header(cacheControlHeader, cacheControlNoCache)
|
c.Header(cacheControlHeader, cacheControlNoCache)
|
||||||
c.Data(http.StatusOK, textCSSUTF8, []byte(customCSS))
|
c.Data(http.StatusOK, textCSSUTF8, []byte(customCSS))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Module) instanceCustomCSSGETHandler(c *gin.Context) {
|
||||||
|
|
||||||
|
if _, err := apiutil.NegotiateAccept(c, apiutil.TextCSS); err != nil {
|
||||||
|
apiutil.WebErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
instanceV1, errWithCode := m.processor.InstanceGetV1(c.Request.Context())
|
||||||
|
if errWithCode != nil {
|
||||||
|
apiutil.WebErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
instanceCustomCSS := instanceV1.CustomCSS
|
||||||
|
|
||||||
|
c.Header(cacheControlHeader, cacheControlNoCache)
|
||||||
|
c.Data(http.StatusOK, textCSSUTF8, []byte(instanceCustomCSS))
|
||||||
|
}
|
||||||
|
|
|
@ -67,7 +67,7 @@ func (m *Module) domainBlockListGETHandler(c *gin.Context) {
|
||||||
Template: "domain-blocklist.tmpl",
|
Template: "domain-blocklist.tmpl",
|
||||||
Instance: instance,
|
Instance: instance,
|
||||||
OGMeta: apiutil.OGBase(instance),
|
OGMeta: apiutil.OGBase(instance),
|
||||||
Stylesheets: []string{cssFA},
|
Stylesheets: []string{cssFA, instanceCustomCSSPath},
|
||||||
Javascript: []string{jsFrontend},
|
Javascript: []string{jsFrontend},
|
||||||
Extra: map[string]any{"blocklist": domainBlocks},
|
Extra: map[string]any{"blocklist": domainBlocks},
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,7 @@ func (m *Module) indexHandler(c *gin.Context) {
|
||||||
Template: "index.tmpl",
|
Template: "index.tmpl",
|
||||||
Instance: instance,
|
Instance: instance,
|
||||||
OGMeta: apiutil.OGBase(instance),
|
OGMeta: apiutil.OGBase(instance),
|
||||||
Stylesheets: []string{cssAbout, cssIndex},
|
Stylesheets: []string{cssAbout, cssIndex, instanceCustomCSSPath},
|
||||||
Extra: map[string]any{"showStrap": true},
|
Extra: map[string]any{"showStrap": true},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -132,7 +132,7 @@ func (m *Module) profileGETHandler(c *gin.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepare stylesheets for profile.
|
// Prepare stylesheets for profile.
|
||||||
stylesheets := make([]string, 0, 6)
|
stylesheets := make([]string, 0, 7)
|
||||||
|
|
||||||
// Basic profile stylesheets.
|
// Basic profile stylesheets.
|
||||||
stylesheets = append(
|
stylesheets = append(
|
||||||
|
@ -142,6 +142,7 @@ func (m *Module) profileGETHandler(c *gin.Context) {
|
||||||
cssStatus,
|
cssStatus,
|
||||||
cssThread,
|
cssThread,
|
||||||
cssProfile,
|
cssProfile,
|
||||||
|
instanceCustomCSSPath,
|
||||||
}...,
|
}...,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ func (m *Module) SettingsPanelHandler(c *gin.Context) {
|
||||||
cssProfile, // Used for rendering stub/fake profiles.
|
cssProfile, // Used for rendering stub/fake profiles.
|
||||||
cssStatus, // Used for rendering stub/fake statuses.
|
cssStatus, // Used for rendering stub/fake statuses.
|
||||||
cssSettings,
|
cssSettings,
|
||||||
|
instanceCustomCSSPath,
|
||||||
},
|
},
|
||||||
Javascript: []string{jsSettings},
|
Javascript: []string{jsSettings},
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,9 +126,10 @@ func (m *Module) signupPOSTHandler(c *gin.Context) {
|
||||||
// Serve a page informing the
|
// Serve a page informing the
|
||||||
// user that they've signed up.
|
// user that they've signed up.
|
||||||
page := apiutil.WebPage{
|
page := apiutil.WebPage{
|
||||||
Template: "signed-up.tmpl",
|
Template: "signed-up.tmpl",
|
||||||
Instance: instance,
|
Instance: instance,
|
||||||
OGMeta: apiutil.OGBase(instance),
|
Stylesheets: []string{instanceCustomCSSPath},
|
||||||
|
OGMeta: apiutil.OGBase(instance),
|
||||||
Extra: map[string]any{
|
Extra: map[string]any{
|
||||||
"email": user.UnconfirmedEmail,
|
"email": user.UnconfirmedEmail,
|
||||||
"username": user.Account.Username,
|
"username": user.Account.Username,
|
||||||
|
|
|
@ -59,7 +59,7 @@ func (m *Module) tagGETHandler(c *gin.Context) {
|
||||||
Template: "tag.tmpl",
|
Template: "tag.tmpl",
|
||||||
Instance: instance,
|
Instance: instance,
|
||||||
OGMeta: apiutil.OGBase(instance),
|
OGMeta: apiutil.OGBase(instance),
|
||||||
Stylesheets: []string{cssFA, cssThread, cssTag},
|
Stylesheets: []string{cssFA, cssThread, cssTag, instanceCustomCSSPath},
|
||||||
Extra: map[string]any{"tagName": tagName},
|
Extra: map[string]any{"tagName": tagName},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ func (m *Module) threadGETHandler(c *gin.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepare stylesheets for thread.
|
// Prepare stylesheets for thread.
|
||||||
stylesheets := make([]string, 0, 5)
|
stylesheets := make([]string, 0, 6)
|
||||||
|
|
||||||
// Basic thread stylesheets.
|
// Basic thread stylesheets.
|
||||||
stylesheets = append(
|
stylesheets = append(
|
||||||
|
@ -131,6 +131,7 @@ func (m *Module) threadGETHandler(c *gin.Context) {
|
||||||
if theme := targetAccount.Theme; theme != "" {
|
if theme := targetAccount.Theme; theme != "" {
|
||||||
stylesheets = append(
|
stylesheets = append(
|
||||||
stylesheets,
|
stylesheets,
|
||||||
|
instanceCustomCSSPath,
|
||||||
themesPathPrefix+"/"+theme,
|
themesPathPrefix+"/"+theme,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,20 +36,21 @@
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
confirmEmailPath = "/" + uris.ConfirmEmailPath
|
confirmEmailPath = "/" + uris.ConfirmEmailPath
|
||||||
profileGroupPath = "/@:username"
|
profileGroupPath = "/@:username"
|
||||||
statusPath = "/statuses/:" + apiutil.WebStatusIDKey // leave out the '/@:username' prefix as this will be served within the profile group
|
statusPath = "/statuses/:" + apiutil.WebStatusIDKey // leave out the '/@:username' prefix as this will be served within the profile group
|
||||||
tagsPath = "/tags/:" + apiutil.TagNameKey
|
tagsPath = "/tags/:" + apiutil.TagNameKey
|
||||||
customCSSPath = profileGroupPath + "/custom.css"
|
customCSSPath = profileGroupPath + "/custom.css"
|
||||||
rssFeedPath = profileGroupPath + "/feed.rss"
|
instanceCustomCSSPath = "/custom.css"
|
||||||
assetsPathPrefix = "/assets"
|
rssFeedPath = profileGroupPath + "/feed.rss"
|
||||||
distPathPrefix = assetsPathPrefix + "/dist"
|
assetsPathPrefix = "/assets"
|
||||||
themesPathPrefix = assetsPathPrefix + "/themes"
|
distPathPrefix = assetsPathPrefix + "/dist"
|
||||||
settingsPathPrefix = "/settings"
|
themesPathPrefix = assetsPathPrefix + "/themes"
|
||||||
settingsPanelGlob = settingsPathPrefix + "/*panel"
|
settingsPathPrefix = "/settings"
|
||||||
userPanelPath = settingsPathPrefix + "/user"
|
settingsPanelGlob = settingsPathPrefix + "/*panel"
|
||||||
adminPanelPath = settingsPathPrefix + "/admin"
|
userPanelPath = settingsPathPrefix + "/user"
|
||||||
signupPath = "/signup"
|
adminPanelPath = settingsPathPrefix + "/admin"
|
||||||
|
signupPath = "/signup"
|
||||||
|
|
||||||
cacheControlHeader = "Cache-Control" // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
|
cacheControlHeader = "Cache-Control" // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
|
||||||
cacheControlNoCache = "no-cache" // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#response_directives
|
cacheControlNoCache = "no-cache" // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#response_directives
|
||||||
|
@ -114,6 +115,7 @@ func (m *Module) Route(r *router.Router, mi ...gin.HandlerFunc) {
|
||||||
r.AttachHandler(http.MethodGet, settingsPathPrefix, m.SettingsPanelHandler)
|
r.AttachHandler(http.MethodGet, settingsPathPrefix, m.SettingsPanelHandler)
|
||||||
r.AttachHandler(http.MethodGet, settingsPanelGlob, m.SettingsPanelHandler)
|
r.AttachHandler(http.MethodGet, settingsPanelGlob, m.SettingsPanelHandler)
|
||||||
r.AttachHandler(http.MethodGet, customCSSPath, m.customCSSGETHandler)
|
r.AttachHandler(http.MethodGet, customCSSPath, m.customCSSGETHandler)
|
||||||
|
r.AttachHandler(http.MethodGet, instanceCustomCSSPath, m.instanceCustomCSSGETHandler)
|
||||||
r.AttachHandler(http.MethodGet, rssFeedPath, m.rssFeedGETHandler)
|
r.AttachHandler(http.MethodGet, rssFeedPath, m.rssFeedGETHandler)
|
||||||
r.AttachHandler(http.MethodGet, confirmEmailPath, m.confirmEmailGETHandler)
|
r.AttachHandler(http.MethodGet, confirmEmailPath, m.confirmEmailGETHandler)
|
||||||
r.AttachHandler(http.MethodPost, confirmEmailPath, m.confirmEmailPOSTHandler)
|
r.AttachHandler(http.MethodPost, confirmEmailPath, m.confirmEmailPOSTHandler)
|
||||||
|
|
6
vendor/github.com/tdewolff/minify/v2/html/html.go
generated
vendored
6
vendor/github.com/tdewolff/minify/v2/html/html.go
generated
vendored
|
@ -199,7 +199,7 @@ func (o *Minifier) Minify(m *minify.M, w io.Writer, r io.Reader, _ map[string]st
|
||||||
} else if next.TokenType == html.TextToken && !parse.IsAllWhitespace(next.Data) {
|
} else if next.TokenType == html.TextToken && !parse.IsAllWhitespace(next.Data) {
|
||||||
// stop looking when text encountered
|
// stop looking when text encountered
|
||||||
break
|
break
|
||||||
} else if next.TokenType == html.StartTagToken || next.TokenType == html.EndTagToken {
|
} else if next.TokenType == html.StartTagToken || next.TokenType == html.EndTagToken || next.TokenType == html.SvgToken || next.TokenType == html.MathToken {
|
||||||
if o.KeepWhitespace {
|
if o.KeepWhitespace {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -208,7 +208,7 @@ func (o *Minifier) Minify(m *minify.M, w io.Writer, r io.Reader, _ map[string]st
|
||||||
t.Data = t.Data[:len(t.Data)-1]
|
t.Data = t.Data[:len(t.Data)-1]
|
||||||
omitSpace = false
|
omitSpace = false
|
||||||
break
|
break
|
||||||
} else if next.TokenType == html.StartTagToken {
|
} else if next.TokenType == html.StartTagToken || next.TokenType == html.SvgToken || next.TokenType == html.MathToken {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -309,7 +309,7 @@ func (o *Minifier) Minify(m *minify.M, w io.Writer, r io.Reader, _ map[string]st
|
||||||
|
|
||||||
// skip text in select and optgroup tags
|
// skip text in select and optgroup tags
|
||||||
if t.Hash == Option || t.Hash == Optgroup {
|
if t.Hash == Option || t.Hash == Optgroup {
|
||||||
if next := tb.Peek(0); next.TokenType == html.TextToken {
|
if next := tb.Peek(0); next.TokenType == html.TextToken && !next.HasTemplate {
|
||||||
tb.Shift()
|
tb.Shift()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
4
vendor/github.com/tdewolff/minify/v2/html/table.go
generated
vendored
4
vendor/github.com/tdewolff/minify/v2/html/table.go
generated
vendored
|
@ -74,7 +74,7 @@
|
||||||
Input: objectTag,
|
Input: objectTag,
|
||||||
Ins: keepPTag,
|
Ins: keepPTag,
|
||||||
Kbd: normalTag,
|
Kbd: normalTag,
|
||||||
Label: normalTag,
|
Label: normalTag | keepPTag, // experimentally, keepPTag is needed
|
||||||
Legend: blockTag,
|
Legend: blockTag,
|
||||||
Li: blockTag,
|
Li: blockTag,
|
||||||
Link: normalTag,
|
Link: normalTag,
|
||||||
|
@ -125,7 +125,7 @@
|
||||||
Th: blockTag,
|
Th: blockTag,
|
||||||
Thead: blockTag,
|
Thead: blockTag,
|
||||||
Time: normalTag,
|
Time: normalTag,
|
||||||
Title: normalTag,
|
Title: blockTag,
|
||||||
Tr: blockTag,
|
Tr: blockTag,
|
||||||
Track: normalTag,
|
Track: normalTag,
|
||||||
U: normalTag,
|
U: normalTag,
|
||||||
|
|
317
vendor/github.com/tdewolff/parse/v2/binary.go
generated
vendored
317
vendor/github.com/tdewolff/parse/v2/binary.go
generated
vendored
|
@ -2,12 +2,15 @@
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const PageSize = 4096
|
||||||
|
|
||||||
// BinaryReader is a binary big endian file format reader.
|
// BinaryReader is a binary big endian file format reader.
|
||||||
type BinaryReader struct {
|
type BinaryReader struct {
|
||||||
Endianness binary.ByteOrder
|
Endianness binary.ByteOrder
|
||||||
|
@ -330,6 +333,320 @@ func (r *BinaryFileReader) ReadInt64() int64 {
|
||||||
return int64(r.ReadUint64())
|
return int64(r.ReadUint64())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IBinaryReader interface {
|
||||||
|
Close() error
|
||||||
|
Len() int
|
||||||
|
Bytes(int, int64) ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type binaryReaderFile struct {
|
||||||
|
f *os.File
|
||||||
|
size int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func newBinaryReaderFile(filename string) (*binaryReaderFile, error) {
|
||||||
|
f, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
fi, err := f.Stat()
|
||||||
|
if err != nil {
|
||||||
|
f.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &binaryReaderFile{f, fi.Size()}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the reader.
|
||||||
|
func (r *binaryReaderFile) Close() error {
|
||||||
|
return r.f.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns the length of the underlying memory-mapped file.
|
||||||
|
func (r *binaryReaderFile) Len() int {
|
||||||
|
return int(r.size)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *binaryReaderFile) Bytes(n int, off int64) ([]byte, error) {
|
||||||
|
if _, err := r.f.Seek(off, 0); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
b := make([]byte, n)
|
||||||
|
m, err := r.f.Read(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
} else if m != n {
|
||||||
|
return nil, errors.New("file: could not read all bytes")
|
||||||
|
}
|
||||||
|
return b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type binaryReaderBytes struct {
|
||||||
|
data []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func newBinaryReaderBytes(data []byte) (*binaryReaderBytes, error) {
|
||||||
|
return &binaryReaderBytes{data}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the reader.
|
||||||
|
func (r *binaryReaderBytes) Close() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns the length of the underlying memory-mapped file.
|
||||||
|
func (r *binaryReaderBytes) Len() int {
|
||||||
|
return len(r.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *binaryReaderBytes) Bytes(n int, off int64) ([]byte, error) {
|
||||||
|
if off < 0 || int64(len(r.data)) < off {
|
||||||
|
return nil, fmt.Errorf("bytes: invalid offset %d", off)
|
||||||
|
}
|
||||||
|
return r.data[off : off+int64(n) : off+int64(n)], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type binaryReaderReader struct {
|
||||||
|
r io.Reader
|
||||||
|
n int64
|
||||||
|
readerAt bool
|
||||||
|
seeker bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func newBinaryReaderReader(r io.Reader, n int64) (*binaryReaderReader, error) {
|
||||||
|
_, readerAt := r.(io.ReaderAt)
|
||||||
|
_, seeker := r.(io.Seeker)
|
||||||
|
return &binaryReaderReader{r, n, readerAt, seeker}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the reader.
|
||||||
|
func (r *binaryReaderReader) Close() error {
|
||||||
|
if closer, ok := r.r.(io.Closer); ok {
|
||||||
|
return closer.Close()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns the length of the underlying memory-mapped file.
|
||||||
|
func (r *binaryReaderReader) Len() int {
|
||||||
|
return int(r.n)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *binaryReaderReader) Bytes(n int, off int64) ([]byte, error) {
|
||||||
|
// seeker seems faster than readerAt by 10%
|
||||||
|
if r.seeker {
|
||||||
|
if _, err := r.r.(io.Seeker).Seek(off, 0); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
b := make([]byte, n)
|
||||||
|
m, err := r.r.Read(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
} else if m != n {
|
||||||
|
return nil, errors.New("file: could not read all bytes")
|
||||||
|
}
|
||||||
|
return b, nil
|
||||||
|
} else if r.readerAt {
|
||||||
|
b := make([]byte, n)
|
||||||
|
m, err := r.r.(io.ReaderAt).ReadAt(b, off)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
} else if m != n {
|
||||||
|
return nil, errors.New("file: could not read all bytes")
|
||||||
|
}
|
||||||
|
return b, nil
|
||||||
|
}
|
||||||
|
return nil, errors.New("io.Seeker and io.ReaderAt not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
type BinaryReader2 struct {
|
||||||
|
f IBinaryReader
|
||||||
|
pos int64
|
||||||
|
err error
|
||||||
|
|
||||||
|
Endian binary.ByteOrder
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBinaryReader2(f IBinaryReader) *BinaryReader2 {
|
||||||
|
return &BinaryReader2{
|
||||||
|
f: f,
|
||||||
|
Endian: binary.BigEndian,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBinaryReader2Reader(r io.Reader, n int64) (*BinaryReader2, error) {
|
||||||
|
_, isReaderAt := r.(io.ReaderAt)
|
||||||
|
_, isSeeker := r.(io.Seeker)
|
||||||
|
|
||||||
|
var f IBinaryReader
|
||||||
|
if isReaderAt || isSeeker {
|
||||||
|
var err error
|
||||||
|
f, err = newBinaryReaderReader(r, n)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
b := make([]byte, n)
|
||||||
|
if _, err := io.ReadFull(r, b); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
f, _ = newBinaryReaderBytes(b)
|
||||||
|
}
|
||||||
|
return NewBinaryReader2(f), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBinaryReader2Bytes(data []byte) (*BinaryReader2, error) {
|
||||||
|
f, _ := newBinaryReaderBytes(data)
|
||||||
|
return NewBinaryReader2(f), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBinaryReader2File(filename string) (*BinaryReader2, error) {
|
||||||
|
f, err := newBinaryReaderFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return NewBinaryReader2(f), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBinaryReader2Mmap(filename string) (*BinaryReader2, error) {
|
||||||
|
f, err := newBinaryReaderMmap(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return NewBinaryReader2(f), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *BinaryReader2) Err() error {
|
||||||
|
return r.err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *BinaryReader2) Close() error {
|
||||||
|
if err := r.f.Close(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return r.err
|
||||||
|
}
|
||||||
|
|
||||||
|
// InPageCache returns true if the range is already in the page cache (for mmap).
|
||||||
|
func (r *BinaryReader2) InPageCache(start, end int64) bool {
|
||||||
|
index := int64(r.Pos()) / PageSize
|
||||||
|
return start/PageSize == index && end/PageSize == index
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free frees all previously read bytes, you cannot seek from before this position (for reader).
|
||||||
|
func (r *BinaryReader2) Free() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pos returns the reader's position.
|
||||||
|
func (r *BinaryReader2) Pos() int64 {
|
||||||
|
return r.pos
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns the remaining length of the buffer.
|
||||||
|
func (r *BinaryReader2) Len() int {
|
||||||
|
return int(int64(r.f.Len()) - int64(r.pos))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *BinaryReader2) Seek(pos int64) {
|
||||||
|
r.pos = pos
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read complies with io.Reader.
|
||||||
|
func (r *BinaryReader2) Read(b []byte) (int, error) {
|
||||||
|
data, err := r.f.Bytes(len(b), r.pos)
|
||||||
|
if err != nil && err != io.EOF {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
n := copy(b, data)
|
||||||
|
r.pos += int64(len(b))
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadBytes reads n bytes.
|
||||||
|
func (r *BinaryReader2) ReadBytes(n int) []byte {
|
||||||
|
data, err := r.f.Bytes(n, r.pos)
|
||||||
|
if err != nil {
|
||||||
|
r.err = err
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
r.pos += int64(n)
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadString reads a string of length n.
|
||||||
|
func (r *BinaryReader2) ReadString(n int) string {
|
||||||
|
return string(r.ReadBytes(n))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadByte reads a single byte.
|
||||||
|
func (r *BinaryReader2) ReadByte() byte {
|
||||||
|
data := r.ReadBytes(1)
|
||||||
|
if data == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return data[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadUint8 reads a uint8.
|
||||||
|
func (r *BinaryReader2) ReadUint8() uint8 {
|
||||||
|
return r.ReadByte()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadUint16 reads a uint16.
|
||||||
|
func (r *BinaryReader2) ReadUint16() uint16 {
|
||||||
|
data := r.ReadBytes(2)
|
||||||
|
if data == nil {
|
||||||
|
return 0
|
||||||
|
} else if r.Endian == binary.LittleEndian {
|
||||||
|
return uint16(data[1])<<8 | uint16(data[0])
|
||||||
|
}
|
||||||
|
return uint16(data[0])<<8 | uint16(data[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadUint32 reads a uint32.
|
||||||
|
func (r *BinaryReader2) ReadUint32() uint32 {
|
||||||
|
data := r.ReadBytes(4)
|
||||||
|
if data == nil {
|
||||||
|
return 0
|
||||||
|
} else if r.Endian == binary.LittleEndian {
|
||||||
|
return uint32(data[3])<<24 | uint32(data[2])<<16 | uint32(data[1])<<8 | uint32(data[0])
|
||||||
|
}
|
||||||
|
return uint32(data[0])<<24 | uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadUint64 reads a uint64.
|
||||||
|
func (r *BinaryReader2) ReadUint64() uint64 {
|
||||||
|
data := r.ReadBytes(8)
|
||||||
|
if data == nil {
|
||||||
|
return 0
|
||||||
|
} else if r.Endian == binary.LittleEndian {
|
||||||
|
return uint64(data[7])<<56 | uint64(data[6])<<48 | uint64(data[5])<<40 | uint64(data[4])<<32 | uint64(data[3])<<24 | uint64(data[2])<<16 | uint64(data[1])<<8 | uint64(data[0])
|
||||||
|
}
|
||||||
|
return uint64(data[0])<<56 | uint64(data[1])<<48 | uint64(data[2])<<40 | uint64(data[3])<<32 | uint64(data[4])<<24 | uint64(data[5])<<16 | uint64(data[6])<<8 | uint64(data[7])
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadInt8 reads a int8.
|
||||||
|
func (r *BinaryReader2) ReadInt8() int8 {
|
||||||
|
return int8(r.ReadByte())
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadInt16 reads a int16.
|
||||||
|
func (r *BinaryReader2) ReadInt16() int16 {
|
||||||
|
return int16(r.ReadUint16())
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadInt32 reads a int32.
|
||||||
|
func (r *BinaryReader2) ReadInt32() int32 {
|
||||||
|
return int32(r.ReadUint32())
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadInt64 reads a int64.
|
||||||
|
func (r *BinaryReader2) ReadInt64() int64 {
|
||||||
|
return int64(r.ReadUint64())
|
||||||
|
}
|
||||||
|
|
||||||
// BinaryWriter is a big endian binary file format writer.
|
// BinaryWriter is a big endian binary file format writer.
|
||||||
type BinaryWriter struct {
|
type BinaryWriter struct {
|
||||||
buf []byte
|
buf []byte
|
||||||
|
|
83
vendor/github.com/tdewolff/parse/v2/binary_unix.go
generated
vendored
Normal file
83
vendor/github.com/tdewolff/parse/v2/binary_unix.go
generated
vendored
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
//go:build unix
|
||||||
|
|
||||||
|
package parse
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
type binaryReaderMmap struct {
|
||||||
|
data []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func newBinaryReaderMmap(filename string) (*binaryReaderMmap, error) {
|
||||||
|
f, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
fi, err := f.Stat()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
size := fi.Size()
|
||||||
|
if size == 0 {
|
||||||
|
// Treat (size == 0) as a special case, avoiding the syscall, since
|
||||||
|
// "man 2 mmap" says "the length... must be greater than 0".
|
||||||
|
//
|
||||||
|
// As we do not call syscall.Mmap, there is no need to call
|
||||||
|
// runtime.SetFinalizer to enforce a balancing syscall.Munmap.
|
||||||
|
return &binaryReaderMmap{
|
||||||
|
data: make([]byte, 0),
|
||||||
|
}, nil
|
||||||
|
} else if size < 0 {
|
||||||
|
return nil, fmt.Errorf("mmap: file %q has negative size", filename)
|
||||||
|
} else if size != int64(int(size)) {
|
||||||
|
return nil, fmt.Errorf("mmap: file %q is too large", filename)
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := syscall.Mmap(int(f.Fd()), 0, int(size), syscall.PROT_READ, syscall.MAP_SHARED)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
r := &binaryReaderMmap{data}
|
||||||
|
runtime.SetFinalizer(r, (*binaryReaderMmap).Close)
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the reader.
|
||||||
|
func (r *binaryReaderMmap) Close() error {
|
||||||
|
if r.data == nil {
|
||||||
|
return nil
|
||||||
|
} else if len(r.data) == 0 {
|
||||||
|
r.data = nil
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
data := r.data
|
||||||
|
r.data = nil
|
||||||
|
runtime.SetFinalizer(r, nil)
|
||||||
|
return syscall.Munmap(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns the length of the underlying memory-mapped file.
|
||||||
|
func (r *binaryReaderMmap) Len() int {
|
||||||
|
return len(r.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *binaryReaderMmap) Bytes(n int, off int64) ([]byte, error) {
|
||||||
|
if r.data == nil {
|
||||||
|
return nil, errors.New("mmap: closed")
|
||||||
|
} else if off < 0 || int64(len(r.data)) < off {
|
||||||
|
return nil, fmt.Errorf("mmap: invalid offset %d", off)
|
||||||
|
} else if int64(len(r.data)-n) < off {
|
||||||
|
return r.data[off:len(r.data):len(r.data)], io.EOF
|
||||||
|
}
|
||||||
|
return r.data[off : off+int64(n) : off+int64(n)], nil
|
||||||
|
}
|
2
vendor/github.com/tdewolff/parse/v2/html/lex.go
generated
vendored
2
vendor/github.com/tdewolff/parse/v2/html/lex.go
generated
vendored
|
@ -362,7 +362,7 @@ func (l *Lexer) shiftBogusComment() []byte {
|
||||||
|
|
||||||
func (l *Lexer) shiftStartTag() (TokenType, []byte) {
|
func (l *Lexer) shiftStartTag() (TokenType, []byte) {
|
||||||
for {
|
for {
|
||||||
if c := l.r.Peek(0); c == ' ' || c == '>' || c == '/' && l.r.Peek(1) == '>' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == 0 && l.r.Err() != nil {
|
if c := l.r.Peek(0); (c < 'a' || 'z' < c) && (c < 'A' || 'Z' < c) && (c < '0' || '9' < c) && c != '-' {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
l.r.Move(1)
|
l.r.Move(1)
|
||||||
|
|
15
vendor/github.com/yuin/goldmark/ast/ast.go
generated
vendored
15
vendor/github.com/yuin/goldmark/ast/ast.go
generated
vendored
|
@ -123,6 +123,12 @@ type Node interface {
|
||||||
Dump(source []byte, level int)
|
Dump(source []byte, level int)
|
||||||
|
|
||||||
// Text returns text values of this node.
|
// Text returns text values of this node.
|
||||||
|
// This method is valid only for some inline nodes.
|
||||||
|
// If this node is a block node, Text returns a text value as reasonable as possible.
|
||||||
|
// Notice that there are no 'correct' text values for the block nodes.
|
||||||
|
// Result for the block nodes may be different from your expectation.
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. Pragraph.Lines, Text.Value).
|
||||||
Text(source []byte) []byte
|
Text(source []byte) []byte
|
||||||
|
|
||||||
// HasBlankPreviousLines returns true if the row before this node is blank,
|
// HasBlankPreviousLines returns true if the row before this node is blank,
|
||||||
|
@ -374,11 +380,18 @@ func (n *BaseNode) OwnerDocument() *Document {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Text implements Node.Text .
|
// Text implements Node.Text .
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. Pragraph.Lines, Text.Value).
|
||||||
func (n *BaseNode) Text(source []byte) []byte {
|
func (n *BaseNode) Text(source []byte) []byte {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
for c := n.firstChild; c != nil; c = c.NextSibling() {
|
for c := n.firstChild; c != nil; c = c.NextSibling() {
|
||||||
buf.Write(c.Text(source))
|
buf.Write(c.Text(source))
|
||||||
|
if sb, ok := c.(interface {
|
||||||
|
SoftLineBreak() bool
|
||||||
|
}); ok && sb.SoftLineBreak() {
|
||||||
|
buf.WriteByte('\n')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return buf.Bytes()
|
return buf.Bytes()
|
||||||
}
|
}
|
||||||
|
|
49
vendor/github.com/yuin/goldmark/ast/block.go
generated
vendored
49
vendor/github.com/yuin/goldmark/ast/block.go
generated
vendored
|
@ -1,7 +1,6 @@
|
||||||
package ast
|
package ast
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -48,15 +47,6 @@ func (b *BaseBlock) SetLines(v *textm.Segments) {
|
||||||
b.lines = v
|
b.lines = v
|
||||||
}
|
}
|
||||||
|
|
||||||
// Text implements Node.Text.
|
|
||||||
func (b *BaseBlock) Text(source []byte) []byte {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
for _, line := range b.Lines().Sliced(0, b.Lines().Len()) {
|
|
||||||
buf.Write(line.Value(source))
|
|
||||||
}
|
|
||||||
return buf.Bytes()
|
|
||||||
}
|
|
||||||
|
|
||||||
// A Document struct is a root node of Markdown text.
|
// A Document struct is a root node of Markdown text.
|
||||||
type Document struct {
|
type Document struct {
|
||||||
BaseBlock
|
BaseBlock
|
||||||
|
@ -140,6 +130,13 @@ func (n *TextBlock) Kind() NodeKind {
|
||||||
return KindTextBlock
|
return KindTextBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Text implements Node.Text.
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. TextBlock.Lines).
|
||||||
|
func (n *TextBlock) Text(source []byte) []byte {
|
||||||
|
return n.Lines().Value(source)
|
||||||
|
}
|
||||||
|
|
||||||
// NewTextBlock returns a new TextBlock node.
|
// NewTextBlock returns a new TextBlock node.
|
||||||
func NewTextBlock() *TextBlock {
|
func NewTextBlock() *TextBlock {
|
||||||
return &TextBlock{
|
return &TextBlock{
|
||||||
|
@ -165,6 +162,13 @@ func (n *Paragraph) Kind() NodeKind {
|
||||||
return KindParagraph
|
return KindParagraph
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Text implements Node.Text.
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. Paragraph.Lines).
|
||||||
|
func (n *Paragraph) Text(source []byte) []byte {
|
||||||
|
return n.Lines().Value(source)
|
||||||
|
}
|
||||||
|
|
||||||
// NewParagraph returns a new Paragraph node.
|
// NewParagraph returns a new Paragraph node.
|
||||||
func NewParagraph() *Paragraph {
|
func NewParagraph() *Paragraph {
|
||||||
return &Paragraph{
|
return &Paragraph{
|
||||||
|
@ -259,6 +263,13 @@ func (n *CodeBlock) Kind() NodeKind {
|
||||||
return KindCodeBlock
|
return KindCodeBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Text implements Node.Text.
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. CodeBlock.Lines).
|
||||||
|
func (n *CodeBlock) Text(source []byte) []byte {
|
||||||
|
return n.Lines().Value(source)
|
||||||
|
}
|
||||||
|
|
||||||
// NewCodeBlock returns a new CodeBlock node.
|
// NewCodeBlock returns a new CodeBlock node.
|
||||||
func NewCodeBlock() *CodeBlock {
|
func NewCodeBlock() *CodeBlock {
|
||||||
return &CodeBlock{
|
return &CodeBlock{
|
||||||
|
@ -314,6 +325,13 @@ func (n *FencedCodeBlock) Kind() NodeKind {
|
||||||
return KindFencedCodeBlock
|
return KindFencedCodeBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Text implements Node.Text.
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. FencedCodeBlock.Lines).
|
||||||
|
func (n *FencedCodeBlock) Text(source []byte) []byte {
|
||||||
|
return n.Lines().Value(source)
|
||||||
|
}
|
||||||
|
|
||||||
// NewFencedCodeBlock return a new FencedCodeBlock node.
|
// NewFencedCodeBlock return a new FencedCodeBlock node.
|
||||||
func NewFencedCodeBlock(info *Text) *FencedCodeBlock {
|
func NewFencedCodeBlock(info *Text) *FencedCodeBlock {
|
||||||
return &FencedCodeBlock{
|
return &FencedCodeBlock{
|
||||||
|
@ -508,6 +526,17 @@ func (n *HTMLBlock) Kind() NodeKind {
|
||||||
return KindHTMLBlock
|
return KindHTMLBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Text implements Node.Text.
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. HTMLBlock.Lines).
|
||||||
|
func (n *HTMLBlock) Text(source []byte) []byte {
|
||||||
|
ret := n.Lines().Value(source)
|
||||||
|
if n.HasClosure() {
|
||||||
|
ret = append(ret, n.ClosureLine.Value(source)...)
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
// NewHTMLBlock returns a new HTMLBlock node.
|
// NewHTMLBlock returns a new HTMLBlock node.
|
||||||
func NewHTMLBlock(typ HTMLBlockType) *HTMLBlock {
|
func NewHTMLBlock(typ HTMLBlockType) *HTMLBlock {
|
||||||
return &HTMLBlock{
|
return &HTMLBlock{
|
||||||
|
|
32
vendor/github.com/yuin/goldmark/ast/inline.go
generated
vendored
32
vendor/github.com/yuin/goldmark/ast/inline.go
generated
vendored
|
@ -143,17 +143,25 @@ func (n *Text) Merge(node Node, source []byte) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Text implements Node.Text.
|
// Text implements Node.Text.
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. Text.Value).
|
||||||
func (n *Text) Text(source []byte) []byte {
|
func (n *Text) Text(source []byte) []byte {
|
||||||
return n.Segment.Value(source)
|
return n.Segment.Value(source)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Value returns a value of this node.
|
||||||
|
// SoftLineBreaks are not included in the returned value.
|
||||||
|
func (n *Text) Value(source []byte) []byte {
|
||||||
|
return n.Segment.Value(source)
|
||||||
|
}
|
||||||
|
|
||||||
// Dump implements Node.Dump.
|
// Dump implements Node.Dump.
|
||||||
func (n *Text) Dump(source []byte, level int) {
|
func (n *Text) Dump(source []byte, level int) {
|
||||||
fs := textFlagsString(n.flags)
|
fs := textFlagsString(n.flags)
|
||||||
if len(fs) != 0 {
|
if len(fs) != 0 {
|
||||||
fs = "(" + fs + ")"
|
fs = "(" + fs + ")"
|
||||||
}
|
}
|
||||||
fmt.Printf("%sText%s: \"%s\"\n", strings.Repeat(" ", level), fs, strings.TrimRight(string(n.Text(source)), "\n"))
|
fmt.Printf("%sText%s: \"%s\"\n", strings.Repeat(" ", level), fs, strings.TrimRight(string(n.Value(source)), "\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// KindText is a NodeKind of the Text node.
|
// KindText is a NodeKind of the Text node.
|
||||||
|
@ -258,6 +266,8 @@ func (n *String) SetCode(v bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Text implements Node.Text.
|
// Text implements Node.Text.
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. String.Value).
|
||||||
func (n *String) Text(source []byte) []byte {
|
func (n *String) Text(source []byte) []byte {
|
||||||
return n.Value
|
return n.Value
|
||||||
}
|
}
|
||||||
|
@ -492,15 +502,22 @@ func (n *AutoLink) URL(source []byte) []byte {
|
||||||
ret := make([]byte, 0, len(n.Protocol)+s.Len()+3)
|
ret := make([]byte, 0, len(n.Protocol)+s.Len()+3)
|
||||||
ret = append(ret, n.Protocol...)
|
ret = append(ret, n.Protocol...)
|
||||||
ret = append(ret, ':', '/', '/')
|
ret = append(ret, ':', '/', '/')
|
||||||
ret = append(ret, n.value.Text(source)...)
|
ret = append(ret, n.value.Value(source)...)
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
return n.value.Text(source)
|
return n.value.Value(source)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Label returns a label of this node.
|
// Label returns a label of this node.
|
||||||
func (n *AutoLink) Label(source []byte) []byte {
|
func (n *AutoLink) Label(source []byte) []byte {
|
||||||
return n.value.Text(source)
|
return n.value.Value(source)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Text implements Node.Text.
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. AutoLink.Label).
|
||||||
|
func (n *AutoLink) Text(source []byte) []byte {
|
||||||
|
return n.value.Value(source)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewAutoLink returns a new AutoLink node.
|
// NewAutoLink returns a new AutoLink node.
|
||||||
|
@ -541,6 +558,13 @@ func (n *RawHTML) Kind() NodeKind {
|
||||||
return KindRawHTML
|
return KindRawHTML
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Text implements Node.Text.
|
||||||
|
//
|
||||||
|
// Deprecated: Use other properties of the node to get the text value(i.e. RawHTML.Segments).
|
||||||
|
func (n *RawHTML) Text(source []byte) []byte {
|
||||||
|
return n.Segments.Value(source)
|
||||||
|
}
|
||||||
|
|
||||||
// NewRawHTML returns a new RawHTML node.
|
// NewRawHTML returns a new RawHTML node.
|
||||||
func NewRawHTML() *RawHTML {
|
func NewRawHTML() *RawHTML {
|
||||||
return &RawHTML{
|
return &RawHTML{
|
||||||
|
|
2
vendor/github.com/yuin/goldmark/parser/code_block.go
generated
vendored
2
vendor/github.com/yuin/goldmark/parser/code_block.go
generated
vendored
|
@ -35,6 +35,7 @@ func (b *codeBlockParser) Open(parent ast.Node, reader text.Reader, pc Context)
|
||||||
if segment.Padding != 0 {
|
if segment.Padding != 0 {
|
||||||
preserveLeadingTabInCodeBlock(&segment, reader, 0)
|
preserveLeadingTabInCodeBlock(&segment, reader, 0)
|
||||||
}
|
}
|
||||||
|
segment.ForceNewline = true
|
||||||
node.Lines().Append(segment)
|
node.Lines().Append(segment)
|
||||||
reader.Advance(segment.Len() - 1)
|
reader.Advance(segment.Len() - 1)
|
||||||
return node, NoChildren
|
return node, NoChildren
|
||||||
|
@ -59,6 +60,7 @@ func (b *codeBlockParser) Continue(node ast.Node, reader text.Reader, pc Context
|
||||||
preserveLeadingTabInCodeBlock(&segment, reader, 0)
|
preserveLeadingTabInCodeBlock(&segment, reader, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
segment.ForceNewline = true
|
||||||
node.Lines().Append(segment)
|
node.Lines().Append(segment)
|
||||||
reader.Advance(segment.Len() - 1)
|
reader.Advance(segment.Len() - 1)
|
||||||
return Continue | NoChildren
|
return Continue | NoChildren
|
||||||
|
|
1
vendor/github.com/yuin/goldmark/parser/fcode_block.go
generated
vendored
1
vendor/github.com/yuin/goldmark/parser/fcode_block.go
generated
vendored
|
@ -100,6 +100,7 @@ func (b *fencedCodeBlockParser) Continue(node ast.Node, reader text.Reader, pc C
|
||||||
if padding != 0 {
|
if padding != 0 {
|
||||||
preserveLeadingTabInCodeBlock(&seg, reader, fdata.indent)
|
preserveLeadingTabInCodeBlock(&seg, reader, fdata.indent)
|
||||||
}
|
}
|
||||||
|
seg.ForceNewline = true // EOF as newline
|
||||||
node.Lines().Append(seg)
|
node.Lines().Append(seg)
|
||||||
reader.AdvanceAndSetPadding(segment.Stop-segment.Start-pos-1, padding)
|
reader.AdvanceAndSetPadding(segment.Stop-segment.Start-pos-1, padding)
|
||||||
return Continue | NoChildren
|
return Continue | NoChildren
|
||||||
|
|
6
vendor/github.com/yuin/goldmark/parser/parser.go
generated
vendored
6
vendor/github.com/yuin/goldmark/parser/parser.go
generated
vendored
|
@ -878,12 +878,6 @@ func (p *parser) Parse(reader text.Reader, opts ...ParseOption) ast.Node {
|
||||||
blockReader := text.NewBlockReader(reader.Source(), nil)
|
blockReader := text.NewBlockReader(reader.Source(), nil)
|
||||||
p.walkBlock(root, func(node ast.Node) {
|
p.walkBlock(root, func(node ast.Node) {
|
||||||
p.parseBlock(blockReader, node, pc)
|
p.parseBlock(blockReader, node, pc)
|
||||||
lines := node.Lines()
|
|
||||||
if lines != nil && lines.Len() != 0 {
|
|
||||||
s := lines.At(lines.Len() - 1)
|
|
||||||
s.EOB = true
|
|
||||||
lines.Set(lines.Len()-1, s)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
for _, at := range p.astTransformers {
|
for _, at := range p.astTransformers {
|
||||||
at.Transform(root, reader, pc)
|
at.Transform(root, reader, pc)
|
||||||
|
|
15
vendor/github.com/yuin/goldmark/renderer/html/html.go
generated
vendored
15
vendor/github.com/yuin/goldmark/renderer/html/html.go
generated
vendored
|
@ -680,7 +680,7 @@ func (r *Renderer) renderImage(w util.BufWriter, source []byte, node ast.Node, e
|
||||||
_, _ = w.Write(util.EscapeHTML(util.URLEscape(n.Destination, true)))
|
_, _ = w.Write(util.EscapeHTML(util.URLEscape(n.Destination, true)))
|
||||||
}
|
}
|
||||||
_, _ = w.WriteString(`" alt="`)
|
_, _ = w.WriteString(`" alt="`)
|
||||||
r.renderAttribute(w, source, n)
|
r.renderTexts(w, source, n)
|
||||||
_ = w.WriteByte('"')
|
_ = w.WriteByte('"')
|
||||||
if n.Title != nil {
|
if n.Title != nil {
|
||||||
_, _ = w.WriteString(` title="`)
|
_, _ = w.WriteString(` title="`)
|
||||||
|
@ -737,7 +737,7 @@ func (r *Renderer) renderText(w util.BufWriter, source []byte, node ast.Node, en
|
||||||
if r.EastAsianLineBreaks != EastAsianLineBreaksNone && len(value) != 0 {
|
if r.EastAsianLineBreaks != EastAsianLineBreaksNone && len(value) != 0 {
|
||||||
sibling := node.NextSibling()
|
sibling := node.NextSibling()
|
||||||
if sibling != nil && sibling.Kind() == ast.KindText {
|
if sibling != nil && sibling.Kind() == ast.KindText {
|
||||||
if siblingText := sibling.(*ast.Text).Text(source); len(siblingText) != 0 {
|
if siblingText := sibling.(*ast.Text).Value(source); len(siblingText) != 0 {
|
||||||
thisLastRune := util.ToRune(value, len(value)-1)
|
thisLastRune := util.ToRune(value, len(value)-1)
|
||||||
siblingFirstRune, _ := utf8.DecodeRune(siblingText)
|
siblingFirstRune, _ := utf8.DecodeRune(siblingText)
|
||||||
if r.EastAsianLineBreaks.softLineBreak(thisLastRune, siblingFirstRune) {
|
if r.EastAsianLineBreaks.softLineBreak(thisLastRune, siblingFirstRune) {
|
||||||
|
@ -770,19 +770,14 @@ func (r *Renderer) renderString(w util.BufWriter, source []byte, node ast.Node,
|
||||||
return ast.WalkContinue, nil
|
return ast.WalkContinue, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Renderer) renderAttribute(w util.BufWriter, source []byte, n ast.Node) {
|
func (r *Renderer) renderTexts(w util.BufWriter, source []byte, n ast.Node) {
|
||||||
for c := n.FirstChild(); c != nil; c = c.NextSibling() {
|
for c := n.FirstChild(); c != nil; c = c.NextSibling() {
|
||||||
if s, ok := c.(*ast.String); ok {
|
if s, ok := c.(*ast.String); ok {
|
||||||
_, _ = r.renderString(w, source, s, true)
|
_, _ = r.renderString(w, source, s, true)
|
||||||
} else if t, ok := c.(*ast.String); ok {
|
} else if t, ok := c.(*ast.Text); ok {
|
||||||
_, _ = r.renderText(w, source, t, true)
|
_, _ = r.renderText(w, source, t, true)
|
||||||
} else if !c.HasChildren() {
|
|
||||||
r.Writer.Write(w, c.Text(source))
|
|
||||||
if t, ok := c.(*ast.Text); ok && t.SoftLineBreak() {
|
|
||||||
_ = w.WriteByte('\n')
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
r.renderAttribute(w, source, c)
|
r.renderTexts(w, source, c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
26
vendor/github.com/yuin/goldmark/text/segment.go
generated
vendored
26
vendor/github.com/yuin/goldmark/text/segment.go
generated
vendored
|
@ -20,8 +20,19 @@ type Segment struct {
|
||||||
// Padding is a padding length of the segment.
|
// Padding is a padding length of the segment.
|
||||||
Padding int
|
Padding int
|
||||||
|
|
||||||
// EOB is true if the segment is end of the block.
|
// ForceNewline is true if the segment should be ended with a newline.
|
||||||
EOB bool
|
// Some elements(i.e. CodeBlock, FencedCodeBlock) does not trim trailing
|
||||||
|
// newlines. Spec defines that EOF is treated as a newline, so we need to
|
||||||
|
// add a newline to the end of the segment if it is not empty.
|
||||||
|
//
|
||||||
|
// i.e.:
|
||||||
|
//
|
||||||
|
// ```go
|
||||||
|
// const test = "test"
|
||||||
|
//
|
||||||
|
// This code does not close the code block and ends with EOF. In this case,
|
||||||
|
// we need to add a newline to the end of the last line like `const test = "test"\n`.
|
||||||
|
ForceNewline bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSegment return a new Segment.
|
// NewSegment return a new Segment.
|
||||||
|
@ -52,7 +63,7 @@ func (t *Segment) Value(buffer []byte) []byte {
|
||||||
result = append(result, bytes.Repeat(space, t.Padding)...)
|
result = append(result, bytes.Repeat(space, t.Padding)...)
|
||||||
result = append(result, buffer[t.Start:t.Stop]...)
|
result = append(result, buffer[t.Start:t.Stop]...)
|
||||||
}
|
}
|
||||||
if t.EOB && len(result) > 0 && result[len(result)-1] != '\n' {
|
if t.ForceNewline && len(result) > 0 && result[len(result)-1] != '\n' {
|
||||||
result = append(result, '\n')
|
result = append(result, '\n')
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
@ -217,3 +228,12 @@ func (s *Segments) Unshift(v Segment) {
|
||||||
s.values = append(s.values[0:1], s.values[0:]...)
|
s.values = append(s.values[0:1], s.values[0:]...)
|
||||||
s.values[0] = v
|
s.values[0] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Value returns a string value of the collection.
|
||||||
|
func (s *Segments) Value(buffer []byte) []byte {
|
||||||
|
var result []byte
|
||||||
|
for _, v := range s.values {
|
||||||
|
result = append(result, v.Value(buffer)...)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
8
vendor/modules.txt
vendored
8
vendor/modules.txt
vendored
|
@ -556,7 +556,7 @@ github.com/pkg/errors
|
||||||
# github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
|
# github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
|
||||||
## explicit
|
## explicit
|
||||||
github.com/pmezard/go-difflib/difflib
|
github.com/pmezard/go-difflib/difflib
|
||||||
# github.com/prometheus/client_golang v1.20.4
|
# github.com/prometheus/client_golang v1.20.5
|
||||||
## explicit; go 1.20
|
## explicit; go 1.20
|
||||||
github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil
|
github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil
|
||||||
github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil/header
|
github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil/header
|
||||||
|
@ -832,11 +832,11 @@ github.com/superseriousbusiness/oauth2/v4/generates
|
||||||
github.com/superseriousbusiness/oauth2/v4/manage
|
github.com/superseriousbusiness/oauth2/v4/manage
|
||||||
github.com/superseriousbusiness/oauth2/v4/models
|
github.com/superseriousbusiness/oauth2/v4/models
|
||||||
github.com/superseriousbusiness/oauth2/v4/server
|
github.com/superseriousbusiness/oauth2/v4/server
|
||||||
# github.com/tdewolff/minify/v2 v2.20.37
|
# github.com/tdewolff/minify/v2 v2.21.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
github.com/tdewolff/minify/v2
|
github.com/tdewolff/minify/v2
|
||||||
github.com/tdewolff/minify/v2/html
|
github.com/tdewolff/minify/v2/html
|
||||||
# github.com/tdewolff/parse/v2 v2.7.15
|
# github.com/tdewolff/parse/v2 v2.7.17
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
github.com/tdewolff/parse/v2
|
github.com/tdewolff/parse/v2
|
||||||
github.com/tdewolff/parse/v2/buffer
|
github.com/tdewolff/parse/v2/buffer
|
||||||
|
@ -954,7 +954,7 @@ github.com/vmihailenco/tagparser/v2/internal/parser
|
||||||
# github.com/wagslane/go-password-validator v0.3.0
|
# github.com/wagslane/go-password-validator v0.3.0
|
||||||
## explicit; go 1.16
|
## explicit; go 1.16
|
||||||
github.com/wagslane/go-password-validator
|
github.com/wagslane/go-password-validator
|
||||||
# github.com/yuin/goldmark v1.7.6
|
# github.com/yuin/goldmark v1.7.8
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
github.com/yuin/goldmark
|
github.com/yuin/goldmark
|
||||||
github.com/yuin/goldmark/ast
|
github.com/yuin/goldmark/ast
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import Loading from "./loading";
|
import Loading from "./loading";
|
||||||
|
import { Error as ErrorC } from "./error";
|
||||||
import { useVerifyCredentialsQuery, useLogoutMutation } from "../lib/query/oauth";
|
import { useVerifyCredentialsQuery, useLogoutMutation } from "../lib/query/oauth";
|
||||||
import { useInstanceV1Query } from "../lib/query/gts-api";
|
import { useInstanceV1Query } from "../lib/query/gts-api";
|
||||||
|
|
||||||
|
@ -29,16 +30,20 @@ export default function UserLogoutCard() {
|
||||||
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return <Loading />;
|
return <Loading />;
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
<div className="account-card">
|
|
||||||
<img className="avatar" src={profile.avatar} alt="" />
|
|
||||||
<h3 className="text-cutoff">{profile.display_name?.length > 0 ? profile.display_name : profile.acct}</h3>
|
|
||||||
<span className="text-cutoff">@{profile.username}@{instance?.account_domain}</span>
|
|
||||||
<a onClick={logoutQuery} href="#" aria-label="Log out" title="Log out" className="logout">
|
|
||||||
<i className="fa fa-fw fa-sign-out" aria-hidden="true" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!profile) {
|
||||||
|
return <ErrorC error={new Error("account was undefined")} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="account-card">
|
||||||
|
<img className="avatar" src={profile.avatar} alt="" />
|
||||||
|
<h3 className="text-cutoff">{profile.display_name?.length > 0 ? profile.display_name : profile.acct}</h3>
|
||||||
|
<span className="text-cutoff">@{profile.username}@{instance?.account_domain}</span>
|
||||||
|
<a onClick={logoutQuery} href="#" aria-label="Log out" title="Log out" className="logout">
|
||||||
|
<i className="fa fa-fw fa-sign-out" aria-hidden="true" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
|
@ -26,6 +26,7 @@ import {
|
||||||
authorize as oauthAuthorize,
|
authorize as oauthAuthorize,
|
||||||
} from "../../../redux/oauth";
|
} from "../../../redux/oauth";
|
||||||
import { RootState } from '../../../redux/store';
|
import { RootState } from '../../../redux/store';
|
||||||
|
import { Account } from '../../types/account';
|
||||||
|
|
||||||
export interface OauthTokenRequestBody {
|
export interface OauthTokenRequestBody {
|
||||||
client_id: string;
|
client_id: string;
|
||||||
|
@ -58,7 +59,7 @@ const SETTINGS_URL = (getSettingsURL());
|
||||||
// https://redux-toolkit.js.org/rtk-query/usage/customizing-queries#performing-multiple-requests-with-a-single-query
|
// https://redux-toolkit.js.org/rtk-query/usage/customizing-queries#performing-multiple-requests-with-a-single-query
|
||||||
const extended = gtsApi.injectEndpoints({
|
const extended = gtsApi.injectEndpoints({
|
||||||
endpoints: (build) => ({
|
endpoints: (build) => ({
|
||||||
verifyCredentials: build.query<any, void>({
|
verifyCredentials: build.query<Account, void>({
|
||||||
providesTags: (_res, error) =>
|
providesTags: (_res, error) =>
|
||||||
error == undefined ? ["Auth"] : [],
|
error == undefined ? ["Auth"] : [],
|
||||||
async queryFn(_arg, api, _extraOpts, fetchWithBQ) {
|
async queryFn(_arg, api, _extraOpts, fetchWithBQ) {
|
||||||
|
|
|
@ -53,8 +53,12 @@ export interface Account {
|
||||||
url: string,
|
url: string,
|
||||||
avatar: string,
|
avatar: string,
|
||||||
avatar_static: string,
|
avatar_static: string,
|
||||||
|
avatar_description?: string,
|
||||||
|
avatar_media_id?: string,
|
||||||
header: string,
|
header: string,
|
||||||
header_static: string,
|
header_static: string,
|
||||||
|
header_description?: string,
|
||||||
|
header_media_id?: string,
|
||||||
followers_count: number,
|
followers_count: number,
|
||||||
following_count: number,
|
following_count: number,
|
||||||
statuses_count: number,
|
statuses_count: number,
|
||||||
|
@ -68,7 +72,7 @@ export interface Account {
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AccountSource {
|
export interface AccountSource {
|
||||||
fields: any[];
|
fields: any;
|
||||||
follow_requests_count: number;
|
follow_requests_count: number;
|
||||||
language: string;
|
language: string;
|
||||||
note: string;
|
note: string;
|
||||||
|
|
|
@ -25,6 +25,7 @@ export interface InstanceV1 {
|
||||||
description_text?: string;
|
description_text?: string;
|
||||||
short_description: string;
|
short_description: string;
|
||||||
short_description_text?: string;
|
short_description_text?: string;
|
||||||
|
custom_css: string;
|
||||||
email: string;
|
email: string;
|
||||||
version: string;
|
version: string;
|
||||||
debug?: boolean;
|
debug?: boolean;
|
||||||
|
|
|
@ -441,6 +441,11 @@ section.with-sidebar > form {
|
||||||
.profile {
|
.profile {
|
||||||
max-width: 42rem;
|
max-width: 42rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.file-input-with-image-description {
|
||||||
|
max-width: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.overview {
|
.overview {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
@ -46,7 +46,7 @@ function InstanceSettingsForm({ data: instance }: InstanceSettingsFormProps) {
|
||||||
const shortDescLimit = 500;
|
const shortDescLimit = 500;
|
||||||
const descLimit = 5000;
|
const descLimit = 5000;
|
||||||
const termsLimit = 5000;
|
const termsLimit = 5000;
|
||||||
|
|
||||||
const form = {
|
const form = {
|
||||||
title: useTextInput("title", {
|
title: useTextInput("title", {
|
||||||
source: instance,
|
source: instance,
|
||||||
|
@ -66,6 +66,10 @@ function InstanceSettingsForm({ data: instance }: InstanceSettingsFormProps) {
|
||||||
valueSelector: (s: InstanceV1) => s.description_text,
|
valueSelector: (s: InstanceV1) => s.description_text,
|
||||||
validator: (val: string) => val.length <= descLimit ? "" : `Instance description is ${val.length} characters; must be ${descLimit} characters or less`
|
validator: (val: string) => val.length <= descLimit ? "" : `Instance description is ${val.length} characters; must be ${descLimit} characters or less`
|
||||||
}),
|
}),
|
||||||
|
customCSS: useTextInput("custom_css", {
|
||||||
|
source: instance,
|
||||||
|
valueSelector: (s: InstanceV1) => s.custom_css
|
||||||
|
}),
|
||||||
terms: useTextInput("terms", {
|
terms: useTextInput("terms", {
|
||||||
source: instance,
|
source: instance,
|
||||||
// Select "raw" text version of parsed field for editing.
|
// Select "raw" text version of parsed field for editing.
|
||||||
|
@ -191,7 +195,16 @@ function InstanceSettingsForm({ data: instance }: InstanceSettingsFormProps) {
|
||||||
type="email"
|
type="email"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<TextArea
|
||||||
|
field={form.customCSS}
|
||||||
|
label={"Custom CSS"}
|
||||||
|
className="monospace"
|
||||||
|
rows={8}
|
||||||
|
autoCapitalize="none"
|
||||||
|
spellCheck="false"
|
||||||
|
/>
|
||||||
|
|
||||||
<MutationButton label="Save" result={result} disabled={false} />
|
<MutationButton label="Save" result={result} disabled={false} />
|
||||||
</form>
|
</form>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useVerifyCredentialsQuery } from "../../../lib/query/oauth";
|
import { useVerifyCredentialsQuery } from "../../../lib/query/oauth";
|
||||||
import Loading from "../../../components/loading";
|
import Loading from "../../../components/loading";
|
||||||
import { Error } from "../../../components/error";
|
import { Error as ErrorC } from "../../../components/error";
|
||||||
import BasicSettings from "./basic-settings";
|
import BasicSettings from "./basic-settings";
|
||||||
import InteractionPolicySettings from "./interaction-policy-settings";
|
import InteractionPolicySettings from "./interaction-policy-settings";
|
||||||
|
|
||||||
|
@ -38,7 +38,11 @@ export default function PostSettings() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isError) {
|
if (isError) {
|
||||||
return <Error error={error} />;
|
return <ErrorC error={error} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!account) {
|
||||||
|
return <ErrorC error={new Error("account was undefined")} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -45,6 +45,7 @@ import { useAccountThemesQuery } from "../../lib/query/user";
|
||||||
import { useUpdateCredentialsMutation } from "../../lib/query/user";
|
import { useUpdateCredentialsMutation } from "../../lib/query/user";
|
||||||
import { useVerifyCredentialsQuery } from "../../lib/query/oauth";
|
import { useVerifyCredentialsQuery } from "../../lib/query/oauth";
|
||||||
import { useInstanceV1Query } from "../../lib/query/gts-api";
|
import { useInstanceV1Query } from "../../lib/query/gts-api";
|
||||||
|
import { Account } from "../../lib/types/account";
|
||||||
|
|
||||||
export default function UserProfile() {
|
export default function UserProfile() {
|
||||||
return (
|
return (
|
||||||
|
@ -55,7 +56,11 @@ export default function UserProfile() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function UserProfileForm({ data: profile }) {
|
interface UserProfileFormProps {
|
||||||
|
data: Account;
|
||||||
|
}
|
||||||
|
|
||||||
|
function UserProfileForm({ data: profile }: UserProfileFormProps) {
|
||||||
/*
|
/*
|
||||||
User profile update form keys
|
User profile update form keys
|
||||||
- bool bot
|
- bool bot
|
||||||
|
@ -132,6 +137,9 @@ function UserProfileForm({ data: profile }) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const noAvatarSet = !profile.avatar_media_id;
|
||||||
|
const noHeaderSet = !profile.header_media_id;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form className="user-profile" onSubmit={submitForm}>
|
<form className="user-profile" onSubmit={submitForm}>
|
||||||
<h1>Profile</h1>
|
<h1>Profile</h1>
|
||||||
|
@ -145,33 +153,37 @@ function UserProfileForm({ data: profile }) {
|
||||||
role={profile.role}
|
role={profile.role}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div className="file-input-with-image-description">
|
<fieldset className="file-input-with-image-description">
|
||||||
|
<legend>Header</legend>
|
||||||
<FileInput
|
<FileInput
|
||||||
label="Header"
|
label="Upload file"
|
||||||
field={form.header}
|
field={form.header}
|
||||||
accept="image/png, image/jpeg, image/webp, image/gif"
|
accept="image/png, image/jpeg, image/webp, image/gif"
|
||||||
/>
|
/>
|
||||||
<TextInput
|
<TextInput
|
||||||
field={form.headerDescription}
|
field={form.headerDescription}
|
||||||
label="Header image description"
|
label="Image description; only settable if not using default header"
|
||||||
placeholder="A green field with pink flowers."
|
placeholder="A green field with pink flowers."
|
||||||
autoCapitalize="sentences"
|
autoCapitalize="sentences"
|
||||||
|
disabled={noHeaderSet && !form.header.value}
|
||||||
/>
|
/>
|
||||||
</div>
|
</fieldset>
|
||||||
|
|
||||||
<div className="file-input-with-image-description">
|
<fieldset className="file-input-with-image-description">
|
||||||
|
<legend>Avatar</legend>
|
||||||
<FileInput
|
<FileInput
|
||||||
label="Avatar (1:1 images look best)"
|
label="Upload file (1:1 images look best)"
|
||||||
field={form.avatar}
|
field={form.avatar}
|
||||||
accept="image/png, image/jpeg, image/webp, image/gif"
|
accept="image/png, image/jpeg, image/webp, image/gif"
|
||||||
/>
|
/>
|
||||||
<TextInput
|
<TextInput
|
||||||
field={form.avatarDescription}
|
field={form.avatarDescription}
|
||||||
label="Avatar image description"
|
label="Image description; only settable if not using default avatar"
|
||||||
placeholder="A cute drawing of a smiling sloth."
|
placeholder="A cute drawing of a smiling sloth."
|
||||||
autoCapitalize="sentences"
|
autoCapitalize="sentences"
|
||||||
|
disabled={noAvatarSet && !form.avatar.value}
|
||||||
/>
|
/>
|
||||||
</div>
|
</fieldset>
|
||||||
|
|
||||||
<div className="theme">
|
<div className="theme">
|
||||||
<div>
|
<div>
|
||||||
|
|
Loading…
Reference in a new issue