Compare commits
105 Commits
ncat/dev/e
...
12.109.2-s
Author | SHA1 | Date | |
---|---|---|---|
dca6d23415 | |||
7156bfb01c | |||
d4e9082941 | |||
a2242261db | |||
9cf6561a95 | |||
a989e904cc | |||
7774465274 | |||
b2299e1344 | |||
af0dfb2362 | |||
ad74fbc48f | |||
d0775da7d2 | |||
633994ecb6 | |||
54923b7ac9 | |||
48e132a2c7 | |||
7663170fae | |||
cebb66cc36 | |||
f6dda604dc | |||
d10143544d | |||
40e3c75c13 | |||
a2150b1269 | |||
19579ed0f1 | |||
78396baf82 | |||
982896f7be | |||
1c9b842983 | |||
0cf950bb35 | |||
ef4f49778e | |||
721c47a74b | |||
11cbbeb795 | |||
6bc893ca44 | |||
9c34f96cdd | |||
74a80b3405 | |||
84da9d4cd4 | |||
b48f76aad1 | |||
78b9550eca | |||
8fc770d371 | |||
4aed68ec96 | |||
90c89c3083 | |||
c63d7dc898 | |||
74e695a320 | |||
f269ceaee9 | |||
57a106a192 | |||
5563d6bdeb | |||
ab59a5b659 | |||
a81f8b8275 | |||
c99c4b73f4 | |||
995d8f2f5d | |||
6bb22007d8 | |||
a4a0d33348 | |||
7d1f3cd1e8 | |||
dc13627a68 | |||
b96e886a61 | |||
7024f6651f | |||
4f9aca0aa3 | |||
88a2606884 | |||
d6b15add1b | |||
39307694b5 | |||
9b7be06eef | |||
5afb3a59cd | |||
73d66fc439 | |||
12214c473a | |||
8e173a6d8e | |||
9d0c1a8fea | |||
aee5193ef6 | |||
2892a31142 | |||
90bb0cec37 | |||
19775507fc | |||
9d4f621833 | |||
2e095b4863 | |||
5d9b9eeaad | |||
98f5cb6cd2 | |||
b88c4d6d34 | |||
6238ba965b | |||
8489c3ca7b | |||
33871f3cb8 | |||
5eb758fa28 | |||
56d8f7f257 | |||
74c3e6d483 | |||
ead62a538f | |||
72058b30c2 | |||
22102639a8 | |||
ee4289076f | |||
be011d3985 | |||
6ef86df368 | |||
34e099984f | |||
5a1c6be944 | |||
25991cfdc1 | |||
b1a526aeea | |||
f31ef70ce7 | |||
09a751b992 | |||
a41e4ed4fd | |||
b77f7f5041 | |||
7adcf99865 | |||
cc2d5480f3 | |||
fdd129fb83 | |||
8dd3fef0e2 | |||
f1c66f09e1 | |||
6f328f2ccf | |||
70b3d598c6 | |||
668c403ece | |||
c873f17080 | |||
3f6691bd5e | |||
260ece9881 | |||
9a4c04fe79 | |||
24896d4a36 | |||
8aea52e9b4 |
18
.github/workflows/docker-image.yml
vendored
@ -1,18 +0,0 @@
|
|||||||
name: Docker Image CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
build:
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Build the Docker image
|
|
||||||
run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)
|
|
10
.github/workflows/lint.yml
vendored
@ -14,12 +14,12 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: 16.x
|
node-version: 16.x
|
||||||
cache: 'yarn'
|
- uses: actions/cache@v2
|
||||||
cache-dependency-path: |
|
with:
|
||||||
packages/backend/yarn.lock
|
path: '**/node_modules'
|
||||||
packages/client/yarn.lock
|
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
|
||||||
- run: yarn install
|
- run: yarn install
|
||||||
- run: yarn lint
|
- run: yarn lint
|
||||||
|
84
.github/workflows/test.yml
vendored
@ -8,48 +8,44 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
mocha:
|
#mocha:
|
||||||
runs-on: ubuntu-latest
|
# runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
# strategy:
|
||||||
matrix:
|
# matrix:
|
||||||
node-version: [16.x]
|
# node-version: [16.x]
|
||||||
|
|
||||||
services:
|
# services:
|
||||||
postgres:
|
# postgres:
|
||||||
image: postgres:13
|
# image: postgres:13
|
||||||
ports:
|
# ports:
|
||||||
- 54312:5432
|
# - 54312:5432
|
||||||
env:
|
# env:
|
||||||
POSTGRES_DB: test-misskey
|
# POSTGRES_DB: test-misskey
|
||||||
POSTGRES_HOST_AUTH_METHOD: trust
|
# POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
redis:
|
# redis:
|
||||||
image: redis:6
|
# image: redis:6
|
||||||
ports:
|
# ports:
|
||||||
- 56312:6379
|
# - 56312:6379
|
||||||
|
|
||||||
steps:
|
# steps:
|
||||||
- uses: actions/checkout@v2
|
# - uses: actions/checkout@v2
|
||||||
with:
|
# with:
|
||||||
submodules: true
|
# submodules: true
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
# - name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v3
|
# uses: actions/setup-node@v1
|
||||||
with:
|
# with:
|
||||||
node-version: ${{ matrix.node-version }}
|
# node-version: ${{ matrix.node-version }}
|
||||||
cache: 'yarn'
|
# - name: Install dependencies
|
||||||
cache-dependency-path: |
|
# run: yarn install
|
||||||
packages/backend/yarn.lock
|
# - name: Check yarn.lock
|
||||||
packages/client/yarn.lock
|
# run: git diff --exit-code yarn.lock
|
||||||
- name: Install dependencies
|
# - name: Copy Configure
|
||||||
run: yarn install
|
# run: cp .github/misskey/test.yml .config
|
||||||
- name: Check yarn.lock
|
# - name: Build
|
||||||
run: git diff --exit-code yarn.lock
|
# run: yarn build
|
||||||
- name: Copy Configure
|
# - name: Test
|
||||||
run: cp .github/misskey/test.yml .config
|
# run: yarn mocha
|
||||||
- name: Build
|
|
||||||
run: yarn build
|
|
||||||
- name: Test
|
|
||||||
run: yarn mocha
|
|
||||||
|
|
||||||
e2e:
|
e2e:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -84,13 +80,13 @@ jobs:
|
|||||||
#- uses: browser-actions/setup-firefox@latest
|
#- uses: browser-actions/setup-firefox@latest
|
||||||
# if: ${{ matrix.browser == 'firefox' }}
|
# if: ${{ matrix.browser == 'firefox' }}
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'yarn'
|
- uses: actions/cache@v2
|
||||||
cache-dependency-path: |
|
with:
|
||||||
packages/backend/yarn.lock
|
path: '**/node_modules'
|
||||||
packages/client/yarn.lock
|
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install
|
run: yarn install
|
||||||
- name: Check yarn.lock
|
- name: Check yarn.lock
|
||||||
|
2
.gitignore
vendored
@ -42,3 +42,5 @@ ormconfig.json
|
|||||||
*.blend3
|
*.blend3
|
||||||
*.blend4
|
*.blend4
|
||||||
*.blend5
|
*.blend5
|
||||||
|
|
||||||
|
start.sh
|
16
CHANGELOG.md
@ -10,22 +10,6 @@
|
|||||||
You should also include the user name that made the change.
|
You should also include the user name that made the change.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## 12.110.1 (2022/04/23)
|
|
||||||
|
|
||||||
### Bugfixes
|
|
||||||
- Fix GOP rendering @syuilo
|
|
||||||
- Improve performance of antenna, clip, and list @xianon
|
|
||||||
|
|
||||||
## 12.110.0 (2022/04/11)
|
|
||||||
|
|
||||||
### Improvements
|
|
||||||
- Improve webhook @syuilo
|
|
||||||
- Client: Show loading icon on splash screen @syuilo
|
|
||||||
|
|
||||||
### Bugfixes
|
|
||||||
- API: parameter validation of users/show was wrong
|
|
||||||
- Federation: リモートインスタンスへのダイレクト投稿が届かない問題を修正 @syuilo
|
|
||||||
|
|
||||||
## 12.109.2 (2022/04/03)
|
## 12.109.2 (2022/04/03)
|
||||||
|
|
||||||
### Bugfixes
|
### Bugfixes
|
||||||
|
@ -32,3 +32,4 @@ COPY --from=builder /misskey/packages/client/node_modules ./packages/client/node
|
|||||||
COPY . ./
|
COPY . ./
|
||||||
|
|
||||||
CMD ["npm", "run", "migrateandstart"]
|
CMD ["npm", "run", "migrateandstart"]
|
||||||
|
|
||||||
|
173
README.md
@ -1,7 +1,168 @@
|
|||||||
## これってなに?
|
[](https://join.misskey.page/)
|
||||||
[Misskey](https://github.com/misskey-dev/misskey)ベースのSNS
|
|
||||||
|
|
||||||
## 本家との違い
|
<div align="center">
|
||||||
[ここ](https://nullc.at/nca10.net/)にかいてあるよ
|
|
||||||
## 導入方法
|
**🌎 A forever evolving, interplanetary microblogging platform. 🚀**
|
||||||
[MisskeyHub](https://misskey-hub.net/docs/install.html)をみてね
|
|
||||||
|
**Misskey** is a distributed microblogging platform with advanced features such as Reactions and a highly customizable UI.
|
||||||
|
|
||||||
|
[Learn more](https://misskey-hub.net/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[✨ Find an instance](https://misskey-hub.net/instances.html)
|
||||||
|
•
|
||||||
|
[📦 Create your own instance](https://misskey-hub.net/docs/install.html)
|
||||||
|
•
|
||||||
|
[🛠️ Contribute](./CONTRIBUTING.md)
|
||||||
|
•
|
||||||
|
[🚀 Join the community](https://discord.gg/Wp8gVStHW3)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<a href="https://xn--931a.moe/"><img src="https://github.com/misskey-dev/misskey/blob/develop/assets/ai.png?raw=true" align="right" height="320px"/></a>
|
||||||
|
|
||||||
|
## ✨ Features
|
||||||
|
- **ActivityPub support**\
|
||||||
|
It is possible to interact with other software.
|
||||||
|
- **Reactions**\
|
||||||
|
You can add "reactions" to each post, making it easy for you to express your feelings.
|
||||||
|
- **Drive**\
|
||||||
|
An interface to manage uploaded files such as images, videos, sounds, etc.
|
||||||
|
You can also organize your favorite content into folders, making it easy to share again.
|
||||||
|
- **Rich Web UI**\
|
||||||
|
Misskey has a rich WebUI by default.
|
||||||
|
It is highly customizable by flexibly changing the layout and installing various widgets and themes.
|
||||||
|
Furthermore, plug-ins can be created using AiScript, a original programming language.
|
||||||
|
- and more...
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="clear: both;"></div>
|
||||||
|
|
||||||
|
## Sponsors
|
||||||
|
<div align="center">
|
||||||
|
<a class="rss3" title="RSS3" href="https://rss3.io/" target="_blank"><img src="https://rss3.mypinata.cloud/ipfs/QmUG6H3Z7D5P511shn7sB4CPmpjH5uZWu4m5mWX7U3Gqbu" alt="RSS3" height="60"></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Backers
|
||||||
|
<!-- PATREON_START -->
|
||||||
|
<table><tr>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/20832595" alt="Roujo " width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/27956229" alt="Oliver Maximilian Seidel" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan " width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/27648259" alt="みなしま " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24430516/b1964ac5b9f746d2a12ff53dbc9aa40a/1.jpg?token-time=2145916800&token-hash=bmEiMGYpp3bS7hCCbymjGGsHBZM3AXuBOFO3Kro37PU%3D" alt="Eduardo Quiros" width="100"></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=20832595">Roujo </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=27956229">Oliver Maximilian Seidel</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/weepjp">weepjp </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=19045173">kiritan </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=27648259">みなしま </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=24430516">Eduardo Quiros</a></td>
|
||||||
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/14215107/1cbe1912c26143919fa0faca16f12ce1/4.jpg?token-time=2145916800&token-hash=BslMqDjTjz8KYANLvxL87agHTugHa0dMPUzT-hwR6Vk%3D" alt="Nesakko" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/776209" alt="Demogrognard" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3075183/c2ae575c604e420297f000ccc396e395/1.jpeg?token-time=2145916800&token-hash=O9qmPtpo6wWb0OuvnkEekhk_1WO2MTdytLr7ZgsAr80%3D" alt="Liaizon Wakest" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/23915207/25428766ecd745478e600b3d7f871eb2/1.png?token-time=2145916800&token-hash=urCLLA4KjJZX92Y1CxcBP4d8bVTHGkiaPnQZp-Tqz68%3D" alt="kabo2468y " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8249688/4aacf36b6b244ab1bc6653591b6640df/2.png?token-time=2145916800&token-hash=1ZEf2w6L34253cZXS_HlVevLEENWS9QqrnxGUAYblPo%3D" alt="AureoleArk " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon " width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/36813045/29876ea679d443bcbba3c3f16edab8c2/2.jpeg?token-time=2145916800&token-hash=YCKWnIhrV9rjUCV9KqtJnEqjy_uGYF3WMXftjUdpi7o%3D" alt="Wataru Manji (manji0)" width="100"></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/Nesakko">Nesakko</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=776209">Demogrognard</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/wakest">Liaizon Wakest</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=557245">mkatze </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=23915207">kabo2468y </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/AureoleArk">AureoleArk </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/osapon">osapon </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=36813045">Wataru Manji (manji0)</a></td>
|
||||||
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61 " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5788159/af42076ab3354bb49803cfba65f94bee/1.jpg?token-time=2145916800&token-hash=iSaxp_Yr2-ZiU2YVi9rcpZZj9mj3UvNSMrZr4CU4qtA%3D" alt="mewl hayabusa" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/28779508/3cd4cb7f017f4ee0864341e3464d42f9/1.png?token-time=2145916800&token-hash=eGQtR15be44kgvh8fw2Jx8Db4Bv15YBp2ldxh0EKRxA%3D" alt="S Y" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/38837364/9421361c54c645ac8f5fc442a40c32e9/1.png?token-time=2145916800&token-hash=TUZB48Nem3BeUPLBH6s3P6WyKBnQOy0xKaDSTBBUNzA%3D" alt="xianon" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/26340354/08834cf767b3449e93098ef73a434e2f/2.png?token-time=2145916800&token-hash=nyM8DnKRL8hR47HQ619mUzsqVRpkWZjgtgBU9RY15Uc%3D" alt="totokoro " width="100"></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61 </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/hs_sh_net">mewl hayabusa</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=28779508">S Y</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=38837364">xianon</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=26340354">totokoro </a></td>
|
||||||
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5827393/59893c191dda408f9cabd0f20a3a5627/1.jpeg?token-time=2145916800&token-hash=i9N05vOph-eP1LTLb9_npATjYOpntL0ZsHNaZFSsPmE%3D" alt="motcha " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/20494440/540beaf2445f408ea6597bc61e077bb3/1.png?token-time=2145916800&token-hash=UJ0JQge64Bx9XmN_qYA1inMQhrWf4U91fqz7VAKJeSg%3D" alt="axtuki1 " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpg?token-time=2145916800&token-hash=nVAntpybQrznE0rg05keLrSE6ogPKJXB13rmrJng42c%3D" alt="takimura " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13100201/fc5be4fa90444f09a9c8a06f72385272/1.png?token-time=2145916800&token-hash=i8PjlgfOB2LPEdbtWyx8ZPsBKhGcNZqcw_FQmH71UGU%3D" alt="aqz tamaina" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/9109588/e3cffc48d20a4e43afe04123e696781d/3.png?token-time=2145916800&token-hash=T_VIUA0IFIbleZv4pIjiszZGnQonwn34sLCYFIhakBo%3D" alt="nafuchoco " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/619ab87cc08448439222631ebb26802f/1.gif?token-time=2145916800&token-hash=o27K7M02s1z-LkDUEO5Oa7cu-GviRXeOXxryi4o_6VU%3D" alt="Atsuko Tominaga" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/26144593/9514b10a5c1b42a3af58621aee213d1d/1.png?token-time=2145916800&token-hash=v1PYRsjzu4c_mndN4Hvi_dlispZJsuGRCQeNS82pUSM%3D" alt="EBISUME" width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo " width="100"></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=5827393">motcha </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=20494440">axtuki1 </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/takimura">takimura </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/aqz">aqz tamaina</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=9109588">nafuchoco </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=26144593">EBISUME</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/noellabo">noellabo </a></td>
|
||||||
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpg?token-time=2145916800&token-hash=7bkMqTwHPRsJPGAq42PYdDXDZBVGLqdgr1ZmBxX8GFQ%3D" alt="Hekovic " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24641572/b4fd175424814f15b0ca9178d2d2d2e4/1.png?token-time=2145916800&token-hash=e2fyqdbuJbpCckHcwux7rbuW6OPkKdERcus0u2wIEWU%3D" alt="uroco @99" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/14661394" alt="Chandler " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
||||||
|
<td><img src="https://c8.patreon.com/2/200/23932002" alt="nenohi " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/9481273/7fa89168e72943859c3d3c96e424ed31/4.jpeg?token-time=2145916800&token-hash=5w1QV1qXe-NdWbdFmp1H7O_-QBsSiV0haumk3XTHIEg%3D" alt="Efertone " width="100"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/Corset">CG </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/hekovic">Hekovic </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=24641572">uroco @99</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=14661394">Chandler </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=23932002">nenohi </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/efertone">Efertone </a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
|
</tr></table>
|
||||||
|
|
||||||
|
**Last updated:** Sun, 26 Jul 2020 07:00:10 UTC
|
||||||
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
|
[backer-url]: #backers
|
||||||
|
[backer-badge]: https://opencollective.com/misskey/backers/badge.svg
|
||||||
|
[backers-image]: https://opencollective.com/misskey/backers.svg
|
||||||
|
[sponsor-url]: #sponsors
|
||||||
|
[sponsor-badge]: https://opencollective.com/misskey/sponsors/badge.svg
|
||||||
|
[sponsors-image]: https://opencollective.com/misskey/sponsors.svg
|
||||||
|
[support-url]: https://opencollective.com/misskey#support
|
||||||
|
|
||||||
|
[syuilo-link]: https://syuilo.com
|
||||||
|
[syuilo-icon]: https://avatars2.githubusercontent.com/u/4439005?v=3&s=70
|
||||||
|
BIN
assets/about/drive.png
Normal file
After Width: | Height: | Size: 94 KiB |
BIN
assets/about/post.png
Normal file
After Width: | Height: | Size: 317 KiB |
BIN
assets/about/reaction.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
assets/about/ui.png
Normal file
After Width: | Height: | Size: 95 KiB |
BIN
assets/ai-orig.png
Normal file
After Width: | Height: | Size: 200 KiB |
BIN
assets/ai.png
Normal file
After Width: | Height: | Size: 235 KiB |
BIN
assets/banner.afdesign
Normal file
BIN
assets/mi-white.afdesign
Normal file
BIN
assets/mi.afdesign
Normal file
BIN
assets/ss/explore.jpg
Normal file
After Width: | Height: | Size: 238 KiB |
BIN
assets/ss/user.jpg
Normal file
After Width: | Height: | Size: 148 KiB |
BIN
assets/title.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
@ -1,31 +1,52 @@
|
|||||||
version: "3"
|
version: "3"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
db:
|
web:
|
||||||
restart: always
|
build: .
|
||||||
image: postgres:12.2-alpine
|
restart: always
|
||||||
ports:
|
links:
|
||||||
- "5432:5432"
|
- db
|
||||||
networks:
|
- redis
|
||||||
- internal_network
|
# - es
|
||||||
- external_network
|
ports:
|
||||||
env_file:
|
- "127.0.0.1:3000:3000"
|
||||||
- .config/docker.env
|
networks:
|
||||||
volumes:
|
- internal_network
|
||||||
- ./db:/var/lib/postgresql/data
|
- external_network
|
||||||
|
volumes:
|
||||||
redis:
|
- ./files:/misskey/files
|
||||||
restart: always
|
- ./.config:/misskey/.config:ro
|
||||||
image: redis:4.0-alpine
|
|
||||||
ports:
|
redis:
|
||||||
- "6379:6379"
|
restart: always
|
||||||
networks:
|
image: redis:4.0-alpine
|
||||||
- internal_network
|
networks:
|
||||||
- external_network
|
- internal_network
|
||||||
volumes:
|
volumes:
|
||||||
- ./redis:/data
|
- ./redis:/data
|
||||||
|
|
||||||
networks:
|
db:
|
||||||
internal_network:
|
restart: always
|
||||||
internal: true
|
image: postgres:12.2-alpine
|
||||||
external_network:
|
networks:
|
||||||
|
- internal_network
|
||||||
|
env_file:
|
||||||
|
- .config/docker.env
|
||||||
|
volumes:
|
||||||
|
- ./db:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
# es:
|
||||||
|
# restart: always
|
||||||
|
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2
|
||||||
|
# environment:
|
||||||
|
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||||
|
# - "TAKE_FILE_OWNERSHIP=111"
|
||||||
|
# networks:
|
||||||
|
# - internal_network
|
||||||
|
# volumes:
|
||||||
|
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||||
|
|
||||||
|
networks:
|
||||||
|
internal_network:
|
||||||
|
internal: true
|
||||||
|
external_network:
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
`packages/backend/src/server/web/views/base.pug` の中の
|
|
||||||
```
|
|
||||||
meta(name='theme-color' content='#好きな色')
|
|
||||||
meta(name='theme-color-orig' content='#好きな色')
|
|
||||||
```
|
|
||||||
の好きな色の部分を変更する(Hex値)
|
|
@ -1,15 +0,0 @@
|
|||||||
## 主な変更点
|
|
||||||
- なとナがにゃ
|
|
||||||
- コピーがコビー
|
|
||||||
- あなたが僕
|
|
||||||
- パスワードが鍵
|
|
||||||
- doneがドネ
|
|
||||||
- ユーザー名が名前
|
|
||||||
- バナーがバニャーニャ
|
|
||||||
- ユーザーネームがid
|
|
||||||
- コントロールパネルがコンソトールパネル
|
|
||||||
|
|
||||||
## ぬるきゃごの導入方法
|
|
||||||
1. `./locales/ja-JP.yml` を `ja-NCAT.yml` に変更
|
|
||||||
2. `ja-NCAT.yml` を `./locales` のなかに入れる
|
|
||||||
3. `./locales/inde.js` の `const languages` に `ja-NCAT` を追加する
|
|
@ -908,7 +908,6 @@ _mfm:
|
|||||||
rainbow: "قوس قزح"
|
rainbow: "قوس قزح"
|
||||||
rainbowDescription: "اجعل المحتوى يظهر بألوان الطيف"
|
rainbowDescription: "اجعل المحتوى يظهر بألوان الطيف"
|
||||||
rotate: "تدوير"
|
rotate: "تدوير"
|
||||||
rotateDescription: "يُدير المحتوى بزاوية معيّنة."
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "لا تظهره بتاتًا"
|
none: "لا تظهره بتاتًا"
|
||||||
remote: "أظهر للمستخدمين البِعاد"
|
remote: "أظهر للمستخدمين البِعاد"
|
||||||
@ -1237,8 +1236,6 @@ _pages:
|
|||||||
font: "الخط"
|
font: "الخط"
|
||||||
fontSerif: "Serif"
|
fontSerif: "Serif"
|
||||||
fontSansSerif: "Sans Serif"
|
fontSansSerif: "Sans Serif"
|
||||||
eyeCatchingImageSet: "عيّن صورة مصغّرة"
|
|
||||||
eyeCatchingImageRemove: "احذف صورة مصغّرة"
|
|
||||||
chooseBlock: "إضافة كتلة"
|
chooseBlock: "إضافة كتلة"
|
||||||
selectType: "اختر النوع"
|
selectType: "اختر النوع"
|
||||||
enterVariableName: "أدخل اسم المتغيّر"
|
enterVariableName: "أدخل اسم المتغيّر"
|
||||||
@ -1499,7 +1496,6 @@ _notification:
|
|||||||
pollVote: "مصوِت شارك في الاستطلاع"
|
pollVote: "مصوِت شارك في الاستطلاع"
|
||||||
receiveFollowRequest: "طلبات المتابعة المتلقاة"
|
receiveFollowRequest: "طلبات المتابعة المتلقاة"
|
||||||
followRequestAccepted: "طلبات المتابعة المقبولة"
|
followRequestAccepted: "طلبات المتابعة المقبولة"
|
||||||
groupInvited: "دعوات الفريق"
|
|
||||||
app: "إشعارات التطبيقات المرتبطة"
|
app: "إشعارات التطبيقات المرتبطة"
|
||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "أظهر العمود الرئيسي دائمًا"
|
alwaysShowMainColumn: "أظهر العمود الرئيسي دائمًا"
|
||||||
|
@ -832,10 +832,6 @@ size: "আকার"
|
|||||||
numberOfColumn: "কলামের সংখ্যা"
|
numberOfColumn: "কলামের সংখ্যা"
|
||||||
searchByGoogle: "গুগল"
|
searchByGoogle: "গুগল"
|
||||||
indefinitely: "অনির্দিষ্ট"
|
indefinitely: "অনির্দিষ্ট"
|
||||||
tenMinutes: "১০ মিনিট"
|
|
||||||
oneHour: "১ ঘণ্টা"
|
|
||||||
oneDay: "একদিন"
|
|
||||||
oneWeek: "এক সপ্তাহ"
|
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
|
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
|
||||||
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
|
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
|
||||||
|
@ -94,8 +94,6 @@ unfollow: "Unfollow"
|
|||||||
followRequestPending: "Follow request pending"
|
followRequestPending: "Follow request pending"
|
||||||
enterEmoji: "Enter an emoji"
|
enterEmoji: "Enter an emoji"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
renoteHomeOnly: "Renote to home only"
|
|
||||||
renoteFollowersOnly: "Renote to followers only"
|
|
||||||
unrenote: "Take back renote"
|
unrenote: "Take back renote"
|
||||||
renoted: "Renoted."
|
renoted: "Renoted."
|
||||||
cantRenote: "This post can't be renoted."
|
cantRenote: "This post can't be renoted."
|
||||||
|
1151
locales/eo-UY.yml
Normal file
@ -19,10 +19,12 @@ const languages = [
|
|||||||
'da-DK',
|
'da-DK',
|
||||||
'de-DE',
|
'de-DE',
|
||||||
'en-US',
|
'en-US',
|
||||||
|
'eo-UY',
|
||||||
'es-ES',
|
'es-ES',
|
||||||
'fr-FR',
|
'fr-FR',
|
||||||
'id-ID',
|
'id-ID',
|
||||||
'it-IT',
|
'it-IT',
|
||||||
|
'ja-NY',
|
||||||
'ja-JP',
|
'ja-JP',
|
||||||
'ja-KS',
|
'ja-KS',
|
||||||
'kab-KAB',
|
'kab-KAB',
|
||||||
@ -56,6 +58,7 @@ module.exports = Object.entries(locales)
|
|||||||
const [lang] = k.split('-');
|
const [lang] = k.split('-');
|
||||||
switch (k) {
|
switch (k) {
|
||||||
case 'ja-JP': return v;
|
case 'ja-JP': return v;
|
||||||
|
case 'ja-NY':
|
||||||
case 'ja-KS':
|
case 'ja-KS':
|
||||||
case 'en-US': return merge(locales['ja-JP'], v);
|
case 'en-US': return merge(locales['ja-JP'], v);
|
||||||
default: return merge(
|
default: return merge(
|
||||||
|
1793
locales/ja-NY.yml
Normal file
@ -481,24 +481,13 @@ showFeaturedNotesInTimeline: "Arată notele recomandate în cronologii"
|
|||||||
objectStorage: "Object Storage"
|
objectStorage: "Object Storage"
|
||||||
useObjectStorage: "Folosește Object Storage"
|
useObjectStorage: "Folosește Object Storage"
|
||||||
objectStorageBaseUrl: "URL de bază"
|
objectStorageBaseUrl: "URL de bază"
|
||||||
objectStorageBaseUrlDesc: "URL-ul este folosit pentru referință. Specifică URL-ul CDN-ului sau Proxy-ului tău dacă folosești unul. Pentru S3 folosește 'https://<bucket>.s3.amazonaws.com' și pentru GCS sau servicii echivalente folosește 'https://storage.googleapis.com/<bucket>', etc."
|
|
||||||
objectStorageBucket: "Bucket"
|
objectStorageBucket: "Bucket"
|
||||||
objectStorageBucketDesc: "Te rog specifică numele bucket-ului furnizorului tău."
|
objectStorageBucketDesc: "Te rog specifică numele bucket-ului furnizorului tău."
|
||||||
objectStoragePrefix: "Prefix"
|
objectStoragePrefix: "Prefix"
|
||||||
objectStoragePrefixDesc: "Fișierele vor fi stocate sub directoare cu acest prefix."
|
objectStoragePrefixDesc: "Fișierele vor fi stocate sub directoare cu acest prefix."
|
||||||
objectStorageEndpoint: "Endpoint"
|
objectStorageEndpoint: "Endpoint"
|
||||||
objectStorageEndpointDesc: "Lasă acest câmp gol dacă folosești AWS S3, dacă nu specifică endpoint-ul ca '<host>' sau '<host>:<port>', depinzând de ce serviciu folosești."
|
|
||||||
objectStorageRegion: "Regiune"
|
objectStorageRegion: "Regiune"
|
||||||
objectStorageRegionDesc: "Specifică o regiune precum 'xx-east-1'. Dacă serviciul tău nu face distincția între regiuni lasă acest câmp gol sau introdu 'us-east-1'."
|
|
||||||
objectStorageUseSSL: "Folosește SSl"
|
objectStorageUseSSL: "Folosește SSl"
|
||||||
objectStorageUseSSLDesc: "Oprește această opțiune dacă nu vei folosi HTTPS pentru conexiunile API-ului"
|
|
||||||
objectStorageUseProxy: "Conectează-te prin Proxy"
|
|
||||||
objectStorageUseProxyDesc: "Oprește această opțiune dacă vei nu folosi un Proxy pentru conexiunile API-ului"
|
|
||||||
objectStorageSetPublicRead: "Setează \"public-read\" pentru încărcare"
|
|
||||||
serverLogs: "Loguri server"
|
|
||||||
deleteAll: "Șterge tot"
|
|
||||||
showFixedPostForm: "Arată caseta de postare în vârful cronologie"
|
|
||||||
newNoteRecived: "Sunt note noi"
|
|
||||||
sounds: "Sunete"
|
sounds: "Sunete"
|
||||||
listen: "Ascultă"
|
listen: "Ascultă"
|
||||||
none: "Nimic"
|
none: "Nimic"
|
||||||
@ -533,42 +522,12 @@ removeAllFollowingDescription: "Asta va dez-urmări toate conturile din {host}.
|
|||||||
userSuspended: "Acest utilizator a fost suspendat."
|
userSuspended: "Acest utilizator a fost suspendat."
|
||||||
userSilenced: "Acest utilizator a fost setat silențios."
|
userSilenced: "Acest utilizator a fost setat silențios."
|
||||||
yourAccountSuspendedTitle: "Acest cont a fost suspendat"
|
yourAccountSuspendedTitle: "Acest cont a fost suspendat"
|
||||||
yourAccountSuspendedDescription: "Acest cont a fost suspendat din cauza încălcării termenilor de serviciu al serverului sau ceva similar. Contactează administratorul dacă ai dori să afli un motiv mai detaliat. Te rog nu crea un cont nou."
|
|
||||||
menu: "Meniu"
|
|
||||||
divider: "Separator"
|
|
||||||
addItem: "Adaugă element"
|
|
||||||
relays: "Relee"
|
|
||||||
addRelay: "Adaugă Releu"
|
|
||||||
inboxUrl: "URL-ul inbox-ului"
|
|
||||||
addedRelays: "Relee adăugate"
|
|
||||||
serviceworkerInfo: "Trebuie să fie activat pentru notificări push."
|
|
||||||
deletedNote: "Notă ștearsă"
|
|
||||||
invisibleNote: "Note ascunse"
|
|
||||||
enableInfiniteScroll: "Încarcă mai mult automat"
|
|
||||||
visibility: "Vizibilitate"
|
|
||||||
poll: "Sondaj"
|
|
||||||
useCw: "Ascunde conținutul"
|
|
||||||
enablePlayer: "Deschide player-ul video"
|
|
||||||
disablePlayer: "Închide player-ul video"
|
|
||||||
expandTweet: "Expandează tweet"
|
|
||||||
themeEditor: "Editor de teme"
|
|
||||||
description: "Descriere"
|
|
||||||
describeFile: "Adaugă titrări"
|
|
||||||
enterFileDescription: "Introdu titrările"
|
|
||||||
author: "Autor"
|
|
||||||
leaveConfirm: "Ai schimbări nesalvate. Vrei să renunți la ele?"
|
|
||||||
manage: "Gestionare"
|
|
||||||
plugins: "Pluginuri"
|
|
||||||
deck: "Deck"
|
|
||||||
undeck: "Părăsește Deck"
|
|
||||||
useBlurEffectForModal: "Folosește efect de blur pentru modale"
|
|
||||||
smtpHost: "Gazdă"
|
smtpHost: "Gazdă"
|
||||||
smtpUser: "Nume de utilizator"
|
smtpUser: "Nume de utilizator"
|
||||||
smtpPass: "Parolă"
|
smtpPass: "Parolă"
|
||||||
clearCache: "Golește cache-ul"
|
clearCache: "Golește cache-ul"
|
||||||
info: "Despre"
|
info: "Despre"
|
||||||
user: "Utilizatori"
|
user: "Utilizatori"
|
||||||
administration: "Gestionare"
|
|
||||||
searchByGoogle: "Caută"
|
searchByGoogle: "Caută"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
@ -579,11 +538,9 @@ _mfm:
|
|||||||
emoji: "Emoji personalizat"
|
emoji: "Emoji personalizat"
|
||||||
search: "Caută"
|
search: "Caută"
|
||||||
_theme:
|
_theme:
|
||||||
description: "Descriere"
|
|
||||||
keys:
|
keys:
|
||||||
mention: "Mențiune"
|
mention: "Mențiune"
|
||||||
renote: "Re-notează"
|
renote: "Re-notează"
|
||||||
divider: "Separator"
|
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Note"
|
note: "Note"
|
||||||
notification: "Notificări"
|
notification: "Notificări"
|
||||||
|
@ -81,8 +81,6 @@ somethingHappened: "發生錯誤"
|
|||||||
retry: "重試"
|
retry: "重試"
|
||||||
pageLoadError: "載入頁面失敗"
|
pageLoadError: "載入頁面失敗"
|
||||||
pageLoadErrorDescription: "這通常是因為網路錯誤或是瀏覽器快取殘留的原因。請先清除瀏覽器快取,稍後再重試"
|
pageLoadErrorDescription: "這通常是因為網路錯誤或是瀏覽器快取殘留的原因。請先清除瀏覽器快取,稍後再重試"
|
||||||
serverIsDead: "伺服器沒有回應。請稍等片刻,然後重試。"
|
|
||||||
youShouldUpgradeClient: "請重新載入以使用新版本的客戶端顯示此頁面"
|
|
||||||
enterListName: "輸入清單名稱"
|
enterListName: "輸入清單名稱"
|
||||||
privacy: "隱私"
|
privacy: "隱私"
|
||||||
makeFollowManuallyApprove: "手動審核追隨請求"
|
makeFollowManuallyApprove: "手動審核追隨請求"
|
||||||
@ -106,7 +104,6 @@ clickToShow: "按一下以顯示"
|
|||||||
sensitive: "敏感內容"
|
sensitive: "敏感內容"
|
||||||
add: "新增"
|
add: "新增"
|
||||||
reaction: "情感"
|
reaction: "情感"
|
||||||
reactionSetting: "在選擇器中顯示反應"
|
|
||||||
reactionSettingDescription2: "拖動以重新列序,點擊以刪除,按下 + 添加。"
|
reactionSettingDescription2: "拖動以重新列序,點擊以刪除,按下 + 添加。"
|
||||||
rememberNoteVisibility: "記住貼文可見性"
|
rememberNoteVisibility: "記住貼文可見性"
|
||||||
attachCancel: "移除附件"
|
attachCancel: "移除附件"
|
||||||
@ -141,7 +138,6 @@ flagAsBot: "此使用者是機器人"
|
|||||||
flagAsBotDescription: "如果本帳戶是由程式控制,請啟用此選項。啟用後,會作為標示幫助其他開發者防止機器人之間產生無限互動的行為,並會調整Misskey內部系統將本帳戶識別為機器人"
|
flagAsBotDescription: "如果本帳戶是由程式控制,請啟用此選項。啟用後,會作為標示幫助其他開發者防止機器人之間產生無限互動的行為,並會調整Misskey內部系統將本帳戶識別為機器人"
|
||||||
flagAsCat: "此使用者是貓"
|
flagAsCat: "此使用者是貓"
|
||||||
flagAsCatDescription: "如果想將本帳戶標示為一隻貓,請開啟此標示"
|
flagAsCatDescription: "如果想將本帳戶標示為一隻貓,請開啟此標示"
|
||||||
flagShowTimelineReplies: "在時間軸上顯示貼文的回覆"
|
|
||||||
autoAcceptFollowed: "自動追隨中使用者的追隨請求"
|
autoAcceptFollowed: "自動追隨中使用者的追隨請求"
|
||||||
addAccount: "添加帳戶"
|
addAccount: "添加帳戶"
|
||||||
loginFailed: "登入失敗"
|
loginFailed: "登入失敗"
|
||||||
@ -603,9 +599,6 @@ reportAbuse: "檢舉"
|
|||||||
reportAbuseOf: "檢舉{name}"
|
reportAbuseOf: "檢舉{name}"
|
||||||
fillAbuseReportDescription: "請填寫檢舉的詳細理由。可以的話,請附上針對的URL網址。"
|
fillAbuseReportDescription: "請填寫檢舉的詳細理由。可以的話,請附上針對的URL網址。"
|
||||||
abuseReported: "回報已送出。感謝您的報告。"
|
abuseReported: "回報已送出。感謝您的報告。"
|
||||||
reporter: "檢舉者"
|
|
||||||
reporteeOrigin: "檢舉來源"
|
|
||||||
reporterOrigin: "檢舉者來源"
|
|
||||||
send: "發送"
|
send: "發送"
|
||||||
abuseMarkAsResolved: "處理完畢"
|
abuseMarkAsResolved: "處理完畢"
|
||||||
openInNewTab: "在新分頁中開啟"
|
openInNewTab: "在新分頁中開啟"
|
||||||
@ -741,7 +734,6 @@ postToGallery: "發佈到相簿"
|
|||||||
gallery: "相簿"
|
gallery: "相簿"
|
||||||
recentPosts: "最新貼文"
|
recentPosts: "最新貼文"
|
||||||
popularPosts: "熱門的貼文"
|
popularPosts: "熱門的貼文"
|
||||||
shareWithNote: "在貼文中分享"
|
|
||||||
ads: "廣告"
|
ads: "廣告"
|
||||||
expiration: "期限"
|
expiration: "期限"
|
||||||
memo: "備忘錄"
|
memo: "備忘錄"
|
||||||
@ -751,35 +743,14 @@ middle: "中"
|
|||||||
low: "低"
|
low: "低"
|
||||||
emailNotConfiguredWarning: "沒有設定電子郵件地址"
|
emailNotConfiguredWarning: "沒有設定電子郵件地址"
|
||||||
ratio: "%"
|
ratio: "%"
|
||||||
previewNoteText: "預覽文本"
|
|
||||||
customCss: "自定義 CSS"
|
|
||||||
global: "公開"
|
global: "公開"
|
||||||
sent: "發送"
|
sent: "發送"
|
||||||
received: "收取"
|
|
||||||
searchResult: "搜尋結果"
|
|
||||||
hashtags: "#tag"
|
hashtags: "#tag"
|
||||||
troubleshooting: "故障排除"
|
|
||||||
useBlurEffect: "在 UI 上使用模糊效果"
|
|
||||||
misskeyUpdated: "Misskey 更新完成!"
|
|
||||||
translate: "翻譯"
|
|
||||||
translatedFrom: "從 {x} 翻譯"
|
|
||||||
accountDeletionInProgress: "正在刪除帳戶"
|
|
||||||
pubSub: "Pub/Sub 帳戶"
|
|
||||||
resolved: "已解決"
|
|
||||||
unresolved: "未解決"
|
|
||||||
breakFollow: "移除追蹤者"
|
|
||||||
hide: "隱藏"
|
hide: "隱藏"
|
||||||
leaveGroupConfirm: "確定離開「{name}」?"
|
|
||||||
auto: "自動"
|
|
||||||
searchByGoogle: "搜尋"
|
searchByGoogle: "搜尋"
|
||||||
indefinitely: "無期限"
|
indefinitely: "無期限"
|
||||||
_ffVisibility:
|
_ffVisibility:
|
||||||
public: "發佈"
|
public: "發佈"
|
||||||
private: "私密"
|
|
||||||
_signup:
|
|
||||||
almostThere: "即將完成"
|
|
||||||
_accountDelete:
|
|
||||||
inProgress: "正在刪除"
|
|
||||||
_ad:
|
_ad:
|
||||||
back: "返回"
|
back: "返回"
|
||||||
reduceFrequencyOfThisAd: "降低此廣告的頻率 "
|
reduceFrequencyOfThisAd: "降低此廣告的頻率 "
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "12.110.1-nca10.net-v1",
|
"version": "12.109.2-simkey-v1",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/misskey-dev/misskey.git"
|
"url": "https://github.com/sim1222/misskey.git"
|
||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -41,7 +41,7 @@
|
|||||||
"js-yaml": "4.1.0"
|
"js-yaml": "4.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@typescript-eslint/parser": "5.18.0",
|
"@typescript-eslint/parser": "5.17.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "9.5.3",
|
"cypress": "9.5.3",
|
||||||
"start-server-and-test": "1.14.0",
|
"start-server-and-test": "1.14.0",
|
||||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 9.1 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 3.4 KiB |
@ -5,7 +5,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc -p tsconfig.json || echo done. && tsc-alias -p tsconfig.json",
|
"build": "tsc -p tsconfig.json || echo done. && tsc-alias -p tsconfig.json",
|
||||||
"watch": "node watch.mjs",
|
"watch": "node watch.mjs",
|
||||||
"lint": "eslint --quiet \"src/**/*.ts\"",
|
"lint": "eslint --quiet 'src/**/*.ts'",
|
||||||
"mocha": "cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha",
|
"mocha": "cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha",
|
||||||
"test": "npm run mocha"
|
"test": "npm run mocha"
|
||||||
},
|
},
|
||||||
@ -55,24 +55,25 @@
|
|||||||
"@types/redis": "4.0.11",
|
"@types/redis": "4.0.11",
|
||||||
"@types/rename": "1.0.4",
|
"@types/rename": "1.0.4",
|
||||||
"@types/sanitize-html": "2.6.2",
|
"@types/sanitize-html": "2.6.2",
|
||||||
"@types/sharp": "0.30.1",
|
"@types/sharp": "0.30.0",
|
||||||
"@types/sinonjs__fake-timers": "8.1.2",
|
"@types/sinonjs__fake-timers": "8.1.2",
|
||||||
"@types/speakeasy": "2.0.7",
|
"@types/speakeasy": "2.0.7",
|
||||||
|
"@types/throttle-debounce": "2.1.0",
|
||||||
"@types/tinycolor2": "1.4.3",
|
"@types/tinycolor2": "1.4.3",
|
||||||
"@types/tmp": "0.2.3",
|
"@types/tmp": "0.2.3",
|
||||||
"@types/uuid": "8.3.4",
|
"@types/uuid": "8.3.4",
|
||||||
"@types/web-push": "3.3.2",
|
"@types/web-push": "3.3.2",
|
||||||
"@types/websocket": "1.0.5",
|
"@types/websocket": "1.0.5",
|
||||||
"@types/ws": "8.5.3",
|
"@types/ws": "8.5.3",
|
||||||
"@typescript-eslint/eslint-plugin": "5.18.0",
|
"@typescript-eslint/eslint-plugin": "5.17.0",
|
||||||
"@typescript-eslint/parser": "5.18.0",
|
"@typescript-eslint/parser": "5.17.0",
|
||||||
"@bull-board/koa": "3.10.3",
|
"@bull-board/koa": "3.10.2",
|
||||||
"abort-controller": "3.0.0",
|
"abort-controller": "3.0.0",
|
||||||
"ajv": "8.11.0",
|
"ajv": "8.11.0",
|
||||||
"archiver": "5.3.0",
|
"archiver": "5.3.0",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"aws-sdk": "2.1111.0",
|
"aws-sdk": "2.1105.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "1.1.5",
|
"blurhash": "1.1.5",
|
||||||
"broadcast-channel": "4.10.0",
|
"broadcast-channel": "4.10.0",
|
||||||
@ -88,8 +89,8 @@
|
|||||||
"date-fns": "2.28.0",
|
"date-fns": "2.28.0",
|
||||||
"deep-email-validator": "0.1.21",
|
"deep-email-validator": "0.1.21",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "8.13.0",
|
"eslint": "8.12.0",
|
||||||
"eslint-plugin-import": "2.26.0",
|
"eslint-plugin-import": "2.25.4",
|
||||||
"feed": "4.2.2",
|
"feed": "4.2.2",
|
||||||
"file-type": "17.1.1",
|
"file-type": "17.1.1",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
@ -144,7 +145,7 @@
|
|||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"sanitize-html": "2.7.0",
|
"sanitize-html": "2.7.0",
|
||||||
"semver": "7.3.6",
|
"semver": "7.3.5",
|
||||||
"sharp": "0.30.3",
|
"sharp": "0.30.3",
|
||||||
"speakeasy": "2.0.0",
|
"speakeasy": "2.0.0",
|
||||||
"strict-event-emitter-types": "2.0.0",
|
"strict-event-emitter-types": "2.0.0",
|
||||||
@ -153,6 +154,7 @@
|
|||||||
"summaly": "2.5.0",
|
"summaly": "2.5.0",
|
||||||
"syslog-pro": "1.0.0",
|
"syslog-pro": "1.0.0",
|
||||||
"systeminformation": "5.11.9",
|
"systeminformation": "5.11.9",
|
||||||
|
"throttle-debounce": "3.0.1",
|
||||||
"tinycolor2": "1.4.2",
|
"tinycolor2": "1.4.2",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"ts-loader": "9.2.8",
|
"ts-loader": "9.2.8",
|
||||||
@ -160,7 +162,7 @@
|
|||||||
"tsc-alias": "1.4.1",
|
"tsc-alias": "1.4.1",
|
||||||
"tsconfig-paths": "3.14.1",
|
"tsconfig-paths": "3.14.1",
|
||||||
"twemoji-parser": "14.0.0",
|
"twemoji-parser": "14.0.0",
|
||||||
"typeorm": "0.3.5",
|
"typeorm": "0.3.4",
|
||||||
"typescript": "4.6.3",
|
"typescript": "4.6.3",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"unzipper": "0.10.11",
|
"unzipper": "0.10.11",
|
||||||
@ -171,7 +173,7 @@
|
|||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@redocly/openapi-core": "1.0.0-beta.93",
|
"@redocly/openapi-core": "1.0.0-beta.91",
|
||||||
"@types/fluent-ffmpeg": "2.1.20",
|
"@types/fluent-ffmpeg": "2.1.20",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"execa": "6.1.0"
|
"execa": "6.1.0"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
export const MAX_NOTE_TEXT_LENGTH = 3000;
|
export const MAX_NOTE_TEXT_LENGTH = 8192;
|
||||||
|
|
||||||
export const USER_ONLINE_THRESHOLD = 1000 * 60 * 10; // 10min
|
export const USER_ONLINE_THRESHOLD = 1000 * 60 * 10; // 10min
|
||||||
export const USER_ACTIVE_THRESHOLD = 1000 * 60 * 60 * 24 * 3; // 3days
|
export const USER_ACTIVE_THRESHOLD = 1000 * 60 * 60 * 24 * 3; // 3days
|
||||||
|
@ -209,11 +209,7 @@ export const db = new DataSource({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export async function initDb() {
|
export async function initDb() {
|
||||||
if (db.isInitialized) {
|
await db.connect();
|
||||||
// nop
|
|
||||||
} else {
|
|
||||||
await db.connect();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function resetDb() {
|
export async function resetDb() {
|
||||||
|
@ -42,8 +42,7 @@ async function getCaptchaResponse(url: string, secret: string, response: string)
|
|||||||
headers: {
|
headers: {
|
||||||
'User-Agent': config.userAgent,
|
'User-Agent': config.userAgent,
|
||||||
},
|
},
|
||||||
// TODO
|
timeout: 10 * 1000,
|
||||||
//timeout: 10 * 1000,
|
|
||||||
agent: getAgentByUrl,
|
agent: getAgentByUrl,
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
throw `${e.message || e}`;
|
throw `${e.message || e}`;
|
||||||
|
@ -120,9 +120,9 @@ export const httpsAgent = config.proxy
|
|||||||
*/
|
*/
|
||||||
export function getAgentByUrl(url: URL, bypassProxy = false) {
|
export function getAgentByUrl(url: URL, bypassProxy = false) {
|
||||||
if (bypassProxy || (config.proxyBypassHosts || []).includes(url.hostname)) {
|
if (bypassProxy || (config.proxyBypassHosts || []).includes(url.hostname)) {
|
||||||
return url.protocol === 'http:' ? _http : _https;
|
return url.protocol == 'http:' ? _http : _https;
|
||||||
} else {
|
} else {
|
||||||
return url.protocol === 'http:' ? httpAgent : httpsAgent;
|
return url.protocol == 'http:' ? httpAgent : httpsAgent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ export const getNoteSummary = (note: Packed<'Note'>): string => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ファイルが添付されているとき
|
// ファイルが添付されているとき
|
||||||
if ((note.files || []).length !== 0) {
|
if ((note.files || []).length != 0) {
|
||||||
summary += ` (📎${note.files!.length})`;
|
summary += ` (📎${note.files!.length})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Entity, Column, Index, OneToOne, JoinColumn, PrimaryColumn } from 'typeorm';
|
import { Entity, Column, Index, OneToOne, JoinColumn, PrimaryColumn } from 'typeorm';
|
||||||
import { id } from '../id.js';
|
|
||||||
import { DriveFile } from './drive-file.js';
|
import { DriveFile } from './drive-file.js';
|
||||||
|
import { id } from '../id.js';
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
@Index(['usernameLower', 'host'], { unique: true })
|
@Index(['usernameLower', 'host'], { unique: true })
|
||||||
@ -207,7 +207,7 @@ export class User {
|
|||||||
|
|
||||||
@Column('boolean', {
|
@Column('boolean', {
|
||||||
default: false,
|
default: false,
|
||||||
comment: 'Whether to show users replying to other users in the timeline',
|
comment: 'Whether to show users replying to other users in the timeline'
|
||||||
})
|
})
|
||||||
public showTimelineReplies: boolean;
|
public showTimelineReplies: boolean;
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { EntityRepository, Repository, In, Not } from 'typeorm';
|
import { EntityRepository, Repository, In, Not } from 'typeorm';
|
||||||
import Ajv from 'ajv';
|
import Ajv from 'ajv';
|
||||||
import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js';
|
import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js';
|
||||||
|
import { Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserSecurityKeys, UserGroupJoinings, Pages, Announcements, AnnouncementReads, Antennas, AntennaNotes, ChannelFollowings, Instances, DriveFiles } from '../index.js';
|
||||||
import config from '@/config/index.js';
|
import config from '@/config/index.js';
|
||||||
import { Packed } from '@/misc/schema.js';
|
import { Packed } from '@/misc/schema.js';
|
||||||
import { awaitAll, Promiseable } from '@/prelude/await-all.js';
|
import { awaitAll, Promiseable } from '@/prelude/await-all.js';
|
||||||
@ -8,9 +9,8 @@ import { populateEmojis } from '@/misc/populate-emojis.js';
|
|||||||
import { getAntennas } from '@/misc/antenna-cache.js';
|
import { getAntennas } from '@/misc/antenna-cache.js';
|
||||||
import { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from '@/const.js';
|
import { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from '@/const.js';
|
||||||
import { Cache } from '@/misc/cache.js';
|
import { Cache } from '@/misc/cache.js';
|
||||||
import { db } from '@/db/postgre.js';
|
|
||||||
import { Instance } from '../entities/instance.js';
|
import { Instance } from '../entities/instance.js';
|
||||||
import { Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserSecurityKeys, UserGroupJoinings, Pages, Announcements, AnnouncementReads, Antennas, AntennaNotes, ChannelFollowings, Instances, DriveFiles } from '../index.js';
|
import { db } from '@/db/postgre.js';
|
||||||
|
|
||||||
const userInstanceCache = new Cache<Instance | null>(1000 * 60 * 60 * 3);
|
const userInstanceCache = new Cache<Instance | null>(1000 * 60 * 60 * 3);
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ export const UserRepository = db.getRepository(User).extend({
|
|||||||
const joinings = await UserGroupJoinings.findBy({ userId: userId });
|
const joinings = await UserGroupJoinings.findBy({ userId: userId });
|
||||||
|
|
||||||
const groupQs = Promise.all(joinings.map(j => MessagingMessages.createQueryBuilder('message')
|
const groupQs = Promise.all(joinings.map(j => MessagingMessages.createQueryBuilder('message')
|
||||||
.where('message.groupId = :groupId', { groupId: j.userGroupId })
|
.where(`message.groupId = :groupId`, { groupId: j.userGroupId })
|
||||||
.andWhere('message.userId != :userId', { userId: userId })
|
.andWhere('message.userId != :userId', { userId: userId })
|
||||||
.andWhere('NOT (:userId = ANY(message.reads))', { userId: userId })
|
.andWhere('NOT (:userId = ANY(message.reads))', { userId: userId })
|
||||||
.andWhere('message.createdAt > :joinedAt', { joinedAt: j.createdAt }) // 自分が加入する前の会話については、未読扱いしない
|
.andWhere('message.createdAt > :joinedAt', { joinedAt: j.createdAt }) // 自分が加入する前の会話については、未読扱いしない
|
||||||
@ -204,18 +204,8 @@ export const UserRepository = db.getRepository(User).extend({
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
async getAvatarUrl(user: User): Promise<string> {
|
getAvatarUrl(user: User): string {
|
||||||
if (user.avatar) {
|
// TODO: avatarIdがあるがavatarがない(JOINされてない)場合のハンドリング
|
||||||
return DriveFiles.getPublicUrl(user.avatar, true) || this.getIdenticonUrl(user.id);
|
|
||||||
} else if (user.avatarId) {
|
|
||||||
const avatar = await DriveFiles.findOneByOrFail({ id: user.avatarId });
|
|
||||||
return DriveFiles.getPublicUrl(avatar, true) || this.getIdenticonUrl(user.id);
|
|
||||||
} else {
|
|
||||||
return this.getIdenticonUrl(user.id);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
getAvatarUrlSync(user: User): string {
|
|
||||||
if (user.avatar) {
|
if (user.avatar) {
|
||||||
return DriveFiles.getPublicUrl(user.avatar, true) || this.getIdenticonUrl(user.id);
|
return DriveFiles.getPublicUrl(user.avatar, true) || this.getIdenticonUrl(user.id);
|
||||||
} else {
|
} else {
|
||||||
@ -233,7 +223,7 @@ export const UserRepository = db.getRepository(User).extend({
|
|||||||
options?: {
|
options?: {
|
||||||
detail?: D,
|
detail?: D,
|
||||||
includeSecrets?: boolean,
|
includeSecrets?: boolean,
|
||||||
},
|
}
|
||||||
): Promise<IsMeAndIsUserDetailed<ExpectsMe, D>> {
|
): Promise<IsMeAndIsUserDetailed<ExpectsMe, D>> {
|
||||||
const opts = Object.assign({
|
const opts = Object.assign({
|
||||||
detail: false,
|
detail: false,
|
||||||
@ -284,7 +274,7 @@ export const UserRepository = db.getRepository(User).extend({
|
|||||||
name: user.name,
|
name: user.name,
|
||||||
username: user.username,
|
username: user.username,
|
||||||
host: user.host,
|
host: user.host,
|
||||||
avatarUrl: this.getAvatarUrlSync(user),
|
avatarUrl: this.getAvatarUrl(user),
|
||||||
avatarBlurhash: user.avatar?.blurhash || null,
|
avatarBlurhash: user.avatar?.blurhash || null,
|
||||||
avatarColor: null, // 後方互換性のため
|
avatarColor: null, // 後方互換性のため
|
||||||
isAdmin: user.isAdmin || falsy,
|
isAdmin: user.isAdmin || falsy,
|
||||||
@ -293,7 +283,7 @@ export const UserRepository = db.getRepository(User).extend({
|
|||||||
isCat: user.isCat || falsy,
|
isCat: user.isCat || falsy,
|
||||||
instance: user.host ? userInstanceCache.fetch(user.host,
|
instance: user.host ? userInstanceCache.fetch(user.host,
|
||||||
() => Instances.findOneBy({ host: user.host! }),
|
() => Instances.findOneBy({ host: user.host! }),
|
||||||
v => v != null,
|
v => v != null
|
||||||
).then(instance => instance ? {
|
).then(instance => instance ? {
|
||||||
name: instance.name,
|
name: instance.name,
|
||||||
softwareName: instance.softwareName,
|
softwareName: instance.softwareName,
|
||||||
@ -413,7 +403,7 @@ export const UserRepository = db.getRepository(User).extend({
|
|||||||
options?: {
|
options?: {
|
||||||
detail?: D,
|
detail?: D,
|
||||||
includeSecrets?: boolean,
|
includeSecrets?: boolean,
|
||||||
},
|
}
|
||||||
): Promise<IsUserDetailed<D>[]> {
|
): Promise<IsUserDetailed<D>[]> {
|
||||||
return Promise.all(users.map(u => this.pack(u, me, options)));
|
return Promise.all(users.map(u => this.pack(u, me, options)));
|
||||||
},
|
},
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import httpSignature from 'http-signature';
|
import httpSignature from 'http-signature';
|
||||||
import { v4 as uuid } from 'uuid';
|
|
||||||
|
|
||||||
import config from '@/config/index.js';
|
import config from '@/config/index.js';
|
||||||
import { envOption } from '../env.js';
|
import { envOption } from '../env.js';
|
||||||
@ -17,7 +16,7 @@ import { getJobInfo } from './get-job-info.js';
|
|||||||
import { systemQueue, dbQueue, deliverQueue, inboxQueue, objectStorageQueue, endedPollNotificationQueue, webhookDeliverQueue } from './queues.js';
|
import { systemQueue, dbQueue, deliverQueue, inboxQueue, objectStorageQueue, endedPollNotificationQueue, webhookDeliverQueue } from './queues.js';
|
||||||
import { ThinUser } from './types.js';
|
import { ThinUser } from './types.js';
|
||||||
import { IActivity } from '@/remote/activitypub/type.js';
|
import { IActivity } from '@/remote/activitypub/type.js';
|
||||||
import { Webhook, webhookEventTypes } from '@/models/entities/webhook.js';
|
import { Webhook } from '@/models/entities/webhook.js';
|
||||||
|
|
||||||
function renderError(e: Error): any {
|
function renderError(e: Error): any {
|
||||||
return {
|
return {
|
||||||
@ -263,16 +262,12 @@ export function createCleanRemoteFilesJob() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function webhookDeliver(webhook: Webhook, type: typeof webhookEventTypes[number], content: unknown) {
|
export function webhookDeliver(webhook: Webhook, content: unknown) {
|
||||||
const data = {
|
const data = {
|
||||||
type,
|
|
||||||
content,
|
content,
|
||||||
webhookId: webhook.id,
|
webhookId: webhook.id,
|
||||||
userId: webhook.userId,
|
|
||||||
to: webhook.url,
|
to: webhook.url,
|
||||||
secret: webhook.secret,
|
secret: webhook.secret,
|
||||||
createdAt: Date.now(),
|
|
||||||
eventId: uuid(),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return webhookDeliverQueue.add(data, {
|
return webhookDeliverQueue.add(data, {
|
||||||
|
@ -8,9 +8,13 @@ import config from '@/config/index.js';
|
|||||||
|
|
||||||
const logger = new Logger('webhook');
|
const logger = new Logger('webhook');
|
||||||
|
|
||||||
|
let latest: string | null = null;
|
||||||
|
|
||||||
export default async (job: Bull.Job<WebhookDeliverJobData>) => {
|
export default async (job: Bull.Job<WebhookDeliverJobData>) => {
|
||||||
try {
|
try {
|
||||||
logger.debug(`delivering ${job.data.webhookId}`);
|
if (latest !== (latest = JSON.stringify(job.data.content, null, 2))) {
|
||||||
|
logger.debug(`delivering ${latest}`);
|
||||||
|
}
|
||||||
|
|
||||||
const res = await getResponse({
|
const res = await getResponse({
|
||||||
url: job.data.to,
|
url: job.data.to,
|
||||||
@ -21,14 +25,7 @@ export default async (job: Bull.Job<WebhookDeliverJobData>) => {
|
|||||||
'X-Misskey-Hook-Id': job.data.webhookId,
|
'X-Misskey-Hook-Id': job.data.webhookId,
|
||||||
'X-Misskey-Hook-Secret': job.data.secret,
|
'X-Misskey-Hook-Secret': job.data.secret,
|
||||||
},
|
},
|
||||||
body: JSON.stringify({
|
body: JSON.stringify(job.data.content),
|
||||||
hookId: job.data.webhookId,
|
|
||||||
userId: job.data.userId,
|
|
||||||
eventId: job.data.eventId,
|
|
||||||
createdAt: job.data.createdAt,
|
|
||||||
type: job.data.type,
|
|
||||||
body: job.data.content,
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Webhooks.update({ id: job.data.webhookId }, {
|
Webhooks.update({ id: job.data.webhookId }, {
|
||||||
|
@ -48,14 +48,10 @@ export type EndedPollNotificationJobData = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type WebhookDeliverJobData = {
|
export type WebhookDeliverJobData = {
|
||||||
type: string;
|
|
||||||
content: unknown;
|
content: unknown;
|
||||||
webhookId: Webhook['id'];
|
webhookId: Webhook['id'];
|
||||||
userId: User['id'];
|
|
||||||
to: string;
|
to: string;
|
||||||
secret: string;
|
secret: string;
|
||||||
createdAt: number;
|
|
||||||
eventId: string;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ThinUser = {
|
export type ThinUser = {
|
||||||
|
@ -95,7 +95,7 @@ function genSigningString(request: Request, includeHeaders: string[]) {
|
|||||||
|
|
||||||
function lcObjectKey(src: Record<string, string>) {
|
function lcObjectKey(src: Record<string, string>) {
|
||||||
const dst: Record<string, string> = {};
|
const dst: Record<string, string> = {};
|
||||||
for (const key of Object.keys(src).filter(x => x !== '__proto__' && typeof src[x] === 'string')) dst[key.toLowerCase()] = src[key];
|
for (const key of Object.keys(src).filter(x => x != '__proto__' && typeof src[x] === 'string')) dst[key.toLowerCase()] = src[key];
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,15 +109,15 @@ export default class DeliverManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.recipes.filter((recipe): recipe is IDirectRecipe =>
|
this.recipes.filter((recipe): recipe is IDirectRecipe => {
|
||||||
// followers recipes have already been processed
|
// followers recipes have already been processed
|
||||||
isDirect(recipe)
|
isDirect(recipe)
|
||||||
// check that shared inbox has not been added yet
|
// check that shared inbox has not been added yet
|
||||||
&& !(recipe.to.sharedInbox && inboxes.has(recipe.to.sharedInbox))
|
&& !(recipe.to.sharedInbox && inboxes.has(recipe.to.sharedInbox))
|
||||||
// check that they actually have an inbox
|
// check that they actually have an inbox
|
||||||
&& recipe.to.inbox != null,
|
&& recipe.to.inbox
|
||||||
)
|
})
|
||||||
.forEach(recipe => inboxes.add(recipe.to.inbox!));
|
.forEach(recipe => inboxes.add(recipe.to.inbox));
|
||||||
|
|
||||||
// deliver
|
// deliver
|
||||||
for (const inbox of inboxes) {
|
for (const inbox of inboxes) {
|
||||||
|
@ -18,7 +18,7 @@ export const performReadActivity = async (actor: CacheableRemoteUser, activity:
|
|||||||
return `skip: message not found`;
|
return `skip: message not found`;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actor.id !== message.recipientId) {
|
if (actor.id != message.recipientId) {
|
||||||
return `skip: actor is not a message recipient`;
|
return `skip: actor is not a message recipient`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import unfollow from '@/services/following/delete.js';
|
import unfollow from '@/services/following/delete.js';
|
||||||
import cancelRequest from '@/services/following/requests/cancel.js';
|
import cancelRequest from '@/services/following/requests/cancel.js';
|
||||||
import { IAccept } from '../../type.js';
|
import {IAccept} from '../../type.js';
|
||||||
import { CacheableRemoteUser } from '@/models/entities/user.js';
|
import { CacheableRemoteUser } from '@/models/entities/user.js';
|
||||||
import { Followings } from '@/models/index.js';
|
import { Followings } from '@/models/index.js';
|
||||||
import DbResolver from '../../db-resolver.js';
|
import DbResolver from '../../db-resolver.js';
|
||||||
|
@ -113,8 +113,7 @@ export class LdSignature {
|
|||||||
headers: {
|
headers: {
|
||||||
Accept: 'application/ld+json, application/json',
|
Accept: 'application/ld+json, application/json',
|
||||||
},
|
},
|
||||||
// TODO
|
timeout: this.loderTimeout,
|
||||||
//timeout: this.loderTimeout,
|
|
||||||
agent: u => u.protocol === 'http:' ? httpAgent : httpsAgent,
|
agent: u => u.protocol === 'http:' ? httpAgent : httpsAgent,
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
|
@ -69,7 +69,7 @@ export async function updateQuestion(value: any) {
|
|||||||
const oldCount = poll.votes[poll.choices.indexOf(choice)];
|
const oldCount = poll.votes[poll.choices.indexOf(choice)];
|
||||||
const newCount = apChoices!.filter(ap => ap.name === choice)[0].replies!.totalItems;
|
const newCount = apChoices!.filter(ap => ap.name === choice)[0].replies!.totalItems;
|
||||||
|
|
||||||
if (oldCount !== newCount) {
|
if (oldCount != newCount) {
|
||||||
changed = true;
|
changed = true;
|
||||||
poll.votes[poll.choices.indexOf(choice)] = newCount;
|
poll.votes[poll.choices.indexOf(choice)] = newCount;
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ type IWebFinger = {
|
|||||||
export default async function(query: string): Promise<IWebFinger> {
|
export default async function(query: string): Promise<IWebFinger> {
|
||||||
const url = genUrl(query);
|
const url = genUrl(query);
|
||||||
|
|
||||||
return await getJson(url, 'application/jrd+json, application/json') as IWebFinger;
|
return await getJson(url, 'application/jrd+json, application/json');
|
||||||
}
|
}
|
||||||
|
|
||||||
function genUrl(query: string) {
|
function genUrl(query: string) {
|
||||||
|
@ -121,14 +121,14 @@ export function verifyLogin({
|
|||||||
signature: Buffer,
|
signature: Buffer,
|
||||||
challenge: string
|
challenge: string
|
||||||
}) {
|
}) {
|
||||||
if (clientData.type !== 'webauthn.get') {
|
if (clientData.type != 'webauthn.get') {
|
||||||
throw new Error('type is not webauthn.get');
|
throw new Error('type is not webauthn.get');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hash(clientData.challenge).toString('hex') !== challenge) {
|
if (hash(clientData.challenge).toString('hex') != challenge) {
|
||||||
throw new Error('challenge mismatch');
|
throw new Error('challenge mismatch');
|
||||||
}
|
}
|
||||||
if (clientData.origin !== config.scheme + '://' + config.host) {
|
if (clientData.origin != config.scheme + '://' + config.host) {
|
||||||
throw new Error('origin mismatch');
|
throw new Error('origin mismatch');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,11 +148,11 @@ export const procedures = {
|
|||||||
verify({ publicKey }: {publicKey: Map<number, Buffer>}) {
|
verify({ publicKey }: {publicKey: Map<number, Buffer>}) {
|
||||||
const negTwo = publicKey.get(-2);
|
const negTwo = publicKey.get(-2);
|
||||||
|
|
||||||
if (!negTwo || negTwo.length !== 32) {
|
if (!negTwo || negTwo.length != 32) {
|
||||||
throw new Error('invalid or no -2 key given');
|
throw new Error('invalid or no -2 key given');
|
||||||
}
|
}
|
||||||
const negThree = publicKey.get(-3);
|
const negThree = publicKey.get(-3);
|
||||||
if (!negThree || negThree.length !== 32) {
|
if (!negThree || negThree.length != 32) {
|
||||||
throw new Error('invalid or no -3 key given');
|
throw new Error('invalid or no -3 key given');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,7 +183,7 @@ export const procedures = {
|
|||||||
rpIdHash: Buffer,
|
rpIdHash: Buffer,
|
||||||
credentialId: Buffer,
|
credentialId: Buffer,
|
||||||
}) {
|
}) {
|
||||||
if (attStmt.alg !== -7) {
|
if (attStmt.alg != -7) {
|
||||||
throw new Error('alg mismatch');
|
throw new Error('alg mismatch');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,11 +196,11 @@ export const procedures = {
|
|||||||
|
|
||||||
const negTwo = publicKey.get(-2);
|
const negTwo = publicKey.get(-2);
|
||||||
|
|
||||||
if (!negTwo || negTwo.length !== 32) {
|
if (!negTwo || negTwo.length != 32) {
|
||||||
throw new Error('invalid or no -2 key given');
|
throw new Error('invalid or no -2 key given');
|
||||||
}
|
}
|
||||||
const negThree = publicKey.get(-3);
|
const negThree = publicKey.get(-3);
|
||||||
if (!negThree || negThree.length !== 32) {
|
if (!negThree || negThree.length != 32) {
|
||||||
throw new Error('invalid or no -3 key given');
|
throw new Error('invalid or no -3 key given');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,7 +263,7 @@ export const procedures = {
|
|||||||
.map((key: any) => PEMString(key))
|
.map((key: any) => PEMString(key))
|
||||||
.concat([GSR2]);
|
.concat([GSR2]);
|
||||||
|
|
||||||
if (getCertSubject(certificateChain[0]).CN !== 'attest.android.com') {
|
if (getCertSubject(certificateChain[0]).CN != 'attest.android.com') {
|
||||||
throw new Error('invalid common name');
|
throw new Error('invalid common name');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,11 +283,11 @@ export const procedures = {
|
|||||||
|
|
||||||
const negTwo = publicKey.get(-2);
|
const negTwo = publicKey.get(-2);
|
||||||
|
|
||||||
if (!negTwo || negTwo.length !== 32) {
|
if (!negTwo || negTwo.length != 32) {
|
||||||
throw new Error('invalid or no -2 key given');
|
throw new Error('invalid or no -2 key given');
|
||||||
}
|
}
|
||||||
const negThree = publicKey.get(-3);
|
const negThree = publicKey.get(-3);
|
||||||
if (!negThree || negThree.length !== 32) {
|
if (!negThree || negThree.length != 32) {
|
||||||
throw new Error('invalid or no -3 key given');
|
throw new Error('invalid or no -3 key given');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -332,11 +332,11 @@ export const procedures = {
|
|||||||
|
|
||||||
const negTwo = publicKey.get(-2);
|
const negTwo = publicKey.get(-2);
|
||||||
|
|
||||||
if (!negTwo || negTwo.length !== 32) {
|
if (!negTwo || negTwo.length != 32) {
|
||||||
throw new Error('invalid or no -2 key given');
|
throw new Error('invalid or no -2 key given');
|
||||||
}
|
}
|
||||||
const negThree = publicKey.get(-3);
|
const negThree = publicKey.get(-3);
|
||||||
if (!negThree || negThree.length !== 32) {
|
if (!negThree || negThree.length != 32) {
|
||||||
throw new Error('invalid or no -3 key given');
|
throw new Error('invalid or no -3 key given');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +353,7 @@ export const procedures = {
|
|||||||
// https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-ecdaa-algorithm-v2.0-id-20180227.html#ecdaa-verify-operation
|
// https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-ecdaa-algorithm-v2.0-id-20180227.html#ecdaa-verify-operation
|
||||||
throw new Error('ECDAA-Verify is not supported');
|
throw new Error('ECDAA-Verify is not supported');
|
||||||
} else {
|
} else {
|
||||||
if (attStmt.alg !== -7) throw new Error('alg mismatch');
|
if (attStmt.alg != -7) throw new Error('alg mismatch');
|
||||||
|
|
||||||
throw new Error('self attestation is not supported');
|
throw new Error('self attestation is not supported');
|
||||||
}
|
}
|
||||||
@ -377,7 +377,7 @@ export const procedures = {
|
|||||||
credentialId: Buffer
|
credentialId: Buffer
|
||||||
}) {
|
}) {
|
||||||
const x5c: Buffer[] = attStmt.x5c;
|
const x5c: Buffer[] = attStmt.x5c;
|
||||||
if (x5c.length !== 1) {
|
if (x5c.length != 1) {
|
||||||
throw new Error('x5c length does not match expectation');
|
throw new Error('x5c length does not match expectation');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -387,11 +387,11 @@ export const procedures = {
|
|||||||
|
|
||||||
const negTwo: Buffer = publicKey.get(-2);
|
const negTwo: Buffer = publicKey.get(-2);
|
||||||
|
|
||||||
if (!negTwo || negTwo.length !== 32) {
|
if (!negTwo || negTwo.length != 32) {
|
||||||
throw new Error('invalid or no -2 key given');
|
throw new Error('invalid or no -2 key given');
|
||||||
}
|
}
|
||||||
const negThree: Buffer = publicKey.get(-3);
|
const negThree: Buffer = publicKey.get(-3);
|
||||||
if (!negThree || negThree.length !== 32) {
|
if (!negThree || negThree.length != 32) {
|
||||||
throw new Error('invalid or no -3 key given');
|
throw new Error('invalid or no -3 key given');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ import { publishMainStream } from '@/services/stream.js';
|
|||||||
export default function(ctx: Koa.Context, user: ILocalUser, redirect = false) {
|
export default function(ctx: Koa.Context, user: ILocalUser, redirect = false) {
|
||||||
if (redirect) {
|
if (redirect) {
|
||||||
//#region Cookie
|
//#region Cookie
|
||||||
ctx.cookies.set('igi', user.token!, {
|
ctx.cookies.set('igi', user.token, {
|
||||||
path: '/',
|
path: '/',
|
||||||
// SEE: https://github.com/koajs/koa/issues/974
|
// SEE: https://github.com/koajs/koa/issues/974
|
||||||
// When using a SSL proxy it should be configured to add the "X-Forwarded-Proto: https" header
|
// When using a SSL proxy it should be configured to add the "X-Forwarded-Proto: https" header
|
||||||
|
@ -57,9 +57,13 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
throw new ApiError(meta.errors.noSuchAntenna);
|
throw new ApiError(meta.errors.noSuchAntenna);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const antennaQuery = AntennaNotes.createQueryBuilder('joining')
|
||||||
|
.select('joining.noteId')
|
||||||
|
.where('joining.antennaId = :antennaId', { antennaId: antenna.id });
|
||||||
|
|
||||||
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
|
||||||
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
|
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
|
||||||
.innerJoin(AntennaNotes.metadata.targetName, 'antennaNote', 'antennaNote.noteId = note.id')
|
.andWhere(`note.id IN (${ antennaQuery.getQuery() })`)
|
||||||
.innerJoinAndSelect('note.user', 'user')
|
.innerJoinAndSelect('note.user', 'user')
|
||||||
.leftJoinAndSelect('user.avatar', 'avatar')
|
.leftJoinAndSelect('user.avatar', 'avatar')
|
||||||
.leftJoinAndSelect('user.banner', 'banner')
|
.leftJoinAndSelect('user.banner', 'banner')
|
||||||
@ -71,7 +75,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
.leftJoinAndSelect('renote.user', 'renoteUser')
|
.leftJoinAndSelect('renote.user', 'renoteUser')
|
||||||
.leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
|
.leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
|
||||||
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
|
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
|
||||||
.andWhere('antennaNote.antennaId = :antennaId', { antennaId: antenna.id });
|
.setParameters(antennaQuery.getParameters());
|
||||||
|
|
||||||
generateVisibilityQuery(query, user);
|
generateVisibilityQuery(query, user);
|
||||||
generateMutedUserQuery(query, user);
|
generateMutedUserQuery(query, user);
|
||||||
|
@ -57,8 +57,12 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
throw new ApiError(meta.errors.noSuchClip);
|
throw new ApiError(meta.errors.noSuchClip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clipQuery = ClipNotes.createQueryBuilder('joining')
|
||||||
|
.select('joining.noteId')
|
||||||
|
.where('joining.clipId = :clipId', { clipId: clip.id });
|
||||||
|
|
||||||
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
||||||
.innerJoin(ClipNotes.metadata.targetName, 'clipNote', 'clipNote.noteId = note.id')
|
.andWhere(`note.id IN (${ clipQuery.getQuery() })`)
|
||||||
.innerJoinAndSelect('note.user', 'user')
|
.innerJoinAndSelect('note.user', 'user')
|
||||||
.leftJoinAndSelect('user.avatar', 'avatar')
|
.leftJoinAndSelect('user.avatar', 'avatar')
|
||||||
.leftJoinAndSelect('user.banner', 'banner')
|
.leftJoinAndSelect('user.banner', 'banner')
|
||||||
@ -70,7 +74,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
.leftJoinAndSelect('renote.user', 'renoteUser')
|
.leftJoinAndSelect('renote.user', 'renoteUser')
|
||||||
.leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
|
.leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
|
||||||
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
|
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
|
||||||
.andWhere('clipNote.clipId = :clipId', { clipId: clip.id });
|
.setParameters(clipQuery.getParameters());
|
||||||
|
|
||||||
if (user) {
|
if (user) {
|
||||||
generateVisibilityQuery(query, user);
|
generateVisibilityQuery(query, user);
|
||||||
|
@ -48,6 +48,7 @@ export const paramDef = {
|
|||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
// eslint-disable-next-line import/no-default-export
|
// eslint-disable-next-line import/no-default-export
|
||||||
|
// @ts-ignore
|
||||||
export default define(meta, paramDef, async (ps, user, _, file, cleanup) => {
|
export default define(meta, paramDef, async (ps, user, _, file, cleanup) => {
|
||||||
// Get 'name' parameter
|
// Get 'name' parameter
|
||||||
let name = ps.name || file.originalname;
|
let name = ps.name || file.originalname;
|
||||||
|
@ -50,10 +50,10 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
|
|
||||||
const clientData = JSON.parse(ps.clientDataJSON);
|
const clientData = JSON.parse(ps.clientDataJSON);
|
||||||
|
|
||||||
if (clientData.type !== 'webauthn.create') {
|
if (clientData.type != 'webauthn.create') {
|
||||||
throw new Error('not a creation attestation');
|
throw new Error('not a creation attestation');
|
||||||
}
|
}
|
||||||
if (clientData.origin !== config.scheme + '://' + config.host) {
|
if (clientData.origin != config.scheme + '://' + config.host) {
|
||||||
throw new Error('origin mismatch');
|
throw new Error('origin mismatch');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
const credentialId = authData.slice(55, 55 + credentialIdLength);
|
const credentialId = authData.slice(55, 55 + credentialIdLength);
|
||||||
const publicKeyData = authData.slice(55 + credentialIdLength);
|
const publicKeyData = authData.slice(55 + credentialIdLength);
|
||||||
const publicKey: Map<number, any> = await cborDecodeFirst(publicKeyData);
|
const publicKey: Map<number, any> = await cborDecodeFirst(publicKeyData);
|
||||||
if (publicKey.get(3) !== -7) {
|
if (publicKey.get(3) != -7) {
|
||||||
throw new Error('alg mismatch');
|
throw new Error('alg mismatch');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
take: ps.limit,
|
take: ps.limit,
|
||||||
skip: ps.offset,
|
skip: ps.offset,
|
||||||
order: {
|
order: {
|
||||||
id: ps.sort === 'asc' ? 1 : -1,
|
id: ps.sort == 'asc' ? 1 : -1,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -52,19 +52,19 @@ export default define(meta, paramDef, async (ps) => {
|
|||||||
query.andWhere('note.userHost IS NULL');
|
query.andWhere('note.userHost IS NULL');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps.reply !== undefined) {
|
if (ps.reply != undefined) {
|
||||||
query.andWhere(ps.reply ? 'note.replyId IS NOT NULL' : 'note.replyId IS NULL');
|
query.andWhere(ps.reply ? 'note.replyId IS NOT NULL' : 'note.replyId IS NULL');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps.renote !== undefined) {
|
if (ps.renote != undefined) {
|
||||||
query.andWhere(ps.renote ? 'note.renoteId IS NOT NULL' : 'note.renoteId IS NULL');
|
query.andWhere(ps.renote ? 'note.renoteId IS NOT NULL' : 'note.renoteId IS NULL');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps.withFiles !== undefined) {
|
if (ps.withFiles != undefined) {
|
||||||
query.andWhere(ps.withFiles ? `note.fileIds != '{}'` : `note.fileIds = '{}'`);
|
query.andWhere(ps.withFiles ? `note.fileIds != '{}'` : `note.fileIds = '{}'`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps.poll !== undefined) {
|
if (ps.poll != undefined) {
|
||||||
query.andWhere(ps.poll ? 'note.hasPoll = TRUE' : 'note.hasPoll = FALSE');
|
query.andWhere(ps.poll ? 'note.hasPoll = TRUE' : 'note.hasPoll = FALSE');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
conversation.push(p);
|
conversation.push(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (conversation.length === ps.limit) {
|
if (conversation.length == ps.limit) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@ import { Note } from '@/models/entities/note.js';
|
|||||||
import { noteVisibilities } from '../../../../types.js';
|
import { noteVisibilities } from '../../../../types.js';
|
||||||
import { Channel } from '@/models/entities/channel.js';
|
import { Channel } from '@/models/entities/channel.js';
|
||||||
import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
|
import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
|
||||||
import { In } from 'typeorm';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
@ -164,18 +163,19 @@ export const paramDef = {
|
|||||||
export default define(meta, paramDef, async (ps, user) => {
|
export default define(meta, paramDef, async (ps, user) => {
|
||||||
let visibleUsers: User[] = [];
|
let visibleUsers: User[] = [];
|
||||||
if (ps.visibleUserIds) {
|
if (ps.visibleUserIds) {
|
||||||
visibleUsers = await Users.findBy({
|
visibleUsers = (await Promise.all(ps.visibleUserIds.map(id => Users.findOneBy({ id }))))
|
||||||
id: In(ps.visibleUserIds),
|
.filter(x => x != null) as User[];
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let files: DriveFile[] = [];
|
let files: DriveFile[] = [];
|
||||||
const fileIds = ps.fileIds != null ? ps.fileIds : ps.mediaIds != null ? ps.mediaIds : null;
|
const fileIds = ps.fileIds != null ? ps.fileIds : ps.mediaIds != null ? ps.mediaIds : null;
|
||||||
if (fileIds != null) {
|
if (fileIds != null) {
|
||||||
files = await DriveFiles.findBy({
|
files = (await Promise.all(fileIds.map(fileId =>
|
||||||
userId: user.id,
|
DriveFiles.findOneBy({
|
||||||
id: In(fileIds),
|
id: fileId,
|
||||||
});
|
userId: user.id,
|
||||||
|
})
|
||||||
|
))).filter(file => file != null) as DriveFile[];
|
||||||
}
|
}
|
||||||
|
|
||||||
let renote: Note | null;
|
let renote: Note | null;
|
||||||
|
@ -110,7 +110,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
|
|
||||||
if (exist.length) {
|
if (exist.length) {
|
||||||
if (poll.multiple) {
|
if (poll.multiple) {
|
||||||
if (exist.some(x => x.choice === ps.choice)) {
|
if (exist.some(x => x.choice == ps.choice)) {
|
||||||
throw new ApiError(meta.errors.alreadyVoted);
|
throw new ApiError(meta.errors.alreadyVoted);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -75,8 +75,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
Accept: 'application/json, */*',
|
Accept: 'application/json, */*',
|
||||||
},
|
},
|
||||||
body: params,
|
body: params,
|
||||||
// TODO
|
timeout: 10000,
|
||||||
//timeout: 10000,
|
|
||||||
agent: getAgentByUrl,
|
agent: getAgentByUrl,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -63,8 +63,12 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//#region Construct query
|
//#region Construct query
|
||||||
|
const listQuery = UserListJoinings.createQueryBuilder('joining')
|
||||||
|
.select('joining.userId')
|
||||||
|
.where('joining.userListId = :userListId', { userListId: list.id });
|
||||||
|
|
||||||
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
||||||
.innerJoin(UserListJoinings.metadata.targetName, 'userListJoining', 'userListJoining.userId = note.userId')
|
.andWhere(`note.userId IN (${ listQuery.getQuery() })`)
|
||||||
.innerJoinAndSelect('note.user', 'user')
|
.innerJoinAndSelect('note.user', 'user')
|
||||||
.leftJoinAndSelect('user.avatar', 'avatar')
|
.leftJoinAndSelect('user.avatar', 'avatar')
|
||||||
.leftJoinAndSelect('user.banner', 'banner')
|
.leftJoinAndSelect('user.banner', 'banner')
|
||||||
@ -76,7 +80,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
|||||||
.leftJoinAndSelect('renote.user', 'renoteUser')
|
.leftJoinAndSelect('renote.user', 'renoteUser')
|
||||||
.leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
|
.leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
|
||||||
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
|
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
|
||||||
.andWhere('userListJoining.userListId = :userListId', { userListId: list.id });
|
.setParameters(listQuery.getParameters());
|
||||||
|
|
||||||
generateVisibilityQuery(query, user);
|
generateVisibilityQuery(query, user);
|
||||||
|
|
||||||
|
@ -23,9 +23,9 @@ export const meta = {
|
|||||||
items: {
|
items: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
ref: 'UserDetailed',
|
ref: 'UserDetailed',
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
],
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
errors: {
|
errors: {
|
||||||
@ -70,7 +70,7 @@ export const paramDef = {
|
|||||||
description: 'The local host is represented with `null`.',
|
description: 'The local host is represented with `null`.',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
required: ['username'],
|
required: ['username', 'host'],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
} as const;
|
} as const;
|
||||||
|
@ -24,17 +24,17 @@ export default async (ctx: Koa.Context) => {
|
|||||||
ctx.body = { error };
|
ctx.body = { error };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof username !== 'string') {
|
if (typeof username != 'string') {
|
||||||
ctx.status = 400;
|
ctx.status = 400;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof password !== 'string') {
|
if (typeof password != 'string') {
|
||||||
ctx.status = 400;
|
ctx.status = 400;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (token != null && typeof token !== 'string') {
|
if (token != null && typeof token != 'string') {
|
||||||
ctx.status = 400;
|
ctx.status = 400;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -10,23 +10,23 @@ import mount from 'koa-mount';
|
|||||||
import koaLogger from 'koa-logger';
|
import koaLogger from 'koa-logger';
|
||||||
import * as slow from 'koa-slow';
|
import * as slow from 'koa-slow';
|
||||||
|
|
||||||
import { IsNull } from 'typeorm';
|
import activityPub from './activitypub.js';
|
||||||
|
import nodeinfo from './nodeinfo.js';
|
||||||
|
import wellKnown from './well-known.js';
|
||||||
import config from '@/config/index.js';
|
import config from '@/config/index.js';
|
||||||
|
import apiServer from './api/index.js';
|
||||||
|
import fileServer from './file/index.js';
|
||||||
|
import proxyServer from './proxy/index.js';
|
||||||
|
import webServer from './web/index.js';
|
||||||
import Logger from '@/services/logger.js';
|
import Logger from '@/services/logger.js';
|
||||||
|
import { envOption } from '../env.js';
|
||||||
import { UserProfiles, Users } from '@/models/index.js';
|
import { UserProfiles, Users } from '@/models/index.js';
|
||||||
import { genIdenticon } from '@/misc/gen-identicon.js';
|
import { genIdenticon } from '@/misc/gen-identicon.js';
|
||||||
import { createTemp } from '@/misc/create-temp.js';
|
import { createTemp } from '@/misc/create-temp.js';
|
||||||
import { publishMainStream } from '@/services/stream.js';
|
import { publishMainStream } from '@/services/stream.js';
|
||||||
import * as Acct from '@/misc/acct.js';
|
import * as Acct from '@/misc/acct.js';
|
||||||
import { envOption } from '../env.js';
|
|
||||||
import activityPub from './activitypub.js';
|
|
||||||
import nodeinfo from './nodeinfo.js';
|
|
||||||
import wellKnown from './well-known.js';
|
|
||||||
import apiServer from './api/index.js';
|
|
||||||
import fileServer from './file/index.js';
|
|
||||||
import proxyServer from './proxy/index.js';
|
|
||||||
import webServer from './web/index.js';
|
|
||||||
import { initializeStreamingServer } from './api/streaming.js';
|
import { initializeStreamingServer } from './api/streaming.js';
|
||||||
|
import { IsNull } from 'typeorm';
|
||||||
|
|
||||||
export const serverLogger = new Logger('server', 'gray', false);
|
export const serverLogger = new Logger('server', 'gray', false);
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ router.get('/avatar/@:acct', async ctx => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (user) {
|
if (user) {
|
||||||
ctx.redirect(Users.getAvatarUrlSync(user));
|
ctx.redirect(Users.getAvatarUrl(user));
|
||||||
} else {
|
} else {
|
||||||
ctx.redirect('/static-assets/user-unknown.png');
|
ctx.redirect('/static-assets/user-unknown.png');
|
||||||
}
|
}
|
||||||
|
@ -113,26 +113,18 @@
|
|||||||
// eslint-disable-next-line no-inner-declarations
|
// eslint-disable-next-line no-inner-declarations
|
||||||
function renderError(code, details) {
|
function renderError(code, details) {
|
||||||
document.documentElement.innerHTML = `
|
document.documentElement.innerHTML = `
|
||||||
<style>body { background-color: #010080; }</style>
|
<h1>⚠エラーが発生しました</h1>
|
||||||
<div style="color: #FFF; padding: 128px;">
|
<p>問題が解決しない場合は管理者までお問い合わせください。以下のオプションを試すこともできます:</p>
|
||||||
<h1 style="font-family: system-ui; font-size: 100px; margin: 0;">:(</h1>
|
<ul>
|
||||||
<h1>おまえが悪い</h1>
|
<li><a href="/cli">簡易クライアント</a>を起動</li>
|
||||||
<p>問題が解決しない場合はおまえが修正しろ。以下のオプションを試すこともできる:</p>
|
<li><a href="/bios">BIOS</a>で修復を試みる</li>
|
||||||
<div style="display: flex; flex-direction: row;">
|
<li><a href="/flush">キャッシュをクリア</a>する</li>
|
||||||
<img style="width: 192px; image-rendering: pixelated;" src="data:image/gif;base64,R0lGODlhIwAjAIAAAP///wEAgCH5BAAAAAAALAAAAAAjACMAAAK1hI+py+0Pozyh2mAquBtdq2DeplGjaCYYuIpr97avSsZZ1sJ1R7O3XItpUKkiLGfkeT625vEjkRFJ0Z6LKsRNTaDgrIvd3nC/kBZSGpdYnLQZOPSVRzSdN73Oh67I3VtMFUbh1mZHx0d2dQIo6KfFBNSAJKXjoqgydMSlGSEUR2TJxlhnQ2a6AHnW5QNWZ/TleLk4E8QD2ceVOfi4p5RL+/OVakYXa1u7lZqHqDbh/AwdLZ1QAAA7">
|
</ul>
|
||||||
<div style="display: flex; flex-direction: column; justify-content: space-between; padding-block: 16px;">
|
<hr>
|
||||||
<ul style="margin: 0;">
|
<code>ERROR CODE: ${code}</code>
|
||||||
<li><a style="color: red;" href="/cli">簡易クライアント</a>を起動しろ</li>
|
<details>
|
||||||
<li><a style="color: red;" href="/bios">BIOS</a>で修復を試みろ</li>
|
${details}
|
||||||
<li><a style="color: red;" href="/flush">キャッシュを消せ</a></li>
|
</details>
|
||||||
</ul>
|
|
||||||
<div style="padding-left: 40px;">
|
|
||||||
<p style="margin: 0;"><code>停止コード: ${code}</code></p>
|
|
||||||
<p style="margin: 0;"><code>失敗した内容: ${details}</code></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Feed } from 'feed';
|
import { Feed } from 'feed';
|
||||||
import { In, IsNull } from 'typeorm';
|
|
||||||
import config from '@/config/index.js';
|
import config from '@/config/index.js';
|
||||||
import { User } from '@/models/entities/user.js';
|
import { User } from '@/models/entities/user.js';
|
||||||
import { Notes, DriveFiles, UserProfiles, Users } from '@/models/index.js';
|
import { Notes, DriveFiles, UserProfiles } from '@/models/index.js';
|
||||||
|
import { In, IsNull } from 'typeorm';
|
||||||
|
|
||||||
export default async function(user: User) {
|
export default async function(user: User) {
|
||||||
const author = {
|
const author = {
|
||||||
@ -29,7 +29,7 @@ export default async function(user: User) {
|
|||||||
generator: 'Misskey',
|
generator: 'Misskey',
|
||||||
description: `${user.notesCount} Notes, ${profile.ffVisibility === 'public' ? user.followingCount : '?'} Following, ${profile.ffVisibility === 'public' ? user.followersCount : '?'} Followers${profile.description ? ` · ${profile.description}` : ''}`,
|
description: `${user.notesCount} Notes, ${profile.ffVisibility === 'public' ? user.followingCount : '?'} Following, ${profile.ffVisibility === 'public' ? user.followersCount : '?'} Followers${profile.description ? ` · ${profile.description}` : ''}`,
|
||||||
link: author.link,
|
link: author.link,
|
||||||
image: await Users.getAvatarUrl(user),
|
image: user.avatarUrl ? user.avatarUrl : undefined,
|
||||||
feedLinks: {
|
feedLinks: {
|
||||||
json: `${author.link}.json`,
|
json: `${author.link}.json`,
|
||||||
atom: `${author.link}.atom`,
|
atom: `${author.link}.atom`,
|
||||||
|
@ -11,20 +11,20 @@ import send from 'koa-send';
|
|||||||
import favicon from 'koa-favicon';
|
import favicon from 'koa-favicon';
|
||||||
import views from 'koa-views';
|
import views from 'koa-views';
|
||||||
import { createBullBoard } from '@bull-board/api';
|
import { createBullBoard } from '@bull-board/api';
|
||||||
import { BullAdapter } from '@bull-board/api/bullAdapter.js';
|
import { BullAdapter } from '@bull-board/api/bullAdapter.js';
|
||||||
import { KoaAdapter } from '@bull-board/koa';
|
import { KoaAdapter } from '@bull-board/koa';
|
||||||
|
|
||||||
import { IsNull } from 'typeorm';
|
import packFeed from './feed.js';
|
||||||
import { fetchMeta } from '@/misc/fetch-meta.js';
|
import { fetchMeta } from '@/misc/fetch-meta.js';
|
||||||
|
import { genOpenapiSpec } from '../api/openapi/gen-spec.js';
|
||||||
import config from '@/config/index.js';
|
import config from '@/config/index.js';
|
||||||
import { Users, Notes, UserProfiles, Pages, Channels, Clips, GalleryPosts } from '@/models/index.js';
|
import { Users, Notes, UserProfiles, Pages, Channels, Clips, GalleryPosts } from '@/models/index.js';
|
||||||
import * as Acct from '@/misc/acct.js';
|
import * as Acct from '@/misc/acct.js';
|
||||||
import { getNoteSummary } from '@/misc/get-note-summary.js';
|
import { getNoteSummary } from '@/misc/get-note-summary.js';
|
||||||
import { queues } from '@/queue/queues.js';
|
|
||||||
import { genOpenapiSpec } from '../api/openapi/gen-spec.js';
|
|
||||||
import { urlPreviewHandler } from './url-preview.js';
|
import { urlPreviewHandler } from './url-preview.js';
|
||||||
import { manifestHandler } from './manifest.js';
|
import { manifestHandler } from './manifest.js';
|
||||||
import packFeed from './feed.js';
|
import { queues } from '@/queue/queues.js';
|
||||||
|
import { IsNull } from 'typeorm';
|
||||||
|
|
||||||
const _filename = fileURLToPath(import.meta.url);
|
const _filename = fileURLToPath(import.meta.url);
|
||||||
const _dirname = dirname(_filename);
|
const _dirname = dirname(_filename);
|
||||||
@ -127,7 +127,7 @@ router.get('/twemoji/(.*)', async ctx => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.set('Content-Security-Policy', 'default-src \'none\'; style-src \'unsafe-inline\'');
|
ctx.set('Content-Security-Policy', `default-src 'none'; style-src 'unsafe-inline'`);
|
||||||
|
|
||||||
await send(ctx as any, path, {
|
await send(ctx as any, path, {
|
||||||
root: `${_dirname}/../../../node_modules/@discordapp/twemoji/dist/svg/`,
|
root: `${_dirname}/../../../node_modules/@discordapp/twemoji/dist/svg/`,
|
||||||
@ -235,7 +235,6 @@ router.get(['/@:user', '/@:user/:sub'], async (ctx, next) => {
|
|||||||
|
|
||||||
await ctx.render('user', {
|
await ctx.render('user', {
|
||||||
user, profile, me,
|
user, profile, me,
|
||||||
avatarUrl: await Users.getAvatarUrl(user),
|
|
||||||
sub: ctx.params.sub,
|
sub: ctx.params.sub,
|
||||||
instanceName: meta.name || 'Misskey',
|
instanceName: meta.name || 'Misskey',
|
||||||
icon: meta.iconUrl,
|
icon: meta.iconUrl,
|
||||||
@ -275,7 +274,6 @@ router.get('/notes/:note', async (ctx, next) => {
|
|||||||
await ctx.render('note', {
|
await ctx.render('note', {
|
||||||
note: _note,
|
note: _note,
|
||||||
profile,
|
profile,
|
||||||
avatarUrl: await Users.getAvatarUrl(await Users.findOneByOrFail({ id: note.userId })),
|
|
||||||
// TODO: Let locale changeable by instance setting
|
// TODO: Let locale changeable by instance setting
|
||||||
summary: getNoteSummary(_note),
|
summary: getNoteSummary(_note),
|
||||||
instanceName: meta.name || 'Misskey',
|
instanceName: meta.name || 'Misskey',
|
||||||
@ -317,7 +315,6 @@ router.get('/@:user/pages/:page', async (ctx, next) => {
|
|||||||
await ctx.render('page', {
|
await ctx.render('page', {
|
||||||
page: _page,
|
page: _page,
|
||||||
profile,
|
profile,
|
||||||
avatarUrl: await Users.getAvatarUrl(await Users.findOneByOrFail({ id: page.userId })),
|
|
||||||
instanceName: meta.name || 'Misskey',
|
instanceName: meta.name || 'Misskey',
|
||||||
icon: meta.iconUrl,
|
icon: meta.iconUrl,
|
||||||
themeColor: meta.themeColor,
|
themeColor: meta.themeColor,
|
||||||
@ -349,7 +346,6 @@ router.get('/clips/:clip', async (ctx, next) => {
|
|||||||
await ctx.render('clip', {
|
await ctx.render('clip', {
|
||||||
clip: _clip,
|
clip: _clip,
|
||||||
profile,
|
profile,
|
||||||
avatarUrl: await Users.getAvatarUrl(await Users.findOneByOrFail({ id: clip.userId })),
|
|
||||||
instanceName: meta.name || 'Misskey',
|
instanceName: meta.name || 'Misskey',
|
||||||
icon: meta.iconUrl,
|
icon: meta.iconUrl,
|
||||||
themeColor: meta.themeColor,
|
themeColor: meta.themeColor,
|
||||||
@ -374,7 +370,6 @@ router.get('/gallery/:post', async (ctx, next) => {
|
|||||||
await ctx.render('gallery-post', {
|
await ctx.render('gallery-post', {
|
||||||
post: _post,
|
post: _post,
|
||||||
profile,
|
profile,
|
||||||
avatarUrl: await Users.getAvatarUrl(await Users.findOneByOrFail({ id: post.userId })),
|
|
||||||
instanceName: meta.name || 'Misskey',
|
instanceName: meta.name || 'Misskey',
|
||||||
icon: meta.iconUrl,
|
icon: meta.iconUrl,
|
||||||
themeColor: meta.themeColor,
|
themeColor: meta.themeColor,
|
||||||
@ -439,7 +434,7 @@ router.get('/cli', async ctx => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const override = (source: string, target: string, depth = 0) =>
|
const override = (source: string, target: string, depth: number = 0) =>
|
||||||
[, ...target.split('/').filter(x => x), ...source.split('/').filter(x => x).splice(depth)].join('/');
|
[, ...target.split('/').filter(x => x), ...source.split('/').filter(x => x).splice(depth)].join('/');
|
||||||
|
|
||||||
router.get('/flush', async ctx => {
|
router.get('/flush', async ctx => {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"short_name": "nca10.net",
|
"short_name": "Misskey",
|
||||||
"name": "ぬるきゃのおうち",
|
"name": "Misskey",
|
||||||
"start_url": "/",
|
"start_url": "/",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"background_color": "#313a42",
|
"background_color": "#313a42",
|
||||||
"theme_color": "#96CCE7",
|
"theme_color": "#a7dc4e",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/static-assets/icons/192.png",
|
"src": "/static-assets/icons/192.png",
|
||||||
|
@ -16,7 +16,7 @@ html {
|
|||||||
transition: opacity 0.5s ease;
|
transition: opacity 0.5s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
#splashIcon {
|
#splash > img {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
@ -27,48 +27,3 @@ html {
|
|||||||
height: 64px;
|
height: 64px;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#splashSpinner {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
margin: auto;
|
|
||||||
display: inline-block;
|
|
||||||
width: 28px;
|
|
||||||
height: 28px;
|
|
||||||
transform: translateY(70px);
|
|
||||||
}
|
|
||||||
|
|
||||||
#splashSpinner:before,
|
|
||||||
#splashSpinner:after {
|
|
||||||
content: " ";
|
|
||||||
display: block;
|
|
||||||
box-sizing: border-box;
|
|
||||||
width: 28px;
|
|
||||||
height: 28px;
|
|
||||||
border-radius: 50%;
|
|
||||||
border: solid 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#splashSpinner:before {
|
|
||||||
border-color: currentColor;
|
|
||||||
opacity: 0.3;
|
|
||||||
}
|
|
||||||
|
|
||||||
#splashSpinner:after {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
border-color: currentColor transparent transparent transparent;
|
|
||||||
animation: splashSpinner 0.5s linear infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes splashSpinner {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -27,11 +27,11 @@ html
|
|||||||
link(rel='icon' href= icon || '/favicon.ico')
|
link(rel='icon' href= icon || '/favicon.ico')
|
||||||
link(rel='apple-touch-icon' href= icon || '/apple-touch-icon.png')
|
link(rel='apple-touch-icon' href= icon || '/apple-touch-icon.png')
|
||||||
link(rel='manifest' href='/manifest.json')
|
link(rel='manifest' href='/manifest.json')
|
||||||
link(rel='prefetch' href='https://s3.nca10.net/misskey/3e1a7f0c-b106-41a1-b4ea-3ac896a0f3a4.png')
|
link(rel='prefetch' href='https://xn--931a.moe/assets/info.jpg')
|
||||||
link(rel='prefetch' href='https://s3.nca10.net/misskey/20b71322-00a7-4f57-8eb0-947df6cc0ccb.png')
|
link(rel='prefetch' href='https://xn--931a.moe/assets/not-found.jpg')
|
||||||
link(rel='prefetch' href='https://s3.nca10.net/misskey/ba995335-fca2-485b-8203-65e26a67f019.png')
|
link(rel='prefetch' href='https://xn--931a.moe/assets/error.jpg')
|
||||||
link(rel='preload' href='https://use.fontawesome.com/releases/v5.15.3/css/all.css' as='style')
|
link(rel='preload' href='/assets/fontawesome/css/all.css' as='style')
|
||||||
link(rel='stylesheet' href='https://use.fontawesome.com/releases/v5.15.3/css/all.css')
|
link(rel='stylesheet' href='/assets/fontawesome/css/all.css')
|
||||||
|
|
||||||
title
|
title
|
||||||
block title
|
block title
|
||||||
@ -59,6 +59,5 @@ html
|
|||||||
br
|
br
|
||||||
| Please turn on your JavaScript
|
| Please turn on your JavaScript
|
||||||
div#splash
|
div#splash
|
||||||
img#splashIcon(src= icon || '/static-assets/splash.png')
|
img(src= icon || '/static-assets/splash.png')
|
||||||
div#splashSpinner
|
|
||||||
block content
|
block content
|
||||||
|
@ -16,7 +16,7 @@ block og
|
|||||||
meta(property='og:title' content= title)
|
meta(property='og:title' content= title)
|
||||||
meta(property='og:description' content= clip.description)
|
meta(property='og:description' content= clip.description)
|
||||||
meta(property='og:url' content= url)
|
meta(property='og:url' content= url)
|
||||||
meta(property='og:image' content= avatarUrl)
|
meta(property='og:image' content= user.avatarUrl)
|
||||||
|
|
||||||
block meta
|
block meta
|
||||||
if profile.noCrawle
|
if profile.noCrawle
|
||||||
|
@ -17,7 +17,7 @@ block og
|
|||||||
meta(property='og:title' content= title)
|
meta(property='og:title' content= title)
|
||||||
meta(property='og:description' content= summary)
|
meta(property='og:description' content= summary)
|
||||||
meta(property='og:url' content= url)
|
meta(property='og:url' content= url)
|
||||||
meta(property='og:image' content= avatarUrl)
|
meta(property='og:image' content= user.avatarUrl)
|
||||||
|
|
||||||
block meta
|
block meta
|
||||||
if user.host || isRenote || profile.noCrawle
|
if user.host || isRenote || profile.noCrawle
|
||||||
|
@ -16,7 +16,7 @@ block og
|
|||||||
meta(property='og:title' content= title)
|
meta(property='og:title' content= title)
|
||||||
meta(property='og:description' content= page.summary)
|
meta(property='og:description' content= page.summary)
|
||||||
meta(property='og:url' content= url)
|
meta(property='og:url' content= url)
|
||||||
meta(property='og:image' content= page.eyeCatchingImage ? page.eyeCatchingImage.thumbnailUrl : avatarUrl)
|
meta(property='og:image' content= page.eyeCatchingImage ? page.eyeCatchingImage.thumbnailUrl : user.avatarUrl)
|
||||||
|
|
||||||
block meta
|
block meta
|
||||||
if profile.noCrawle
|
if profile.noCrawle
|
||||||
|
@ -3,6 +3,7 @@ extends ./base
|
|||||||
block vars
|
block vars
|
||||||
- const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`;
|
- const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`;
|
||||||
- const url = `${config.url}/@${(user.host ? `${user.username}@${user.host}` : user.username)}`;
|
- const url = `${config.url}/@${(user.host ? `${user.username}@${user.host}` : user.username)}`;
|
||||||
|
- const img = user.avatarUrl || null;
|
||||||
|
|
||||||
block title
|
block title
|
||||||
= `${title} | ${instanceName}`
|
= `${title} | ${instanceName}`
|
||||||
@ -15,7 +16,7 @@ block og
|
|||||||
meta(property='og:title' content= title)
|
meta(property='og:title' content= title)
|
||||||
meta(property='og:description' content= profile.description)
|
meta(property='og:description' content= profile.description)
|
||||||
meta(property='og:url' content= url)
|
meta(property='og:url' content= url)
|
||||||
meta(property='og:image' content= avatarUrl)
|
meta(property='og:image' content= img)
|
||||||
|
|
||||||
block meta
|
block meta
|
||||||
if user.host || profile.noCrawle
|
if user.host || profile.noCrawle
|
||||||
|
@ -65,7 +65,8 @@ async function cancelRequest(follower: User, followee: User) {
|
|||||||
|
|
||||||
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
||||||
for (const webhook of webhooks) {
|
for (const webhook of webhooks) {
|
||||||
webhookDeliver(webhook, 'unfollow', {
|
webhookDeliver(webhook, {
|
||||||
|
type: 'unfollow',
|
||||||
user: packed,
|
user: packed,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -117,7 +118,8 @@ async function unFollow(follower: User, followee: User) {
|
|||||||
|
|
||||||
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
||||||
for (const webhook of webhooks) {
|
for (const webhook of webhooks) {
|
||||||
webhookDeliver(webhook, 'unfollow', {
|
webhookDeliver(webhook, {
|
||||||
|
type: 'unfollow',
|
||||||
user: packed,
|
user: packed,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ export async function uploadFromUrl({
|
|||||||
sensitive = false,
|
sensitive = false,
|
||||||
force = false,
|
force = false,
|
||||||
isLink = false,
|
isLink = false,
|
||||||
comment = null,
|
comment = null
|
||||||
}: Args): Promise<DriveFile> {
|
}: Args): Promise<DriveFile> {
|
||||||
let name = new URL(url).pathname.split('/').pop() || null;
|
let name = new URL(url).pathname.split('/').pop() || null;
|
||||||
if (name == null || !DriveFiles.validateFileName(name)) {
|
if (name == null || !DriveFiles.validateFileName(name)) {
|
||||||
@ -38,7 +38,7 @@ export async function uploadFromUrl({
|
|||||||
|
|
||||||
// If the comment is same as the name, skip comment
|
// If the comment is same as the name, skip comment
|
||||||
// (image.name is passed in when receiving attachment)
|
// (image.name is passed in when receiving attachment)
|
||||||
if (comment !== null && name === comment) {
|
if (comment !== null && name == comment) {
|
||||||
comment = null;
|
comment = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ async function fetchNodeinfo(instance: Instance): Promise<NodeInfo> {
|
|||||||
} else {
|
} else {
|
||||||
throw e.statusCode || e.message;
|
throw e.statusCode || e.message;
|
||||||
}
|
}
|
||||||
}) as Record<string, unknown>;
|
});
|
||||||
|
|
||||||
if (wellknown.links == null || !Array.isArray(wellknown.links)) {
|
if (wellknown.links == null || !Array.isArray(wellknown.links)) {
|
||||||
throw 'No wellknown links';
|
throw 'No wellknown links';
|
||||||
@ -121,7 +121,7 @@ async function fetchNodeinfo(instance: Instance): Promise<NodeInfo> {
|
|||||||
|
|
||||||
logger.succ(`Successfuly fetched nodeinfo of ${instance.host}`);
|
logger.succ(`Successfuly fetched nodeinfo of ${instance.host}`);
|
||||||
|
|
||||||
return info as NodeInfo;
|
return info;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.error(`Failed to fetch nodeinfo of ${instance.host}: ${e}`);
|
logger.error(`Failed to fetch nodeinfo of ${instance.host}: ${e}`);
|
||||||
|
|
||||||
@ -142,12 +142,12 @@ async function fetchDom(instance: Instance): Promise<DOMWindow['document']> {
|
|||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchManifest(instance: Instance): Promise<Record<string, unknown> | null> {
|
async function fetchManifest(instance: Instance): Promise<Record<string, any> | null> {
|
||||||
const url = 'https://' + instance.host;
|
const url = 'https://' + instance.host;
|
||||||
|
|
||||||
const manifestUrl = url + '/manifest.json';
|
const manifestUrl = url + '/manifest.json';
|
||||||
|
|
||||||
const manifest = await getJson(manifestUrl) as Record<string, unknown>;
|
const manifest = await getJson(manifestUrl);
|
||||||
|
|
||||||
return manifest;
|
return manifest;
|
||||||
}
|
}
|
||||||
@ -167,8 +167,7 @@ async function fetchFaviconUrl(instance: Instance, doc: DOMWindow['document'] |
|
|||||||
const faviconUrl = url + '/favicon.ico';
|
const faviconUrl = url + '/favicon.ico';
|
||||||
|
|
||||||
const favicon = await fetch(faviconUrl, {
|
const favicon = await fetch(faviconUrl, {
|
||||||
// TODO
|
timeout: 10000,
|
||||||
//timeout: 10000,
|
|
||||||
agent: getAgentByUrl,
|
agent: getAgentByUrl,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -97,7 +97,8 @@ export async function insertFollowingDoc(followee: { id: User['id']; host: User[
|
|||||||
|
|
||||||
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('follow'));
|
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('follow'));
|
||||||
for (const webhook of webhooks) {
|
for (const webhook of webhooks) {
|
||||||
webhookDeliver(webhook, 'follow', {
|
webhookDeliver(webhook, {
|
||||||
|
type: 'follow',
|
||||||
user: packed,
|
user: packed,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -107,11 +108,12 @@ export async function insertFollowingDoc(followee: { id: User['id']; host: User[
|
|||||||
// Publish followed event
|
// Publish followed event
|
||||||
if (Users.isLocalUser(followee)) {
|
if (Users.isLocalUser(followee)) {
|
||||||
Users.pack(follower.id, followee).then(async packed => {
|
Users.pack(follower.id, followee).then(async packed => {
|
||||||
publishMainStream(followee.id, 'followed', packed);
|
publishMainStream(followee.id, 'followed', packed)
|
||||||
|
|
||||||
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === followee.id && x.on.includes('followed'));
|
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === followee.id && x.on.includes('followed'));
|
||||||
for (const webhook of webhooks) {
|
for (const webhook of webhooks) {
|
||||||
webhookDeliver(webhook, 'followed', {
|
webhookDeliver(webhook, {
|
||||||
|
type: 'followed',
|
||||||
user: packed,
|
user: packed,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,8 @@ export default async function(follower: { id: User['id']; host: User['host']; ur
|
|||||||
|
|
||||||
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
||||||
for (const webhook of webhooks) {
|
for (const webhook of webhooks) {
|
||||||
webhookDeliver(webhook, 'unfollow', {
|
webhookDeliver(webhook, {
|
||||||
|
type: 'unfollow',
|
||||||
user: packed,
|
user: packed,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,8 @@ async function publishUnfollow(followee: Both, follower: Local) {
|
|||||||
|
|
||||||
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
||||||
for (const webhook of webhooks) {
|
for (const webhook of webhooks) {
|
||||||
webhookDeliver(webhook, 'unfollow', {
|
webhookDeliver(webhook, {
|
||||||
|
type: 'unfollow',
|
||||||
user: packedFollowee,
|
user: packedFollowee,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -350,7 +350,8 @@ export default async (user: { id: User['id']; username: User['username']; host:
|
|||||||
getActiveWebhooks().then(webhooks => {
|
getActiveWebhooks().then(webhooks => {
|
||||||
webhooks = webhooks.filter(x => x.userId === user.id && x.on.includes('note'));
|
webhooks = webhooks.filter(x => x.userId === user.id && x.on.includes('note'));
|
||||||
for (const webhook of webhooks) {
|
for (const webhook of webhooks) {
|
||||||
webhookDeliver(webhook, 'note', {
|
webhookDeliver(webhook, {
|
||||||
|
type: 'note',
|
||||||
note: noteObj,
|
note: noteObj,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -379,7 +380,8 @@ export default async (user: { id: User['id']; username: User['username']; host:
|
|||||||
|
|
||||||
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === data.reply!.userId && x.on.includes('reply'));
|
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === data.reply!.userId && x.on.includes('reply'));
|
||||||
for (const webhook of webhooks) {
|
for (const webhook of webhooks) {
|
||||||
webhookDeliver(webhook, 'reply', {
|
webhookDeliver(webhook, {
|
||||||
|
type: 'reply',
|
||||||
note: noteObj,
|
note: noteObj,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -405,7 +407,8 @@ export default async (user: { id: User['id']; username: User['username']; host:
|
|||||||
|
|
||||||
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === data.renote!.userId && x.on.includes('renote'));
|
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === data.renote!.userId && x.on.includes('renote'));
|
||||||
for (const webhook of webhooks) {
|
for (const webhook of webhooks) {
|
||||||
webhookDeliver(webhook, 'renote', {
|
webhookDeliver(webhook, {
|
||||||
|
type: 'renote',
|
||||||
note: noteObj,
|
note: noteObj,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -647,7 +650,8 @@ async function createMentionedEvents(mentionedUsers: MinimumUser[], note: Note,
|
|||||||
|
|
||||||
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === u.id && x.on.includes('mention'));
|
const webhooks = (await getActiveWebhooks()).filter(x => x.userId === u.id && x.on.includes('mention'));
|
||||||
for (const webhook of webhooks) {
|
for (const webhook of webhooks) {
|
||||||
webhookDeliver(webhook, 'mention', {
|
webhookDeliver(webhook, {
|
||||||
|
type: 'mention',
|
||||||
note: detailPackedNote,
|
note: detailPackedNote,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -35,20 +35,20 @@
|
|||||||
lodash "^4.17.19"
|
lodash "^4.17.19"
|
||||||
to-fast-properties "^2.0.0"
|
to-fast-properties "^2.0.0"
|
||||||
|
|
||||||
"@bull-board/api@3.10.3":
|
"@bull-board/api@3.10.2":
|
||||||
version "3.10.3"
|
version "3.10.2"
|
||||||
resolved "https://registry.yarnpkg.com/@bull-board/api/-/api-3.10.3.tgz#c6aad9f5cfb3acbe02c57e823ee81c1ae575849d"
|
resolved "https://registry.yarnpkg.com/@bull-board/api/-/api-3.10.2.tgz#382450b703c671bb64eeb4d76f139b5e172d1fde"
|
||||||
integrity sha512-kV6EPwi9j71qBmozvDmtT01j986r4cFqNmBgq7HApYXW0G2U8Brmv0Ut0iMQZRc/X7aA5KYL3qXcEsriFnq+jw==
|
integrity sha512-jufgsRvAZpUoq/IbmNhwRPQKav6oFUTMjgq0Z200cvNgyFkVDexPhNKNrXdhxaKhBOass4CWvgyQQntDlvCaoQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
redis-info "^3.0.8"
|
redis-info "^3.0.8"
|
||||||
|
|
||||||
"@bull-board/koa@3.10.3":
|
"@bull-board/koa@3.10.2":
|
||||||
version "3.10.3"
|
version "3.10.2"
|
||||||
resolved "https://registry.yarnpkg.com/@bull-board/koa/-/koa-3.10.3.tgz#b9f02629f96f056d6a038c3c58fc339d58e55abb"
|
resolved "https://registry.yarnpkg.com/@bull-board/koa/-/koa-3.10.2.tgz#b50049355913eb049471169faec278d30bb44559"
|
||||||
integrity sha512-DK8m09MwcRwUR3tz3xI0iSK/Ih2huQ2MAWm8krYjO5deswP2yBaCWE4OtpiULLfVpf8z4zB3Oqa0xNJrKRHTOQ==
|
integrity sha512-SJu+yoE/823sjif003X7030Cj8FmbQ+shUN3LPcUlQ9+0tIQ6ao0+FifJ4uhFnp1CN6FWpn+DCAf4vlC771PNQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@bull-board/api" "3.10.3"
|
"@bull-board/api" "3.10.2"
|
||||||
"@bull-board/ui" "3.10.3"
|
"@bull-board/ui" "3.10.2"
|
||||||
ejs "^3.1.6"
|
ejs "^3.1.6"
|
||||||
koa "^2.13.1"
|
koa "^2.13.1"
|
||||||
koa-mount "^4.0.0"
|
koa-mount "^4.0.0"
|
||||||
@ -56,12 +56,12 @@
|
|||||||
koa-static "^5.0.0"
|
koa-static "^5.0.0"
|
||||||
koa-views "^7.0.1"
|
koa-views "^7.0.1"
|
||||||
|
|
||||||
"@bull-board/ui@3.10.3":
|
"@bull-board/ui@3.10.2":
|
||||||
version "3.10.3"
|
version "3.10.2"
|
||||||
resolved "https://registry.yarnpkg.com/@bull-board/ui/-/ui-3.10.3.tgz#b921199d42b32d8ddd9bbf0e35c25be0d64403e9"
|
resolved "https://registry.yarnpkg.com/@bull-board/ui/-/ui-3.10.2.tgz#ab6400b1cbd459604b9e8afeaef9e3cc235d1dd9"
|
||||||
integrity sha512-6zYW3FqySg+4IKEeM1jt/5ixNVBKQjtZLG9W81ADVcHk8YceQ++7URWzDb8nQEct3rEW4bjR6nicVWNXMSN7Lw==
|
integrity sha512-XFFbnJjZZDoMxntNdmgJoyTlEvMcCfNqeC/QPiqTJU0X/k0cxWDx36tw83PKjN+lKxPjzN/WNpTebYZPKV78Yg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@bull-board/api" "3.10.3"
|
"@bull-board/api" "3.10.2"
|
||||||
|
|
||||||
"@cspotcode/source-map-consumer@0.8.0":
|
"@cspotcode/source-map-consumer@0.8.0":
|
||||||
version "0.8.0"
|
version "0.8.0"
|
||||||
@ -244,10 +244,10 @@
|
|||||||
require-from-string "^2.0.2"
|
require-from-string "^2.0.2"
|
||||||
uri-js "^4.2.2"
|
uri-js "^4.2.2"
|
||||||
|
|
||||||
"@redocly/openapi-core@1.0.0-beta.93":
|
"@redocly/openapi-core@1.0.0-beta.91":
|
||||||
version "1.0.0-beta.93"
|
version "1.0.0-beta.91"
|
||||||
resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.0.0-beta.93.tgz#882db8684598217f621adc7349288229253a0038"
|
resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.0.0-beta.91.tgz#58dbd8c3cad9ef82f2437c6bbeb6a14dd1bc537d"
|
||||||
integrity sha512-xQj7UnjPj3mKtkyRrm+bjzEoyo0CVNjGP4pV6BzQ0vgKf0Jqq7apFC703psyBH+JscYr7NKK1hPQU76ylhFDdg==
|
integrity sha512-8RhZGn5jSoy3oZE0sAdXxhPPHrqKgy2JVJzLqjgX9LDjNf7cXOTYOXkXIkjv1tfZHFBV/H7c08rRLEdxnzn0dg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@redocly/ajv" "^8.6.4"
|
"@redocly/ajv" "^8.6.4"
|
||||||
"@types/node" "^14.11.8"
|
"@types/node" "^14.11.8"
|
||||||
@ -785,10 +785,10 @@
|
|||||||
"@types/express-serve-static-core" "*"
|
"@types/express-serve-static-core" "*"
|
||||||
"@types/mime" "*"
|
"@types/mime" "*"
|
||||||
|
|
||||||
"@types/sharp@0.30.1":
|
"@types/sharp@0.30.0":
|
||||||
version "0.30.1"
|
version "0.30.0"
|
||||||
resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.30.1.tgz#31bd128f2437e8fc31424eb23d8284aa127bfa8d"
|
resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.30.0.tgz#58cb016c8fdc558b4c5771ad1f3668336685c843"
|
||||||
integrity sha512-LxzQsKo2YtvA2DlqACNXmlbLGMVJCSU/HhV4N9RrStClUEf02iN+AakD/zUOpZkbo1OG+lHk2LeqoHedLwln2w==
|
integrity sha512-bZ0Y/JVlrOyqwlBMJ2taEgnwFavjLnyZmLOLecmOesuG5kR2Lx9b2fM4osgfVjLJi8UlE+t3R1JzRVMxF6MbfA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
@ -804,6 +804,11 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/throttle-debounce@2.1.0":
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776"
|
||||||
|
integrity sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==
|
||||||
|
|
||||||
"@types/tinycolor2@1.4.3":
|
"@types/tinycolor2@1.4.3":
|
||||||
version "1.4.3"
|
version "1.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/@types/tinycolor2/-/tinycolor2-1.4.3.tgz#ed4a0901f954b126e6a914b4839c77462d56e706"
|
resolved "https://registry.yarnpkg.com/@types/tinycolor2/-/tinycolor2-1.4.3.tgz#ed4a0901f954b126e6a914b4839c77462d56e706"
|
||||||
@ -845,14 +850,14 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
"@typescript-eslint/eslint-plugin@5.18.0":
|
"@typescript-eslint/eslint-plugin@5.17.0":
|
||||||
version "5.18.0"
|
version "5.17.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz#950df411cec65f90d75d6320a03b2c98f6c3af7d"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz#704eb4e75039000531255672bf1c85ee85cf1d67"
|
||||||
integrity sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==
|
integrity sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/scope-manager" "5.18.0"
|
"@typescript-eslint/scope-manager" "5.17.0"
|
||||||
"@typescript-eslint/type-utils" "5.18.0"
|
"@typescript-eslint/type-utils" "5.17.0"
|
||||||
"@typescript-eslint/utils" "5.18.0"
|
"@typescript-eslint/utils" "5.17.0"
|
||||||
debug "^4.3.2"
|
debug "^4.3.2"
|
||||||
functional-red-black-tree "^1.0.1"
|
functional-red-black-tree "^1.0.1"
|
||||||
ignore "^5.1.8"
|
ignore "^5.1.8"
|
||||||
@ -860,69 +865,69 @@
|
|||||||
semver "^7.3.5"
|
semver "^7.3.5"
|
||||||
tsutils "^3.21.0"
|
tsutils "^3.21.0"
|
||||||
|
|
||||||
"@typescript-eslint/parser@5.18.0":
|
"@typescript-eslint/parser@5.17.0":
|
||||||
version "5.18.0"
|
version "5.17.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.18.0.tgz#2bcd4ff21df33621df33e942ccb21cb897f004c6"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.17.0.tgz#7def77d5bcd8458d12d52909118cf3f0a45f89d5"
|
||||||
integrity sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==
|
integrity sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/scope-manager" "5.18.0"
|
"@typescript-eslint/scope-manager" "5.17.0"
|
||||||
"@typescript-eslint/types" "5.18.0"
|
"@typescript-eslint/types" "5.17.0"
|
||||||
"@typescript-eslint/typescript-estree" "5.18.0"
|
"@typescript-eslint/typescript-estree" "5.17.0"
|
||||||
debug "^4.3.2"
|
debug "^4.3.2"
|
||||||
|
|
||||||
"@typescript-eslint/scope-manager@5.18.0":
|
"@typescript-eslint/scope-manager@5.17.0":
|
||||||
version "5.18.0"
|
version "5.17.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz#a7d7b49b973ba8cebf2a3710eefd457ef2fb5505"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz#4cea7d0e0bc0e79eb60cad431c89120987c3f952"
|
||||||
integrity sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==
|
integrity sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/types" "5.18.0"
|
"@typescript-eslint/types" "5.17.0"
|
||||||
"@typescript-eslint/visitor-keys" "5.18.0"
|
"@typescript-eslint/visitor-keys" "5.17.0"
|
||||||
|
|
||||||
"@typescript-eslint/type-utils@5.18.0":
|
"@typescript-eslint/type-utils@5.17.0":
|
||||||
version "5.18.0"
|
version "5.17.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz#62dbfc8478abf36ba94a90ddf10be3cc8e471c74"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz#1c4549d68c89877662224aabb29fbbebf5fc9672"
|
||||||
integrity sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==
|
integrity sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/utils" "5.18.0"
|
"@typescript-eslint/utils" "5.17.0"
|
||||||
debug "^4.3.2"
|
debug "^4.3.2"
|
||||||
tsutils "^3.21.0"
|
tsutils "^3.21.0"
|
||||||
|
|
||||||
"@typescript-eslint/types@5.18.0":
|
"@typescript-eslint/types@5.17.0":
|
||||||
version "5.18.0"
|
version "5.17.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.18.0.tgz#4f0425d85fdb863071680983853c59a62ce9566e"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.17.0.tgz#861ec9e669ffa2aa9b873dd4d28d9b1ce26d216f"
|
||||||
integrity sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==
|
integrity sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==
|
||||||
|
|
||||||
"@typescript-eslint/typescript-estree@5.18.0":
|
"@typescript-eslint/typescript-estree@5.17.0":
|
||||||
version "5.18.0"
|
version "5.17.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz#6498e5ee69a32e82b6e18689e2f72e4060986474"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz#a7cba7dfc8f9cc2ac78c18584e684507df4f2488"
|
||||||
integrity sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==
|
integrity sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/types" "5.18.0"
|
"@typescript-eslint/types" "5.17.0"
|
||||||
"@typescript-eslint/visitor-keys" "5.18.0"
|
"@typescript-eslint/visitor-keys" "5.17.0"
|
||||||
debug "^4.3.2"
|
debug "^4.3.2"
|
||||||
globby "^11.0.4"
|
globby "^11.0.4"
|
||||||
is-glob "^4.0.3"
|
is-glob "^4.0.3"
|
||||||
semver "^7.3.5"
|
semver "^7.3.5"
|
||||||
tsutils "^3.21.0"
|
tsutils "^3.21.0"
|
||||||
|
|
||||||
"@typescript-eslint/utils@5.18.0":
|
"@typescript-eslint/utils@5.17.0":
|
||||||
version "5.18.0"
|
version "5.17.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.18.0.tgz#27fc84cf95c1a96def0aae31684cb43a37e76855"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.17.0.tgz#549a9e1d491c6ccd3624bc3c1b098f5cfb45f306"
|
||||||
integrity sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==
|
integrity sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/json-schema" "^7.0.9"
|
"@types/json-schema" "^7.0.9"
|
||||||
"@typescript-eslint/scope-manager" "5.18.0"
|
"@typescript-eslint/scope-manager" "5.17.0"
|
||||||
"@typescript-eslint/types" "5.18.0"
|
"@typescript-eslint/types" "5.17.0"
|
||||||
"@typescript-eslint/typescript-estree" "5.18.0"
|
"@typescript-eslint/typescript-estree" "5.17.0"
|
||||||
eslint-scope "^5.1.1"
|
eslint-scope "^5.1.1"
|
||||||
eslint-utils "^3.0.0"
|
eslint-utils "^3.0.0"
|
||||||
|
|
||||||
"@typescript-eslint/visitor-keys@5.18.0":
|
"@typescript-eslint/visitor-keys@5.17.0":
|
||||||
version "5.18.0"
|
version "5.17.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz#c7c07709823804171d569017f3b031ced7253e60"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz#52daae45c61b0211b4c81b53a71841911e479128"
|
||||||
integrity sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==
|
integrity sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/types" "5.18.0"
|
"@typescript-eslint/types" "5.17.0"
|
||||||
eslint-visitor-keys "^3.0.0"
|
eslint-visitor-keys "^3.0.0"
|
||||||
|
|
||||||
"@ungap/promise-all-settled@1.1.2":
|
"@ungap/promise-all-settled@1.1.2":
|
||||||
@ -1266,10 +1271,10 @@ autwh@0.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
oauth "0.9.15"
|
oauth "0.9.15"
|
||||||
|
|
||||||
aws-sdk@2.1111.0:
|
aws-sdk@2.1105.0:
|
||||||
version "2.1111.0"
|
version "2.1105.0"
|
||||||
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1111.0.tgz#02b1e5c530ef8140235ee7c48c710bb2dbd7dc84"
|
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1105.0.tgz#3e63129f2aca254f1d6d5a1580b988bb786e98fa"
|
||||||
integrity sha512-WRyNcCckzmu1djTAWfR2r+BuI/PbuLrhG3oa+oH39v4NZ4EecYWFL1CoCPlC2kRUML4maSba5T4zlxjcNl7ELQ==
|
integrity sha512-YZ6IbKvtiw8noD/Iuyp3hXNX5NmhJ2xSU4598pZr55CfnIQ0oU5ZwtQqLPG8E07ouA363/moCYddIAVGYSkQ+A==
|
||||||
dependencies:
|
dependencies:
|
||||||
buffer "4.9.2"
|
buffer "4.9.2"
|
||||||
events "1.1.1"
|
events "1.1.1"
|
||||||
@ -2645,32 +2650,32 @@ eslint-import-resolver-node@^0.3.6:
|
|||||||
debug "^3.2.7"
|
debug "^3.2.7"
|
||||||
resolve "^1.20.0"
|
resolve "^1.20.0"
|
||||||
|
|
||||||
eslint-module-utils@^2.7.3:
|
eslint-module-utils@^2.7.2:
|
||||||
version "2.7.3"
|
version "2.7.2"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee"
|
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz#1d0aa455dcf41052339b63cada8ab5fd57577129"
|
||||||
integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==
|
integrity sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==
|
||||||
dependencies:
|
dependencies:
|
||||||
debug "^3.2.7"
|
debug "^3.2.7"
|
||||||
find-up "^2.1.0"
|
find-up "^2.1.0"
|
||||||
|
|
||||||
eslint-plugin-import@2.26.0:
|
eslint-plugin-import@2.25.4:
|
||||||
version "2.26.0"
|
version "2.25.4"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1"
|
||||||
integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==
|
integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==
|
||||||
dependencies:
|
dependencies:
|
||||||
array-includes "^3.1.4"
|
array-includes "^3.1.4"
|
||||||
array.prototype.flat "^1.2.5"
|
array.prototype.flat "^1.2.5"
|
||||||
debug "^2.6.9"
|
debug "^2.6.9"
|
||||||
doctrine "^2.1.0"
|
doctrine "^2.1.0"
|
||||||
eslint-import-resolver-node "^0.3.6"
|
eslint-import-resolver-node "^0.3.6"
|
||||||
eslint-module-utils "^2.7.3"
|
eslint-module-utils "^2.7.2"
|
||||||
has "^1.0.3"
|
has "^1.0.3"
|
||||||
is-core-module "^2.8.1"
|
is-core-module "^2.8.0"
|
||||||
is-glob "^4.0.3"
|
is-glob "^4.0.3"
|
||||||
minimatch "^3.1.2"
|
minimatch "^3.0.4"
|
||||||
object.values "^1.1.5"
|
object.values "^1.1.5"
|
||||||
resolve "^1.22.0"
|
resolve "^1.20.0"
|
||||||
tsconfig-paths "^3.14.1"
|
tsconfig-paths "^3.12.0"
|
||||||
|
|
||||||
eslint-scope@^5.1.1:
|
eslint-scope@^5.1.1:
|
||||||
version "5.1.1"
|
version "5.1.1"
|
||||||
@ -2710,10 +2715,10 @@ eslint-visitor-keys@^3.3.0:
|
|||||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
|
||||||
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
|
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
|
||||||
|
|
||||||
eslint@8.13.0:
|
eslint@8.12.0:
|
||||||
version "8.13.0"
|
version "8.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.13.0.tgz#6fcea43b6811e655410f5626cfcf328016badcd7"
|
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.12.0.tgz#c7a5bd1cfa09079aae64c9076c07eada66a46e8e"
|
||||||
integrity sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==
|
integrity sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint/eslintrc" "^1.2.1"
|
"@eslint/eslintrc" "^1.2.1"
|
||||||
"@humanwhocodes/config-array" "^0.9.2"
|
"@humanwhocodes/config-array" "^0.9.2"
|
||||||
@ -3772,10 +3777,10 @@ is-core-module@^2.2.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
has "^1.0.3"
|
has "^1.0.3"
|
||||||
|
|
||||||
is-core-module@^2.8.1:
|
is-core-module@^2.8.0:
|
||||||
version "2.8.1"
|
version "2.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
|
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
|
||||||
integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
|
integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
|
||||||
dependencies:
|
dependencies:
|
||||||
has "^1.0.3"
|
has "^1.0.3"
|
||||||
|
|
||||||
@ -4573,11 +4578,6 @@ lru-cache@^6.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
yallist "^4.0.0"
|
yallist "^4.0.0"
|
||||||
|
|
||||||
lru-cache@^7.4.0:
|
|
||||||
version "7.8.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.8.1.tgz#68ee3f4807a57d2ba185b7fd90827d5c21ce82bb"
|
|
||||||
integrity sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==
|
|
||||||
|
|
||||||
luxon@^1.28.0:
|
luxon@^1.28.0:
|
||||||
version "1.28.0"
|
version "1.28.0"
|
||||||
resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf"
|
resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf"
|
||||||
@ -4718,13 +4718,6 @@ minimatch@^3.0.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion "^1.1.7"
|
brace-expansion "^1.1.7"
|
||||||
|
|
||||||
minimatch@^3.1.2:
|
|
||||||
version "3.1.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
|
||||||
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
|
|
||||||
dependencies:
|
|
||||||
brace-expansion "^1.1.7"
|
|
||||||
|
|
||||||
minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6:
|
minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
|
||||||
@ -5426,7 +5419,7 @@ path-key@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
|
resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
|
||||||
integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
|
integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
|
||||||
|
|
||||||
path-parse@^1.0.6, path-parse@^1.0.7:
|
path-parse@^1.0.6:
|
||||||
version "1.0.7"
|
version "1.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
||||||
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
|
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
|
||||||
@ -6082,15 +6075,6 @@ resolve@^1.15.1, resolve@^1.20.0:
|
|||||||
is-core-module "^2.2.0"
|
is-core-module "^2.2.0"
|
||||||
path-parse "^1.0.6"
|
path-parse "^1.0.6"
|
||||||
|
|
||||||
resolve@^1.22.0:
|
|
||||||
version "1.22.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
|
|
||||||
integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
|
|
||||||
dependencies:
|
|
||||||
is-core-module "^2.8.1"
|
|
||||||
path-parse "^1.0.7"
|
|
||||||
supports-preserve-symlinks-flag "^1.0.0"
|
|
||||||
|
|
||||||
responselike@^2.0.0:
|
responselike@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
|
resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
|
||||||
@ -6213,12 +6197,12 @@ seedrandom@3.0.5:
|
|||||||
resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7"
|
resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7"
|
||||||
integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==
|
integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==
|
||||||
|
|
||||||
semver@7.3.6:
|
semver@7.3.5, semver@^7.3.5:
|
||||||
version "7.3.6"
|
version "7.3.5"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.6.tgz#5d73886fb9c0c6602e79440b97165c29581cbb2b"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
|
||||||
integrity sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==
|
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
lru-cache "^7.4.0"
|
lru-cache "^6.0.0"
|
||||||
|
|
||||||
semver@^5.6.0:
|
semver@^5.6.0:
|
||||||
version "5.7.1"
|
version "5.7.1"
|
||||||
@ -6232,13 +6216,6 @@ semver@^7.3.2, semver@^7.3.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lru-cache "^6.0.0"
|
lru-cache "^6.0.0"
|
||||||
|
|
||||||
semver@^7.3.5:
|
|
||||||
version "7.3.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
|
|
||||||
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
|
|
||||||
dependencies:
|
|
||||||
lru-cache "^6.0.0"
|
|
||||||
|
|
||||||
serialize-javascript@6.0.0:
|
serialize-javascript@6.0.0:
|
||||||
version "6.0.0"
|
version "6.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
|
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
|
||||||
@ -6625,11 +6602,6 @@ supports-color@^7.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
has-flag "^4.0.0"
|
has-flag "^4.0.0"
|
||||||
|
|
||||||
supports-preserve-symlinks-flag@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
|
|
||||||
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
|
||||||
|
|
||||||
symbol-tree@^3.2.4:
|
symbol-tree@^3.2.4:
|
||||||
version "3.2.4"
|
version "3.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
|
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
|
||||||
@ -6725,6 +6697,11 @@ thenify-all@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
any-promise "^1.0.0"
|
any-promise "^1.0.0"
|
||||||
|
|
||||||
|
throttle-debounce@3.0.1:
|
||||||
|
version "3.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb"
|
||||||
|
integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==
|
||||||
|
|
||||||
through@2:
|
through@2:
|
||||||
version "2.3.8"
|
version "2.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||||
@ -6844,7 +6821,7 @@ tsc-alias@1.4.1:
|
|||||||
mylas "^2.1.4"
|
mylas "^2.1.4"
|
||||||
normalize-path "^3.0.0"
|
normalize-path "^3.0.0"
|
||||||
|
|
||||||
tsconfig-paths@3.14.1, tsconfig-paths@^3.14.1:
|
tsconfig-paths@3.14.1:
|
||||||
version "3.14.1"
|
version "3.14.1"
|
||||||
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
|
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
|
||||||
integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==
|
integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==
|
||||||
@ -6854,6 +6831,16 @@ tsconfig-paths@3.14.1, tsconfig-paths@^3.14.1:
|
|||||||
minimist "^1.2.6"
|
minimist "^1.2.6"
|
||||||
strip-bom "^3.0.0"
|
strip-bom "^3.0.0"
|
||||||
|
|
||||||
|
tsconfig-paths@^3.12.0:
|
||||||
|
version "3.12.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b"
|
||||||
|
integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==
|
||||||
|
dependencies:
|
||||||
|
"@types/json5" "^0.0.29"
|
||||||
|
json5 "^1.0.1"
|
||||||
|
minimist "^1.2.0"
|
||||||
|
strip-bom "^3.0.0"
|
||||||
|
|
||||||
tslib@^1.8.1:
|
tslib@^1.8.1:
|
||||||
version "1.11.1"
|
version "1.11.1"
|
||||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
|
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
|
||||||
@ -6952,10 +6939,10 @@ typedarray@^0.0.6:
|
|||||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||||
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
|
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
|
||||||
|
|
||||||
typeorm@0.3.5:
|
typeorm@0.3.4:
|
||||||
version "0.3.5"
|
version "0.3.4"
|
||||||
resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.5.tgz#8fe50d517de5ec6f4b38856ea0f180e4a60cf7e4"
|
resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.4.tgz#6608f7efb15c40f3fa2863cefb45ff78a208c40c"
|
||||||
integrity sha512-KL4c8nQqouHaXs4m1J3xh7oXWqX4+A9poExbceLxBRtlavpJQYqiSnqt3JYGpy7Tl9vD5DG5DrmZrSslTkkW5Q==
|
integrity sha512-6v3HH12viDhIQwQDod/B0Plt1o7IYIVDxP7zwatD6fzN+IDdqTTinW/sWNw84Edpbhh2t7XILTaQEqj0NXFP/Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@sqltools/formatter" "^1.2.2"
|
"@sqltools/formatter" "^1.2.2"
|
||||||
app-root-path "^3.0.0"
|
app-root-path "^3.0.0"
|
||||||
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 20 KiB |
7
packages/client/assets/misskey.svg
Normal file
After Width: | Height: | Size: 9.2 KiB |
@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 106.54"><path d="M282.88,106.54c-14.68,0-25.73-5-32.86-14.78-6.54-9-9.86-21.9-9.86-38.43s3.32-29.44,9.86-38.42C257.14,5,268.21,0,282.88,0c14.29,0,24.71,4.36,31.85,13.33s10.62,22.31,10.62,40-3.57,31.08-10.62,39.91S297.17,106.54,282.88,106.54ZM437.71,106c-8.86,0-15.72-2.4-21-7.34-5.63-5.19-8.39-12.41-8.39-22s2.71-16.84,8.29-22c5.2-4.88,12-7.25,20.89-7.25,4.92,0,12.17.5,18.31,4.88,6.36,4.54,10.06,12.2,11,22.78a5.78,5.78,0,0,1-5.75,6.29H426.55c1.39,6.08,5.08,9.16,11,9.16,4.2,0,7.46-1.26,9.68-3.74a5.79,5.79,0,0,1,4.3-1.91,5.72,5.72,0,0,1,1.86.31l6.45,2.19a5.79,5.79,0,0,1,2.68,9C457.46,102.72,449.13,106,437.71,106Zm-.86-44c-4.68,0-7.83,2.46-9.63,7.53H448C447,64.54,443.24,62,436.85,62ZM133.7,106c-12.72,0-19.17-5.68-19.17-16.88,0-8.86,4.56-15,13.55-18.12,5.38-1.92,12.91-2.86,23-2.86a6.79,6.79,0,0,0-2.38-5.06c-1.39-1.07-3.83-1.62-7.25-1.62-4.48,0-9.52,1.48-15,4.39a5.8,5.8,0,0,1-7.64-2.08L117.14,61a5.78,5.78,0,0,1,2.65-8.33c8.32-3.56,16.2-5.36,23.45-5.36,10.78,0,18.14,2.31,22.49,7.07,4.12,4.5,4.12,9.63,4.12,12.1V99.24a5.78,5.78,0,0,1-5.78,5.78h-7.48a5.77,5.77,0,0,1-5.43-3.82A31.37,31.37,0,0,1,133.7,106Zm17.46-25.65a55.1,55.1,0,0,0-11.45.85c-4.62,1.08-7,3.23-7,6.39,0,2.91,1.89,4.39,5.63,4.39a17.88,17.88,0,0,0,12.78-5.24ZM85.83,106c-8.73,0-15.4-2.4-20.41-7.34-5.25-5.13-7.82-12.34-7.82-22s2.56-16.9,7.82-22c5-4.88,11.68-7.25,20.41-7.25,12.39,0,20.56,4.22,24.26,12.54a5.77,5.77,0,0,1-3.79,7.94l-6.87,1.82a5.72,5.72,0,0,1-1.48.19,5.79,5.79,0,0,1-5-2.87c-1.41-2.42-3.74-3.6-7.13-3.6-6.42,0-9.54,4.34-9.54,13.26,0,8.72,3.12,13,9.54,13A7.72,7.72,0,0,0,93,85.78,5.76,5.76,0,0,1,97.9,83a5.83,5.83,0,0,1,1.65.24l6.94,2.08a5.77,5.77,0,0,1,3.6,7.94C106.22,101.7,98.06,106,85.83,106Zm93.89-.56a5.78,5.78,0,0,1-5.78-5.78V89.07a5.78,5.78,0,0,1,5.78-5.78h17V30.08l-9.45,7.28a5.81,5.81,0,0,1-3.53,1.2,5.45,5.45,0,0,1-.89-.08A5.75,5.75,0,0,1,179,36.05L173,27.44a5.78,5.78,0,0,1,1.29-7.89L198.43,1.41A5.8,5.8,0,0,1,201.91.25h15A5.78,5.78,0,0,1,222.73,6V83.29h14.06a5.78,5.78,0,0,1,5.78,5.78V99.63a5.78,5.78,0,0,1-5.78,5.78ZM494.55,105c-6.1,0-10.2-1.1-12.55-3.34s-3.47-6.19-3.47-11.83v-26h-5.29A5.78,5.78,0,0,1,467.46,58V54a5.77,5.77,0,0,1,5.78-5.77h5.29v-9.1a5.77,5.77,0,0,1,5.77-5.78h7.14a5.78,5.78,0,0,1,5.78,5.78v9.1h9A5.77,5.77,0,0,1,512,54V58a5.78,5.78,0,0,1-5.78,5.78h-9V85.28c0,3.81,1.65,4.1,2.19,4.19a17.21,17.21,0,0,0,2.19.1h4.15a5.77,5.77,0,0,1,5.77,5.77v3.9a5.77,5.77,0,0,1-5.77,5.78ZM392,105a5.78,5.78,0,0,1-5.78-5.78V73.07c0-2.95-.37-5-1.14-6.39-1.08-1.9-3-2.86-5.72-2.86-2.25,0-4.37,1-6.49,3.14a15.18,15.18,0,0,0-3.53,5.92V99.24a5.78,5.78,0,0,1-5.78,5.78h-7a5.77,5.77,0,0,1-5.77-5.78V54a5.77,5.77,0,0,1,5.77-5.77h7.12a5.77,5.77,0,0,1,5.7,4.86c4-3.8,9.12-5.72,15.26-5.72,6,0,10.62,1.5,14.21,4.58,4.05,3.48,6.1,8.87,6.1,16V99.24a5.77,5.77,0,0,1-5.77,5.78Zm-60.84,0a5.78,5.78,0,0,1-5.78-5.78V91.91a5.78,5.78,0,0,1,5.78-5.78H340a5.78,5.78,0,0,1,5.78,5.78v7.33A5.78,5.78,0,0,1,340,105Zm-289.9,0a5.77,5.77,0,0,1-5.77-5.78V73.07c0-2.95-.38-5-1.15-6.39-1.08-1.9-3-2.86-5.72-2.86-2.25,0-4.37,1-6.48,3.14a15.06,15.06,0,0,0-3.53,5.92V99.24A5.78,5.78,0,0,1,12.82,105h-7A5.78,5.78,0,0,1,0,99.24V54a5.77,5.77,0,0,1,5.78-5.77h7.11A5.78,5.78,0,0,1,18.6,53c4-3.8,9.12-5.72,15.26-5.72,6,0,10.61,1.5,14.21,4.58,4,3.48,6.1,8.87,6.1,16V99.24A5.78,5.78,0,0,1,48.39,105ZM276.5,43.74a5.69,5.69,0,1,0-6.66-4.54A5.7,5.7,0,0,0,276.5,43.74ZM265.91,44a5.69,5.69,0,1,0,.55,8A5.69,5.69,0,0,0,265.91,44Zm40.57-1.31A5.69,5.69,0,1,0,311,49.31,5.69,5.69,0,0,0,306.48,42.65Zm-10.59-.22a5.69,5.69,0,0,0,.55-8h0a5.69,5.69,0,1,0-.55,8Zm-12.52,9.1c-9,0-18.93,10.38-16.06,17.77,2.78,7.14,11.45,4.2,16.06,4.2s13.27,2.94,16.05-4.2C302.29,61.91,292.36,51.53,283.37,51.53Z" style="fill:#fff"/></svg>
|
|
Before Width: | Height: | Size: 3.6 KiB |
@ -18,7 +18,7 @@
|
|||||||
"@types/gulp": "4.0.9",
|
"@types/gulp": "4.0.9",
|
||||||
"@types/gulp-rename": "2.0.1",
|
"@types/gulp-rename": "2.0.1",
|
||||||
"@types/is-url": "1.2.30",
|
"@types/is-url": "1.2.30",
|
||||||
"@types/katex": "0.14.0",
|
"@types/katex": "0.11.1",
|
||||||
"@types/matter-js": "0.17.7",
|
"@types/matter-js": "0.17.7",
|
||||||
"@types/mocha": "9.1.0",
|
"@types/mocha": "9.1.0",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
@ -34,7 +34,7 @@
|
|||||||
"@types/webpack-stream": "3.2.12",
|
"@types/webpack-stream": "3.2.12",
|
||||||
"@types/websocket": "1.0.5",
|
"@types/websocket": "1.0.5",
|
||||||
"@types/ws": "8.5.3",
|
"@types/ws": "8.5.3",
|
||||||
"@typescript-eslint/parser": "5.18.0",
|
"@typescript-eslint/parser": "5.17.0",
|
||||||
"@vue/compiler-sfc": "3.2.31",
|
"@vue/compiler-sfc": "3.2.31",
|
||||||
"abort-controller": "3.0.0",
|
"abort-controller": "3.0.0",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
@ -49,11 +49,11 @@
|
|||||||
"compare-versions": "4.1.3",
|
"compare-versions": "4.1.3",
|
||||||
"content-disposition": "0.5.4",
|
"content-disposition": "0.5.4",
|
||||||
"css-loader": "6.7.1",
|
"css-loader": "6.7.1",
|
||||||
"cssnano": "5.1.7",
|
"cssnano": "5.1.6",
|
||||||
"date-fns": "2.28.0",
|
"date-fns": "2.28.0",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "8.13.0",
|
"eslint": "8.12.0",
|
||||||
"eslint-plugin-vue": "8.6.0",
|
"eslint-plugin-vue": "8.5.0",
|
||||||
"eventemitter3": "4.0.7",
|
"eventemitter3": "4.0.7",
|
||||||
"feed": "4.2.2",
|
"feed": "4.2.2",
|
||||||
"glob": "7.2.0",
|
"glob": "7.2.0",
|
||||||
@ -70,7 +70,7 @@
|
|||||||
"ms": "2.1.3",
|
"ms": "2.1.3",
|
||||||
"nested-property": "4.0.0",
|
"nested-property": "4.0.0",
|
||||||
"parse5": "6.0.1",
|
"parse5": "6.0.1",
|
||||||
"photoswipe": "5.2.4",
|
"photoswipe": "5.2.2",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss": "8.4.12",
|
"postcss": "8.4.12",
|
||||||
"postcss-loader": "6.2.1",
|
"postcss-loader": "6.2.1",
|
||||||
@ -85,7 +85,7 @@
|
|||||||
"reflect-metadata": "0.1.13",
|
"reflect-metadata": "0.1.13",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"sass": "1.50.0",
|
"sass": "1.49.10",
|
||||||
"sass-loader": "12.6.0",
|
"sass-loader": "12.6.0",
|
||||||
"seedrandom": "3.0.5",
|
"seedrandom": "3.0.5",
|
||||||
"strict-event-emitter-types": "2.0.0",
|
"strict-event-emitter-types": "2.0.0",
|
||||||
@ -93,8 +93,8 @@
|
|||||||
"style-loader": "3.3.1",
|
"style-loader": "3.3.1",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"three": "0.139.2",
|
"three": "0.139.0",
|
||||||
"throttle-debounce": "4.0.0",
|
"throttle-debounce": "3.0.1",
|
||||||
"tinycolor2": "1.4.2",
|
"tinycolor2": "1.4.2",
|
||||||
"ts-loader": "9.2.8",
|
"ts-loader": "9.2.8",
|
||||||
"tsc-alias": "1.5.0",
|
"tsc-alias": "1.5.0",
|
||||||
@ -111,16 +111,16 @@
|
|||||||
"vue-style-loader": "4.1.3",
|
"vue-style-loader": "4.1.3",
|
||||||
"vue-svg-loader": "0.17.0-beta.2",
|
"vue-svg-loader": "0.17.0-beta.2",
|
||||||
"vuedraggable": "4.0.1",
|
"vuedraggable": "4.0.1",
|
||||||
"webpack": "5.72.0",
|
"webpack": "5.70.0",
|
||||||
"webpack-cli": "4.9.2",
|
"webpack-cli": "4.9.2",
|
||||||
"websocket": "1.0.34",
|
"websocket": "1.0.34",
|
||||||
"ws": "8.5.0"
|
"ws": "8.5.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@typescript-eslint/eslint-plugin": "5.18.0",
|
"@typescript-eslint/eslint-plugin": "5.17.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "9.5.3",
|
"cypress": "9.5.3",
|
||||||
"eslint-plugin-import": "2.26.0",
|
"eslint-plugin-import": "2.25.4",
|
||||||
"start-server-and-test": "1.14.0"
|
"start-server-and-test": "1.14.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ export async function addAccount(id: Account['id'], token: Account['token']) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function fetchAccount(token: string): Promise<Account> {
|
function fetchAccount(token): Promise<Account> {
|
||||||
return new Promise((done, fail) => {
|
return new Promise((done, fail) => {
|
||||||
// Fetch user
|
// Fetch user
|
||||||
fetch(`${apiUrl}/i`, {
|
fetch(`${apiUrl}/i`, {
|
||||||
|
@ -64,14 +64,14 @@ const alpha = (hex, a) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const colors = {
|
const colors = {
|
||||||
blue: '#96CCE7',
|
blue: '#008FFB',
|
||||||
green: '#B0E7CB',
|
green: '#00E396',
|
||||||
yellow: '#E7E7B0',
|
yellow: '#FEB019',
|
||||||
red: '#FF9D9D',
|
red: '#FF4560',
|
||||||
purple: '#CECEFF',
|
purple: '#e300db',
|
||||||
orange: '#E7BA95',
|
orange: '#fe6919',
|
||||||
lime: '#C5E37F',
|
lime: '#bde800',
|
||||||
cyan: '#96E7E7',
|
cyan: '#00e0e0',
|
||||||
};
|
};
|
||||||
const colorSets = [colors.blue, colors.green, colors.yellow, colors.red, colors.purple];
|
const colorSets = [colors.blue, colors.green, colors.yellow, colors.red, colors.purple];
|
||||||
const getColor = (i) => {
|
const getColor = (i) => {
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<header v-if="title"><Mfm :text="title"/></header>
|
<header v-if="title"><Mfm :text="title"/></header>
|
||||||
<div v-if="text" class="body"><Mfm :text="text"/></div>
|
<div v-if="text" class="body"><Mfm :text="text"/></div>
|
||||||
<MkInput v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder || undefined" @keydown="onInputKeydown">
|
<MkInput v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder || undefined" @keydown="onInputKeydown">
|
||||||
<template v-if="input.type === 'password'" #prefix><i style="color: #96CCE7;" class="fas fa-lock"></i></template>
|
<template v-if="input.type === 'password'" #prefix><i class="fas fa-lock"></i></template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
<MkSelect v-if="select" v-model="selectedValue" autofocus>
|
<MkSelect v-if="select" v-model="selectedValue" autofocus>
|
||||||
<template v-if="select.items">
|
<template v-if="select.items">
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<transition :name="$store.state.animation ? 'zoom' : ''" appear>
|
<transition :name="$store.state.animation ? 'zoom' : ''" appear>
|
||||||
<div class="mjndxjcg">
|
<div class="mjndxjcg">
|
||||||
<img src="https://s3.nca10.net/misskey/ba995335-fca2-485b-8203-65e26a67f019.png" class="_ghost"/>
|
<img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/>
|
||||||
<p><i class="fas fa-exclamation-triangle"></i> {{ $ts.somethingHappened }}</p>
|
<p><i class="fas fa-exclamation-triangle"></i> {{ $ts.somethingHappened }}</p>
|
||||||
<MkButton class="button" @click="() => $emit('retry')">{{ $ts.retry }}</MkButton>
|
<MkButton class="button" @click="() => $emit('retry')">{{ $ts.retry }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,40 +1,78 @@
|
|||||||
<template>
|
<template>
|
||||||
<div ref="el" class="fdidabkb" :class="{ slim: narrow, thin: thin_ }" :style="{ background: bg }" @click="onClick">
|
<div
|
||||||
<template v-if="info">
|
ref="el"
|
||||||
<div v-if="!hideTitle" class="titleContainer" @click="showTabsPopup">
|
class="fdidabkb"
|
||||||
<MkAvatar v-if="info.avatar" class="avatar" :user="info.avatar" :disable-preview="true" :show-indicator="true"/>
|
:class="{ slim: narrow, thin: thin_ }"
|
||||||
<i v-else-if="info.icon" class="icon" :class="info.icon"></i>
|
:style="{ background: bg }"
|
||||||
|
@click="onClick"
|
||||||
|
>
|
||||||
|
<template v-if="info">
|
||||||
|
<div v-if="!hideTitle" class="titleContainer" @click="showTabsPopup">
|
||||||
|
<MkAvatar
|
||||||
|
v-if="info.avatar"
|
||||||
|
class="avatar"
|
||||||
|
:user="info.avatar"
|
||||||
|
:disable-preview="true"
|
||||||
|
:show-indicator="true"
|
||||||
|
/>
|
||||||
|
<i v-else-if="info.icon" class="icon" :class="info.icon"></i>
|
||||||
|
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<MkUserName v-if="info.userName" :user="info.userName" :nowrap="true" class="title"/>
|
<MkUserName v-if="info.userName" :user="info.userName" :nowrap="true" class="title" />
|
||||||
<div v-else-if="info.title" class="title">{{ info.title }}</div>
|
<div v-else-if="info.title" class="title">{{ info.title }}</div>
|
||||||
<div v-if="!narrow && info.subtitle" class="subtitle">
|
<div v-if="!narrow && info.subtitle" class="subtitle">{{ info.subtitle }}</div>
|
||||||
{{ info.subtitle }}
|
<div v-if="narrow && hasTabs" class="subtitle activeTab">
|
||||||
</div>
|
{{ info.tabs.find(tab => tab.active)?.title }}
|
||||||
<div v-if="narrow && hasTabs" class="subtitle activeTab">
|
<i class="chevron fas fa-chevron-down"></i>
|
||||||
{{ info.tabs.find(tab => tab.active)?.title }}
|
</div>
|
||||||
<i class="chevron fas fa-chevron-down"></i>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div v-if="!narrow || hideTitle" class="tabs">
|
||||||
<div v-if="!narrow || hideTitle" class="tabs">
|
<button
|
||||||
<button v-for="tab in info.tabs" v-tooltip="tab.title" class="tab _button" :class="{ active: tab.active }" @click="tab.onClick">
|
v-for="tab in info.tabs"
|
||||||
<i v-if="tab.icon" class="icon" :class="tab.icon"></i>
|
v-tooltip="tab.title"
|
||||||
<span v-if="!tab.iconOnly" class="title">{{ tab.title }}</span>
|
class="tab _button"
|
||||||
|
:class="{ active: tab.active }"
|
||||||
|
@click="tab.onClick"
|
||||||
|
>
|
||||||
|
<i v-if="tab.icon" class="icon" :class="tab.icon"></i>
|
||||||
|
<span v-if="!tab.iconOnly" class="title">{{ tab.title }}</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div class="buttons right">
|
||||||
|
<button class="_button button" onclick="location.reload();">
|
||||||
|
<i class="fa-solid fa-arrow-rotate-right"></i>
|
||||||
|
</button>
|
||||||
|
<template v-if="info && info.actions && !narrow">
|
||||||
|
<template v-for="action in info.actions">
|
||||||
|
<MkButton v-if="action.asFullButton" class="fullButton" primary @click.stop="action.handler">
|
||||||
|
<i :class="action.icon" style="margin-right: 6px;"></i>
|
||||||
|
{{ action.text }}
|
||||||
|
</MkButton>
|
||||||
|
<button
|
||||||
|
v-else
|
||||||
|
v-tooltip="action.text"
|
||||||
|
class="_button button"
|
||||||
|
:class="{ highlighted: action.highlighted }"
|
||||||
|
@click.stop="action.handler"
|
||||||
|
@touchstart="preventDrag"
|
||||||
|
>
|
||||||
|
<i :class="action.icon"></i>
|
||||||
|
</button>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<button
|
||||||
|
v-if="shouldShowMenu"
|
||||||
|
v-tooltip="$ts.menu"
|
||||||
|
class="_button button"
|
||||||
|
@click.stop="showMenu"
|
||||||
|
@touchstart="preventDrag"
|
||||||
|
>
|
||||||
|
<i class="fas fa-ellipsis-h"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
|
||||||
<div class="buttons right">
|
|
||||||
<button class="_button button" v-tooltip="'リロード'" onclick="location.reload();"><i class="fas fa-redo"></i></button>
|
|
||||||
<template v-if="info && info.actions && !narrow">
|
|
||||||
<template v-for="action in info.actions">
|
|
||||||
<MkButton v-if="action.asFullButton" class="fullButton" primary @click.stop="action.handler"><i :class="action.icon" style="margin-right: 6px;"></i>{{ action.text }}</MkButton>
|
|
||||||
<button v-else v-tooltip="action.text" class="_button button" :class="{ highlighted: action.highlighted }" @click.stop="action.handler" @touchstart="preventDrag"><i :class="action.icon"></i></button>
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
<button v-if="shouldShowMenu" v-tooltip="$ts.menu" class="_button button" @click.stop="showMenu" @touchstart="preventDrag"><i class="fas fa-ellipsis-h"></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -151,7 +189,7 @@ export default defineComponent({
|
|||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
globalEvents.off('themeChanged', calcBg);
|
globalEvents.off('themeChanged', calcBg);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (el.value.parentElement) {
|
if (el.value.parentElement) {
|
||||||
narrow.value = el.value.parentElement.offsetWidth < 500;
|
narrow.value = el.value.parentElement.offsetWidth < 500;
|
||||||
const ro = new ResizeObserver((entries, observer) => {
|
const ro = new ResizeObserver((entries, observer) => {
|
||||||
@ -228,7 +266,7 @@ export default defineComponent({
|
|||||||
> .buttons {
|
> .buttons {
|
||||||
--margin: 8px;
|
--margin: 8px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
height: var(--height);
|
height: var(--height);
|
||||||
margin: 0 var(--margin);
|
margin: 0 var(--margin);
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
<MkA v-user-preview="appearNote.user.id" class="name" :to="userPage(appearNote.user)">
|
<MkA v-user-preview="appearNote.user.id" class="name" :to="userPage(appearNote.user)">
|
||||||
<MkUserName :user="appearNote.user"/>
|
<MkUserName :user="appearNote.user"/>
|
||||||
</MkA>
|
</MkA>
|
||||||
<span v-if="appearNote.user.isBot"><svg xmlns="http://www.w3.org/2000/svg" class="is-bot-icon" fill="#FFFFFF" viewBox="0 0 512 512"><title>Hardware Chip</title><path d="M352 128H160a32 32 0 00-32 32v192a32 32 0 0032 32h192a32 32 0 0032-32V160a32 32 0 00-32-32zm0 216a8 8 0 01-8 8H168a8 8 0 01-8-8V168a8 8 0 018-8h176a8 8 0 018 8z" fill="none"/><rect x="160" y="160" width="192" height="192" rx="8" ry="8"/><path d="M464 192a16 16 0 000-32h-16v-32a64.07 64.07 0 00-64-64h-32V48a16 16 0 00-32 0v16h-48V48a16 16 0 00-32 0v16h-48V48a16 16 0 00-32 0v16h-32a64.07 64.07 0 00-64 64v32H48a16 16 0 000 32h16v48H48a16 16 0 000 32h16v48H48a16 16 0 000 32h16v32a64.07 64.07 0 0064 64h32v16a16 16 0 0032 0v-16h48v16a16 16 0 0032 0v-16h48v16a16 16 0 0032 0v-16h32a64.07 64.07 0 0064-64v-32h16a16 16 0 000-32h-16v-48h16a16 16 0 000-32h-16v-48zm-80 160a32 32 0 01-32 32H160a32 32 0 01-32-32V160a32 32 0 0132-32h192a32 32 0 0132 32z"/></svg></span>
|
<span v-if="appearNote.user.isBot" class="is-bot">bot</span>
|
||||||
<span v-if="appearNote.visibility !== 'public'" class="visibility">
|
<span v-if="appearNote.visibility !== 'public'" class="visibility">
|
||||||
<i v-if="appearNote.visibility === 'home'" class="fas fa-home"></i>
|
<i v-if="appearNote.visibility === 'home'" class="fas fa-home"></i>
|
||||||
<i v-else-if="appearNote.visibility === 'followers'" class="fas fa-unlock"></i>
|
<i v-else-if="appearNote.visibility === 'followers'" class="fas fa-unlock"></i>
|
||||||
@ -432,18 +432,14 @@ if (appearNote.replyId) {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.is-bot-icon {
|
> .is-bot {
|
||||||
transform: translateY(4px);
|
flex-shrink: 0;
|
||||||
width: 20px;
|
align-self: center;
|
||||||
margin-left: 8px;
|
margin: 0 0.5em;
|
||||||
}
|
padding: 4px 6px;
|
||||||
|
font-size: 80%;
|
||||||
> .visibility {
|
border: solid 0.5px var(--divider);
|
||||||
margin-left: 8px;
|
border-radius: 4px;
|
||||||
}
|
|
||||||
|
|
||||||
> .localOnly {
|
|
||||||
margin-left: 8px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|