mirror of
https://github.com/yude-jp/yude.jp
synced 2026-10-26 01:05:08 +09:00
Compare commits
166
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79246ee600 | ||
|
|
98ad910a9b | ||
|
|
fc90f87285 | ||
|
|
b07d6412ff | ||
|
|
6d6365c240 | ||
|
|
1dd86ac2c8 | ||
|
|
496fe5ee4b | ||
|
|
cdcce3a39b | ||
|
|
7f3a8f8230 | ||
|
|
fae52872f1 | ||
|
|
1c8bf364dd | ||
|
|
ef653ed749 | ||
|
|
8deac1fede | ||
|
|
3fb52ddcfa | ||
|
|
a36785dded | ||
|
|
c60270c1c6
|
||
|
|
1b7319617b
|
||
|
|
aa6f4417e7 | ||
|
|
ae6c8aa9c9
|
||
|
|
9389cc55f7
|
||
|
|
ba0e41579a
|
||
|
|
b35caef45c
|
||
|
|
7ac1c7199f
|
||
|
|
f697eb9b85
|
||
|
|
16bb6398e4
|
||
|
|
02b1adcf55
|
||
|
|
34e335037c
|
||
|
|
0cb27e3cda
|
||
|
|
92459e594f
|
||
|
|
c30312a46a
|
||
|
|
5531b3a3bf
|
||
|
|
f0cf3729a0
|
||
|
|
ec530601b4
|
||
|
|
30547e3b81
|
||
|
|
2529afa286 | ||
|
|
b62f95d483
|
||
|
|
2bd3b69da1
|
||
|
|
5a0e87d7d4
|
||
|
|
b6f427d605
|
||
|
|
92bb8b995c
|
||
|
|
52c8cd8d1c
|
||
|
|
22385a42c8
|
||
|
|
99f776b861
|
||
|
|
24327251ee
|
||
|
|
1f7456db3c
|
||
|
|
a8321b6c60
|
||
|
|
ff98956a10
|
||
|
|
db6855fbc6
|
||
|
|
b446a2ebae
|
||
|
|
86844984d2
|
||
|
|
a72a778a03
|
||
|
|
d9559dd072
|
||
|
|
c856a34867
|
||
|
|
d3283b12b2
|
||
|
|
8513ee795f
|
||
|
|
49bd87b276
|
||
|
|
a095e20b6b
|
||
|
|
33dbec3339
|
||
|
|
6eb140fc0a | ||
|
|
08d054f8f6 | ||
|
|
bed955aa95 | ||
|
|
37adbffcef
|
||
|
|
b1a778b5d0
|
||
|
|
e32dde3363 | ||
|
|
429407820f | ||
|
|
4e8f0435f2
|
||
|
|
d764ae8f32
|
||
|
|
db8a0af6ca
|
||
|
|
9e2f51eb5f
|
||
|
|
979bbe2a7f
|
||
|
|
de69c49d46
|
||
|
|
1411e37d8f
|
||
|
|
a08bd36c3e
|
||
|
|
aaa92c3a73
|
||
|
|
ea617dd8dc
|
||
|
|
5276456ac2
|
||
|
|
2b6ca4354d
|
||
|
|
7e7066317c
|
||
|
|
3afef82031
|
||
|
|
4d0b82dee3
|
||
|
|
c19e797fa4
|
||
|
|
365559158d
|
||
|
|
967c0f77af
|
||
|
|
85c649ddca
|
||
|
|
3898a6951d
|
||
|
|
7ad04ba8ef
|
||
|
|
e3e4cc5a5e
|
||
|
|
a4982c7ef3
|
||
|
|
c957d791a6
|
||
|
|
971be8ab25
|
||
|
|
eb46a60119
|
||
|
|
7629eb6c49
|
||
|
|
f8357e2068
|
||
|
|
ee913461f1
|
||
|
|
b95c6b4cd5
|
||
|
|
b0b900cc10
|
||
|
|
296e4d6298
|
||
|
|
2c0bc0f5f6
|
||
|
|
73d159c1a6
|
||
|
|
34df66d050
|
||
|
|
0258de61b0
|
||
|
|
958e9803fb
|
||
|
|
7ee5d348dd
|
||
|
|
24cf758cad
|
||
|
|
a8186fb801
|
||
|
|
65fbb55a33
|
||
|
|
b59a6b6926
|
||
|
|
623db08e1a | ||
|
|
3a947d2932 | ||
|
|
8f6953df10 | ||
|
|
3c7d783a9c | ||
|
|
39457ec092
|
||
|
|
7099eac000
|
||
|
|
c12ea87daf
|
||
|
|
d239a211fc
|
||
|
|
aa4b214239
|
||
|
|
aa10c2fee7
|
||
|
|
3db0a78c29
|
||
|
|
8cb9b12b8a | ||
|
|
0a50795838 | ||
|
|
51f67deb11
|
||
|
|
0d6a65e8f0
|
||
|
|
bddc61768c
|
||
|
|
c2edfeb82c
|
||
|
|
e6d61ff4ce
|
||
|
|
aafc72d5d9
|
||
|
|
94c966d58c
|
||
|
|
fafd1f4533
|
||
|
|
d923c686ae
|
||
|
|
93c8be4214
|
||
|
|
efb5e34b90
|
||
|
|
3802286327
|
||
|
|
1287e54b43
|
||
|
|
d9279ee88f
|
||
|
|
95c6b29db0
|
||
|
|
54e9f0cb61
|
||
|
|
93ec789a1b | ||
|
|
299034c391
|
||
|
|
4b673b8c9c
|
||
|
|
6fcb31fb68 | ||
|
|
9f95e24ede
|
||
|
|
d3bf8cc2f2
|
||
|
|
3fdfcd4359
|
||
|
|
9532e0f48b
|
||
|
|
8a0897cc00
|
||
|
|
29af6383a7
|
||
|
|
c7c4177edd
|
||
|
|
9d77edd973
|
||
|
|
7f2411b2f6
|
||
|
|
ffc6acb9cb
|
||
|
|
b1dabb8fb9
|
||
|
|
7932b63d60
|
||
|
|
18473ec7fd
|
||
|
|
859aa2bbab
|
||
|
|
ba2a8a365c
|
||
|
|
0e7a1292e0
|
||
|
|
8f185e05dc
|
||
|
|
d558d666b1
|
||
|
|
97be65a6a4
|
||
|
|
23b791a9bf
|
||
|
|
f530891563
|
||
|
|
6f274deea8
|
||
|
|
e7cda9d4c5
|
||
|
|
460225328b
|
||
|
|
34ed4f27cf
|
||
|
|
b3e9d02025
|
No files matched your search
@@ -1,3 +0,0 @@
|
|||||||
SPOTIFY_CLIENT_ID=
|
|
||||||
SPOTIFY_CLIENT_SECRET=
|
|
||||||
SPOTIFY_REFRESH_TOKEN=
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"extends": "next/core-web-vitals",
|
||||||
|
"rules": {
|
||||||
|
"@next/next/no-document-import-in-page": "off",
|
||||||
|
"@next/next/no-img-element": "off",
|
||||||
|
"react-hooks/exhaustive-deps": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,3 +11,6 @@ yarn-error.log
|
|||||||
.vimrc~
|
.vimrc~
|
||||||
..vimrc.un~
|
..vimrc.un~
|
||||||
.env.local
|
.env.local
|
||||||
|
out
|
||||||
|
.vercel
|
||||||
|
.DS_Store
|
||||||
@@ -3,14 +3,11 @@
|
|||||||
<img alt="Next JS" src="https://img.shields.io/badge/nextjs-%23000000.svg?style=for-the-badge&logo=next.js&logoColor=white"/>
|
<img alt="Next JS" src="https://img.shields.io/badge/nextjs-%23000000.svg?style=for-the-badge&logo=next.js&logoColor=white"/>
|
||||||
<img alt="TailwindCSS" src="https://img.shields.io/badge/tailwindcss-%2338B2AC.svg?style=for-the-badge&logo=tailwind-css&logoColor=white"/>\
|
<img alt="TailwindCSS" src="https://img.shields.io/badge/tailwindcss-%2338B2AC.svg?style=for-the-badge&logo=tailwind-css&logoColor=white"/>\
|
||||||
Source code of [yude.jp](https://yude.jp).\
|
Source code of [yude.jp](https://yude.jp).\
|
||||||
Built with [Next.js](https://nextjs.org/) and [Tailwind CSS](https://tailwindcss.com/) and deployed on [Vercel](https://vercel.com).
|
Built with [Next.js](https://nextjs.org/) and [Tailwind CSS](https://tailwindcss.com/) and deployed to [Cloudflare Pages](https://pages.cloudflare.com/).
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
### Setup
|
1. Run `yarn` to install dependencies.
|
||||||
1. Run `yarn`.
|
2. Run `yarn dev` to serve.
|
||||||
1. Rename `.env.local.sample` as `.env.local` and set value.
|
|
||||||
### Preview
|
|
||||||
* Run `yarn dev`.
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
This repository is provided under the MIT License.
|
This repository is provided under the MIT License.
|
||||||
+2
-3
@@ -1,12 +1,11 @@
|
|||||||
このアカウントは**非公式**アカウントです。また、内容を保証するものではありません。
|
このアカウントは**非公式**アカウントです。また、内容を保証するものではありません。
|
||||||
|
|
||||||
# 管理者
|
# 連絡先
|
||||||
広島市立大学 情報科学部 2年の [yude](https://yude.jp/profile) が管理しています。このアカウントについての連絡は下記までお願いします。
|
広島市立大学 情報科学部 2年の [yude](https://yude.jp/profile) が管理しています。このアカウントについての連絡は下記までお願いします。
|
||||||
## 連絡先
|
|
||||||
* 電子メール: [[email protected]](mailto:[email protected])
|
* 電子メール: [[email protected]](mailto:[email protected])
|
||||||
* Twitter: [@yude_jp](https://twitter.com/yude_jp)
|
* Twitter: [@yude_jp](https://twitter.com/yude_jp)
|
||||||
|
|
||||||
# 稼働方法
|
# 仕組み
|
||||||
Microsoft Power Automate によって広島市立大学 Web ページの RSS フィードを取得し、新しい記事が投稿されている場合にツイートします。\
|
Microsoft Power Automate によって広島市立大学 Web ページの RSS フィードを取得し、新しい記事が投稿されている場合にツイートします。\
|
||||||
次の URL を監視しています。
|
次の URL を監視しています。
|
||||||
* [お知らせ|広島市立大学](https://www.hiroshima-cu.ac.jp/news/)
|
* [お知らせ|広島市立大学](https://www.hiroshima-cu.ac.jp/news/)
|
||||||
|
|||||||
+12
-6
@@ -4,7 +4,7 @@ The following applies in addition to [yude.jp Terms of Service](https://yude.jp/
|
|||||||
* Don't troll.
|
* Don't troll.
|
||||||
* Don't cheat.
|
* Don't cheat.
|
||||||
|
|
||||||
# List of available commands
|
# Part of the list of available commands ()
|
||||||
* `/ll`: Switch the visibility of spawn checker.
|
* `/ll`: Switch the visibility of spawn checker.
|
||||||
* `/mvspawn`: Teleport to spawn point of the world you're in.
|
* `/mvspawn`: Teleport to spawn point of the world you're in.
|
||||||
|
|
||||||
@@ -14,16 +14,22 @@ You can destroy wood logs and ore blocks at once by destroying with sneaking.\
|
|||||||
## Block protection
|
## Block protection
|
||||||
You can protect your chests, doors, furnaces, etc. by pasting sign like the image below.\
|
You can protect your chests, doors, furnaces, etc. by pasting sign like the image below.\
|
||||||
You can also create a shared block by writing the player ID across multiple lines. \
|
You can also create a shared block by writing the player ID across multiple lines. \
|
||||||

|

|
||||||
## Skills
|
## Skills
|
||||||
You can use skills powered by mcMMO.
|
You can use skills powered by mcMMO.
|
||||||
|
## Warp
|
||||||
|
You can warp to registered points.
|
||||||
|
To show registered points, run `/warps`. To warp, run `/warp <name>`.
|
||||||
|
|
||||||
|
# Game specifications
|
||||||
|
* `keepInventory` is `true`, which means you won't drop inventory on death.
|
||||||
|
|
||||||
# Facility introduction
|
# Facility introduction
|
||||||
## Shrine (by shirachan_1204)
|
## Shrine (by shirachan_1204)
|
||||||

|

|
||||||
## Iron Golem Trap (by yude & kuwazi_)
|
## Iron Golem Trap (by yude & kuwazi_)
|
||||||

|

|
||||||
## Huge field (by yude & kuwazi_)
|
## Huge field (by yude & kuwazi_)
|
||||||

|

|
||||||
## Giant sugar cane field (by yude)
|
## Giant sugar cane field (by yude)
|
||||||

|

|
||||||
+12
-6
@@ -3,7 +3,7 @@
|
|||||||
* ワールドのどこであっても自由に建築することができます。
|
* ワールドのどこであっても自由に建築することができます。
|
||||||
* トロール (荒らし) を行わないでください。
|
* トロール (荒らし) を行わないでください。
|
||||||
* チートを行わないでください。
|
* チートを行わないでください。
|
||||||
# 使用可能なコマンドの一覧
|
# 主な使用可能なコマンドの一覧
|
||||||
* `/ll`: スポーンチェッカーの表示を切り替えます。
|
* `/ll`: スポーンチェッカーの表示を切り替えます。
|
||||||
* `/mvspawn`: ワールドのスポーン地点へ転移します。
|
* `/mvspawn`: ワールドのスポーン地点へ転移します。
|
||||||
|
|
||||||
@@ -13,16 +13,22 @@
|
|||||||
## ブロックの保護
|
## ブロックの保護
|
||||||
看板を画像のように貼り付けることで、チェストやドア、かまどなどを保護できます。\
|
看板を画像のように貼り付けることで、チェストやドア、かまどなどを保護できます。\
|
||||||
複数行に渡ってプレイヤー ID を書くことで、共有ブロックを作ることもできます。\
|
複数行に渡ってプレイヤー ID を書くことで、共有ブロックを作ることもできます。\
|
||||||

|

|
||||||
## スキル
|
## スキル
|
||||||
mcMMO を導入しているので、プラグインによるスキルを利用できます。
|
mcMMO を導入しているので、プラグインによるスキルを利用できます。
|
||||||
|
## ワープ
|
||||||
|
登録されている地点へワープできます。
|
||||||
|
`/warps` で登録地点の一覧を表示し、`/warp (登録名)` でワープします。
|
||||||
|
|
||||||
|
# ゲームの仕様
|
||||||
|
* `keepInventory` は `true` になっています。したがって、死亡によるインベントリーのドロップはありません。
|
||||||
|
|
||||||
# 施設紹介
|
# 施設紹介
|
||||||
## 神社 (by shirachan_1204)
|
## 神社 (by shirachan_1204)
|
||||||

|

|
||||||
## アイアンゴーレムトラップ (by yude & kuwazi_)
|
## アイアンゴーレムトラップ (by yude & kuwazi_)
|
||||||

|

|
||||||
## 巨大畑 (by yude & kuwazi_)
|
## 巨大畑 (by yude & kuwazi_)
|
||||||

|

|
||||||
## 巨大サトウキビ畑 (by yude)
|
## 巨大サトウキビ畑 (by yude)
|
||||||

|

|
||||||
+3
-3
@@ -3,12 +3,12 @@ Publishing the website whose links to yude.jp.
|
|||||||
|
|
||||||
## Link listing
|
## Link listing
|
||||||
### カービィ★KIRBYの家 `https://exout.net/~kirby3ds/`
|
### カービィ★KIRBYの家 `https://exout.net/~kirby3ds/`
|
||||||
[](https://exout.net/~kirby3ds/)
|
[](https://exout.net/~kirby3ds/)
|
||||||
|
|
||||||
### こーげんやさい `https://nona-takahara.github.io/`
|
### こーげんやさい `https://nona-takahara.github.io/`
|
||||||
[](https://nona-takahara.github.io/)
|
[](https://nona-takahara.github.io/)
|
||||||
|
|
||||||
|
|
||||||
## To those who want to link yude.jp
|
## To those who want to link yude.jp
|
||||||
Thank you! You can use the banner below to link this website.
|
Thank you! You can use the banner below to link this website.
|
||||||
[](https://yude.jp)
|
[](https://yude.jp)
|
||||||
+3
-3
@@ -3,12 +3,12 @@
|
|||||||
|
|
||||||
## リンク一覧
|
## リンク一覧
|
||||||
### カービィ★KIRBYの家 `https://exout.net/~kirby3ds/`
|
### カービィ★KIRBYの家 `https://exout.net/~kirby3ds/`
|
||||||
[](https://exout.net/~kirby3ds/)
|
[](https://exout.net/~kirby3ds/)
|
||||||
|
|
||||||
### こーげんやさい `https://nona-takahara.github.io/`
|
### こーげんやさい `https://nona-takahara.github.io/`
|
||||||
[](https://nona-takahara.github.io/)
|
[](https://nona-takahara.github.io/)
|
||||||
|
|
||||||
|
|
||||||
## このサイトをリンクしてくださる方へ
|
## このサイトをリンクしてくださる方へ
|
||||||
ありがとうございます!以下のバナーを使用して、この Web サイトをリンクすることができます。
|
ありがとうございます!以下のバナーを使用して、この Web サイトをリンクすることができます。
|
||||||
[](https://yude.jp)
|
[](https://yude.jp)
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# Available services on yude.jp
|
||||||
|
|
||||||
|
## Softwares
|
||||||
|
* [AutoMuteUs](https://github.com/denverquane/automuteus)\
|
||||||
|
Among Us helper; API: [`galactus.yude.jp`](https://galactus.yude.jp)
|
||||||
|
* [Nextcloud](https://nc.yude.jp)
|
||||||
|
* [Mastodon](https://mstdn.yude.jp)
|
||||||
|
* [Misskey](https://misskey.yude.jp)
|
||||||
|
* [Pleroma](https//pleroma.yude.jp)
|
||||||
|
* TeamSpeak 3: `yude.jp`
|
||||||
|
* [Gitea](https://git.yude.jp)
|
||||||
|
* [h5ai](https://files.yude.jp)
|
||||||
|
* [JMusicBot (forked)](https://discord.com/oauth2/authorize?client_id=429638220456656896&scope=bot&permissions=338963472)
|
||||||
|
* [Owncast](https://live.yude.jp)
|
||||||
|
* [Minecraft Server](https://yude.jp/minecraft)
|
||||||
|
|
||||||
|
## Anonymous communication
|
||||||
|
### Tor
|
||||||
|
* Relay: [yudejp](https://metrics.torproject.org/rs.html#details/CF762EF3C86B104C301511894547C72371F952A4)
|
||||||
|
* Hidden Service: [yude3mzscyufx5u3zup72ium7tgecy3bd67p7t6vqhaywvr7e2gqpcqd.onion](http://yude3mzscyufx5u3zup72ium7tgecy3bd67p7t6vqhaywvr7e2gqpcqd.onion)
|
||||||
|
|
||||||
|
### I2P
|
||||||
|
* Hidden Service: [yudejp.i2p/?i2paddresshelper=55ivoba6mo3mqlwvw5lqz7lchxqew2kh77kwkn5shefrj2dp3coq.b32.i2p](http://yudejp.i2p/?i2paddresshelper=55ivoba6mo3mqlwvw5lqz7lchxqew2kh77kwkn5shefrj2dp3coq.b32.i2p)
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# yude.jp で運用中のサービス
|
||||||
|
|
||||||
|
## ソフトウェア
|
||||||
|
* [AutoMuteUs](https://github.com/denverquane/automuteus)\
|
||||||
|
Among Us の自動ミュートボット; API: [`galactus.yude.jp`](https://galactus.yude.jp)
|
||||||
|
* [Nextcloud](https://nc.yude.jp)
|
||||||
|
* [Mastodon](https://mstdn.yude.jp)
|
||||||
|
* [Misskey](https://misskey.yude.jp)
|
||||||
|
* [Pleroma](https//pleroma.yude.jp)
|
||||||
|
* TeamSpeak 3: `yude.jp`
|
||||||
|
* [Gitea](https://git.yude.jp)
|
||||||
|
* [h5ai](https://files.yude.jp)
|
||||||
|
* [JMusicBot (フォーク)](https://discord.com/oauth2/authorize?client_id=429638220456656896&scope=bot&permissions=338963472)
|
||||||
|
* [Owncast](https://live.yude.jp)
|
||||||
|
* [Minecraft サーバー](https://yude.jp/minecraft)
|
||||||
|
|
||||||
|
## 秘匿化ネットワーク
|
||||||
|
### Tor
|
||||||
|
* リレー: [yudejp](https://metrics.torproject.org/rs.html#details/CF762EF3C86B104C301511894547C72371F952A4)
|
||||||
|
* Hidden Service: [yude3mzscyufx5u3zup72ium7tgecy3bd67p7t6vqhaywvr7e2gqpcqd.onion](http://yude3mzscyufx5u3zup72ium7tgecy3bd67p7t6vqhaywvr7e2gqpcqd.onion)
|
||||||
|
|
||||||
|
### I2P
|
||||||
|
* Hidden Service: [yudejp.i2p/?i2paddresshelper=55ivoba6mo3mqlwvw5lqz7lchxqew2kh77kwkn5shefrj2dp3coq.b32.i2p](http://yudejp.i2p/?i2paddresshelper=55ivoba6mo3mqlwvw5lqz7lchxqew2kh77kwkn5shefrj2dp3coq.b32.i2p)
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"locales": ["en", "ja"],
|
|
||||||
"defaultLocale": "ja",
|
|
||||||
"pages": {
|
|
||||||
"*": ["common"],
|
|
||||||
"/": ["index", "minecraft", "common"],
|
|
||||||
"/profile": ["profile", "common"],
|
|
||||||
"/server": ["server", "common"],
|
|
||||||
"/house": ["house", "common"],
|
|
||||||
"/tos": ["tos", "common"],
|
|
||||||
"/hcunews": ["hcunews", "common"],
|
|
||||||
"/minecraft": ["minecraft", "common"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
var ja = require('./translations.ja.json');
|
||||||
|
var en = require('./translations.en.json')
|
||||||
|
|
||||||
|
const i18n = {
|
||||||
|
translations: {
|
||||||
|
ja: ja,
|
||||||
|
en: en,
|
||||||
|
},
|
||||||
|
defaultLang: 'ja'
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = i18n;
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"caption": "The requested page does not exist on this website.",
|
||||||
|
"return": "Return to top",
|
||||||
|
"footer": "This page is provided under the MIT License.",
|
||||||
|
"source": "Source code",
|
||||||
|
"tos": "yude.jp Terms of Service",
|
||||||
|
"yes_playing": "Playing {{playing}}",
|
||||||
|
"listening": "Listening to {{listening}}",
|
||||||
|
"close": "Close",
|
||||||
|
"mutual": "Mutual links",
|
||||||
|
"status": "Service Status",
|
||||||
|
"icon_1": "Icon: ",
|
||||||
|
"icon_2": " ",
|
||||||
|
"post_list": "Posts listing",
|
||||||
|
"hcunews": "About @hcunews",
|
||||||
|
"house": "yude's house",
|
||||||
|
"home": "Home",
|
||||||
|
"profile": "yude's profile",
|
||||||
|
"blog": "yude's blog",
|
||||||
|
"status": "yude.jp Server Status",
|
||||||
|
"house": "yude's house",
|
||||||
|
"discord": "yude.jp Discord Server",
|
||||||
|
"mastodon": "Mastodon instance",
|
||||||
|
"title": "Minecraft Multiplayer",
|
||||||
|
"playing": "{{count}} player(s) online.",
|
||||||
|
"no_one": "No one is playing.",
|
||||||
|
"offline": "Server is down.",
|
||||||
|
"address": "Server address",
|
||||||
|
"fail": "Failed to retrieve server status.",
|
||||||
|
"loading": "Retrieving server status...",
|
||||||
|
"version": "Version",
|
||||||
|
"about": "About yude",
|
||||||
|
"desc": "Description",
|
||||||
|
"school": "Faculty of Information Science, Hiroshima City University.",
|
||||||
|
"hiroshima": "Hiroshima, Japan",
|
||||||
|
"location": "Location",
|
||||||
|
"link": "Links",
|
||||||
|
"link_all": "To see all of yude's account, please visit ",
|
||||||
|
"link_all_late": ".",
|
||||||
|
"here": "here",
|
||||||
|
"mail": "E-mail",
|
||||||
|
"birth": "Birthday",
|
||||||
|
"date": "November the 19th, 2001",
|
||||||
|
"contact": "Accounts",
|
||||||
|
"belongs": "Organization",
|
||||||
|
"grade": "B2",
|
||||||
|
"keys": "Public keys",
|
||||||
|
"download": "Download",
|
||||||
|
"fingerprint": "Digital fingerprint",
|
||||||
|
"view": "View",
|
||||||
|
"device": "Devices",
|
||||||
|
"account": "Accounts",
|
||||||
|
"wishlist": "Amazon Wishlist",
|
||||||
|
"status": "Server Status",
|
||||||
|
"location": "Location",
|
||||||
|
"tottori": "Tottori, Japan",
|
||||||
|
"hiroshima": "Hiroshima, Japan",
|
||||||
|
"model": "Model",
|
||||||
|
"region": "Region",
|
||||||
|
"service": "Service",
|
||||||
|
"shape": "Shape",
|
||||||
|
"tos": "yude.jp Terms of Service",
|
||||||
|
"input": "en",
|
||||||
|
"services": "Services",
|
||||||
|
"contents": "Contents",
|
||||||
|
"Blog": "Weblog"
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"caption": "要求されたページはこのウェブサイト上に存在しません。",
|
||||||
|
"return": "トップページへ戻る",
|
||||||
|
"footer": "このページは MIT License のもと提供されています。",
|
||||||
|
"source": "ソースコード",
|
||||||
|
"tos": "yude.jp サービス利用規約",
|
||||||
|
"yes_playing": "{{playing}} をプレイ中",
|
||||||
|
"listening": "{{listening}} を再生中",
|
||||||
|
"close": "閉じる",
|
||||||
|
"mutual": "相互リンク",
|
||||||
|
"status": "サービスの状態",
|
||||||
|
"icon_1": "アイコン: ",
|
||||||
|
"icon_2": "さん",
|
||||||
|
"post_list": "記事一覧",
|
||||||
|
"hcunews": "@hcunews について",
|
||||||
|
"house": "ゆでハウス",
|
||||||
|
"home": "ホーム",
|
||||||
|
"profile": "yude のプロフィール",
|
||||||
|
"blog": "yude のブログ",
|
||||||
|
"status": "yude.jp サーバー情報",
|
||||||
|
"house": "ゆでハウス",
|
||||||
|
"discord": "yude.jp Discord サーバー",
|
||||||
|
"mastodon": "Mastodon インスタンス",
|
||||||
|
"title": "Minecraft マルチプレイ",
|
||||||
|
"playing": "{{count}} 人がプレイしています。",
|
||||||
|
"no_one": "現在、誰もログインしていません。",
|
||||||
|
"offline": "サーバーがオフラインのようです。",
|
||||||
|
"address": "サーバー アドレス",
|
||||||
|
"fail": "サーバーの状態を取得できませんでした。",
|
||||||
|
"loading": "サーバーの状態を取得しています...",
|
||||||
|
"version": "バージョン",
|
||||||
|
"about": "yude について",
|
||||||
|
"desc": "概要",
|
||||||
|
"school": "広島市立大学 情報科学部",
|
||||||
|
"hiroshima": "日本, 広島県",
|
||||||
|
"location": "所在地",
|
||||||
|
"link": "リンク",
|
||||||
|
"link_all": "yude が所持しているすべてのアカウントの一覧は、",
|
||||||
|
"link_all_late": "にあります。",
|
||||||
|
"here": "こちら",
|
||||||
|
"mail": "メール",
|
||||||
|
"birth": "生年月日",
|
||||||
|
"date": "2001年11月19日",
|
||||||
|
"contact": "アカウント",
|
||||||
|
"belongs": "所属",
|
||||||
|
"grade": "2年",
|
||||||
|
"keys": "公開鍵",
|
||||||
|
"download": "ダウンロード",
|
||||||
|
"fingerprint": "電子指紋",
|
||||||
|
"view": "閲覧",
|
||||||
|
"device": "デバイス",
|
||||||
|
"account": "アカウント",
|
||||||
|
"wishlist": "Amazon ほしいものリスト",
|
||||||
|
"status": "サーバー情報",
|
||||||
|
"location": "場所",
|
||||||
|
"tottori": "日本, 鳥取県",
|
||||||
|
"hiroshima": "日本, 広島県",
|
||||||
|
"model": "モデル",
|
||||||
|
"region": "リージョン",
|
||||||
|
"service": "サービス",
|
||||||
|
"shape": "シェイプ",
|
||||||
|
"tos": "yude.jp サービス利用規約",
|
||||||
|
"input": "ja",
|
||||||
|
"services": "サービス",
|
||||||
|
"contents": "コンテンツ",
|
||||||
|
"blog": "ブログ"
|
||||||
|
}
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"footer": "This page is provided under the MIT License.",
|
|
||||||
"source": "Source code",
|
|
||||||
"tos": "yude.jp Terms of Service",
|
|
||||||
"yes_playing": "Playing {{playing}}",
|
|
||||||
"listening": "Listening to {{listening}}",
|
|
||||||
"close": "Close",
|
|
||||||
"mutual": "Mutual links",
|
|
||||||
"status": "Service Status"
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"hcunews": "About @hcunews"
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"house": "yude's house"
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"home": "Home",
|
|
||||||
"profile": "yude's profile",
|
|
||||||
"blog": "yude's blog",
|
|
||||||
"status": "yude.jp Server Status",
|
|
||||||
"house": "yude's house",
|
|
||||||
"discord": "yude.jp Discord Server",
|
|
||||||
"mastodon": "Mastodon instance"
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Minecraft Multiplayer",
|
|
||||||
"playing": "{{count}} player(s) online.",
|
|
||||||
"no_one": "No one is playing.",
|
|
||||||
"offline": "Server is down.",
|
|
||||||
"address": "Server address",
|
|
||||||
"fail": "Failed to retrieve server status.",
|
|
||||||
"loading": "Retrieving server status...",
|
|
||||||
"version": "Version"
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"about": "About yude",
|
|
||||||
"desc": "Description",
|
|
||||||
"school": "Faculty of Information Science, Hiroshima City University.",
|
|
||||||
"hiroshima": "Hiroshima, Japan",
|
|
||||||
"location": "Location",
|
|
||||||
"link": "Links",
|
|
||||||
"link_all": "To see all of yude's account, please visit ",
|
|
||||||
"link_all_late": ".",
|
|
||||||
"here": "here",
|
|
||||||
"mail": "E-mail",
|
|
||||||
"birth": "Birthday",
|
|
||||||
"date": "November the 19th, 2001",
|
|
||||||
"contact": "Get in touch",
|
|
||||||
"belongs": "Organization",
|
|
||||||
"grade": "B2",
|
|
||||||
"icon_1": "Icon: ",
|
|
||||||
"icon_2": "",
|
|
||||||
"keys": "Public keys",
|
|
||||||
"download": "Download",
|
|
||||||
"fingerprint": "Digital fingerprint",
|
|
||||||
"view": "View",
|
|
||||||
"device": "Devices",
|
|
||||||
"account": "Accounts"
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"status": "Server Status",
|
|
||||||
"location": "Location",
|
|
||||||
"tottori": "Tottori, Japan",
|
|
||||||
"hiroshima": "Hiroshima, Japan",
|
|
||||||
"model": "Model",
|
|
||||||
"region": "Region",
|
|
||||||
"service": "Service",
|
|
||||||
"shape": "Shape"
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"tos": "yude.jp Terms of Service",
|
|
||||||
"input": "en"
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"footer": "このページは MIT License のもと提供されています。",
|
|
||||||
"source": "ソースコード",
|
|
||||||
"tos": "yude.jp サービス利用規約",
|
|
||||||
"yes_playing": "{{playing}} をプレイ中",
|
|
||||||
"listening": "{{listening}} を再生中",
|
|
||||||
"close": "閉じる",
|
|
||||||
"mutual": "相互リンク",
|
|
||||||
"status": "サービスの状態"
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"hcunews": "@hcunews について"
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"house": "ゆでハウス"
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"home": "ホーム",
|
|
||||||
"profile": "yude のプロフィール",
|
|
||||||
"blog": "yude のブログ",
|
|
||||||
"status": "yude.jp サーバー情報",
|
|
||||||
"house": "ゆでハウス",
|
|
||||||
"discord": "yude.jp Discord サーバー",
|
|
||||||
"mastodon": "Mastodon インスタンス"
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Minecraft マルチプレイ",
|
|
||||||
"playing": "{{count}} 人がプレイしています。",
|
|
||||||
"no_one": "現在、誰もログインしていません。",
|
|
||||||
"offline": "サーバーがオフラインのようです。",
|
|
||||||
"address": "サーバー アドレス",
|
|
||||||
"fail": "サーバーの状態を取得できませんでした。",
|
|
||||||
"loading": "サーバーの状態を取得しています...",
|
|
||||||
"version": "バージョン"
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"about": "yude について",
|
|
||||||
"desc": "概要",
|
|
||||||
"school": "広島市立大学 情報科学部",
|
|
||||||
"hiroshima": "日本, 広島県",
|
|
||||||
"location": "所在地",
|
|
||||||
"link": "リンク",
|
|
||||||
"link_all": "yude が所持しているすべてのアカウントの一覧は、",
|
|
||||||
"link_all_late": "にあります。",
|
|
||||||
"here": "こちら",
|
|
||||||
"mail": "メール",
|
|
||||||
"birth": "生年月日",
|
|
||||||
"date": "2001年11月19日",
|
|
||||||
"contact": "連絡先 / SNS",
|
|
||||||
"belongs": "所属",
|
|
||||||
"grade": "2年",
|
|
||||||
"icon_1": "アイコン: ",
|
|
||||||
"icon_2": "さん",
|
|
||||||
"keys": "公開鍵",
|
|
||||||
"download": "ダウンロード",
|
|
||||||
"fingerprint": "電子指紋",
|
|
||||||
"view": "閲覧",
|
|
||||||
"device": "デバイス",
|
|
||||||
"account": "アカウント"
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"status": "サーバー情報",
|
|
||||||
"location": "場所",
|
|
||||||
"tottori": "日本, 鳥取県",
|
|
||||||
"hiroshima": "日本, 広島県",
|
|
||||||
"model": "モデル",
|
|
||||||
"region": "リージョン",
|
|
||||||
"service": "サービス",
|
|
||||||
"shape": "シェイプ"
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"tos": "yude.jp サービス利用規約",
|
|
||||||
"input": "ja"
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
export default {
|
||||||
|
openGraph: {
|
||||||
|
type: 'website',
|
||||||
|
locale: 'ja_JP',
|
||||||
|
url: 'https://yude.jp/',
|
||||||
|
site_name: 'yude.jp',
|
||||||
|
},
|
||||||
|
twitter: {
|
||||||
|
handle: '@yudejp',
|
||||||
|
site: '@yudejp',
|
||||||
|
cardType: 'summary_large_image',
|
||||||
|
},
|
||||||
|
};
|
||||||
+30
-8
@@ -1,12 +1,19 @@
|
|||||||
const nextTranslate = require('next-translate')
|
const rewrites = async () => {
|
||||||
|
return [
|
||||||
module.exports = nextTranslate({
|
{
|
||||||
i18n: {
|
source: '/minecraft/players/:uuid(\[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})',
|
||||||
locales: ['ja', 'en'],
|
destination: '/minecraft/players/:uuid'
|
||||||
defaultLocale: 'ja',
|
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
source: '/minecraft/players/:ign',
|
||||||
|
destination: '/minecraft/lookup/:ign'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
images: {
|
images: {
|
||||||
domains: ['mackerel.io', 'mc-heads.net'],
|
domains: ['mackerel.io', 'mc-heads.net', 'crafatar.com'],
|
||||||
},
|
},
|
||||||
webpack: function (config) {
|
webpack: function (config) {
|
||||||
config.module.rules.push({
|
config.module.rules.push({
|
||||||
@@ -15,4 +22,19 @@ module.exports = nextTranslate({
|
|||||||
})
|
})
|
||||||
return config
|
return config
|
||||||
},
|
},
|
||||||
})
|
async redirects() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
source: '/wishlist',
|
||||||
|
destination: 'https://www.amazon.jp/hz/wishlist/ls/8WTKCPWKOJ2N?ref_=wl_share',
|
||||||
|
permanent: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
source: '/scrapbox',
|
||||||
|
destination: 'https://scrapbox.io/yude',
|
||||||
|
permanent: true,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
rewrites,
|
||||||
|
}
|
||||||
+31
-21
@@ -7,7 +7,8 @@
|
|||||||
"dev": "next",
|
"dev": "next",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"export": "next export"
|
"export": "next export",
|
||||||
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -21,35 +22,44 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/yudemoe/yude.jp#readme",
|
"homepage": "https://github.com/yudemoe/yude.jp#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "^1.2.35",
|
"@babel/core": "^7.15.5",
|
||||||
"@fortawesome/free-brands-svg-icons": "^5.15.3",
|
"@fortawesome/fontawesome-svg-core": "^1.2.36",
|
||||||
"@fortawesome/free-solid-svg-icons": "^5.15.3",
|
"@fortawesome/free-brands-svg-icons": "^5.15.4",
|
||||||
"@fortawesome/react-fontawesome": "^0.1.14",
|
"@fortawesome/free-solid-svg-icons": "^5.15.4",
|
||||||
|
"@fortawesome/react-fontawesome": "^0.1.15",
|
||||||
"@tailwindcss/typography": "^0.4.0",
|
"@tailwindcss/typography": "^0.4.0",
|
||||||
"autoprefixer": "^10.2.5",
|
"autoprefixer": "^10.3.4",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.4",
|
||||||
"next": "^10.2.3",
|
"date-fns": "^2.24.0",
|
||||||
"next-themes": "^0.0.14",
|
"moment": "^2.29.4",
|
||||||
"next-translate": "^1.0.7",
|
"next": "^12.1.0",
|
||||||
|
"next-export-i18n": "^1.2.1",
|
||||||
|
"next-seo": "^4.28.1",
|
||||||
|
"next-themes": "^0.0.15",
|
||||||
|
"next-translate": "^1.2.0",
|
||||||
"popper.js": "^1.16.1",
|
"popper.js": "^1.16.1",
|
||||||
"postcss": "^8.3.0",
|
"postcss": "^8.3.6",
|
||||||
|
"prop-types": "^15.7.2",
|
||||||
"querystring": "^0.2.1",
|
"querystring": "^0.2.1",
|
||||||
"raw-loader": "^4.0.2",
|
"raw-loader": "^4.0.2",
|
||||||
"react": "^17.0.1",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.1",
|
"react-dom": "^17.0.2",
|
||||||
"react-markdown": "^6.0.2",
|
"react-markdown": "^7.0.1",
|
||||||
|
"react-moment": "^1.1.1",
|
||||||
"react-switch": "^6.0.0",
|
"react-switch": "^6.0.0",
|
||||||
"remark-gfm": "^1.0.0",
|
"remark-gfm": "^2.0.0",
|
||||||
"swr": "^0.5.6",
|
"swr": "^1.0.1",
|
||||||
"tailwindcss": "^2.1.4",
|
"tailwindcss": "^2.2.15",
|
||||||
"tailwindcss-filters": "^3.0.0",
|
"tailwindcss-filters": "^3.0.0",
|
||||||
"tailwindcss-responsive-embed": "^1.0.0",
|
"tailwindcss-responsive-embed": "^1.0.0",
|
||||||
"webpack": "^5.37.1"
|
"webpack": "^5.53.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^15.6.0",
|
"@types/node": "^16.9.6",
|
||||||
"@types/react": "^17.0.6",
|
"@types/react": "^17.0.24",
|
||||||
"babel-plugin-inline-react-svg": "^2.0.1",
|
"babel-plugin-inline-react-svg": "^2.0.1",
|
||||||
"typescript": "^4.2.4"
|
"eslint": "7.32.0",
|
||||||
|
"eslint-config-next": "11.1.2",
|
||||||
|
"typescript": "^4.4.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+9
-1
@@ -1,10 +1,18 @@
|
|||||||
|
// Tailwind CSS
|
||||||
import 'tailwindcss/tailwind.css';
|
import 'tailwindcss/tailwind.css';
|
||||||
import { ThemeProvider } from "next-themes";
|
|
||||||
import "../styles/globals.css"
|
import "../styles/globals.css"
|
||||||
|
|
||||||
|
// Dark-mode related
|
||||||
|
import { ThemeProvider } from "next-themes";
|
||||||
|
|
||||||
|
// next-seo
|
||||||
|
import { DefaultSeo } from 'next-seo';
|
||||||
|
import SEO from '../next-seo.config';
|
||||||
|
|
||||||
function MyApp({ Component, pageProps }) {
|
function MyApp({ Component, pageProps }) {
|
||||||
return (
|
return (
|
||||||
<ThemeProvider attribute="class">
|
<ThemeProvider attribute="class">
|
||||||
|
<DefaultSeo {...SEO} />
|
||||||
<Component {...pageProps} />
|
<Component {...pageProps} />
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,58 +0,0 @@
|
|||||||
import querystring from 'querystring';
|
|
||||||
|
|
||||||
const {
|
|
||||||
SPOTIFY_CLIENT_ID: client_id,
|
|
||||||
SPOTIFY_CLIENT_SECRET: client_secret,
|
|
||||||
SPOTIFY_REFRESH_TOKEN: refresh_token,
|
|
||||||
} = process.env;
|
|
||||||
|
|
||||||
const basic = Buffer.from(`${client_id}:${client_secret}`).toString('base64');
|
|
||||||
const NOW_PLAYING_ENDPOINT = `https://api.spotify.com/v1/me/player/currently-playing`;
|
|
||||||
const TOKEN_ENDPOINT = `https://accounts.spotify.com/api/token`;
|
|
||||||
|
|
||||||
const getAccessToken = async () => {
|
|
||||||
const response = await fetch(TOKEN_ENDPOINT, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
Authorization: `Basic ${basic}`,
|
|
||||||
'Content-Type': 'application/x-www-form-urlencoded',
|
|
||||||
},
|
|
||||||
body: querystring.stringify({
|
|
||||||
grant_type: 'refresh_token',
|
|
||||||
refresh_token,
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
return response.json();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getNowPlaying = async () => {
|
|
||||||
const { access_token } = await getAccessToken();
|
|
||||||
|
|
||||||
return fetch(NOW_PLAYING_ENDPOINT, {
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bearer ${access_token}`,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export default async (_, res) => {
|
|
||||||
const response = await getNowPlaying();
|
|
||||||
|
|
||||||
if (response.status === 204 || response.status > 400) {
|
|
||||||
return res.status(200).json({ isPlaying: false });
|
|
||||||
}
|
|
||||||
|
|
||||||
const song = await response.json();
|
|
||||||
const isPlaying = song.is_playing;
|
|
||||||
const title = song.item.name;
|
|
||||||
const artist = song.item.artists.map((_artist) => _artist.name).join(', ');
|
|
||||||
const album = song.item.album.name;
|
|
||||||
|
|
||||||
return res.status(200).json({
|
|
||||||
album,
|
|
||||||
artist,
|
|
||||||
isPlaying,
|
|
||||||
title,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
// React
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
// Data fetching
|
||||||
|
import useSwr from 'swr'
|
||||||
|
const fetcher = (url) => fetch(url).then((res) => res.json())
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
|
export default function DiscordPlaying() {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
|
const { data, error } = useSwr(
|
||||||
|
`https://discord.com/api/guilds/723409709306216498/widget.json`,
|
||||||
|
fetcher
|
||||||
|
)
|
||||||
|
if (error){
|
||||||
|
console.log("[Discord API] データの取得に失敗しました。 / Failed to retrieve data.")
|
||||||
|
return <></>
|
||||||
|
} else {
|
||||||
|
if (!data) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
|
if (data.members) {
|
||||||
|
if (data.members[0].game) {
|
||||||
|
const yes_playing = t('yes_playing', {playing: data.members[0].game.name})
|
||||||
|
return <p>{yes_playing}</p>
|
||||||
|
} else {
|
||||||
|
return <></>
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return <></>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,7 @@
|
|||||||
|
// React
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
// Data fetching
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
|
||||||
import axios from 'axios';
|
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
|
|
||||||
function App (){
|
|
||||||
const router = useRouter()
|
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
const { t, lang } = useTranslation("common")
|
|
||||||
const [data, setData] = useState({ hits: [] });
|
|
||||||
useEffect(() => {
|
|
||||||
const fetchData = async () => {
|
|
||||||
const result = await axios(
|
|
||||||
'https://discord.com/api/guilds/723409709306216498/widget.json',
|
|
||||||
);
|
|
||||||
setData(result.data);
|
|
||||||
};
|
|
||||||
fetchData();
|
|
||||||
}, []);
|
|
||||||
if (data === undefined){
|
|
||||||
console.log("[Discord API] データの取得に失敗しました。 / Failed to retrieve data.")
|
|
||||||
return <p></p>
|
|
||||||
}else{
|
|
||||||
const str = JSON.stringify(data)
|
|
||||||
|
|
||||||
if (str.indexOf("game") !== -1){
|
|
||||||
const yes_playing = t('yes_playing', {playing: data.members[0].game.name})
|
|
||||||
return <p>{yes_playing}</p>
|
|
||||||
}else{
|
|
||||||
return <p></p>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export async function getServerSideProps() {
|
|
||||||
// Fetch data from external API
|
|
||||||
const res = await fetch(url)
|
|
||||||
const data = await res.json()
|
|
||||||
|
|
||||||
// Pass data to the page via props
|
|
||||||
return { props: { data } }
|
|
||||||
}
|
|
||||||
|
|
||||||
export default App;
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import "tailwindcss/tailwind.css";
|
|
||||||
import Link from 'next/link';
|
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
export default function Footer(props) {
|
|
||||||
|
|
||||||
const router = useRouter()
|
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
const { t, lang } = useTranslation("common")
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div className="container mx-auto px-6">
|
|
||||||
<div className="flex flex-col items-center">
|
|
||||||
<div className="sm:w-full text-center py-6">
|
|
||||||
<p className="text-sm font-bold mb-2">
|
|
||||||
{t('footer')} / <Link href="https://github.com/yudejp/yude.jp"><a className="hover:underline">{t('source')}</a></Link>
|
|
||||||
</p>
|
|
||||||
<p className="text-sm font-bold mb-2">
|
|
||||||
<Link href="/tos"><a className="hover:underline">{t('tos')}</a></Link>
|
|
||||||
</p>
|
|
||||||
<p className="text-sm font-bold mb-2">
|
|
||||||
<Link href="https://status.yude.jp"><a className="hover:underline">{t('status')}</a></Link>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
// Tailwind CSS
|
||||||
|
import "tailwindcss/tailwind.css";
|
||||||
|
|
||||||
|
// Next.js
|
||||||
|
import Link from 'next/link';
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
|
export default function Footer(props) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="container mx-auto px-6">
|
||||||
|
<div className="flex flex-col items-center">
|
||||||
|
<div className="sm:w-full text-center py-6">
|
||||||
|
<p className="text-sm font-bold mb-2">
|
||||||
|
{t('footer')} / <Link href="https://github.com/yudejp/yude.jp"><a className="hover:underline">{t('source')}</a></Link>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// Next.js
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
const HappyBusy = (props) => {
|
||||||
|
return (
|
||||||
|
<Link href="https://sites.google.com/site/happybusy/">
|
||||||
|
<a>
|
||||||
|
<img
|
||||||
|
src="/images/busy_banner.png"
|
||||||
|
width={200}
|
||||||
|
height={42}
|
||||||
|
alt="時間のないサイト運営者リング"
|
||||||
|
className="mx-auto"
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default HappyBusy
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import Popper from "popper.js";
|
import Popper from "popper.js";
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { faLanguage } from '@fortawesome/free-solid-svg-icons'
|
import { faLanguage } from '@fortawesome/free-solid-svg-icons'
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
|
|
||||||
const Dropdown = ({ color }) => {
|
// i18n
|
||||||
const router = useRouter()
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
|
|
||||||
|
|
||||||
|
const Dropdown = ({ color }) => {
|
||||||
// dropdown props
|
// dropdown props
|
||||||
const [dropdownPopoverShow, setDropdownPopoverShow] = React.useState(false);
|
const [dropdownPopoverShow, setDropdownPopoverShow] = React.useState(false);
|
||||||
const btnDropdownRef = React.createRef();
|
const btnDropdownRef = React.createRef();
|
||||||
@@ -31,7 +31,7 @@ const Dropdown = ({ color }) => {
|
|||||||
<>
|
<>
|
||||||
|
|
||||||
<div className="text-left mr-2 ml-2 my-3 float-right">
|
<div className="text-left mr-2 ml-2 my-3 float-right">
|
||||||
<button type="button" className="inline-flex justify-center w-full rounded-md border border-gray-300 dark:border-gray-800 shadow-sm px-2 bg-white text-sm font-medium text-gray-700 hover:bg-gray-50 dark:bg-gray-700 dark:text-white focus:outline-none" id="options-menu" aria-haspopup="true" aria-expanded="true"
|
<button type="button" className="inline-flex justify-center rounded-md border border-gray-300 dark:border-gray-800 shadow-sm px-2 bg-white text-sm font-medium text-gray-700 hover:bg-gray-50 dark:bg-gray-700 dark:text-white focus:outline-none h-10" id="options-menu" aria-haspopup="true" aria-expanded="true"
|
||||||
style={{ transition: "all .15s ease" }}
|
style={{ transition: "all .15s ease" }}
|
||||||
ref={btnDropdownRef}
|
ref={btnDropdownRef}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
@@ -40,20 +40,20 @@ const Dropdown = ({ color }) => {
|
|||||||
: openDropdownPopover();
|
: openDropdownPopover();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<FontAwesomeIcon icon={faLanguage} className="w-12 h-9" />
|
<FontAwesomeIcon icon={faLanguage} size="3x" />
|
||||||
<svg className="-mr-1 ml-2 h-9 w-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
<svg className="-mr-1 ml-2 h-9 w-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||||
<path fillRule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule="evenodd" />
|
<path fillRule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule="evenodd" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
<div ref={popoverDropdownRef} className={
|
<div ref={popoverDropdownRef} className={
|
||||||
(dropdownPopoverShow ? "block " : "hidden ") + "z-10 origin-top-right absolute right-0 mt-2 w-40 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 dark:bg-gray-700"}>
|
(dropdownPopoverShow ? "block " : "hidden ") + "z-10 origin-top-right absolute right-0 mt-2 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 dark:bg-gray-700"}>
|
||||||
<div className="py-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
|
<div className="py-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
|
||||||
<Link href="#" locale="ja">
|
<LanguageSwitcher lang="ja">
|
||||||
<a href="#" className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-700 dark:text-white dark:hover:bg-gray-800" role="menuitem">日本語</a>
|
<a href="#" className="block px-4 py-2 text-gray-700 hover:bg-gray-100 hover:text-gray-700 dark:text-white dark:hover:bg-gray-800" role="menuitem">日本語</a>
|
||||||
</Link>
|
</LanguageSwitcher>
|
||||||
<Link href="#" locale="en">
|
<LanguageSwitcher lang="en">
|
||||||
<a href="#" className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-700 dark:text-white dark:hover:bg-gray-800" role="menuitem">English</a>
|
<a href="#" className="block px-4 py-2 text-gray-700 hover:bg-gray-100 hover:text-gray-700 dark:text-white dark:hover:bg-gray-800" role="menuitem">English</a>
|
||||||
</Link>
|
</LanguageSwitcher>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,26 +1,24 @@
|
|||||||
|
// Next.js
|
||||||
import Head from "next/head"
|
import Head from "next/head"
|
||||||
|
|
||||||
|
// Tailwind CSS
|
||||||
import "tailwindcss/tailwind.css";
|
import "tailwindcss/tailwind.css";
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
import { useRouter } from 'next/router'
|
// React
|
||||||
import React, { useEffect, useState } from 'react'
|
import React, { useEffect, useState } from 'react'
|
||||||
import Footer from "./Footer"
|
|
||||||
|
// Components
|
||||||
|
import Footer from "./Footer/Footer"
|
||||||
import Navbar from "./Navbar"
|
import Navbar from "./Navbar"
|
||||||
|
|
||||||
const Layout = (props) => {
|
const Layout = (props) => {
|
||||||
const { title, children } = props
|
const { title, children } = props
|
||||||
const siteTitle = "yude.jp"
|
const siteTitle = "yude.jp"
|
||||||
const router = useRouter()
|
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
|
|
||||||
const { t, lang } = useTranslation("common")
|
|
||||||
const footer = t('footer')
|
|
||||||
const source = t('source')
|
|
||||||
const tos = t('tos')
|
|
||||||
return (
|
return (
|
||||||
<div className="page">
|
<div className="page">
|
||||||
<Head>
|
<Head>
|
||||||
<title>{title ? `${title} - ${siteTitle}` : siteTitle}</title>
|
<title>{title ? `${title} - ${siteTitle}` : siteTitle}</title>
|
||||||
<link rel="icon" href="/static/images/favicon.ico" />
|
<link rel="icon" href="/images/favicon.ico" />
|
||||||
</Head>
|
</Head>
|
||||||
<main>
|
<main>
|
||||||
<Navbar />
|
<Navbar />
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
// Next.js
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
// Font Awesome
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
|
||||||
|
const FontAwesomeMenu = (props) => {
|
||||||
|
const { icon, dest, query } = props
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Link href={{ pathname: dest, query: query }}>
|
||||||
|
<a>
|
||||||
|
<FontAwesomeIcon icon={icon} size="5x" className="w-9 h-9 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" />
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FontAwesomeMenu
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
// Next.js
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
const MinecraftMenu = (props) => {
|
||||||
|
const { query } = props
|
||||||
|
|
||||||
|
if (!query) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Link href={{ pathname: "/minecraft", query: query }}>
|
||||||
|
<a>
|
||||||
|
<svg className="fill-current text-black dark:text-white w-10 h-10 inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 304.8 304.8">
|
||||||
|
<path d="M 39.10262 126.138 L 39.16748 12.39574 L 152.7982 12.33506 L 266.4289 12.27438 L 266.4289 126.0773 L 266.4289 239.8803 L 152.7333 239.8803 L 39.03775 239.8803 L 39.10262 126.138 Z M 260.4857 126.0776 L 260.4857 18.55703 L 152.8628 18.55703 L 45.23985 18.55703 L 45.23985 126.0776 L 45.23985 233.5982 L 152.8628 233.5982 L 260.4857 233.5982 L 260.4857 126.0776 Z M 103.8963 162.9245 L 103.8963 126.0776 L 116.1702 126.0776 L 128.4441 126.0776 L 128.4441 113.8758 L 128.4441 101.674 L 152.8628 101.674 L 177.2814 101.674 L 177.2814 113.8758 L 177.2814 126.0776 L 189.3835 126.0776 L 201.4856 126.0776 L 201.6573 150.5415 C 201.7517 163.9967 201.829 180.5779 201.8291 187.3885 L 201.8293 199.7715 L 189.6869 199.7715 L 177.5446 199.7715 L 177.4776 187.5093 L 177.4106 175.2471 L 152.7982 175.1855 L 128.1857 175.1239 L 128.1857 187.4477 L 128.1857 199.7715 L 116.041 199.7715 L 103.8963 199.7715 L 103.8963 162.9245 Z M 79.34843 77.02888 L 79.34843 52.62534 L 103.7671 52.62534 L 128.1857 52.62534 L 128.1857 77.02888 L 128.1857 101.4324 L 103.7671 101.4324 L 79.34843 101.4324 L 79.34843 77.02888 Z M 177.5398 77.02888 L 177.5398 52.62534 L 201.9585 52.62534 L 226.3771 52.62534 L 226.3771 77.02888 L 226.3771 101.4324 L 201.9585 101.4324 L 177.5398 101.4324 L 177.5398 77.02888 Z"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default MinecraftMenu
|
||||||
@@ -1,15 +1,14 @@
|
|||||||
|
// React
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
import { useRouter } from 'next/router'
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import Image from 'next/image'
|
|
||||||
import { list } from 'postcss';
|
|
||||||
|
|
||||||
export default function Minecraft(props) {
|
export default function Minecraft(props) {
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
const [query] = useLanguageQuery();
|
||||||
const { t, lang } = useTranslation("minecraft")
|
|
||||||
|
|
||||||
const [data, setData] = useState({ hits: [] });
|
const [data, setData] = useState({ hits: [] });
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -25,7 +24,7 @@ export default function Minecraft(props) {
|
|||||||
if (data === undefined){
|
if (data === undefined){
|
||||||
console.log("[Minecraft Query] データの取得に失敗しました。 / Failed to retrieve data.")
|
console.log("[Minecraft Query] データの取得に失敗しました。 / Failed to retrieve data.")
|
||||||
return (
|
return (
|
||||||
<p>{t('minecraft:fail')}</p>
|
<p>{t('fail')}</p>
|
||||||
)
|
)
|
||||||
}else{
|
}else{
|
||||||
const status = data.online
|
const status = data.online
|
||||||
@@ -36,13 +35,13 @@ export default function Minecraft(props) {
|
|||||||
{(() => {
|
{(() => {
|
||||||
if (status == true) {
|
if (status == true) {
|
||||||
if (player == undefined || player == 0) {
|
if (player == undefined || player == 0) {
|
||||||
return <span>{t('minecraft:no_one')}</span>
|
return <span>{t('no_one')}</span>
|
||||||
} else {
|
} else {
|
||||||
return <span>{t('minecraft:playing', {count: player})}</span>
|
return <span>{t('playing', {count: player})}</span>
|
||||||
}}else if (status == false) {
|
}}else if (status == false) {
|
||||||
return <span>{t('minecraft:offline')}</span>
|
return <span>{t('offline')}</span>
|
||||||
}else {
|
}else {
|
||||||
return <span>{t('minecraft:loading')}</span>
|
return <span>{t('loading')}</span>
|
||||||
}
|
}
|
||||||
})()}
|
})()}
|
||||||
|
|
||||||
@@ -54,7 +53,7 @@ export default function Minecraft(props) {
|
|||||||
url.push('https://mc-heads.net/avatar/' + data.players.list[i])
|
url.push('https://mc-heads.net/avatar/' + data.players.list[i])
|
||||||
}
|
}
|
||||||
for (var i in url){
|
for (var i in url){
|
||||||
list.push(<Image src={url[i]} key={i} className="inline" height="50" width="50" />)
|
list.push(<img src={url[i]} key={i} className="inline" height="50" width="50" alt={i}/>)
|
||||||
}
|
}
|
||||||
return <div>{list}</div>
|
return <div>{list}</div>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
function App (props) {
|
||||||
|
const uuid = props;
|
||||||
|
const [data, setData] = useState({ hits: [] });
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchData = async () => {
|
||||||
|
const result = await axios(
|
||||||
|
'https://playersbio.yude.jp/' + uuid.uuid,
|
||||||
|
);
|
||||||
|
setData(result.data);
|
||||||
|
};
|
||||||
|
fetchData();
|
||||||
|
}, []);
|
||||||
|
if (data === undefined){
|
||||||
|
console.log("[Minecraft: PlayersBio] データの取得に失敗しました。 / Failed to retrieve data.")
|
||||||
|
return <p></p>
|
||||||
|
}else {
|
||||||
|
if (data.toString() == "[object Object]"){
|
||||||
|
return <p>読み込み中...</p>
|
||||||
|
} else {
|
||||||
|
if (data.toString() == "") {
|
||||||
|
return <p>ひとことは設定されていません...</p>
|
||||||
|
} else {
|
||||||
|
return <p>ひとこと: <span className="italic">{data.toString()}</span></p>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import axios from 'axios';
|
||||||
|
import { useRouter } from 'next/router'
|
||||||
|
|
||||||
|
function App (props) {
|
||||||
|
const uuid = props;
|
||||||
|
const [data, setData] = useState({ hits: [] });
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchData = async () => {
|
||||||
|
const result = await axios(
|
||||||
|
'https://minecraft.yude.jp/group/' + uuid.uuid,
|
||||||
|
);
|
||||||
|
setData(result.data);
|
||||||
|
};
|
||||||
|
fetchData();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
if (data === undefined || data === null){
|
||||||
|
return <p></p>
|
||||||
|
}else {
|
||||||
|
if (data.toString() == "staff") {
|
||||||
|
return <span className="inline-flex items-center justify-center px-3 py-2 text-base font-bold leading-none text-indigo-100 bg-indigo-700 rounded ml-3">Staff</span>
|
||||||
|
} else {
|
||||||
|
return <></>
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
function App (props) {
|
||||||
|
const uuid = props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<img
|
||||||
|
src={"https://crafatar.com/renders/body/" + uuid.uuid}
|
||||||
|
width={110}
|
||||||
|
height={250}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
function App (props) {
|
||||||
|
const uuid = props;
|
||||||
|
const [data, setData] = useState({ hits: [] });
|
||||||
|
|
||||||
|
const timeAgo = (prevDate) => {
|
||||||
|
const diff = Number(new Date()) - prevDate;
|
||||||
|
const minute = 60 * 1000;
|
||||||
|
const hour = minute * 60;
|
||||||
|
const day = hour * 24;
|
||||||
|
const month = day * 30;
|
||||||
|
const year = day * 365;
|
||||||
|
switch (true) {
|
||||||
|
case diff < minute:
|
||||||
|
const seconds = Math.round(diff / 1000);
|
||||||
|
return `${seconds} 秒前`
|
||||||
|
case diff < hour:
|
||||||
|
return Math.round(diff / minute) + ' 分前';
|
||||||
|
case diff < day:
|
||||||
|
return Math.round(diff / hour) + ' 時間前';
|
||||||
|
case diff < month:
|
||||||
|
return Math.round(diff / day) + ' 日前';
|
||||||
|
case diff < year:
|
||||||
|
return Math.round(diff / month) + ' ヶ月前';
|
||||||
|
case diff > year:
|
||||||
|
return Math.round(diff / year) + ' 年前';
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchData = async () => {
|
||||||
|
const result = await axios(
|
||||||
|
'https://minecraft.yude.jp/last/' + uuid.uuid,
|
||||||
|
);
|
||||||
|
setData(result.data);
|
||||||
|
};
|
||||||
|
fetchData();
|
||||||
|
}, []);
|
||||||
|
if (data === undefined){
|
||||||
|
console.log("[Minecraft: 最終プレイ日時] データの取得に失敗しました。 / Failed to retrieve data.")
|
||||||
|
return <p></p>
|
||||||
|
}else {
|
||||||
|
if (data.toString() == "[object Object]") {
|
||||||
|
return <p>取得中です...</p>
|
||||||
|
} else {
|
||||||
|
if (data.toString() == "not_found") {
|
||||||
|
return <></>
|
||||||
|
} else {
|
||||||
|
let dateTime = new Date(parseInt(data.toString()) * 1000);
|
||||||
|
return (
|
||||||
|
<div className='has-tooltip'>
|
||||||
|
<span className='tooltip rounded shadow-lg p-1 bg-gray-100 text-red-500 -mt-8'>{dateTime.toLocaleDateString() + " " + dateTime.toLocaleTimeString()}</span>
|
||||||
|
最終ログイン: {timeAgo(dateTime)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
// React
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
// Data fetching
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// Components
|
||||||
|
import LastPlayed from './LastPlayed'
|
||||||
|
|
||||||
|
function App (props) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
const uuid = props;
|
||||||
|
const [data, setData] = useState({ hits: [] });
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchData = async () => {
|
||||||
|
const result = await axios(
|
||||||
|
'https://minecraft.yude.jp/online/' + uuid.uuid,
|
||||||
|
);
|
||||||
|
setData(result.data);
|
||||||
|
};
|
||||||
|
fetchData();
|
||||||
|
}, []);
|
||||||
|
if (data === undefined){
|
||||||
|
console.log("[Minecraft: オンライン状況] データの取得に失敗しました。 / Failed to retrieve data.")
|
||||||
|
return <p></p>
|
||||||
|
}else {
|
||||||
|
if (data.toString() == "false") {
|
||||||
|
return <LastPlayed uuid={uuid.uuid} />
|
||||||
|
} else {
|
||||||
|
if (data.toString() == "true") {
|
||||||
|
return <p>オンライン</p>
|
||||||
|
} else {
|
||||||
|
return <p>取得中...</p>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
// React
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
// Data fetching
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
function App (props) {
|
||||||
|
const uuid = props;
|
||||||
|
const [data, setData] = useState({ hits: [] });
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchData = async () => {
|
||||||
|
let result = null;
|
||||||
|
try {
|
||||||
|
result = await axios('https://api.ashcon.app/mojang/v2/user/' + uuid.uuid);
|
||||||
|
setData(result.data);
|
||||||
|
} catch (err) {
|
||||||
|
result = 404;
|
||||||
|
setData(result);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fetchData();
|
||||||
|
}, []);
|
||||||
|
if (data === undefined){
|
||||||
|
console.log("[Minecraft: UUID to player's name] データの取得に失敗しました。 / Failed to retrieve data.")
|
||||||
|
return <>取得中...</>
|
||||||
|
}else {
|
||||||
|
if (data === 404) {
|
||||||
|
return <>404</>
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
|
<>{data.username}</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
// Component
|
||||||
|
import Group from './Group';
|
||||||
|
|
||||||
|
// Data fetching
|
||||||
|
import useSwr from 'swr'
|
||||||
|
|
||||||
|
const fetcher = (url) => fetch(url).then((res) => res.json())
|
||||||
|
|
||||||
|
function App (props) {
|
||||||
|
const uuid = props;
|
||||||
|
const { data, error } = useSwr(
|
||||||
|
uuid.uuid ? `https://api.ashcon.app/mojang/v2/user/${uuid.uuid}` : null,
|
||||||
|
fetcher
|
||||||
|
)
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return (
|
||||||
|
<>エラーが発生しました。</>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
if (!data) {
|
||||||
|
return (
|
||||||
|
<>読み込み中...</>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className='has-tooltip'>
|
||||||
|
<span className='tooltip rounded shadow-lg p-1 bg-gray-100 text-red-500 -mt-8 font-mono text-sm'>UUID: {uuid.uuid}</span>
|
||||||
|
<p className="text-2xl inline">{data.username}</p>
|
||||||
|
<Group uuid={uuid.uuid} />
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
// Components
|
||||||
|
import Online from './Online'
|
||||||
|
import Head from './Head'
|
||||||
|
import PlayerNameHolder from './PlayerNameHolder'
|
||||||
|
import Biography from './Biography'
|
||||||
|
|
||||||
|
function App (props) {
|
||||||
|
const uuid = props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="w-full flex flex-wrap">
|
||||||
|
<div>
|
||||||
|
<Head uuid={uuid.uuid} />
|
||||||
|
</div>
|
||||||
|
<div className="w-5"></div>
|
||||||
|
<div>
|
||||||
|
<p className="text-2xl text-mono"><PlayerNameHolder uuid={uuid.uuid} /></p>
|
||||||
|
<p><Online uuid={uuid.uuid} /></p>
|
||||||
|
<p><Biography uuid={uuid.uuid} /></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
function App (props) {
|
||||||
|
return (
|
||||||
|
<div className="text-center">
|
||||||
|
<h2>入力された UUID またはプレイヤー名に該当するプレイヤーが見つかりませんでした。</h2>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
||||||
@@ -1,13 +1,24 @@
|
|||||||
|
// Tailwind CSS
|
||||||
import "tailwindcss/tailwind.css";
|
import "tailwindcss/tailwind.css";
|
||||||
|
|
||||||
|
// Next.js
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
|
||||||
|
// Components
|
||||||
import LangSelector from "./LangSelector"
|
import LangSelector from "./LangSelector"
|
||||||
import ThemeSelector from "./ThemeSelector"
|
import ThemeSelector from "./ThemeSelector"
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
const Navbar = () => {
|
const Navbar = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<nav className='flex items-center flex-wrap p-3'>
|
<nav className='flex items-center flex-wrap p-3'>
|
||||||
<Link href='/'>
|
<Link href={{ pathname: '/', query: query }}>
|
||||||
<a className='inline-flex items-center p-2'>
|
<a className='inline-flex items-center p-2'>
|
||||||
<span className='text-xl text-black font-bold tracking-wide dark:text-white font-mono animate-heartbeat'>
|
<span className='text-xl text-black font-bold tracking-wide dark:text-white font-mono animate-heartbeat'>
|
||||||
yude.jp
|
yude.jp
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
// Next.js
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
// Font Awesome
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
|
||||||
|
const Button = (props) => {
|
||||||
|
const { icon, dest, caption } = props
|
||||||
|
return (
|
||||||
|
<Link href={{ pathname: dest }}>
|
||||||
|
<a>
|
||||||
|
<button
|
||||||
|
className="bg-pink-600 text-white active:bg-pink-600 mt-3 font-bold text-sm px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
||||||
|
type="button"
|
||||||
|
>
|
||||||
|
<FontAwesomeIcon icon={icon} className="w-5 h-5 inline"/> {caption}
|
||||||
|
</button>
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Button
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
// Next.js
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
// Font Awesome
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
|
||||||
|
const Contact = (props) => {
|
||||||
|
const { icon, dest, caption } = props
|
||||||
|
return (
|
||||||
|
<div className="hover:underline">
|
||||||
|
<Link href={{ pathname: dest }}>
|
||||||
|
<a>
|
||||||
|
<FontAwesomeIcon icon={icon} size="5x" className="w-9 h-9 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" />
|
||||||
|
<p className="font-mono text-xl">{caption}</p>
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Contact
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// Next.js
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
const NintendoSW = () => {
|
||||||
|
return (
|
||||||
|
<div className="hover:underline">
|
||||||
|
<Link href="#">
|
||||||
|
<a>
|
||||||
|
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" className="w-12 h-12 inline lg:w-12 lg:h-12 md:w-12 md:h-12 fill-current text-black dark:text-white" viewBox="0 0 700 700">
|
||||||
|
<g transform="translate(-100.000000,900.000000) scale(0.100000,-0.100000)" fill="#FFFFF">
|
||||||
|
<path d="M2965 8314 c-481 -86 -868 -442 -990 -910 -44 -169 -47 -268 -42
|
||||||
|
-1579 3 -1204 4 -1232 24 -1325 111 -501 467 -858 973 -976 66 -15 150 -18
|
||||||
|
691 -21 560 -4 618 -3 633 12 15 15 16 208 16 2396 0 1622 -3 2386 -10 2400
|
||||||
|
-10 18 -27 19 -613 18 -476 -1 -619 -4 -682 -15z m905 -2400 l0 -2026 -407 5
|
||||||
|
c-375 4 -415 6 -490 25 -322 83 -561 331 -628 654 -22 101 -22 2589 -1 2688
|
||||||
|
60 281 255 514 518 619 132 53 193 59 621 60 l387 1 0 -2026z"/>
|
||||||
|
<path d="M3051 7329 c-63 -12 -159 -60 -210 -105 -105 -91 -157 -220 -149
|
||||||
|
-372 4 -79 9 -100 41 -164 47 -97 118 -168 215 -216 67 -33 84 -37 171 -40 79
|
||||||
|
-3 107 0 160 18 217 73 348 284 311 500 -43 257 -287 429 -539 379z"/>
|
||||||
|
<path d="M4757 8323 c-4 -3 -7 -1087 -7 -2409 0 -2181 1 -2402 16 -2408 27
|
||||||
|
-10 803 -6 899 4 406 46 764 293 959 660 25 47 58 126 75 175 63 188 61 138
|
||||||
|
61 1575 0 1147 -2 1318 -16 1391 -99 521 -496 914 -1018 1004 -70 12 -178 15
|
||||||
|
-526 15 -240 0 -440 -3 -443 -7z m1068 -2178 c156 -41 284 -160 336 -312 33
|
||||||
|
-94 32 -232 -1 -318 -61 -158 -181 -269 -335 -310 -250 -65 -516 86 -589 334
|
||||||
|
-22 76 -21 204 4 282 75 245 335 389 585 324z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
<p className="font-mono text-xl">SW-5543-5143-8814</p>
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default NintendoSW
|
||||||
@@ -1,20 +1,20 @@
|
|||||||
|
// React
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// Font Awesome
|
||||||
import { faKey, faEye, faDownload } from '@fortawesome/free-solid-svg-icons'
|
import { faKey, faEye, faDownload } from '@fortawesome/free-solid-svg-icons'
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
|
// Next.js
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
|
|
||||||
export default function Modal() {
|
export default function Modal() {
|
||||||
const [showModal, setShowModal] = React.useState(false);
|
const [showModal, setShowModal] = React.useState(false);
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { t, lang } = useTranslation("common")
|
const [query] = useLanguageQuery();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
const close = t('common:close')
|
|
||||||
const keys = t('profile:keys')
|
|
||||||
const view = t('profile:view')
|
|
||||||
const fingerprint = t('profile:fingerprint')
|
|
||||||
const download = t('profile:download')
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -23,7 +23,7 @@ export default function Modal() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setShowModal(true)}
|
onClick={() => setShowModal(true)}
|
||||||
>
|
>
|
||||||
<FontAwesomeIcon icon={faKey} className="w-5 h-5 inline"/> {keys}
|
<FontAwesomeIcon icon={faKey} className="w-5 h-5 inline"/> {t('keys')}
|
||||||
</button>
|
</button>
|
||||||
{showModal ? (
|
{showModal ? (
|
||||||
<>
|
<>
|
||||||
@@ -36,17 +36,17 @@ export default function Modal() {
|
|||||||
{/* Modal body */}
|
{/* Modal body */}
|
||||||
<div className="relative p-2 flex-auto text-black text-left">
|
<div className="relative p-2 flex-auto text-black text-left">
|
||||||
|
|
||||||
<p className="text-2xl"><FontAwesomeIcon icon={faKey} className="w-5 h-5 inline"/> {keys}</p>
|
<p className="text-2xl"><FontAwesomeIcon icon={faKey} className="w-5 h-5 inline"/> {t('keys')}</p>
|
||||||
<ul className="list-disc my-2">
|
<ul className="list-disc my-2">
|
||||||
<li>
|
<li>
|
||||||
<span className="font-bold">PGP </span>
|
<span className="font-bold">PGP </span>
|
||||||
<Link href="/static/yudejp.gpg">
|
<Link href="/yudejp.gpg">
|
||||||
<a className="hover:underline">
|
<a className="hover:underline">
|
||||||
<FontAwesomeIcon icon={faDownload} className="w-5 h-5 inline"/>
|
<FontAwesomeIcon icon={faDownload} className="w-5 h-5 inline"/>
|
||||||
{download}
|
{t('download')}
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
<p>{fingerprint}:</p>
|
<p>{t('fingerprint')}:</p>
|
||||||
<div className="overflow-x-auto">
|
<div className="overflow-x-auto">
|
||||||
<div className="whitespace-nowrap">
|
<div className="whitespace-nowrap">
|
||||||
<code>3745 F270 DB4E 8975 6B07 62BE EB0F E5D9 25C4 A968</code>
|
<code>3745 F270 DB4E 8975 6B07 62BE EB0F E5D9 25C4 A968</code>
|
||||||
@@ -58,10 +58,10 @@ export default function Modal() {
|
|||||||
<Link href="https://github.com/yude.keys">
|
<Link href="https://github.com/yude.keys">
|
||||||
<a className="hover:underline">
|
<a className="hover:underline">
|
||||||
<FontAwesomeIcon icon={faEye} className="w-5 h-5 inline"/>
|
<FontAwesomeIcon icon={faEye} className="w-5 h-5 inline"/>
|
||||||
{view}
|
{t('view')}
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
<p>{fingerprint}:</p>
|
<p>{t('fingerprint')}:</p>
|
||||||
<div className="overflow-x-auto">
|
<div className="overflow-x-auto">
|
||||||
<div className="whitespace-nowrap">
|
<div className="whitespace-nowrap">
|
||||||
<code>2048 SHA256:xwSL4DORWmroWdC6P0GU1m1yZl/cXqjo9rCCWqqO+Dc</code>
|
<code>2048 SHA256:xwSL4DORWmroWdC6P0GU1m1yZl/cXqjo9rCCWqqO+Dc</code>
|
||||||
@@ -78,7 +78,7 @@ export default function Modal() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setShowModal(false)}
|
onClick={() => setShowModal(false)}
|
||||||
>
|
>
|
||||||
{close}
|
{t('close')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,17 +1,21 @@
|
|||||||
|
// React
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
// Data fetching
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
import { useRouter } from 'next/router'
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
function App () {
|
function App () {
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
const [query] = useLanguageQuery();
|
||||||
const { t, lang } = useTranslation("common")
|
|
||||||
const [data, setData] = useState({ hits: [] });
|
const [data, setData] = useState({ hits: [] });
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchData = async () => {
|
const fetchData = async () => {
|
||||||
const result = await axios(
|
const result = await axios(
|
||||||
'/api/Spotify',
|
'https://vercel-spotify-api.vercel.app/api/Spotify',
|
||||||
);
|
);
|
||||||
setData(result.data);
|
setData(result.data);
|
||||||
};
|
};
|
||||||
@@ -25,7 +29,7 @@ function App () {
|
|||||||
const status = data.artist + ' / ' + data.title
|
const status = data.artist + ' / ' + data.title
|
||||||
return <p>{t('listening', {listening: status})}</p>
|
return <p>{t('listening', {listening: status})}</p>
|
||||||
}else{
|
}else{
|
||||||
return <p></p>
|
return <></>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1,15 +1,17 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
// React
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
import React from 'react';
|
||||||
|
|
||||||
|
// Font Awesome
|
||||||
import { faUserClock } from '@fortawesome/free-solid-svg-icons'
|
import { faUserClock } from '@fortawesome/free-solid-svg-icons'
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation } from 'next-export-i18n';
|
||||||
|
|
||||||
export default function Modal() {
|
export default function Modal() {
|
||||||
const [showModal, setShowModal] = React.useState(false);
|
const [showModal, setShowModal] = React.useState(false);
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
const { t, lang } = useTranslation("common")
|
|
||||||
const close = t('common:close')
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<button
|
<button
|
||||||
@@ -38,7 +40,7 @@ export default function Modal() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setShowModal(false)}
|
onClick={() => setShowModal(false)}
|
||||||
>
|
>
|
||||||
{close}
|
{t('close')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -7,9 +7,6 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
|||||||
|
|
||||||
const ThemeSelector = (props) => {
|
const ThemeSelector = (props) => {
|
||||||
const { title, children } = props
|
const { title, children } = props
|
||||||
const router = useRouter()
|
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
|
|
||||||
const [isMounted, setIsMounted] = useState(false);
|
const [isMounted, setIsMounted] = useState(false);
|
||||||
const { theme, setTheme, getTheme } = useTheme();
|
const { theme, setTheme, getTheme } = useTheme();
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
+22
-9
@@ -1,27 +1,40 @@
|
|||||||
|
// Base layout
|
||||||
import Layout from "./components/Layout"
|
import Layout from "./components/Layout"
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
import { useRouter } from 'next/router'
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// React
|
||||||
import React from "react"
|
import React from "react"
|
||||||
import ReactMarkdown from "react-markdown"
|
import ReactMarkdown from "react-markdown"
|
||||||
|
|
||||||
|
// Markdown
|
||||||
import gfm from 'remark-gfm';
|
import gfm from 'remark-gfm';
|
||||||
import ja from '../docs/hcunews/ja.md'
|
import ja from '../docs/hcunews/ja.md'
|
||||||
import en from '../docs/hcunews/en.md'
|
import en from '../docs/hcunews/en.md'
|
||||||
|
|
||||||
export default function Tos(props) {
|
export default function HcuNews() {
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
const [query] = useLanguageQuery();
|
||||||
const { t, lang } = useTranslation("hcunews")
|
|
||||||
|
|
||||||
|
if (!query) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
return (
|
return (
|
||||||
<Layout title={t('hcunews')}>
|
<Layout title={t('hcunews')}>
|
||||||
<div>
|
<div>
|
||||||
<h1>{t('hcunews')}</h1>
|
<h1>{t('hcunews')}</h1>
|
||||||
{lang === 'ja' ? (
|
{query["lang"] === 'ja' ? (
|
||||||
<ReactMarkdown plugins={[gfm]} children={ja} />
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{ja}
|
||||||
|
</ReactMarkdown>
|
||||||
) : (
|
) : (
|
||||||
<ReactMarkdown plugins={[gfm]} children={en} />
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{en}
|
||||||
|
</ReactMarkdown>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
+9
-5
@@ -1,17 +1,21 @@
|
|||||||
|
// Base layout
|
||||||
import Layout from "./components/Layout"
|
import Layout from "./components/Layout"
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// Next.js router
|
||||||
import { useRouter } from 'next/router'
|
import { useRouter } from 'next/router'
|
||||||
|
|
||||||
export default function About(props) {
|
export default function About(props) {
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
const [query] = useLanguageQuery();
|
||||||
const { t, lang } = useTranslation("house")
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout title={t('house')}>
|
<Layout title={t('house')}>
|
||||||
<div>
|
<div>
|
||||||
<p className="my-2 text-3xl text-center">{t('house')}</p>
|
<p className="my-2 text-3xl text-center">{t('house')}</p>
|
||||||
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/4mVIU29WCRVZgHUxQPzWsfXo953uxiAegbjDb83hTQ7szesCunwdpVkBIzhnLc9i?period=1d" frameborder="0" scrolling="no"></iframe>
|
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/4mVIU29WCRVZgHUxQPzWsfXo953uxiAegbjDb83hTQ7szesCunwdpVkBIzhnLc9i?period=1d" frameBorder="0" scrolling="no"></iframe>
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
)
|
)
|
||||||
|
|||||||
+47
-54
@@ -1,75 +1,68 @@
|
|||||||
|
// Base layout
|
||||||
import Layout from "./components/Layout"
|
import Layout from "./components/Layout"
|
||||||
|
|
||||||
|
// Menu
|
||||||
|
import FAMenu from "./components/Menu/FontAwesomeMenu"
|
||||||
|
|
||||||
|
// Banner
|
||||||
|
import HappyBusy from "./components/Footer/HappyBusy"
|
||||||
|
|
||||||
|
// Next.js
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import { faDiscord, faGit, faMastodon, faGithub } from '@fortawesome/free-brands-svg-icons'
|
|
||||||
import { faBlog, faBook, faUser, faServer, faHouseUser, faHeart } from '@fortawesome/free-solid-svg-icons'
|
// i18n
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
import Image from 'next/image'
|
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
// React Router
|
||||||
import { useRouter } from 'next/router'
|
import MinecraftMenu from "./components/Menu/MinecraftMenu"
|
||||||
|
|
||||||
|
// Font Awesome
|
||||||
|
import { faDiscord, faGit, faGithub } from '@fortawesome/free-brands-svg-icons'
|
||||||
|
import { faBook, faUser, faServer, faScrewdriver, faHeart } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
||||||
export default function Index(props) {
|
export default function Index(props) {
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
const [query] = useLanguageQuery();
|
||||||
const { t, lang } = useTranslation("index")
|
|
||||||
|
|
||||||
|
if (!query) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
<Layout title={t('home')}>
|
<Layout title={t('home')}>
|
||||||
<div className="my-9 text-center">
|
<div className="my-9 text-center">
|
||||||
<div className="m-10">
|
<div className="m-10">
|
||||||
<Image
|
<img
|
||||||
src = "/static/images/avatar.png"
|
className = "mx-auto"
|
||||||
|
src = "/images/avatar_riru.png"
|
||||||
alt = "yude's avatar"
|
alt = "yude's avatar"
|
||||||
width = {200}
|
width = {200}
|
||||||
height = {200}
|
height = {200}
|
||||||
unoptimized = {true}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="grid grid-cols-4 gap-10">
|
|
||||||
<div><Link href="/profile"><a><FontAwesomeIcon icon={faUser} className="w-10 h-10 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" /></a></Link></div>
|
{/* Index menu */}
|
||||||
<div><Link href="/server"><a><FontAwesomeIcon icon={faServer} className="w-10 h-10 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" /></a></Link></div>
|
<div className="grid grid-cols-3 gap-10">
|
||||||
<div><Link href="/house"><a><FontAwesomeIcon icon={faHouseUser} className="w-10 h-10 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" /></a></Link></div>
|
<FAMenu dest="/profile" query={query} icon={faUser} />
|
||||||
<div><Link href="https://scrapbox.io/yude"><a><FontAwesomeIcon icon={faBook} className="w-10 h-10 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" /></a></Link></div>
|
<FAMenu dest="/server" query={query} icon={faServer} />
|
||||||
<div><Link href="https://discord.gg/X6srY7X"><a><FontAwesomeIcon icon={faDiscord} className="w-10 h-10 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" /></a></Link></div>
|
<FAMenu dest="/services" query={query} icon={faScrewdriver} />
|
||||||
<div><Link href="https://matrix.to/#/!oriLSKSTauvVrpdzZX:matrix.org?via=matrix.org"><a>
|
<FAMenu dest="https://discord.gg/X6srY7X" icon={faDiscord} />
|
||||||
<svg version="1.1" viewBox="0 0 27.9 32" className="fill-current text-black dark:text-white w-10 h-10 inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110">
|
<FAMenu dest="https://github.com/yudejp" icon={faGithub} />
|
||||||
<g transform="translate(-.095 .005)">
|
<FAMenu dest="https://git.yude.jp" icon={faGit} />
|
||||||
<path d="m27.1 31.2v-30.5h-2.19v-0.732h3.04v32h-3.04v-0.732z"/>
|
<MinecraftMenu query={query} />
|
||||||
<path d="m8.23 10.4v1.54h0.044c0.385-0.564 0.893-1.03 1.49-1.37 0.58-0.323 1.25-0.485 1.99-0.485 0.72 0 1.38 0.14 1.97 0.42 0.595 0.279 1.05 0.771 1.36 1.48 0.338-0.5 0.796-0.941 1.38-1.32 0.58-0.383 1.27-0.574 2.06-0.574 0.602 0 1.16 0.074 1.67 0.22 0.514 0.148 0.954 0.383 1.32 0.707 0.366 0.323 0.653 0.746 0.859 1.27 0.205 0.522 0.308 1.15 0.308 1.89v7.63h-3.13v-6.46c0-0.383-0.015-0.743-0.044-1.08-0.0209-0.307-0.103-0.607-0.242-0.882-0.133-0.251-0.336-0.458-0.584-0.596-0.257-0.146-0.606-0.22-1.05-0.22-0.44 0-0.796 0.085-1.07 0.253-0.272 0.17-0.485 0.39-0.639 0.662-0.159 0.287-0.264 0.602-0.308 0.927-0.052 0.347-0.078 0.697-0.078 1.05v6.35h-3.13v-6.4c0-0.338-7e-3 -0.673-0.021-1-0.0114-0.314-0.0749-0.623-0.188-0.916-0.108-0.277-0.3-0.512-0.55-0.673-0.258-0.168-0.636-0.253-1.14-0.253-0.198 0.0083-0.394 0.042-0.584 0.1-0.258 0.0745-0.498 0.202-0.705 0.374-0.228 0.184-0.422 0.449-0.584 0.794-0.161 0.346-0.242 0.798-0.242 1.36v6.62h-3.13v-11.4z"/>
|
<FAMenu dest="/mutual" icon={faHeart} query={query} />
|
||||||
<path d="m0.936 0.732v30.5h2.19v0.732h-3.04v-32h3.03v0.732z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
</a></Link></div>
|
|
||||||
<div><Link href="https://github.com/yudejp"><a><FontAwesomeIcon icon={faGithub} className="w-10 h-10 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" /></a></Link></div>
|
|
||||||
<div><Link href="https://git.yude.jp"><a><FontAwesomeIcon icon={faGit} className="w-10 h-10 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" /></a></Link></div>
|
|
||||||
<div><Link href="https://mstdn.yude.jp"><a><FontAwesomeIcon icon={faMastodon} className="w-10 h-10 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" /></a></Link></div>
|
|
||||||
<div><Link href="/minecraft"><a>
|
|
||||||
<svg className="fill-current text-black dark:text-white w-10 h-10 inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 304.8 304.8">
|
|
||||||
<path d="M 39.10262 126.138 L 39.16748 12.39574 L 152.7982 12.33506 L 266.4289 12.27438 L 266.4289 126.0773 L 266.4289 239.8803 L 152.7333 239.8803 L 39.03775 239.8803 L 39.10262 126.138 Z M 260.4857 126.0776 L 260.4857 18.55703 L 152.8628 18.55703 L 45.23985 18.55703 L 45.23985 126.0776 L 45.23985 233.5982 L 152.8628 233.5982 L 260.4857 233.5982 L 260.4857 126.0776 Z M 103.8963 162.9245 L 103.8963 126.0776 L 116.1702 126.0776 L 128.4441 126.0776 L 128.4441 113.8758 L 128.4441 101.674 L 152.8628 101.674 L 177.2814 101.674 L 177.2814 113.8758 L 177.2814 126.0776 L 189.3835 126.0776 L 201.4856 126.0776 L 201.6573 150.5415 C 201.7517 163.9967 201.829 180.5779 201.8291 187.3885 L 201.8293 199.7715 L 189.6869 199.7715 L 177.5446 199.7715 L 177.4776 187.5093 L 177.4106 175.2471 L 152.7982 175.1855 L 128.1857 175.1239 L 128.1857 187.4477 L 128.1857 199.7715 L 116.041 199.7715 L 103.8963 199.7715 L 103.8963 162.9245 Z M 79.34843 77.02888 L 79.34843 52.62534 L 103.7671 52.62534 L 128.1857 52.62534 L 128.1857 77.02888 L 128.1857 101.4324 L 103.7671 101.4324 L 79.34843 101.4324 L 79.34843 77.02888 Z M 177.5398 77.02888 L 177.5398 52.62534 L 201.9585 52.62534 L 226.3771 52.62534 L 226.3771 77.02888 L 226.3771 101.4324 L 201.9585 101.4324 L 177.5398 101.4324 L 177.5398 77.02888 Z"/>
|
|
||||||
</svg>
|
|
||||||
</a></Link></div>
|
|
||||||
<div><Link href="/mutual"><a><FontAwesomeIcon icon={faHeart} className="w-10 h-10 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" /></a></Link></div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Banner */}
|
||||||
<div className="mx-auto mt-10">
|
<div className="mx-auto mt-10">
|
||||||
<Link href="https://www.eff.org/pages/blue-ribbon-campaign">
|
<HappyBusy />
|
||||||
<a>
|
|
||||||
<Image
|
|
||||||
src="/static/images/brstrip.gif"
|
|
||||||
width={150}
|
|
||||||
height={41}
|
|
||||||
/>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
<Link href="https://sites.google.com/site/happybusy/">
|
|
||||||
<a>
|
|
||||||
<Image
|
|
||||||
src="/static/images/busy_banner.png"
|
|
||||||
width={200}
|
|
||||||
height={42}
|
|
||||||
/>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Avatar by */}
|
||||||
|
<p className="mt-3 text-sm font-bold text-gray-900 dark:text-gray-400">{t('icon_1')}<Link href="https://twitter.com/R_I_R_U_"><a className="hover:underline">梨留りる {t('icon_2')}</a></Link></p>
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
+50
-18
@@ -1,38 +1,63 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
// Base layout
|
||||||
import Layout from "./components/Layout"
|
import Layout from "./components/Layout"
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
|
// React Router etc.
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
import { useRouter } from 'next/router'
|
import { useRouter } from 'next/router'
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// Next.js
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
// Custom pages
|
||||||
import Minecraft from './components/Minecraft'
|
import Minecraft from './components/Minecraft'
|
||||||
import Image from 'next/image'
|
|
||||||
|
// Font Awesome
|
||||||
import { faMap, faCopy } from '@fortawesome/free-solid-svg-icons'
|
import { faMap, faCopy } from '@fortawesome/free-solid-svg-icons'
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
import Link from 'next/link'
|
|
||||||
|
// React Markdown
|
||||||
import ReactMarkdown from "react-markdown"
|
import ReactMarkdown from "react-markdown"
|
||||||
import gfm from 'remark-gfm';
|
import gfm from 'remark-gfm';
|
||||||
import ja from '../docs/minecraft/ja.md'
|
import ja from '../docs/minecraft/ja.md'
|
||||||
import en from '../docs/minecraft/en.md'
|
import en from '../docs/minecraft/en.md'
|
||||||
|
|
||||||
|
// next-seo
|
||||||
|
import { NextSeo } from 'next-seo';
|
||||||
|
|
||||||
export default function About(props) {
|
export default function About(props) {
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
const [query] = useLanguageQuery();
|
||||||
const { t, lang } = useTranslation("minecraft")
|
|
||||||
|
// Copy server address to clipboard
|
||||||
const copyText = () => {
|
const copyText = () => {
|
||||||
navigator.clipboard.writeText("yude.jp");
|
navigator.clipboard.writeText("yude.jp");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (!query) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
|
<NextSeo
|
||||||
|
title="yude.jp Minecraft マルチプレイ"
|
||||||
|
description="yude.jp 上に設置されている Minecraft: Java Edition のマルチプレイサーバーについて"
|
||||||
|
/>
|
||||||
<Layout title={t('title')}>
|
<Layout title={t('title')}>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p className="my-2 text-3xl text-center">{t('title')}</p>
|
<p className="my-2 text-3xl text-center">{t('title')}</p>
|
||||||
<div className="w-full">
|
<div className="w-full">
|
||||||
<Image
|
<img
|
||||||
src = "/static/images/dynmap.png"
|
src = "/images/dynmap.png"
|
||||||
alt = "Dynmap Header"
|
alt = "Minecraft brief world map generated by Dynmap"
|
||||||
unoptimized = {true}
|
|
||||||
width = {1354}
|
width = {1354}
|
||||||
height = {619}
|
height = {619}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<Minecraft />
|
<Minecraft />
|
||||||
<p>
|
<p>
|
||||||
@@ -45,26 +70,33 @@ export default function About(props) {
|
|||||||
<FontAwesomeIcon icon={faCopy} className="w-5 h-5 inline"/>
|
<FontAwesomeIcon icon={faCopy} className="w-5 h-5 inline"/>
|
||||||
</button>
|
</button>
|
||||||
</p>
|
</p>
|
||||||
<p>{t('version')}: 1.17</p>
|
|
||||||
|
<p>{t('version')}: 1.18.1</p>
|
||||||
|
|
||||||
<Link href="https://bluemap.yude.jp">
|
<Link href="https://bluemap.yude.jp">
|
||||||
<a>
|
<a>
|
||||||
<button
|
<button
|
||||||
className="bg-pink-600 text-white active:bg-pink-600 mt-3 font-bold text-sm px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
className="bg-pink-600 text-white active:bg-pink-600 mt-3 font-bold text-sm px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
||||||
type="button"
|
type="button">
|
||||||
>
|
|
||||||
<FontAwesomeIcon icon={faMap} className="w-5 h-5 inline"/> BlueMap
|
<FontAwesomeIcon icon={faMap} className="w-5 h-5 inline"/> BlueMap
|
||||||
</button>
|
</button>
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{lang === 'ja' ? (
|
{/* Load markdown contents */}
|
||||||
<ReactMarkdown plugins={[gfm]} children={ja} />
|
{query["lang"] === 'ja' ? (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{ja}
|
||||||
|
</ReactMarkdown>
|
||||||
) : (
|
) : (
|
||||||
<ReactMarkdown plugins={[gfm]} children={en} />
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{en}
|
||||||
|
</ReactMarkdown>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
// Base layout
|
||||||
|
import Layout from "../../components/Layout"
|
||||||
|
|
||||||
|
// React
|
||||||
|
import { useRouter } from 'next/router'
|
||||||
|
|
||||||
|
// Data fetching
|
||||||
|
import useSwr from 'swr'
|
||||||
|
const fetcher = (url) => fetch(url).then((res) => res.json())
|
||||||
|
|
||||||
|
// Components
|
||||||
|
import WrongUUID from '../../components/Minecraft/WrongUUID'
|
||||||
|
|
||||||
|
export default function UUID() {
|
||||||
|
const router = useRouter()
|
||||||
|
const { ign } = router.query
|
||||||
|
const { data, error } = useSwr(
|
||||||
|
ign ? `https://api.ashcon.app/mojang/v2/user/${ign}` : null,
|
||||||
|
fetcher
|
||||||
|
)
|
||||||
|
if (error) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Layout title="エラー - プレイヤー情報">
|
||||||
|
<p className="text-2xl">エラーが発生しました。</p>
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
if (!data) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Layout title="読み込み中... - プレイヤー情報">
|
||||||
|
<p className="text-2xl">読み込み中</p>
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
if (data.code) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Layout title="404 - プレイヤー情報">
|
||||||
|
<WrongUUID />
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
router.push('/minecraft/players/' + data.uuid)
|
||||||
|
return (
|
||||||
|
<p>リダイレクトしています...</p>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
// Base layout
|
||||||
|
import Layout from "../../components/Layout"
|
||||||
|
|
||||||
|
// React
|
||||||
|
import { useRouter } from 'next/router'
|
||||||
|
|
||||||
|
// Data fetching
|
||||||
|
import Players from '../../components/Minecraft/Players'
|
||||||
|
import useSwr from 'swr'
|
||||||
|
const fetcher = (url) => fetch(url).then((res) => res.json())
|
||||||
|
|
||||||
|
// Components
|
||||||
|
import WrongUUID from '../../components/Minecraft/WrongUUID'
|
||||||
|
|
||||||
|
export default function UUID() {
|
||||||
|
const router = useRouter()
|
||||||
|
const { uuid } = router.query
|
||||||
|
const { data, error } = useSwr(
|
||||||
|
uuid ? `https://api.ashcon.app/mojang/v2/user/${uuid}` : null,
|
||||||
|
fetcher
|
||||||
|
)
|
||||||
|
if (error) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Layout title="エラー - プレイヤー情報">
|
||||||
|
<p className="text-2xl">エラーが発生しました。</p>
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
if (!data) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Layout title="読み込み中... - プレイヤー情報">
|
||||||
|
<Players uuid={uuid} />
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
if (!data.username) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Layout title="404 - プレイヤー情報">
|
||||||
|
<WrongUUID />
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Layout title={data.username + " - " + "プレイヤー情報"}>
|
||||||
|
<Players uuid={uuid} />
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+32
-8
@@ -1,25 +1,49 @@
|
|||||||
|
// Base layout
|
||||||
import Layout from "./components/Layout"
|
import Layout from "./components/Layout"
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// React Router etc.
|
||||||
import { useRouter } from 'next/router'
|
import { useRouter } from 'next/router'
|
||||||
import React from "react"
|
import React from "react"
|
||||||
|
|
||||||
|
// React Markdown
|
||||||
import ReactMarkdown from "react-markdown"
|
import ReactMarkdown from "react-markdown"
|
||||||
import gfm from 'remark-gfm';
|
import gfm from 'remark-gfm';
|
||||||
import ja from '../docs/mutual/ja.md'
|
import ja from '../docs/mutual/ja.md'
|
||||||
import en from '../docs/mutual/en.md'
|
import en from '../docs/mutual/en.md'
|
||||||
|
|
||||||
|
// next-seo
|
||||||
|
import { NextSeo } from 'next-seo';
|
||||||
|
|
||||||
export default function Tos(props) {
|
export default function Tos(props) {
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
const [query] = useLanguageQuery();
|
||||||
const { t, lang } = useTranslation("common")
|
|
||||||
|
if (!query) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
return(
|
return(
|
||||||
<Layout title={t('common:mutual')}>
|
<>
|
||||||
|
<NextSeo
|
||||||
|
title="相互リンク"
|
||||||
|
description="yude.jp と相互にリンクを貼っている Web サイトの一覧"
|
||||||
|
/>
|
||||||
|
<Layout title={t('mutual')}>
|
||||||
<div>
|
<div>
|
||||||
{lang === 'ja' ? (
|
{query["lang"] === 'ja' ? (
|
||||||
<ReactMarkdown plugins={[gfm]} children={ja} />
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{ja}
|
||||||
|
</ReactMarkdown>
|
||||||
) : (
|
) : (
|
||||||
<ReactMarkdown plugins={[gfm]} children={en} />
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{en}
|
||||||
|
</ReactMarkdown>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
+64
-132
@@ -1,24 +1,41 @@
|
|||||||
|
// Base layout
|
||||||
import Layout from "./components/Layout"
|
import Layout from "./components/Layout"
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
import { faDiscord, faTwitter, faGithub, faKeybase, faInstagram, faMastodon, faSteam } from '@fortawesome/free-brands-svg-icons'
|
|
||||||
import { faEnvelope, faBirthdayCake, faMapPin, faSchool, faPhone, faInfo, faLink, faMobile } from '@fortawesome/free-solid-svg-icons'
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
|
||||||
import Link from 'next/link'
|
|
||||||
import Image from 'next/image'
|
|
||||||
import DiscordStatus from './components/DiscordStatus'
|
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
import DiscordPlaying from './components/DiscordPlaying'
|
|
||||||
import Spotify from './components/Spotify'
|
|
||||||
import WakaTime from './components/WakaTime'
|
|
||||||
import PublicKeys from './components/PublicKeys'
|
|
||||||
|
|
||||||
export default function About(props) {
|
// i18n
|
||||||
const router = useRouter()
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
const { t, lang } = useTranslation("profile")
|
// Font Awesome
|
||||||
|
import { faDiscord, faTwitter, faGithub, faKeybase, faInstagram, faMastodon, faSteam, faAmazon } from '@fortawesome/free-brands-svg-icons'
|
||||||
|
import { faEnvelope, faBirthdayCake, faMapPin, faSchool, faPhone, faBlog, faBookDead, faInfo, faBookmark, faLink, faMobile } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
|
|
||||||
|
// Next.js, React
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
// Discord
|
||||||
|
import DiscordStatus from './components/Discord/DiscordStatus'
|
||||||
|
import DiscordPlaying from './components/Discord/DiscordPlaying'
|
||||||
|
|
||||||
|
// Custom component
|
||||||
|
import Spotify from './components/Profile/Spotify'
|
||||||
|
import WakaTime from './components/Profile/WakaTime'
|
||||||
|
import PublicKeys from './components/Profile/PublicKeys'
|
||||||
|
import Button from './components/Profile/Button'
|
||||||
|
import Contact from './components/Profile/Contact'
|
||||||
|
import NintendoSW from "./components/Profile/NintendoSW"
|
||||||
|
|
||||||
|
// next-seo
|
||||||
|
import { NextSeo } from 'next-seo';
|
||||||
|
|
||||||
|
export default function Profile(props) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
|
<NextSeo
|
||||||
|
title="yude のプロフィール"
|
||||||
|
/>
|
||||||
<Layout title={t('about')}>
|
<Layout title={t('about')}>
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
|
|
||||||
@@ -27,9 +44,9 @@ export default function About(props) {
|
|||||||
}
|
}
|
||||||
<div>
|
<div>
|
||||||
<div className="flex mb-10 justify-center">
|
<div className="flex mb-10 justify-center">
|
||||||
<Image
|
<img
|
||||||
className = "rounded-full hover:animate-rumble z-0 p-15"
|
className = "rounded-full hover:animate-rumble z-0 p-15"
|
||||||
src = "/static/images/avatar.png"
|
src = "/images/avatar_mel.png"
|
||||||
alt = "yude's avatar"
|
alt = "yude's avatar"
|
||||||
width = {200}
|
width = {200}
|
||||||
height = {200}
|
height = {200}
|
||||||
@@ -70,6 +87,19 @@ export default function About(props) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{
|
||||||
|
// Contents
|
||||||
|
}
|
||||||
|
<div>
|
||||||
|
<div className="text-left">
|
||||||
|
<p className="text-2xl"><FontAwesomeIcon icon={faBookDead} className="w-5 h-5 inline"/> {t('contents')}</p>
|
||||||
|
</div>
|
||||||
|
<div className="my-2 grid grid-cols-2 lg:grid-cols-5 md:grid-cols-3 sm:grid-cols-2justify-items-center gap-y-6">
|
||||||
|
<Contact dest="https://blog.yude.jp" icon={faBlog} caption={t('blog')} />
|
||||||
|
<Contact dest="https://scrapbox.io/yude" icon={faBookmark} caption="Scrapbox" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{
|
{
|
||||||
// Contact
|
// Contact
|
||||||
}
|
}
|
||||||
@@ -77,94 +107,15 @@ export default function About(props) {
|
|||||||
<p className="text-2xl"><FontAwesomeIcon icon={faPhone} className="w-5 h-5 inline"/> {t('contact')}</p>
|
<p className="text-2xl"><FontAwesomeIcon icon={faPhone} className="w-5 h-5 inline"/> {t('contact')}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="my-2 grid grid-cols-2 lg:grid-cols-5 md:grid-cols-3 sm:grid-cols-2justify-items-center gap-y-6">
|
<div className="my-2 grid grid-cols-2 lg:grid-cols-5 md:grid-cols-3 sm:grid-cols-2justify-items-center gap-y-6">
|
||||||
<div className="hover:underline">
|
<Contact dest="https://twitter.com/yude_jp" icon={faTwitter} caption="@yude_jp" />
|
||||||
<Link href="https://twitter.com/yude_jp">
|
<Contact dest="#" icon={faDiscord} caption="yude#3205" />
|
||||||
<a>
|
<Contact dest="mailto:[email protected]" icon={faEnvelope} caption="[email protected]" />
|
||||||
<FontAwesomeIcon icon={faTwitter} className="w-7 h-7 inline lg:w-10 lg:h-10 md:w-7 md:h-7"/>
|
<Contact dest="https://github.com/yude" icon={faGithub} caption="yude" />
|
||||||
<p className="font-mono text-xl">@yude_jp</p>
|
<Contact dest="https://mstdn.yude.jp/@yude" icon={faMastodon} caption="@[email protected]" />
|
||||||
</a>
|
<Contact dest="https://keybase.io/yude" icon={faKeybase} caption="yude" />
|
||||||
</Link>
|
<Contact dest="https://instagram.com/yude.jp" icon={faInstagram} caption="yude.jp" />
|
||||||
</div>
|
<Contact dest="https://steamcommunity.com/id/yudejp" icon={faSteam} caption="id/yudejp" />
|
||||||
<div className="hover:underline">
|
<NintendoSW />
|
||||||
<a>
|
|
||||||
<FontAwesomeIcon icon={faDiscord} className="w-7 h-7 inline lg:w-10 lg:h-10 md:w-7 md:h-7"/>
|
|
||||||
<p className="font-mono text-xl">yude#3205</p>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div className="hover:underline">
|
|
||||||
<Link href="mailto:[email protected]">
|
|
||||||
<a>
|
|
||||||
<FontAwesomeIcon icon={faEnvelope} className="w-7 h-7 inline lg:w-10 lg:h-10 md:w-7 md:h-7"/>
|
|
||||||
<p className="font-mono text-xl">i@yude.jp</p>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
<div className="hover:underline">
|
|
||||||
<Link href="https://github.com/yude">
|
|
||||||
<a>
|
|
||||||
<FontAwesomeIcon icon={faGithub} className="w-7 h-7 inline lg:w-10 lg:h-10 md:w-7 md:h-7"/>
|
|
||||||
<p className="font-mono text-xl">yude</p>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
<div className="hover:underline">
|
|
||||||
<Link href="https://mstdn.yude.jp/@yude">
|
|
||||||
<a>
|
|
||||||
<FontAwesomeIcon icon={faMastodon} className="w-7 h-7 inline lg:w-10 lg:h-10 md:w-7 md:h-7"/>
|
|
||||||
<p className="font-mono text-xl">@yude@mstdn.yude.jp</p>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
<div className="hover:underline">
|
|
||||||
<Link href="https://keybase.io/yude">
|
|
||||||
<a>
|
|
||||||
<FontAwesomeIcon icon={faKeybase} className="w-7 h-7 inline lg:w-10 lg:h-10 md:w-7 md:h-7"/>
|
|
||||||
<p className="font-mono text-xl">yude</p>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
<div className="hover:underline">
|
|
||||||
<Link href="https://instagram.com/yude.jp">
|
|
||||||
<a>
|
|
||||||
<FontAwesomeIcon icon={faInstagram} className="w-7 h-7 inline lg:w-10 lg:h-10 md:w-7 md:h-7"/>
|
|
||||||
<p className="font-mono text-xl">yude.jp</p>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
<div className="hover:underline">
|
|
||||||
<Link href="https://steamcommunity.com/id/yudejp">
|
|
||||||
<a>
|
|
||||||
<FontAwesomeIcon icon={faSteam} className="w-7 h-7 inline lg:w-10 lg:h-10 md:w-7 md:h-7"/>
|
|
||||||
<p className="font-mono text-xl">id/yudejp</p>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
<div className="hover:underline">
|
|
||||||
<Link href="#">
|
|
||||||
<a>
|
|
||||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" className="w-12 h-12 inline lg:w-12 lg:h-12 md:w-12 md:h-12 fill-current text-black dark:text-white" viewBox="0 0 700 700">
|
|
||||||
<g transform="translate(-100.000000,900.000000) scale(0.100000,-0.100000)" fill="#FFFFF">
|
|
||||||
<path d="M2965 8314 c-481 -86 -868 -442 -990 -910 -44 -169 -47 -268 -42
|
|
||||||
-1579 3 -1204 4 -1232 24 -1325 111 -501 467 -858 973 -976 66 -15 150 -18
|
|
||||||
691 -21 560 -4 618 -3 633 12 15 15 16 208 16 2396 0 1622 -3 2386 -10 2400
|
|
||||||
-10 18 -27 19 -613 18 -476 -1 -619 -4 -682 -15z m905 -2400 l0 -2026 -407 5
|
|
||||||
c-375 4 -415 6 -490 25 -322 83 -561 331 -628 654 -22 101 -22 2589 -1 2688
|
|
||||||
60 281 255 514 518 619 132 53 193 59 621 60 l387 1 0 -2026z"/>
|
|
||||||
<path d="M3051 7329 c-63 -12 -159 -60 -210 -105 -105 -91 -157 -220 -149
|
|
||||||
-372 4 -79 9 -100 41 -164 47 -97 118 -168 215 -216 67 -33 84 -37 171 -40 79
|
|
||||||
-3 107 0 160 18 217 73 348 284 311 500 -43 257 -287 429 -539 379z"/>
|
|
||||||
<path d="M4757 8323 c-4 -3 -7 -1087 -7 -2409 0 -2181 1 -2402 16 -2408 27
|
|
||||||
-10 803 -6 899 4 406 46 764 293 959 660 25 47 58 126 75 175 63 188 61 138
|
|
||||||
61 1575 0 1147 -2 1318 -16 1391 -99 521 -496 914 -1018 1004 -70 12 -178 15
|
|
||||||
-526 15 -240 0 -440 -3 -443 -7z m1068 -2178 c156 -41 284 -160 336 -312 33
|
|
||||||
-94 32 -232 -1 -318 -61 -158 -181 -269 -335 -310 -250 -65 -516 86 -589 334
|
|
||||||
-22 76 -21 204 4 282 75 245 335 389 585 324z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
<p className="font-mono text-xl">SW-5543-5143-8814</p>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -173,35 +124,16 @@ export default function About(props) {
|
|||||||
<div className="text-center my-6 space-x-5">
|
<div className="text-center my-6 space-x-5">
|
||||||
<WakaTime />
|
<WakaTime />
|
||||||
<PublicKeys />
|
<PublicKeys />
|
||||||
|
<Button dest="https://scrapbox.io/yude/%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88" icon={faLink} caption={t('account')}/>
|
||||||
<Link href="https://scrapbox.io/yude/%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88">
|
<Button dest="https://scrapbox.io/yude/%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9" icon={faMobile} caption={t('device')}/>
|
||||||
<a>
|
<Button dest="https://www.amazon.jp/hz/wishlist/ls/8WTKCPWKOJ2N?ref_=wl_share" icon={faAmazon} caption={t('wishlist')}/>
|
||||||
<button
|
|
||||||
className="bg-pink-600 text-white active:bg-pink-600 mt-3 font-bold text-sm px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
<FontAwesomeIcon icon={faLink} className="w-5 h-5 inline"/> {t('account')}
|
|
||||||
</button>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
|
|
||||||
<Link href="https://scrapbox.io/yude/%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9">
|
|
||||||
<a>
|
|
||||||
<button
|
|
||||||
className="bg-pink-600 text-white active:bg-pink-600 mt-3 font-bold text-sm px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
<FontAwesomeIcon icon={faMobile} className="w-5 h-5 inline"/> {t('device')}
|
|
||||||
</button>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<p className="mt-3 text-sm font-bold text-gray-900 dark:text-gray-400">{t('icon_1')}<Link href="https://twitter.com/xmnts"><a className="hover:underline">Minkasy {t('icon_2')}</a></Link></p>
|
<p className="mt-3 text-sm font-bold text-gray-900 dark:text-gray-400">{t('icon_1')}<Link href="https://twitter.com/xmnts"><a className="hover:underline">Minkasy {t('icon_2')}</a></Link></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</Layout>
|
</Layout>
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
+40
-29
@@ -1,51 +1,49 @@
|
|||||||
|
// Base layout
|
||||||
import Layout from "./components/Layout"
|
import Layout from "./components/Layout"
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
|
|
||||||
import { useRouter } from 'next/router'
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// next-seo
|
||||||
|
import { NextSeo } from 'next-seo';
|
||||||
|
|
||||||
export default function Server(props) {
|
export default function Server(props) {
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
const [query] = useLanguageQuery();
|
||||||
const { t, lang } = useTranslation("server")
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
|
<NextSeo
|
||||||
|
title="yude.jp サーバー上"
|
||||||
|
description="yude.jp 上に設置されているサーバーの一覧、情報"
|
||||||
|
/>
|
||||||
<Layout title={t('status')}>
|
<Layout title={t('status')}>
|
||||||
<div className="my-9 text-center">
|
<div className="my-9 text-center">
|
||||||
|
|
||||||
{
|
{
|
||||||
// Heading
|
// Header
|
||||||
}
|
}
|
||||||
<div className="mb-5">
|
<div className="mb-5">
|
||||||
<p className="text-left text-4xl">{t('status')} <p className="md:inline font-mono text-base sm:">Powered / Generated by Mackerel.</p></p>
|
<p className="text-left text-4xl">{t('status')} <p className="md:inline font-mono text-base sm:">Powered / Generated by Mackerel.</p></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{
|
{
|
||||||
// yui Mackerel
|
// sandy
|
||||||
}
|
}
|
||||||
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">yui</h2>
|
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">sandy</h2>
|
||||||
<div className="flex xl:w-2/3 text-center">
|
<div className="flex xl:w-2/3 text-center">
|
||||||
<div className="flex-1"><p className="font-bold">CPU </p>i7-2600</div>
|
<div className="flex-1"><p className="font-bold">CPU </p>i7-2600</div>
|
||||||
<div className="flex-1"><p className="font-bold">RAM </p>DDR3 24GB</div>
|
<div className="flex-1"><p className="font-bold">RAM </p>DDR3 24GB</div>
|
||||||
<div className="flex-1"><p className="font-bold">OS </p>Arch Linux</div>
|
<div className="flex-1"><p className="font-bold">OS </p>Arch Linux</div>
|
||||||
<div className="flex-1"><p className="font-bold">{t('location')} </p>{t('hiroshima')}</div>
|
<div className="flex-1"><p className="font-bold">{t('location')} </p>{t('hiroshima')}</div>
|
||||||
</div>
|
</div>
|
||||||
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/heHnGhDanoIDlf7jjxUe9yPVrsG3deeH5ptD8suErrq5w46crWEIYdLfzLoukzfF?period=24h" height="400" frameBorder="0" scrolling="no"></iframe>
|
<a href="https://mackerel.io/orgs/yude/hosts/4dkbQuMQjvo/-/graphs/loadavg#period=10m"><img src="https://mackerel.io/embed/public/embed/heHnGhDanoIDlf7jjxUe9yPVrsG3deeH5ptD8suErrq5w46crWEIYdLfzLoukzfF.png?period=10m" className="w-full" /></a>
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
// yukino Mackerel
|
// oracle1
|
||||||
}
|
}
|
||||||
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">yukino</h2>
|
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">oracle1</h2>
|
||||||
<div className="flex xl:w-2/3 text-center">
|
|
||||||
<div className="flex-1"><p className="font-bold">{t('model')} </p>Raspberry Pi 4 Model B Rev 1.2</div>
|
|
||||||
<div className="flex-1"><p className="font-bold">RAM </p>4GB</div>
|
|
||||||
<div className="flex-1"><p className="font-bold">OS </p>Raspbian GNU/Linux 10 (buster)</div>
|
|
||||||
<div className="flex-1"><p className="font-bold">{t('location')} </p>{t('tottori')}</div>
|
|
||||||
</div>
|
|
||||||
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/5HVbQiwuxrMithyrGjmmQCCOVgJ6Ptf94SDA2qWSTsh2rtz7pjePihYzaW5QEml4?period=24h" height="400" frameBorder="0" scrolling="no"></iframe>
|
|
||||||
|
|
||||||
{
|
|
||||||
// iroha Mackerel
|
|
||||||
}
|
|
||||||
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">iroha</h2>
|
|
||||||
<div className="flex xl:w-2/3 text-center">
|
<div className="flex xl:w-2/3 text-center">
|
||||||
<div className="flex-1"><p className="font-bold">{t('service')} </p>Oracle Cloud</div>
|
<div className="flex-1"><p className="font-bold">{t('service')} </p>Oracle Cloud</div>
|
||||||
<div className="flex-1"><p className="font-bold">{t('shape')} </p>VM.Standard.E2.1.Micro</div>
|
<div className="flex-1"><p className="font-bold">{t('shape')} </p>VM.Standard.E2.1.Micro</div>
|
||||||
@@ -53,13 +51,12 @@ export default function Server(props) {
|
|||||||
<div className="flex-1"><p className="font-bold">OS </p>Ubuntu 20.04 LTS</div>
|
<div className="flex-1"><p className="font-bold">OS </p>Ubuntu 20.04 LTS</div>
|
||||||
<div className="flex-1"><p className="font-bold">{t('region')} </p>Japan Central (Osaka)</div>
|
<div className="flex-1"><p className="font-bold">{t('region')} </p>Japan Central (Osaka)</div>
|
||||||
</div>
|
</div>
|
||||||
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/wgmTz7aTgvwfyU6qVHrJJmQlpOHCUJK6qw0W9sJTX68WOI8TFtc27YvJ7dwkQEGv?period=24h" height="400" frameBorder="0" scrolling="no"></iframe>
|
<a href="https://mackerel.io/orgs/yude/hosts/4ftHfeojMCU/-/graphs/loadavg#period=10m"><img src="https://mackerel.io/embed/public/embed/vcn6LE4P2hh6GzvtMbIAWxsXpDh6eSoNyAXdhfYaj9yDN6FJwOHIiz9ktqToj1HG.png?period=10m" className="w-full" /></a>
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
// iroha Mackerel
|
// oracle2
|
||||||
}
|
}
|
||||||
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">komachi</h2>
|
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">oracle2</h2>
|
||||||
<div className="flex xl:w-2/3 text-center">
|
<div className="flex xl:w-2/3 text-center">
|
||||||
<div className="flex-1"><p className="font-bold">{t('service')} </p>Oracle Cloud</div>
|
<div className="flex-1"><p className="font-bold">{t('service')} </p>Oracle Cloud</div>
|
||||||
<div className="flex-1"><p className="font-bold">{t('shape')} </p>VM.Standard.E2.1.Micro</div>
|
<div className="flex-1"><p className="font-bold">{t('shape')} </p>VM.Standard.E2.1.Micro</div>
|
||||||
@@ -67,9 +64,23 @@ export default function Server(props) {
|
|||||||
<div className="flex-1"><p className="font-bold">OS </p>Ubuntu 20.04 LTS</div>
|
<div className="flex-1"><p className="font-bold">OS </p>Ubuntu 20.04 LTS</div>
|
||||||
<div className="flex-1"><p className="font-bold">{t('region')} </p>Japan Central (Osaka)</div>
|
<div className="flex-1"><p className="font-bold">{t('region')} </p>Japan Central (Osaka)</div>
|
||||||
</div>
|
</div>
|
||||||
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/vcn6LE4P2hh6GzvtMbIAWxsXpDh6eSoNyAXdhfYaj9yDN6FJwOHIiz9ktqToj1HG?period=24h" height="400" frameBorder="0" scrolling="no"></iframe>
|
<a href="https://mackerel.io/orgs/yude/hosts/4frgQ1QuivJ/-/graphs/loadavg#period=10m"><img src="https://mackerel.io/embed/public/embed/wgmTz7aTgvwfyU6qVHrJJmQlpOHCUJK6qw0W9sJTX68WOI8TFtc27YvJ7dwkQEGv.png?period=10m" className="w-full" /></a>
|
||||||
|
|
||||||
|
{
|
||||||
|
// oracle-a1-1
|
||||||
|
}
|
||||||
|
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">oracle-a1-1</h2>
|
||||||
|
<div className="flex xl:w-2/3 text-center">
|
||||||
|
<div className="flex-1"><p className="font-bold">{t('service')} </p>Oracle Cloud</div>
|
||||||
|
<div className="flex-1"><p className="font-bold">{t('shape')} </p>VM.Standard.A1.Flex</div>
|
||||||
|
<div className="flex-1"><p className="font-bold">RAM </p>6GB</div>
|
||||||
|
<div className="flex-1"><p className="font-bold">OS </p>Ubuntu 20.04.3 LTS</div>
|
||||||
|
<div className="flex-1"><p className="font-bold">{t('region')} </p>Japan Central (Osaka)</div>
|
||||||
|
</div>
|
||||||
|
<a href="https://mackerel.io/orgs/yude/hosts/4qzeqT6kToQ/-/graphs/loadavg#period=10m"><img src="https://mackerel.io/embed/public/embed/2C7NdtqLgGFGPiO2IctDGuaMdjBwhXyp0i8imkaJT2GFI55syPaxxACEYIRWDHnS.png?period=10m" className="w-full" /></a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
// Base layout
|
||||||
|
import Layout from "./components/Layout"
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// React Router etc.
|
||||||
|
import { useRouter } from 'next/router'
|
||||||
|
import React from "react"
|
||||||
|
|
||||||
|
// React Markdown
|
||||||
|
import ReactMarkdown from "react-markdown"
|
||||||
|
import gfm from 'remark-gfm';
|
||||||
|
import ja from '../docs/services/ja.md'
|
||||||
|
import en from '../docs/services/en.md'
|
||||||
|
|
||||||
|
// next-seo
|
||||||
|
import { NextSeo } from 'next-seo';
|
||||||
|
|
||||||
|
export default function Tos(props) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
|
if (!query) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
|
return(
|
||||||
|
<>
|
||||||
|
<NextSeo
|
||||||
|
title="サービス"
|
||||||
|
description="yude.jp で運用中のサービス"
|
||||||
|
/>
|
||||||
|
<Layout title={t('services')}>
|
||||||
|
<div>
|
||||||
|
{query["lang"] === 'ja' ? (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{ja}
|
||||||
|
</ReactMarkdown>
|
||||||
|
) : (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{en}
|
||||||
|
</ReactMarkdown>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
+22
-7
@@ -1,25 +1,40 @@
|
|||||||
|
// Base layout
|
||||||
import Layout from "./components/Layout"
|
import Layout from "./components/Layout"
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// Next.js, React
|
||||||
import { useRouter } from 'next/router'
|
import { useRouter } from 'next/router'
|
||||||
import React from "react"
|
import React from "react"
|
||||||
|
|
||||||
|
// React Markdown
|
||||||
import ReactMarkdown from "react-markdown"
|
import ReactMarkdown from "react-markdown"
|
||||||
import gfm from 'remark-gfm';
|
import gfm from 'remark-gfm';
|
||||||
import ja from '../docs/tos/ja.md'
|
import ja from '../docs/tos/ja.md'
|
||||||
import en from '../docs/tos/en.md'
|
import en from '../docs/tos/en.md'
|
||||||
|
|
||||||
export default function Tos(props) {
|
export default function Tos(props) {
|
||||||
const router = useRouter()
|
const { t } = useTranslation();
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
const [query] = useLanguageQuery();
|
||||||
const { t, lang } = useTranslation("tos")
|
|
||||||
|
if (!query) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
return (
|
return (
|
||||||
<Layout title={t('tos')}>
|
<Layout title={t('tos')}>
|
||||||
<div>
|
<div>
|
||||||
{lang === 'ja' ? (
|
{query["lang"] === 'ja' ? (
|
||||||
<ReactMarkdown plugins={[gfm]} children={ja} />
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{ja}
|
||||||
|
</ReactMarkdown>
|
||||||
) : (
|
) : (
|
||||||
<ReactMarkdown plugins={[gfm]} children={en} />
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{en}
|
||||||
|
</ReactMarkdown>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,67 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
mQINBGBFtIIBEADvtdeDZreuQ/iktUbhSqAOwbmAVNqbuKYvIbxp1AKPlEVD3oxR
|
||||||
|
s+pnfLwMswobAT98VjQMHYnQM8hp4ngBgiZUqfh5RWO750TvlNIRRlG4vMoR06gP
|
||||||
|
maDVz6t0D+UPW0lnuPk7TnHOROPEQCJzjn+J8xd+a1wXHP9ExAOpGLjnjUDPZK2v
|
||||||
|
U7ls3j4/7YWa1/lpbccWbbnZ/siqbz1VE3F+RwXWtxzTIOyreriAAKY5se8Z/fE1
|
||||||
|
FYQlsDlAfFZa5K8+4LiTLongzBJpjwRsWiTYNQxpEUv47jWJuO2DgD5/8+bG4P/F
|
||||||
|
n4OC6GP4odwWZZnga/rIrbYM0rl6pCHzKxg9nrwba0ZsbO6H0++Inii3TIHT9Nm1
|
||||||
|
vBCHUMvoW3DEWD6SB/fut8nNCamQKJwAHp8wl/OCJ8vUbwM0tTiaC7ymRdQXehSG
|
||||||
|
5kWf4tSNAz9QJGQPyn3qFehuD59/B7yMdlIAExKH/fHtUknpb/KNJx8aIRfxC58X
|
||||||
|
e9syXLvNO1XBpI3dl7QWGVLSErVNtWTO3RSywjhDL73rZVxY4fJvz63eo0T/bIHp
|
||||||
|
YdL7ThdTr+PbwcRvmJrJmYqzSzg6kDT+jIyV3vNvUCb/m3nSm41Z4cSGMCU/9/Nm
|
||||||
|
7eUJRnWdFOeEfOrn3TRrbNXDMerXRe/+ITO4K5Xc1AD9I8ILXM/K4QV9iQARAQAB
|
||||||
|
tBJ5dWRlanAgPGlAeXVkZS5qcD6JBUwEEwEIAzYCGwMFCQWjmoAFCwkIBwIGFQoJ
|
||||||
|
CAsCBBYCAwECHgECF4AWIQQ3RfJw206JdWsHYr7rD+XZJcSpaAUCYRmCYjsUgAAA
|
||||||
|
AAASACBwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL2Rldi50by95dWRlL29wZW5w
|
||||||
|
Z3AtMzkyZIMUgAAAAAASAGhwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL3d3dy5y
|
||||||
|
ZWRkaXQuY29tL3VzZXIveXVkZTExMTkvY29tbWVudHMvb253eHI2L29wZW5wZ3A0
|
||||||
|
ZnByMzc0NWYyNzBkYjRlODk3NTZiMDc2MmJlZWIwZmU1ZDkyNWM0YTk2Ly8UgAAA
|
||||||
|
AAASABRwcm9vZkBtZXRhY29kZS5iaXpkbnM6eXVkZS5qcD90eXBlPVRYVFMUgAAA
|
||||||
|
AAASADhwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL3R3aXR0ZXIuY29tL3l1ZGVf
|
||||||
|
dW5pdi9zdGF0dXMvMTQxNzI5ODQ4ODY5NDUwOTU4N1EUgAAAAAASADZwcm9vZkBt
|
||||||
|
ZXRhY29kZS5iaXpodHRwczovL3R3aXR0ZXIuY29tL3l1ZGVfanAvc3RhdHVzLzE0
|
||||||
|
MTcyOTc1MDYxNjIwMTIxNjBYFIAAAAAAEgA9cHJvb2ZAbWV0YWNvZGUuYml6aHR0
|
||||||
|
cHM6Ly9naXN0LmdpdGh1Yi5jb20veXVkZS80NmNkNDE3MWNjM2M3ZjZlNTQ1N2Vk
|
||||||
|
YWU2YzczMjJjMjYUgAAAAAASABtwcm9vZkBtZXRhY29kZS5iaXpodHRwczovL21z
|
||||||
|
dGRuLnl1ZGUuanAvQHl1ZGVRFIAAAAAAEgA2cHJvb2ZAbWV0YWNvZGUuYml6aHR0
|
||||||
|
cHM6Ly90d2l0dGVyLmNvbS95dWRlX1JUL3N0YXR1cy8xNDE3Mjk4NTAxOTQwMTE3
|
||||||
|
NTA2PxSAAAAAABIAJHByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vZ2l0bGFiLmNv
|
||||||
|
bS95dWRlL2dpdGxhYl9wcm9vZj8UgAAAAAASACRwcm9vZkBtZXRhY29kZS5iaXpo
|
||||||
|
dHRwczovL2dpdC55dWRlLmpwL3l1ZGUvZ2l0ZWFfcHJvb2YACgkQ6w/l2SXEqWjY
|
||||||
|
BxAAtMXaDLJCq9qzP6jPs22R+LXM99Pmtf3QiJ/a9qa8L+qJBT2g7mXqlQGXBBy2
|
||||||
|
N0VY+IeTvNHc9hvuKrUVBLxOy7YWnf3D7jPlfttDQrQWVcvtn0//DwCf84Bzl+VC
|
||||||
|
NzB5Fc9FYP+qUv5d4+lsNaRcrO+L1Fr6HWcFDMeb6uKWEoFtKLLVVhrkGAbLOR2H
|
||||||
|
CAmJyspU4Zuw2vo/Cx5TE3IotGXidjYQXt50q0WxbggWYdRsS1E+gS7dMTaS/8+O
|
||||||
|
wcWb0/6QGR1U45gF6BVpF+IwGXGZRHvWykZ9e3xZx5OdjbsC0QRk2b0nxp/c1qN8
|
||||||
|
Ua1L3HurIqqr+yWuLae2DB6hgrpJEi2HwM6uj0LAVgkNG2EMv3cky1+nOsa5xzGy
|
||||||
|
t7OjUKAXX+XHnT2HRSlhET/e3Gqw4VFnTD876CbEPfbJ5aR5jB1lWKcMujiDsg35
|
||||||
|
E/pNkkeLpEy4D6+pZLt8+k+KDNwCazjzNil6aFm4ogSKRH5vmfaJyObLGqChD1bb
|
||||||
|
TfkJXzfIacYzf1L1KjNCLCPyxxUrjzyxHZZRAPm+bg7h494EM4hDoRevWJNdnm2C
|
||||||
|
GQlcZGI7pF4StQR+YkisgaLYBUyAjuerWaMrXp8NWYPdeJEeqDjTxmJyFZRRCVKR
|
||||||
|
CPq0IgEOOkdl1lgQxYEroFlvSgwWoJBNTTFu+LDg6ZuBwMa5Ag0EYEW0ggEQAN0h
|
||||||
|
PmgU7XV0dRqJ1/Mb1WpnnXsshVr3SGZoqUn4XVMRWEhLc3xzp3tLMPqCytLMddAF
|
||||||
|
rBaBItuOA+yE9w5Yqpt9Z1axrqA6TqzHbCBUPhacynPmS5VcnsZDOF/P67s1y0/L
|
||||||
|
RX6idF94ElEYgc1KAzj1wD5Q1bW2yIQUzjhgkDFhZOY4nqbSfg6NDbGQo3coquMs
|
||||||
|
YcLdnEBwPq95WSns62hr4naohMRalbFZDt+BydWvv8XoT2RkoQnWN35+332rUlu6
|
||||||
|
HECBtI+RBVtVwKWGymY8GFcSau20j+4JseSla6iA2XeXi9rN4Kj03n0Nx2L4NOAP
|
||||||
|
W0XfzlpFBBzhcthgJ8ahspIf9z+fvQbBQ9v9xq15/nj5sqLSBN6SZP1Q9ykXM63/
|
||||||
|
HzxSFTDUVyC3OFvS+FsVU08oG/QzfjHp4MWr1zVhAaLBZxDZt7nw5osec+/OgiAm
|
||||||
|
Tt9HU5UiUfbfa5nQEHMapOD/r0HJu5RFA3EHMmmr9Es63OKcNrCfrZzy3b/4mv0h
|
||||||
|
J3sDulsvgu1GSinI0oubU1OJ+l+hEPEvbV3B2xMm/m7anJUEa31GHuu5ZiZJSZZS
|
||||||
|
Hxa4m43X1mRfRnI8h4LNpXgGhm6wh+zO8xx4PztNPNq9zA+CYRlMTMI15xr78Ui6
|
||||||
|
eKzLE5/cliuPaP0CyHEEQNSxxsgk57mdO9xldoShABEBAAGJAjwEGAEIACYWIQQ3
|
||||||
|
RfJw206JdWsHYr7rD+XZJcSpaAUCYEW0ggIbDAUJBaOagAAKCRDrD+XZJcSpaGhO
|
||||||
|
D/0e8q1DCKQUud/BwfT6ELR488ojdIu9Jag0aGKul3qemnLnk3jSSoz5rNKHAemY
|
||||||
|
D6PUNeARU9Unksy88EJMB3GMlbnfrWwTEfMfE1eZSqntCo/xoL1mr013CZKMYlLT
|
||||||
|
K8J0oC5Y3ENi24R5BZIpsAnnqL3L6iPtuTRVkHMYpFgHgWnxRNqpdqbtXHu/1Z5l
|
||||||
|
XLhea7o6NF/Chrl73zTyI6qlrRftERVmyTB/TxbUFTAAXGoUO/Ag/rGt+uoLIjE3
|
||||||
|
usfeoc4KR4uqEKuVN/aLMNSrCYHPTZRltKK6w1XpdASIGFblnFzeT0xHHgI7xtmT
|
||||||
|
hyQPnHhyup9GHYqjj9J1A9BcvZh13gh5efnzEWfvSITpD3XALSRba5NhI3ex9Ene
|
||||||
|
UlKjlGYjxrgpSBtmk/pm6rYo+/YXZY62JhjMt+juBvhgQZQ9cpg003AMNnKY80/f
|
||||||
|
thpA+hR4xLPhAId7grWaAf5zdyqeKPBp+uAaJuf9Ii4VrR6rl0M+nHNLZR2mgN90
|
||||||
|
2z2nvKiGpMuMwLtelW86OAH3CZimx+kxbIO3yj0+mH8PvAKqTI1n5vT82124bLp6
|
||||||
|
avwOcnA246pF6S2k/VnfT8mhQwbUxwkKpvxoyvQDuqo5FcO2O19I6o8EakE8Iruo
|
||||||
|
6hJACt4WXbzR3gPBmptL32eJlo99ZV1gvY4Sy69EAtw2kg==
|
||||||
|
=dc5x
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
File renamed without changes.
@@ -0,0 +1 @@
|
|||||||
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfEH46roc6pn97+Bi0UxWaeogvN38U5/7W+s2TWAQfpE8gv7ibFwZ5FVvHguT8BbCkK8YuXW7Oug1n8S6o3ABhUQD/zGIuEBLVKO6BTUYNDpYNxmmXKZ+dbB1nz++bvson8pYv/MdkeeeRrmqVgmrZzDifgBqYicGep+LKobhXvgCX6Qb9cHC9MCx+3mUzT0RhwwxEL/AsBm6f5oPJZdnF3agnOi61KA+wrK7RPU5v88HY5jHb87irFjNbc2xvyoLJmx+ILyKIcdsaADiTdy2JX5fqsO4S3WFELK+utw1MgBnGt0ENaev2Tce9r2QuUZQYNpa1+vAcdsc0qcR2W9wV
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"redirects": [
|
||||||
|
{ "source": "/wishlist", "destination": "https://www.amazon.jp/hz/wishlist/ls/8WTKCPWKOJ2N?ref_=wl_share" },
|
||||||
|
{ "source": "/scrapbox", "destination": "https://scrapbox.io/yude" }
|
||||||
|
]
|
||||||
|
}
|
||||||
Loaded 100 of 101 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user