Merge branch 'develop'
This commit is contained in:
		
						commit
						12cd2709d6
					
				
					 24 changed files with 133 additions and 119 deletions
				
			
		
							
								
								
									
										79
									
								
								CHANGELOG.md
									
										
									
									
									
								
							
							
						
						
									
										79
									
								
								CHANGELOG.md
									
										
									
									
									
								
							| 
						 | 
					@ -5,6 +5,37 @@ If you encounter any problems with updating, please try the following:
 | 
				
			||||||
1. `npm run clean` or `npm run cleanall`
 | 
					1. `npm run clean` or `npm run cleanall`
 | 
				
			||||||
2. Retry update (Don't forget `npm i`)
 | 
					2. Retry update (Don't forget `npm i`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Migration
 | 
				
			||||||
 | 
					------------------------------
 | 
				
			||||||
 | 
					#### 1
 | 
				
			||||||
 | 
					`ormconfig.json`という名前で、Misskeyのインストール場所(package.jsonとかがあるディレクトリ)に新たなファイルを作る。中身は次のようにします:
 | 
				
			||||||
 | 
					``` json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						"type": "postgres",
 | 
				
			||||||
 | 
						"host": "PostgreSQLのホスト",
 | 
				
			||||||
 | 
						"port": 5432,
 | 
				
			||||||
 | 
						"username": "PostgreSQLのユーザー名",
 | 
				
			||||||
 | 
						"password": "PostgreSQLのパスワード",
 | 
				
			||||||
 | 
						"database": "PostgreSQLのデータベース名",
 | 
				
			||||||
 | 
						"entities": ["src/models/entities/*.ts"],
 | 
				
			||||||
 | 
						"migrations": ["migration/*.ts"],
 | 
				
			||||||
 | 
						"cli": {
 | 
				
			||||||
 | 
							"migrationsDir": "migration"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					上記の各種PostgreSQLの設定(ポートも)は、設定ファイルに書いてあるものをコピーしてください。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 2
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					npm i -g ts-node
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 3
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					ts-node ./node_modules/typeorm/cli.js migration:run
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
How to migrate to v11 from v10
 | 
					How to migrate to v11 from v10
 | 
				
			||||||
------------------------------
 | 
					------------------------------
 | 
				
			||||||
### 移行の注意点
 | 
					### 移行の注意点
 | 
				
			||||||
| 
						 | 
					@ -42,6 +73,23 @@ mongodb:
 | 
				
			||||||
8. master ブランチに戻す
 | 
					8. master ブランチに戻す
 | 
				
			||||||
9. enjoy
 | 
					9. enjoy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					11.10.0 (2019/05/03)
 | 
				
			||||||
 | 
					-------------------
 | 
				
			||||||
 | 
					### 注意
 | 
				
			||||||
 | 
					このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Improvements
 | 
				
			||||||
 | 
					* MisskeyPagesに割った余りを求める関数を追加
 | 
				
			||||||
 | 
					* Mastodon v2.8.0 のフォローリストをインポートできるように
 | 
				
			||||||
 | 
					* エクスポートリクエストに失敗したらエラーを表示するように
 | 
				
			||||||
 | 
					* エクスポートファイルでは同一ハッシュチェックをしないように
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixes
 | 
				
			||||||
 | 
					* 2段階認証を設定するとログインできなくなる問題を修正
 | 
				
			||||||
 | 
					* ファイルをアップロードできないことがある問題を修正
 | 
				
			||||||
 | 
					* リモートファイルをキャッシュしない設定だとサムネイル時にオリジナル画像が表示されない問題を修正
 | 
				
			||||||
 | 
					* 外部サービス連携の不具合を修正
 | 
				
			||||||
 | 
					
 | 
				
			||||||
11.9.0 (2019/05/02)
 | 
					11.9.0 (2019/05/02)
 | 
				
			||||||
-------------------
 | 
					-------------------
 | 
				
			||||||
### Improvements
 | 
					### Improvements
 | 
				
			||||||
| 
						 | 
					@ -104,36 +152,7 @@ mongodb:
 | 
				
			||||||
11.5.0 (2019/04/29)
 | 
					11.5.0 (2019/04/29)
 | 
				
			||||||
-------------------
 | 
					-------------------
 | 
				
			||||||
### 注意
 | 
					### 注意
 | 
				
			||||||
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前にまず以下の手順を実行してください
 | 
					このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](migration)の手順を実行してください
 | 
				
			||||||
 | 
					 | 
				
			||||||
#### 1
 | 
					 | 
				
			||||||
`ormconfig.json`という名前で、Misskeyのインストール場所(package.jsonとかがあるディレクトリ)に新たなファイルを作る。中身は次のようにします:
 | 
					 | 
				
			||||||
``` json
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	"type": "postgres",
 | 
					 | 
				
			||||||
	"host": "PostgreSQLのホスト",
 | 
					 | 
				
			||||||
	"port": 5432,
 | 
					 | 
				
			||||||
	"username": "PostgreSQLのユーザー名",
 | 
					 | 
				
			||||||
	"password": "PostgreSQLのパスワード",
 | 
					 | 
				
			||||||
	"database": "PostgreSQLのデータベース名",
 | 
					 | 
				
			||||||
	"entities": ["src/models/entities/*.ts"],
 | 
					 | 
				
			||||||
	"migrations": ["migration/*.ts"],
 | 
					 | 
				
			||||||
	"cli": {
 | 
					 | 
				
			||||||
		"migrationsDir": "migration"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
上記の各種PostgreSQLの設定(ポートも)は、設定ファイルに書いてあるものをコピーしてください。
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### 2
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
npm i -g ts-node
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### 3
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
ts-node ./node_modules/typeorm/cli.js migration:run
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
### New features
 | 
					### New features
 | 
				
			||||||
#### MisskeyPages
 | 
					#### MisskeyPages
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										12
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
										
									
									
									
								
							| 
						 | 
					@ -118,10 +118,10 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
 | 
					<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
 | 
				
			||||||
</tr></table>
 | 
					</tr></table>
 | 
				
			||||||
<table><tr>
 | 
					<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/12021162/963128bb8d14476dbd8407943db8f31a/1.png?token-time=2145916800&token-hash=FMV7cPKBD1TU2WTbl1jg6AcdKSvTb2BSFcDhgc-EO8w%3D" alt="gutfuckllc" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1.png?token-time=2145916800&token-hash=FMV7cPKBD1TU2WTbl1jg6AcdKSvTb2BSFcDhgc-EO8w%3D" alt="gutfuckllc" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
 | 
				
			||||||
<td><img src="https://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
 | 
					<td><img src="https://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
 | 
				
			||||||
<td><img src="https://c8.patreon.com/2/200/18833336" alt="itiradi" width="100"></td>
 | 
					 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1.jpe?token-time=2145916800&token-hash=UQRWf01TwHDV4Cls1K0YAOAjM29ssif7hLVq0ESQ0hs%3D" alt="nemu" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1.jpe?token-time=2145916800&token-hash=UQRWf01TwHDV4Cls1K0YAOAjM29ssif7hLVq0ESQ0hs%3D" alt="nemu" width="100"></td>
 | 
				
			||||||
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" 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/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
 | 
				
			||||||
| 
						 | 
					@ -129,10 +129,10 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
 | 
				
			||||||
<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/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/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/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
 | 
				
			||||||
</tr><tr>
 | 
					</tr><tr>
 | 
				
			||||||
 | 
					<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
 | 
					<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
 | 
					<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
 | 
					<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=18833336">itiradi</a></td>
 | 
					 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
 | 
					<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</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/yukimochi">YUKIMOCHI</a></td>
 | 
				
			||||||
| 
						 | 
					@ -146,28 +146,30 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/83884b38afc74d4cbe83c30a13b10edd/1.png?token-time=2145916800&token-hash=R5Tog8RWg0rguRoCIoir3lThokrdPvs8Utfikhc0nhY%3D" alt="Atsuko Tominaga" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/83884b38afc74d4cbe83c30a13b10edd/1.png?token-time=2145916800&token-hash=R5Tog8RWg0rguRoCIoir3lThokrdPvs8Utfikhc0nhY%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/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/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1.jpe?token-time=2145916800&token-hash=EWxXhVbZYH7KB4IDT3joc8TbIg8zPO40x1r5IDn3R7c%3D" alt="Hiratake" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1.jpe?token-time=2145916800&token-hash=EWxXhVbZYH7KB4IDT3joc8TbIg8zPO40x1r5IDn3R7c%3D" alt="Hiratake" width="100"></td>
 | 
				
			||||||
 | 
					<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.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
 | 
				
			||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" width="100"></td>
 | 
					<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" 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>
 | 
					 | 
				
			||||||
</tr><tr>
 | 
					</tr><tr>
 | 
				
			||||||
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
 | 
					<td><a href="https://www.patreon.com/takimura">takimura</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
 | 
					<td><a href="https://www.patreon.com/damillora">Damillora</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=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=4389829">natalie</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
 | 
					<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
 | 
				
			||||||
 | 
					<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/hekovic">Hekovic</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
 | 
					<td><a href="https://www.patreon.com/dansup">dansup</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
 | 
					<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
 | 
					 | 
				
			||||||
</tr></table>
 | 
					</tr></table>
 | 
				
			||||||
<table><tr>
 | 
					<table><tr>
 | 
				
			||||||
 | 
					<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://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>
 | 
					<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>
 | 
					</tr><tr>
 | 
				
			||||||
 | 
					<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
 | 
				
			||||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
 | 
					<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
 | 
				
			||||||
</tr></table>
 | 
					</tr></table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Last updated:** Wed, 24 Apr 2019 05:56:07 UTC
 | 
					**Last updated:** Fri, 03 May 2019 05:33:07 UTC
 | 
				
			||||||
<!-- PATREON_END -->
 | 
					<!-- PATREON_END -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:four_leaf_clover: Copyright
 | 
					:four_leaf_clover: Copyright
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1982,6 +1982,10 @@ pages:
 | 
				
			||||||
      _divide:
 | 
					      _divide:
 | 
				
			||||||
        arg1: "A"
 | 
					        arg1: "A"
 | 
				
			||||||
        arg2: "B"
 | 
					        arg2: "B"
 | 
				
			||||||
 | 
					      remind: "÷ 割った余り"
 | 
				
			||||||
 | 
					      _remind:
 | 
				
			||||||
 | 
					        arg1: "A"
 | 
				
			||||||
 | 
					        arg2: "B"
 | 
				
			||||||
      eq: "AとBが同じ"
 | 
					      eq: "AとBが同じ"
 | 
				
			||||||
      _eq:
 | 
					      _eq:
 | 
				
			||||||
        arg1: "A"
 | 
					        arg1: "A"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										23
									
								
								migration/1556746559567-UserProfile.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								migration/1556746559567-UserProfile.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					import {MigrationInterface, QueryRunner} from "typeorm";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class UserProfile1556746559567 implements MigrationInterface {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public async up(queryRunner: QueryRunner): Promise<any> {
 | 
				
			||||||
 | 
					        await queryRunner.query(`UPDATE "user_profile" SET github = FALSE`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "githubId"`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" ADD COLUMN "githubId" VARCHAR(64)`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`UPDATE "user_profile" SET discord = FALSE`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "discordExpiresDate"`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" ADD COLUMN "discordExpiresDate" VARCHAR(64)`);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public async down(queryRunner: QueryRunner): Promise<any> {
 | 
				
			||||||
 | 
					        await queryRunner.query(`UPDATE "user_profile" SET github = FALSE`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "githubId"`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" ADD COLUMN "githubId" INTEGER`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`UPDATE "user_profile" SET discord = FALSE`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "discordExpiresDate"`);
 | 
				
			||||||
 | 
					        await queryRunner.query(`ALTER TABLE "user_profile" ADD COLUMN "discordExpiresDate" INTEGER`);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	"name": "misskey",
 | 
						"name": "misskey",
 | 
				
			||||||
	"author": "syuilo <i@syuilo.com>",
 | 
						"author": "syuilo <i@syuilo.com>",
 | 
				
			||||||
	"version": "11.9.0",
 | 
						"version": "11.10.0",
 | 
				
			||||||
	"codename": "daybreak",
 | 
						"codename": "daybreak",
 | 
				
			||||||
	"repository": {
 | 
						"repository": {
 | 
				
			||||||
		"type": "git",
 | 
							"type": "git",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<x-draggable tag="div" :list="blocks" handle=".drag-handle" :group="{ name: 'blocks' }" animation="150">
 | 
					<x-draggable tag="div" :list="blocks" handle=".drag-handle" :group="{ name: 'blocks' }" animation="150" swap-threshold="0.5">
 | 
				
			||||||
	<component v-for="block in blocks" :is="'x-' + block.type" :value="block" @input="updateItem" @remove="removeItem" :key="block.id" :ai-script="aiScript"/>
 | 
						<component v-for="block in blocks" :is="'x-' + block.type" :value="block" @input="updateItem" @remove="removeItem" :key="block.id" :ai-script="aiScript"/>
 | 
				
			||||||
</x-draggable>
 | 
					</x-draggable>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,15 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="cpjygsrt" :class="{ error: error != null, warn: warn != null, draggable }">
 | 
					<div class="cpjygsrt" :class="{ error: error != null, warn: warn != null }">
 | 
				
			||||||
	<header class="drag-handle">
 | 
						<header>
 | 
				
			||||||
		<div class="title"><slot name="header"></slot></div>
 | 
							<div class="title"><slot name="header"></slot></div>
 | 
				
			||||||
		<div class="buttons">
 | 
							<div class="buttons">
 | 
				
			||||||
			<slot name="func"></slot>
 | 
								<slot name="func"></slot>
 | 
				
			||||||
			<button v-if="removable" @click="remove()">
 | 
								<button v-if="removable" @click="remove()">
 | 
				
			||||||
				<fa :icon="faTrashAlt"/>
 | 
									<fa :icon="faTrashAlt"/>
 | 
				
			||||||
			</button>
 | 
								</button>
 | 
				
			||||||
 | 
								<button v-if="draggable" class="drag-handle">
 | 
				
			||||||
 | 
									<fa :icon="faBars"/>
 | 
				
			||||||
 | 
								</button>
 | 
				
			||||||
			<button @click="toggleContent(!showBody)">
 | 
								<button @click="toggleContent(!showBody)">
 | 
				
			||||||
				<template v-if="showBody"><fa icon="angle-up"/></template>
 | 
									<template v-if="showBody"><fa icon="angle-up"/></template>
 | 
				
			||||||
				<template v-else><fa icon="angle-down"/></template>
 | 
									<template v-else><fa icon="angle-down"/></template>
 | 
				
			||||||
| 
						 | 
					@ -23,6 +26,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import { faBars } from '@fortawesome/free-solid-svg-icons';
 | 
				
			||||||
import { faTrashAlt } from '@fortawesome/free-regular-svg-icons';
 | 
					import { faTrashAlt } from '@fortawesome/free-regular-svg-icons';
 | 
				
			||||||
import i18n from '../../../../i18n';
 | 
					import i18n from '../../../../i18n';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,7 +58,7 @@ export default Vue.extend({
 | 
				
			||||||
	data() {
 | 
						data() {
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			showBody: this.expanded,
 | 
								showBody: this.expanded,
 | 
				
			||||||
			faTrashAlt
 | 
								faTrashAlt, faBars
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
| 
						 | 
					@ -124,8 +128,7 @@ export default Vue.extend({
 | 
				
			||||||
				&:active
 | 
									&:active
 | 
				
			||||||
					color var(--faceTextButtonActive)
 | 
										color var(--faceTextButtonActive)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	&.draggable
 | 
								.drag-handle
 | 
				
			||||||
		> header
 | 
					 | 
				
			||||||
				cursor move
 | 
									cursor move
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .warn
 | 
						> .warn
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -290,12 +290,17 @@ export default Vue.extend({
 | 
				
			||||||
				this.exportTarget == 'mute' ? 'i/export-mute' :
 | 
									this.exportTarget == 'mute' ? 'i/export-mute' :
 | 
				
			||||||
				this.exportTarget == 'blocking' ? 'i/export-blocking' :
 | 
									this.exportTarget == 'blocking' ? 'i/export-blocking' :
 | 
				
			||||||
				this.exportTarget == 'user-lists' ? 'i/export-user-lists' :
 | 
									this.exportTarget == 'user-lists' ? 'i/export-user-lists' :
 | 
				
			||||||
				null, {});
 | 
									null, {}).then(() => {
 | 
				
			||||||
 | 
					 | 
				
			||||||
					this.$root.dialog({
 | 
										this.$root.dialog({
 | 
				
			||||||
						type: 'info',
 | 
											type: 'info',
 | 
				
			||||||
						text: this.$t('export-requested')
 | 
											text: this.$t('export-requested')
 | 
				
			||||||
					});
 | 
										});
 | 
				
			||||||
 | 
									}).catch((e: any) => {
 | 
				
			||||||
 | 
										this.$root.dialog({
 | 
				
			||||||
 | 
											type: 'error',
 | 
				
			||||||
 | 
											text: e.message
 | 
				
			||||||
 | 
										});
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		doImport() {
 | 
							doImport() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -173,9 +173,10 @@ export default class MiOS extends EventEmitter {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Init service worker
 | 
								// Init service worker
 | 
				
			||||||
			if (this.shouldRegisterSw) {
 | 
								if (this.shouldRegisterSw) {
 | 
				
			||||||
				this.getMeta().then(data => {
 | 
									// #4813
 | 
				
			||||||
					this.registerSw(data.swPublickey);
 | 
									//this.getMeta().then(data => {
 | 
				
			||||||
				});
 | 
									//	this.registerSw(data.swPublickey);
 | 
				
			||||||
 | 
									//});
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,12 +3,6 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import composeNotification from './common/scripts/compose-notification';
 | 
					import composeNotification from './common/scripts/compose-notification';
 | 
				
			||||||
import { erase } from '../../prelude/array';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// キャッシュするリソース
 | 
					 | 
				
			||||||
const cachee = [
 | 
					 | 
				
			||||||
	'/'
 | 
					 | 
				
			||||||
];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// インストールされたとき
 | 
					// インストールされたとき
 | 
				
			||||||
self.addEventListener('install', ev => {
 | 
					self.addEventListener('install', ev => {
 | 
				
			||||||
| 
						 | 
					@ -16,31 +10,9 @@ self.addEventListener('install', ev => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ev.waitUntil(Promise.all([
 | 
						ev.waitUntil(Promise.all([
 | 
				
			||||||
		self.skipWaiting(), // Force activate
 | 
							self.skipWaiting(), // Force activate
 | 
				
			||||||
		caches.open(_VERSION_).then(cache => cache.addAll(cachee)) // Cache
 | 
					 | 
				
			||||||
	]));
 | 
						]));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// アクティベートされたとき
 | 
					 | 
				
			||||||
self.addEventListener('activate', ev => {
 | 
					 | 
				
			||||||
	// Clean up old caches
 | 
					 | 
				
			||||||
	ev.waitUntil(
 | 
					 | 
				
			||||||
		caches.keys().then(keys => Promise.all(
 | 
					 | 
				
			||||||
			erase(_VERSION_, keys)
 | 
					 | 
				
			||||||
				.map(key => caches.delete(key))
 | 
					 | 
				
			||||||
		))
 | 
					 | 
				
			||||||
	);
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// リクエストが発生したとき
 | 
					 | 
				
			||||||
self.addEventListener('fetch', ev => {
 | 
					 | 
				
			||||||
	ev.respondWith(
 | 
					 | 
				
			||||||
		// キャッシュがあるか確認してあればそれを返す
 | 
					 | 
				
			||||||
		caches.match(ev.request).then(response =>
 | 
					 | 
				
			||||||
			response || fetch(ev.request)
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	);
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// プッシュ通知を受け取ったとき
 | 
					// プッシュ通知を受け取ったとき
 | 
				
			||||||
self.addEventListener('push', ev => {
 | 
					self.addEventListener('push', ev => {
 | 
				
			||||||
	// クライアント取得
 | 
						// クライアント取得
 | 
				
			||||||
| 
						 | 
					@ -59,11 +31,3 @@ self.addEventListener('push', ev => {
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
	}));
 | 
						}));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					 | 
				
			||||||
self.addEventListener('message', ev => {
 | 
					 | 
				
			||||||
	if (ev.data == 'clear') {
 | 
					 | 
				
			||||||
		caches.keys().then(keys => {
 | 
					 | 
				
			||||||
			for (const key of keys) caches.delete(key);
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -160,6 +160,7 @@ export class ASEvaluator {
 | 
				
			||||||
			subtract: (a: number, b: number) => a - b,
 | 
								subtract: (a: number, b: number) => a - b,
 | 
				
			||||||
			multiply: (a: number, b: number) => a * b,
 | 
								multiply: (a: number, b: number) => a * b,
 | 
				
			||||||
			divide: (a: number, b: number) => a / b,
 | 
								divide: (a: number, b: number) => a / b,
 | 
				
			||||||
 | 
								remind: (a: number, b: number) => a % b,
 | 
				
			||||||
			strLen: (a: string) => a.length,
 | 
								strLen: (a: string) => a.length,
 | 
				
			||||||
			strPick: (a: string, b: number) => a[b - 1],
 | 
								strPick: (a: string, b: number) => a[b - 1],
 | 
				
			||||||
			strReplace: (a: string, b: string, c: string) => a.split(b).join(c),
 | 
								strReplace: (a: string, b: string, c: string) => a.split(b).join(c),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,6 +57,7 @@ export const funcDefs: Record<string, { in: any[]; out: any; category: string; i
 | 
				
			||||||
	subtract:        { in: ['number', 'number'],           out: 'number',      category: 'operation',  icon: faMinus, },
 | 
						subtract:        { in: ['number', 'number'],           out: 'number',      category: 'operation',  icon: faMinus, },
 | 
				
			||||||
	multiply:        { in: ['number', 'number'],           out: 'number',      category: 'operation',  icon: faTimes, },
 | 
						multiply:        { in: ['number', 'number'],           out: 'number',      category: 'operation',  icon: faTimes, },
 | 
				
			||||||
	divide:          { in: ['number', 'number'],           out: 'number',      category: 'operation',  icon: faDivide, },
 | 
						divide:          { in: ['number', 'number'],           out: 'number',      category: 'operation',  icon: faDivide, },
 | 
				
			||||||
 | 
						remind:          { in: ['number', 'number'],           out: 'number',      category: 'operation',  icon: faDivide, },
 | 
				
			||||||
	eq:              { in: [0, 0],                         out: 'boolean',     category: 'comparison', icon: faEquals, },
 | 
						eq:              { in: [0, 0],                         out: 'boolean',     category: 'comparison', icon: faEquals, },
 | 
				
			||||||
	notEq:           { in: [0, 0],                         out: 'boolean',     category: 'comparison', icon: faNotEqual, },
 | 
						notEq:           { in: [0, 0],                         out: 'boolean',     category: 'comparison', icon: faNotEqual, },
 | 
				
			||||||
	gt:              { in: ['number', 'number'],           out: 'boolean',     category: 'comparison', icon: faGreaterThan, },
 | 
						gt:              { in: ['number', 'number'],           out: 'boolean',     category: 'comparison', icon: faGreaterThan, },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -144,10 +144,10 @@ export class UserProfile {
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	public githubAccessToken: string | null;
 | 
						public githubAccessToken: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Column('integer', {
 | 
						@Column('varchar', {
 | 
				
			||||||
		nullable: true, default: null,
 | 
							length: 64, nullable: true, default: null,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	public githubId: number | null;
 | 
						public githubId: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Column('varchar', {
 | 
						@Column('varchar', {
 | 
				
			||||||
		length: 64, nullable: true, default: null,
 | 
							length: 64, nullable: true, default: null,
 | 
				
			||||||
| 
						 | 
					@ -169,10 +169,10 @@ export class UserProfile {
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	public discordRefreshToken: string | null;
 | 
						public discordRefreshToken: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Column('integer', {
 | 
						@Column('varchar', {
 | 
				
			||||||
		nullable: true, default: null,
 | 
							length: 64, nullable: true, default: null,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	public discordExpiresDate: number | null;
 | 
						public discordExpiresDate: string | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Column('varchar', {
 | 
						@Column('varchar', {
 | 
				
			||||||
		length: 64, nullable: true, default: null,
 | 
							length: 64, nullable: true, default: null,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,6 +127,7 @@ export class UserRepository extends Repository<User> {
 | 
				
			||||||
				pinnedNotes: Notes.packMany(pins.map(pin => pin.noteId), meId, {
 | 
									pinnedNotes: Notes.packMany(pins.map(pin => pin.noteId), meId, {
 | 
				
			||||||
					detail: true
 | 
										detail: true
 | 
				
			||||||
				}),
 | 
									}),
 | 
				
			||||||
 | 
									twoFactorEnabled: profile!.twoFactorEnabled,
 | 
				
			||||||
			} : {}),
 | 
								} : {}),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			...(opts.detail && meId === user.id ? {
 | 
								...(opts.detail && meId === user.id ? {
 | 
				
			||||||
| 
						 | 
					@ -135,7 +136,6 @@ export class UserRepository extends Repository<User> {
 | 
				
			||||||
				autoWatch: profile!.autoWatch,
 | 
									autoWatch: profile!.autoWatch,
 | 
				
			||||||
				alwaysMarkNsfw: profile!.alwaysMarkNsfw,
 | 
									alwaysMarkNsfw: profile!.alwaysMarkNsfw,
 | 
				
			||||||
				carefulBot: profile!.carefulBot,
 | 
									carefulBot: profile!.carefulBot,
 | 
				
			||||||
				twoFactorEnabled: profile!.twoFactorEnabled,
 | 
					 | 
				
			||||||
				hasUnreadMessagingMessage: MessagingMessages.count({
 | 
									hasUnreadMessagingMessage: MessagingMessages.count({
 | 
				
			||||||
					where: {
 | 
										where: {
 | 
				
			||||||
						recipientId: user.id,
 | 
											recipientId: user.id,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,7 +85,7 @@ export async function exportBlocking(job: Bull.Job, done: any): Promise<void> {
 | 
				
			||||||
	logger.succ(`Exported to: ${path}`);
 | 
						logger.succ(`Exported to: ${path}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const fileName = 'blocking-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
 | 
						const fileName = 'blocking-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
 | 
				
			||||||
	const driveFile = await addFile(user, path, fileName);
 | 
						const driveFile = await addFile(user, path, fileName, null, null, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logger.succ(`Exported to: ${driveFile.id}`);
 | 
						logger.succ(`Exported to: ${driveFile.id}`);
 | 
				
			||||||
	cleanup();
 | 
						cleanup();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,7 +85,7 @@ export async function exportFollowing(job: Bull.Job, done: any): Promise<void> {
 | 
				
			||||||
	logger.succ(`Exported to: ${path}`);
 | 
						logger.succ(`Exported to: ${path}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const fileName = 'following-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
 | 
						const fileName = 'following-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
 | 
				
			||||||
	const driveFile = await addFile(user, path, fileName);
 | 
						const driveFile = await addFile(user, path, fileName, null, null, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logger.succ(`Exported to: ${driveFile.id}`);
 | 
						logger.succ(`Exported to: ${driveFile.id}`);
 | 
				
			||||||
	cleanup();
 | 
						cleanup();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,7 +85,7 @@ export async function exportMute(job: Bull.Job, done: any): Promise<void> {
 | 
				
			||||||
	logger.succ(`Exported to: ${path}`);
 | 
						logger.succ(`Exported to: ${path}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const fileName = 'mute-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
 | 
						const fileName = 'mute-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
 | 
				
			||||||
	const driveFile = await addFile(user, path, fileName);
 | 
						const driveFile = await addFile(user, path, fileName, null, null, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logger.succ(`Exported to: ${driveFile.id}`);
 | 
						logger.succ(`Exported to: ${driveFile.id}`);
 | 
				
			||||||
	cleanup();
 | 
						cleanup();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,7 +108,7 @@ export async function exportNotes(job: Bull.Job, done: any): Promise<void> {
 | 
				
			||||||
	logger.succ(`Exported to: ${path}`);
 | 
						logger.succ(`Exported to: ${path}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const fileName = 'notes-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.json';
 | 
						const fileName = 'notes-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.json';
 | 
				
			||||||
	const driveFile = await addFile(user, path, fileName);
 | 
						const driveFile = await addFile(user, path, fileName, null, null, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logger.succ(`Exported to: ${driveFile.id}`);
 | 
						logger.succ(`Exported to: ${driveFile.id}`);
 | 
				
			||||||
	cleanup();
 | 
						cleanup();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,7 +62,7 @@ export async function exportUserLists(job: Bull.Job, done: any): Promise<void> {
 | 
				
			||||||
	logger.succ(`Exported to: ${path}`);
 | 
						logger.succ(`Exported to: ${path}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const fileName = 'user-lists-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
 | 
						const fileName = 'user-lists-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
 | 
				
			||||||
	const driveFile = await addFile(user, path, fileName);
 | 
						const driveFile = await addFile(user, path, fileName, null, null, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logger.succ(`Exported to: ${driveFile.id}`);
 | 
						logger.succ(`Exported to: ${driveFile.id}`);
 | 
				
			||||||
	cleanup();
 | 
						cleanup();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,8 @@ export async function importFollowing(job: Bull.Job, done: any): Promise<void> {
 | 
				
			||||||
		linenum++;
 | 
							linenum++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
			const { username, host } = parseAcct(line.trim());
 | 
								const acct = line.split(',')[0].trim();
 | 
				
			||||||
 | 
								const { username, host } = parseAcct(acct);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			let target = isSelfHost(host!) ? await Users.findOne({
 | 
								let target = isSelfHost(host!) ? await Users.findOne({
 | 
				
			||||||
				host: null,
 | 
									host: null,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -203,12 +203,8 @@ router.get('/dc/cb', async ctx => {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const profile = await UserProfiles.createQueryBuilder()
 | 
							const profile = await UserProfiles.createQueryBuilder()
 | 
				
			||||||
			.where('discord @> :discord', {
 | 
								.where('"discordId" = :id', { id: id })
 | 
				
			||||||
				discord: {
 | 
								.andWhere('"userHost" IS NULL')
 | 
				
			||||||
					id: id,
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
			.andWhere('userHost IS NULL')
 | 
					 | 
				
			||||||
			.getOne();
 | 
								.getOne();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (profile == null) {
 | 
							if (profile == null) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -193,12 +193,8 @@ router.get('/gh/cb', async ctx => {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const link = await UserProfiles.createQueryBuilder()
 | 
							const link = await UserProfiles.createQueryBuilder()
 | 
				
			||||||
			.where('github @> :github', {
 | 
								.where('"githubId" = :id', { id: id })
 | 
				
			||||||
				github: {
 | 
								.andWhere('"userHost" IS NULL')
 | 
				
			||||||
					id: id,
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
			.andWhere('userHost IS NULL')
 | 
					 | 
				
			||||||
			.getOne();
 | 
								.getOne();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (link == null) {
 | 
							if (link == null) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -141,12 +141,8 @@ router.get('/tw/cb', async ctx => {
 | 
				
			||||||
		const result = await twAuth!.done(JSON.parse(twCtx), ctx.query.oauth_verifier);
 | 
							const result = await twAuth!.done(JSON.parse(twCtx), ctx.query.oauth_verifier);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const link = await UserProfiles.createQueryBuilder()
 | 
							const link = await UserProfiles.createQueryBuilder()
 | 
				
			||||||
			.where('twitter @> :twitter', {
 | 
								.where('"twitterUserId" = :id', { id: result.userId })
 | 
				
			||||||
				twitter: {
 | 
								.andWhere('"userHost" IS NULL')
 | 
				
			||||||
					userId: result.userId,
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
			.andWhere('userHost IS NULL')
 | 
					 | 
				
			||||||
			.getOne();
 | 
								.getOne();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (link == null) {
 | 
							if (link == null) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -393,6 +393,8 @@ export default async function(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (isLink) {
 | 
							if (isLink) {
 | 
				
			||||||
			file.url = url;
 | 
								file.url = url;
 | 
				
			||||||
 | 
								file.thumbnailUrl = url;
 | 
				
			||||||
 | 
								file.webpublicUrl = url;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue