Compare commits
276 Commits
e2db2de68b
...
dependabot
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8e1e6a6b4e | ||
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
|
|||
b20e9d6271
|
|||
97fdedc6ac
|
|||
291e83d732
|
|||
e94bf01439
|
|||
7da9e16b63 | |||
![]() |
8f58012cdb | ||
0d21be23a1
|
|||
8b4bce6251
|
|||
13601e4f28
|
|||
e2fd1f603c
|
|||
12052f7aba
|
|||
157da46a07
|
|||
998fe67c15
|
|||
6e065045ad
|
|||
0eecba7c88
|
|||
518a2bc6ef
|
|||
2b18f5f759
|
|||
32f41aae32
|
|||
50ee7f1bb6
|
|||
870b970e00
|
|||
20b4f9b122 | |||
65d075fb76
|
|||
b73c38a531
|
|||
2921bbeca1
|
|||
81b9b82028
|
|||
1bd8eab491
|
|||
5009e95433
|
|||
![]() |
8f8fdacbfd | ||
c00d4f60a9
|
|||
09184f93df
|
|||
fb1d20dd96
|
|||
c14961d1d2
|
|||
e7fb45a544
|
|||
f107f658c9
|
|||
35f1a49162
|
|||
78615ee324
|
|||
52bedbd4c6
|
|||
89ca9e55ed | |||
![]() |
0a3c9daac4 | ||
c98b17938f
|
|||
72b2043164
|
|||
e2fe3cd998
|
|||
0a6341f2df
|
|||
f8b4f7a20a
|
|||
adfa4106e2
|
|||
970d9cf352
|
|||
94f6c60f23
|
|||
7f229336bd
|
|||
5ccf701795
|
|||
ca8dcf7cf5
|
|||
36d18de96d
|
|||
68679ca4e8
|
|||
cb460b9b7f
|
|||
636863883a
|
|||
40c98e4c1f
|
|||
4e5eda745b
|
|||
290ece6aba
|
|||
8d2673ce02
|
|||
02aa9e97e1
|
|||
6d28753dd7
|
|||
62925709f8
|
|||
d7099acd8b
|
|||
a52d5a2074
|
|||
8406afaa29
|
|||
48fc60bd07
|
|||
3dd345c10f
|
|||
557ff11a82
|
|||
a1605c8970
|
|||
ccfd1761cc
|
|||
b532bb04d3
|
|||
3400be0357
|
|||
c8c40d1257
|
|||
e7d9336a3d
|
|||
bb550f8185
|
|||
ef9e13b66b
|
|||
3948147d64
|
|||
d1d057cc84
|
|||
3ff7368f06
|
|||
ca6c94090c
|
|||
d402ec85c2
|
|||
bb88dd6a02
|
|||
622d43554f
|
|||
8b3a484d08
|
|||
e7643e30a8
|
|||
cd93e4691d
|
|||
32064d4ba2
|
|||
ebf88ba96b
|
|||
dc8ccde80c
|
|||
04abc7d4bf
|
|||
9ad8943b6d
|
|||
ff919b2999
|
|||
019bf3c4ad
|
|||
8ad79231a2
|
|||
88e7a6abf9
|
|||
9f2e0cc407
|
|||
c33cebd4c1
|
|||
52a21e952b
|
|||
11073186de
|
|||
37ac2d2f7a
|
|||
d41215438b
|
|||
92060aeade
|
|||
9ad748affa
|
|||
2e4456cb91
|
|||
12408fbc52
|
|||
cd574f0cc9
|
|||
a787f8d805
|
|||
b65e165ac4
|
|||
ad8fa9d69d
|
|||
44493605fd
|
8
.eslintrc.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
4
.gitignore
vendored
@@ -10,3 +10,7 @@ dist
|
|||||||
yarn-error.log
|
yarn-error.log
|
||||||
.vimrc~
|
.vimrc~
|
||||||
..vimrc.un~
|
..vimrc.un~
|
||||||
|
.env.local
|
||||||
|
out
|
||||||
|
.vercel
|
||||||
|
.DS_Store
|
||||||
|
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"git.ignoreLimitWarning": true
|
||||||
|
}
|
10
README.md
@@ -2,12 +2,12 @@
|
|||||||

|

|
||||||
<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"/>\
|
||||||
Front page 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
|
||||||
* To setup your repository, please run `yarn`.
|
1. Run `yarn` to install dependencies.
|
||||||
* To view this website in your computer, please run `yarn dev`.
|
2. Run `yarn dev` to serve.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
This repository is licensed under the MIT License.
|
This repository is provided under the MIT License.
|
||||||
|
17
docs/hcunews/en.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
This is **unofficial** account and there's no guarantee of accuracy.
|
||||||
|
|
||||||
|
# Administrator
|
||||||
|
Run by [yude](https://yude.jp/profile), a student of Faculty of Information Science, Hiroshima City University, 2nd grade.
|
||||||
|
## Contact
|
||||||
|
* E-mail: [admin@yude.jp](mailto:admin@yude.jp)
|
||||||
|
* Twitter: [@yude_jp](https://twitter.com/yude_jp)
|
||||||
|
|
||||||
|
# How it works
|
||||||
|
Microsoft Power Automate get the RSS feed from Hiroshima City University Website and tweet when a new article is available. \
|
||||||
|
We are monitoring the following URLs:
|
||||||
|
* [お知らせ|広島市立大学](https://www.hiroshima-cu.ac.jp/news/)
|
||||||
|
* [お知らせ(在学生・保護者の方へ)|広島市立大学](https://www.hiroshima-cu.ac.jp/news_student/)
|
||||||
|
* [在学生・保護者の方へ|広島市立大学](https://www.hiroshima-cu.ac.jp/student/)
|
||||||
|
|
||||||
|
# Related links
|
||||||
|
* [広島市立大学](https://www.hiroshima-cu.ac.jp/)
|
16
docs/hcunews/ja.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
このアカウントは**非公式**アカウントです。また、内容を保証するものではありません。
|
||||||
|
|
||||||
|
# 連絡先
|
||||||
|
広島市立大学 情報科学部 2年の [yude](https://yude.jp/profile) が管理しています。このアカウントについての連絡は下記までお願いします。
|
||||||
|
* 電子メール: [admin@yude.jp](mailto:admin@yude.jp)
|
||||||
|
* Twitter: [@yude_jp](https://twitter.com/yude_jp)
|
||||||
|
|
||||||
|
# 仕組み
|
||||||
|
Microsoft Power Automate によって広島市立大学 Web ページの RSS フィードを取得し、新しい記事が投稿されている場合にツイートします。\
|
||||||
|
次の URL を監視しています。
|
||||||
|
* [お知らせ|広島市立大学](https://www.hiroshima-cu.ac.jp/news/)
|
||||||
|
* [お知らせ(在学生・保護者の方へ)|広島市立大学](https://www.hiroshima-cu.ac.jp/news_student/)
|
||||||
|
* [在学生・保護者の方へ|広島市立大学](https://www.hiroshima-cu.ac.jp/student/)
|
||||||
|
|
||||||
|
# 関連リンク
|
||||||
|
* [広島市立大学](https://www.hiroshima-cu.ac.jp/)
|
35
docs/minecraft/en.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Rules
|
||||||
|
The following applies in addition to [yude.jp Terms of Service](https://yude.jp/tos):
|
||||||
|
* You can build your house / facility / etc. anywhere in the world.
|
||||||
|
* Don't troll.
|
||||||
|
* Don't cheat.
|
||||||
|
|
||||||
|
# Part of the list of available commands ()
|
||||||
|
* `/ll`: Switch the visibility of spawn checker.
|
||||||
|
* `/mvspawn`: Teleport to spawn point of the world you're in.
|
||||||
|
|
||||||
|
# Convenient functionalities
|
||||||
|
## Bulk destruction
|
||||||
|
You can destroy wood logs and ore blocks at once by destroying with sneaking.\
|
||||||
|
## Block protection
|
||||||
|
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. \
|
||||||
|

|
||||||
|
## Skills
|
||||||
|
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
|
||||||
|
## Shrine (by shirachan_1204)
|
||||||
|

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

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

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

|
34
docs/minecraft/ja.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# ルール
|
||||||
|
[yude.jp サービス利用規約](https://yude.jp/tos) に加えて、以下が適用されます。
|
||||||
|
* ワールドのどこであっても自由に建築することができます。
|
||||||
|
* トロール (荒らし) を行わないでください。
|
||||||
|
* チートを行わないでください。
|
||||||
|
# 主な使用可能なコマンドの一覧
|
||||||
|
* `/ll`: スポーンチェッカーの表示を切り替えます。
|
||||||
|
* `/mvspawn`: ワールドのスポーン地点へ転移します。
|
||||||
|
|
||||||
|
# 便利機能
|
||||||
|
## 一括破壊
|
||||||
|
木や鉱石ブロックをスニーク (しゃがむ) しながら破壊すると一括破壊できます。
|
||||||
|
## ブロックの保護
|
||||||
|
看板を画像のように貼り付けることで、チェストやドア、かまどなどを保護できます。\
|
||||||
|
複数行に渡ってプレイヤー ID を書くことで、共有ブロックを作ることもできます。\
|
||||||
|

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

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

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

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

|
14
docs/mutual/en.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Mutual links
|
||||||
|
Publishing the website whose links to yude.jp.
|
||||||
|
|
||||||
|
## Link listing
|
||||||
|
### カービィ★KIRBYの家 `https://exout.net/~kirby3ds/`
|
||||||
|
[](https://exout.net/~kirby3ds/)
|
||||||
|
|
||||||
|
### こーげんやさい `https://nona-takahara.github.io/`
|
||||||
|
[](https://nona-takahara.github.io/)
|
||||||
|
|
||||||
|
|
||||||
|
## To those who want to link yude.jp
|
||||||
|
Thank you! You can use the banner below to link this website.
|
||||||
|
[](https://yude.jp)
|
14
docs/mutual/ja.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# 相互リンク
|
||||||
|
この Web サイトをリンクしてくださっている方のページを掲載します。
|
||||||
|
|
||||||
|
## リンク一覧
|
||||||
|
### カービィ★KIRBYの家 `https://exout.net/~kirby3ds/`
|
||||||
|
[](https://exout.net/~kirby3ds/)
|
||||||
|
|
||||||
|
### こーげんやさい `https://nona-takahara.github.io/`
|
||||||
|
[](https://nona-takahara.github.io/)
|
||||||
|
|
||||||
|
|
||||||
|
## このサイトをリンクしてくださる方へ
|
||||||
|
ありがとうございます!以下のバナーを使用して、この Web サイトをリンクすることができます。
|
||||||
|
[](https://yude.jp)
|
23
docs/services/en.md
Normal file
@@ -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)
|
23
docs/services/ja.md
Normal file
@@ -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)
|
19
docs/tos/en.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# yude.jp Terms of Service
|
||||||
|
The following ToS apply to services running under the yude.jp domain.
|
||||||
|
|
||||||
|
## About service operation
|
||||||
|
Our services are run by yude for experimental purposes and there's no guarantee on them.\
|
||||||
|
Those may be suspended temporarily or permanently (e.g. for server maintenance) without any announcement.
|
||||||
|
|
||||||
|
## Prohibited actions
|
||||||
|
The actions listed below are prohibited on the service running under the yude.jp domain (especially on Mastodon instance).\
|
||||||
|
Our administrator or moderator may take some action against the violating user's account.
|
||||||
|
* Post images or movies for adults, or grotesque
|
||||||
|
* Violent language that deviates from common sense
|
||||||
|
* Chat spamming
|
||||||
|
* Cracking our server(s)
|
||||||
|
* Actions that the administrator or moderator deems inappropriate
|
||||||
|
In addition, the laws of Japan, where the server is running, apply.
|
||||||
|
|
||||||
|
## Misc
|
||||||
|
These ToS may be updated by the administrator without any announcement, but we will always notify you with in the Mastodon instance ([mstdn.yude.jp](https://mstdn.yude.jp)) or on our Twitter account ([@yudejp](https://twitter.com/yudejp) or [@yude_jp](https://twitter.com/yude_jp)).
|
@@ -16,23 +16,3 @@ yude が実験的に運用しており、完全に無保証で提供されるも
|
|||||||
|
|
||||||
## その他
|
## その他
|
||||||
この利用規約は管理者が利用者に対して了承を得ず更新することができますが、その際には必ず通知を Mastodon インスタンス内、または Twitter 上 ([@yudejp](https://twitter.com/yudejp) または [@yude_jp](https://twitter.com/yude_jp)) において行うものとします。
|
この利用規約は管理者が利用者に対して了承を得ず更新することができますが、その際には必ず通知を Mastodon インスタンス内、または Twitter 上 ([@yudejp](https://twitter.com/yudejp) または [@yude_jp](https://twitter.com/yude_jp)) において行うものとします。
|
||||||
|
|
||||||
# yude.jp Terms of Service
|
|
||||||
The following ToS apply to services running under the yude.jp domain.
|
|
||||||
|
|
||||||
## About service operation
|
|
||||||
Our services are run by yude for experimental purposes and there's no guarantee on them.\
|
|
||||||
Those may be suspended temporarily or permanently (e.g. for server maintenance) without any announcement.
|
|
||||||
|
|
||||||
## Prohibited actions
|
|
||||||
The actions listed below are prohibited on the service running under the yude.jp domain (especially on Mastodon instance).\
|
|
||||||
Our administrator or moderator may take some action against the violating user's account.
|
|
||||||
* Post images or movies for adults, or grotesque
|
|
||||||
* Violent language that deviates from common sense
|
|
||||||
* Chat spamming
|
|
||||||
* Cracking our server(s)
|
|
||||||
* Actions that the administrator or moderator deems inappropriate
|
|
||||||
In addition, the laws of Japan, where the server is running, apply.
|
|
||||||
|
|
||||||
## Misc
|
|
||||||
These ToS may be updated by the administrator without any announcement, but we will always notify you with in the Mastodon instance ([mstdn.yude.jp](https://mstdn.yude.jp)) or on our Twitter account ([@yudejp](https://twitter.com/yudejp) or [@yude_jp](https://twitter.com/yude_jp)).
|
|
12
i18n.json
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"locales": ["en", "ja"],
|
|
||||||
"defaultLocale": "ja",
|
|
||||||
"pages": {
|
|
||||||
"*": ["common"],
|
|
||||||
"/": ["index", "common"],
|
|
||||||
"/profile": ["profile", "common"],
|
|
||||||
"/status": ["status", "common"],
|
|
||||||
"/house": ["house", "common"],
|
|
||||||
"/tos": ["tos", "common"]
|
|
||||||
}
|
|
||||||
}
|
|
12
i18n/index.js
Normal file
@@ -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;
|
67
i18n/translations.en.json
Normal file
@@ -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"
|
||||||
|
}
|
67
i18n/translations.ja.json
Normal file
@@ -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,6 +0,0 @@
|
|||||||
{
|
|
||||||
"footer": "This page is licensed under the MIT License.",
|
|
||||||
"source": "Source code",
|
|
||||||
"tos": "yude.jp Terms of Service",
|
|
||||||
"yes_playing": "Playing {{playing}}"
|
|
||||||
}
|
|
@@ -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,24 +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",
|
|
||||||
"more": "More...",
|
|
||||||
"grade": "B2",
|
|
||||||
"icon_1": "Icon: ",
|
|
||||||
"icon_2": "",
|
|
||||||
"keys": "Public keys",
|
|
||||||
"download": "Download",
|
|
||||||
"fingerprint": "Digital fingerprint",
|
|
||||||
"view": "View"
|
|
||||||
}
|
|
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"status": "Server Status",
|
|
||||||
"location": "Location",
|
|
||||||
"tottori": "Tottori, Japan",
|
|
||||||
"hiroshima": "Hiroshima, Japan",
|
|
||||||
"model": "Model"
|
|
||||||
}
|
|
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"tos": "yude.jp Terms of Service"
|
|
||||||
}
|
|
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"footer": "このページは MIT License の下でライセンスされています。",
|
|
||||||
"source": "ソースコード",
|
|
||||||
"tos": "yude.jp サービス利用規約",
|
|
||||||
"yes_playing": "{{playing}} をプレイ中"
|
|
||||||
}
|
|
@@ -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,24 +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": "所属",
|
|
||||||
"more": "さらに見る...",
|
|
||||||
"grade": "2年",
|
|
||||||
"icon_1": "アイコン: ",
|
|
||||||
"icon_2": "さん",
|
|
||||||
"keys": "公開鍵",
|
|
||||||
"download": "ダウンロード",
|
|
||||||
"fingerprint": "電子指紋",
|
|
||||||
"view": "閲覧"
|
|
||||||
}
|
|
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"status": "サーバー情報",
|
|
||||||
"location": "場所",
|
|
||||||
"tottori": "日本, 鳥取県",
|
|
||||||
"hiroshima": "日本, 広島県",
|
|
||||||
"model": "モデル"
|
|
||||||
}
|
|
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"tos": "yude.jp サービス利用規約"
|
|
||||||
}
|
|
13
next-seo.config.js
Normal file
@@ -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',
|
||||||
|
},
|
||||||
|
};
|
@@ -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'],
|
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,
|
||||||
|
}
|
53
package.json
@@ -4,10 +4,11 @@
|
|||||||
"description": "Front page of yude.jp",
|
"description": "Front page of yude.jp",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next -p 30221",
|
"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,32 +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",
|
||||||
"next": "^10.2.2",
|
"axios": "^0.21.4",
|
||||||
"next-themes": "^0.0.14",
|
"date-fns": "^2.24.0",
|
||||||
"next-translate": "^1.0.7",
|
"moment": "^2.29.4",
|
||||||
|
"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",
|
||||||
"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",
|
||||||
"tailwindcss": "^2.1.2",
|
"swr": "^1.0.1",
|
||||||
|
"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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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>
|
||||||
);
|
);
|
||||||
|
38
pages/components/Discord/DiscordPlaying.js
Normal file
@@ -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 <></>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
46
pages/components/Discord/DiscordStatus.js
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
// React
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
// Data fetching
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
const App = () => {
|
||||||
|
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();
|
||||||
|
}, []);
|
||||||
|
const str = JSON.stringify(data)
|
||||||
|
let status = 0
|
||||||
|
if (str.indexOf("status") !== -1){
|
||||||
|
status = data.members && data.members[0].status;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="z-50 w-6 transform translate-y-3/4 -translate-x-full">
|
||||||
|
{
|
||||||
|
(() => {
|
||||||
|
if (status == 0) {
|
||||||
|
return <div className="text-gray-700 rounded-full bg-gray-500 flex w-6 h-6"></div>
|
||||||
|
}else{
|
||||||
|
if (status == "online"){
|
||||||
|
return <div className="text-green-700 rounded-full bg-green-500 flex w-6 h-6"></div>
|
||||||
|
} else if (status == "idle"){
|
||||||
|
return <div className="text-yellow-700 rounded-full bg-green-500 flex w-6 h-6"></div>
|
||||||
|
} else {
|
||||||
|
return <div className="text-yellow-700 rounded-full bg-red-500 flex w-6 h-6"></div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
@@ -1,27 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
|
|
||||||
const url = "https://discord.com/api/guilds/723409709306216498/widget.json";
|
|
||||||
const App = () => {
|
|
||||||
const router = useRouter()
|
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
const { t, lang } = useTranslation("common")
|
|
||||||
|
|
||||||
const [playing, setPlaying] = React.useState(0);
|
|
||||||
React.useEffect(() => {
|
|
||||||
fetch(url)
|
|
||||||
.then((r) => r.json())
|
|
||||||
.then((j) => setPlaying(j.members[0].game.name))
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const yes_playing = t('yes_playing', {playing: playing})
|
|
||||||
const no_playing = t('no_playing')
|
|
||||||
if (playing){
|
|
||||||
return <p>{yes_playing}</p>
|
|
||||||
}else{
|
|
||||||
return <p> </p>
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export default App;
|
|
@@ -1,27 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
|
|
||||||
const url = "https://discord.com/api/guilds/723409709306216498/widget.json";
|
|
||||||
const App = () => {
|
|
||||||
const [status, setStatus] = React.useState(0);
|
|
||||||
React.useEffect(() => {
|
|
||||||
fetch(url)
|
|
||||||
.then((r) => r.json())
|
|
||||||
.then((j) => setStatus(j.members[0].status))
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
if (status === "online") {
|
|
||||||
return <div className="font-bold text-gray-700 rounded-full bg-green-500 flex w-5 h-5 items-center justify-center"></div>
|
|
||||||
}else{
|
|
||||||
if (status === "idle") {
|
|
||||||
return <div className="font-bold text-gray-700 rounded-full bg-yellow-500 flex w-5 h-5 items-center justify-center"></div>
|
|
||||||
}else{
|
|
||||||
if (status === "dnd") {
|
|
||||||
return <div className="font-bold text-gray-700 rounded-full bg-red-500 flex w-5 h-5 items-center justify-center"></div>
|
|
||||||
}else{
|
|
||||||
return <div className="font-bold text-gray-700 rounded-full bg-gray-500 flex w-5 h-5 items-center justify-center"></div>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export default App;
|
|
@@ -1,29 +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")
|
|
||||||
const footer = t('footer')
|
|
||||||
const source = t('source')
|
|
||||||
const tos = t('tos')
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div className="container mx-auto px-6">
|
|
||||||
<div className="mt-16 flex flex-col items-center">
|
|
||||||
<div className="sm:w-full text-center py-6">
|
|
||||||
<p className="text-sm font-bold mb-2">
|
|
||||||
{footer} / <Link href="https://github.com/yudejp/yude.jp"><a className="hover:underline">{source}</a></Link>
|
|
||||||
</p>
|
|
||||||
<p className="text-sm font-bold mb-2">
|
|
||||||
<Link href="/tos"><a className="hover:underline">{tos}</a></Link>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
26
pages/components/Footer/Footer.js
Normal file
@@ -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>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
20
pages/components/Footer/HappyBusy.js
Normal file
@@ -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,12 +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 { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
|
||||||
const Dropdown = ({ color }) => {
|
const Dropdown = ({ color }) => {
|
||||||
const router = useRouter()
|
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
|
|
||||||
// dropdown props
|
// dropdown props
|
||||||
const [dropdownPopoverShow, setDropdownPopoverShow] = React.useState(false);
|
const [dropdownPopoverShow, setDropdownPopoverShow] = React.useState(false);
|
||||||
const btnDropdownRef = React.createRef();
|
const btnDropdownRef = React.createRef();
|
||||||
@@ -28,8 +30,8 @@ const Dropdown = ({ color }) => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|
||||||
<div className="text-left mr-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 shadow-sm px-4 py-2 bg-white text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 focus:ring-indigo-500" 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={() => {
|
||||||
@@ -38,20 +40,20 @@ const Dropdown = ({ color }) => {
|
|||||||
: openDropdownPopover();
|
: openDropdownPopover();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
言語 / Languages
|
<FontAwesomeIcon icon={faLanguage} size="3x" />
|
||||||
<svg className="-mr-1 ml-2 h-5 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"}>
|
(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-900" 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-900" 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,31 +1,31 @@
|
|||||||
|
// 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 />
|
||||||
<div className="page-main">
|
<div className="max-w-2xl mx-auto">
|
||||||
|
<div className="mx-2">
|
||||||
{children}
|
{children}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Footer />
|
<Footer />
|
||||||
</main>
|
</main>
|
||||||
|
21
pages/components/Menu/FontAwesomeMenu.js
Normal file
@@ -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
|
24
pages/components/Menu/MinecraftMenu.js
Normal file
@@ -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
|
64
pages/components/Minecraft.js
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
// React
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
export default function Minecraft(props) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
const [data, setData] = useState({ hits: [] });
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchData = async () => {
|
||||||
|
const result = await axios(
|
||||||
|
'https://api.mcsrvstat.us/2/yude.jp',
|
||||||
|
);
|
||||||
|
setData(result.data);
|
||||||
|
};
|
||||||
|
fetchData();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
if (data === undefined){
|
||||||
|
console.log("[Minecraft Query] データの取得に失敗しました。 / Failed to retrieve data.")
|
||||||
|
return (
|
||||||
|
<p>{t('fail')}</p>
|
||||||
|
)
|
||||||
|
}else{
|
||||||
|
const status = data.online
|
||||||
|
const player = data.players && data.players.online
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="text-center">
|
||||||
|
{(() => {
|
||||||
|
if (status == true) {
|
||||||
|
if (player == undefined || player == 0) {
|
||||||
|
return <span>{t('no_one')}</span>
|
||||||
|
} else {
|
||||||
|
return <span>{t('playing', {count: player})}</span>
|
||||||
|
}}else if (status == false) {
|
||||||
|
return <span>{t('offline')}</span>
|
||||||
|
}else {
|
||||||
|
return <span>{t('loading')}</span>
|
||||||
|
}
|
||||||
|
})()}
|
||||||
|
|
||||||
|
{(() => {
|
||||||
|
if (data.players && data.players.list){
|
||||||
|
var list = [];
|
||||||
|
var url = [];
|
||||||
|
for (var i in data.players.list){
|
||||||
|
url.push('https://mc-heads.net/avatar/' + data.players.list[i])
|
||||||
|
}
|
||||||
|
for (var i in url){
|
||||||
|
list.push(<img src={url[i]} key={i} className="inline" height="50" width="50" alt={i}/>)
|
||||||
|
}
|
||||||
|
return <div>{list}</div>
|
||||||
|
}
|
||||||
|
})()}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
33
pages/components/Minecraft/Biography.js
Normal file
@@ -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;
|
30
pages/components/Minecraft/Group.js
Normal file
@@ -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;
|
15
pages/components/Minecraft/Head.js
Normal file
@@ -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;
|
65
pages/components/Minecraft/LastPlayed.js
Normal file
@@ -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;
|
44
pages/components/Minecraft/Online.js
Normal file
@@ -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;
|
38
pages/components/Minecraft/PlayerName.js
Normal file
@@ -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;
|
39
pages/components/Minecraft/PlayerNameHolder.js
Normal file
@@ -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;
|
25
pages/components/Minecraft/Players.js
Normal file
@@ -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;
|
9
pages/components/Minecraft/WrongUUID.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
function App (props) {
|
||||||
|
return (
|
||||||
|
<div className="text-center">
|
||||||
|
<h2>入力された UUID またはプレイヤー名に該当するプレイヤーが見つかりませんでした。</h2>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
@@ -1,20 +1,31 @@
|
|||||||
|
// 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 mr-4'>
|
<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
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
<div className="origin-top-right absolute right-0">
|
<div className="absolute right-0">
|
||||||
<ThemeSelector />
|
<ThemeSelector />
|
||||||
<LangSelector />
|
<LangSelector />
|
||||||
</div>
|
</div>
|
||||||
|
23
pages/components/Profile/Button.js
Normal file
@@ -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
|
21
pages/components/Profile/Contact.js
Normal file
@@ -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
|
35
pages/components/Profile/NintendoSW.js
Normal file
@@ -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
|
91
pages/components/Profile/PublicKeys.js
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
// React
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// Font Awesome
|
||||||
|
import { faKey, faEye, faDownload } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
|
|
||||||
|
// Next.js
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
export default function Modal() {
|
||||||
|
const [showModal, setShowModal] = React.useState(false);
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<button
|
||||||
|
className="bg-pink-600 text-white active:bg-pink-600 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"
|
||||||
|
onClick={() => setShowModal(true)}
|
||||||
|
>
|
||||||
|
<FontAwesomeIcon icon={faKey} className="w-5 h-5 inline"/> {t('keys')}
|
||||||
|
</button>
|
||||||
|
{showModal ? (
|
||||||
|
<>
|
||||||
|
<div
|
||||||
|
className="justify-center items-center flex overflow-x-hidden overflow-y-auto fixed inset-0 z-50 outline-none focus:outline-none"
|
||||||
|
>
|
||||||
|
<div className="relative mx-auto w-4/5 max-h-1/2 -mt-96 max-w-3xl">
|
||||||
|
{/* Modal content */}
|
||||||
|
<div className="border-0 rounded-lg shadow-lg relative flex flex-col w-full bg-white outline-none focus:outline-none">
|
||||||
|
{/* Modal body */}
|
||||||
|
<div className="relative p-2 flex-auto text-black text-left">
|
||||||
|
|
||||||
|
<p className="text-2xl"><FontAwesomeIcon icon={faKey} className="w-5 h-5 inline"/> {t('keys')}</p>
|
||||||
|
<ul className="list-disc my-2">
|
||||||
|
<li>
|
||||||
|
<span className="font-bold">PGP </span>
|
||||||
|
<Link href="/yudejp.gpg">
|
||||||
|
<a className="hover:underline">
|
||||||
|
<FontAwesomeIcon icon={faDownload} className="w-5 h-5 inline"/>
|
||||||
|
{t('download')}
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
<p>{t('fingerprint')}:</p>
|
||||||
|
<div className="overflow-x-auto">
|
||||||
|
<div className="whitespace-nowrap">
|
||||||
|
<code>3745 F270 DB4E 8975 6B07 62BE EB0F E5D9 25C4 A968</code>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span className="font-bold">SSH </span>
|
||||||
|
<Link href="https://github.com/yude.keys">
|
||||||
|
<a className="hover:underline">
|
||||||
|
<FontAwesomeIcon icon={faEye} className="w-5 h-5 inline"/>
|
||||||
|
{t('view')}
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
<p>{t('fingerprint')}:</p>
|
||||||
|
<div className="overflow-x-auto">
|
||||||
|
<div className="whitespace-nowrap">
|
||||||
|
<code>2048 SHA256:xwSL4DORWmroWdC6P0GU1m1yZl/cXqjo9rCCWqqO+Dc</code>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{/* Modal footer for close button */}
|
||||||
|
<div className="flex items-center justify-end p-6 border-t border-solid border-blueGray-200 rounded-b">
|
||||||
|
<button
|
||||||
|
className="text-red-500 background-transparent font-bold uppercase px-6 py-2 text-sm outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
||||||
|
type="button"
|
||||||
|
onClick={() => setShowModal(false)}
|
||||||
|
>
|
||||||
|
{t('close')}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
) : null}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
37
pages/components/Profile/Spotify.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
// React
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
// Data fetching
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
|
function App () {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
|
const [data, setData] = useState({ hits: [] });
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchData = async () => {
|
||||||
|
const result = await axios(
|
||||||
|
'https://vercel-spotify-api.vercel.app/api/Spotify',
|
||||||
|
);
|
||||||
|
setData(result.data);
|
||||||
|
};
|
||||||
|
fetchData();
|
||||||
|
}, []);
|
||||||
|
if (data === undefined){
|
||||||
|
console.log("[Spotify Web API] データの取得に失敗しました。 / Failed to retrieve data.")
|
||||||
|
return <p></p>
|
||||||
|
}else{
|
||||||
|
if (data.isPlaying){
|
||||||
|
const status = data.artist + ' / ' + data.title
|
||||||
|
return <p>{t('listening', {listening: status})}</p>
|
||||||
|
}else{
|
||||||
|
return <></>
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
53
pages/components/Profile/WakaTime.js
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
// React
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
// Font Awesome
|
||||||
|
import { faUserClock } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation } from 'next-export-i18n';
|
||||||
|
|
||||||
|
export default function Modal() {
|
||||||
|
const [showModal, setShowModal] = React.useState(false);
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<button
|
||||||
|
className="bg-pink-600 text-white active:bg-pink-600 font-bold text-sm px-6 py-3 rounded hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
||||||
|
type="button"
|
||||||
|
onClick={() => setShowModal(true)}
|
||||||
|
>
|
||||||
|
<FontAwesomeIcon icon={faUserClock} className="w-5 h-5 inline"/> WakaTime
|
||||||
|
</button>
|
||||||
|
{showModal ? (
|
||||||
|
<>
|
||||||
|
<div
|
||||||
|
className="justify-center items-center flex overflow-x-hidden overflow-y-auto fixed inset-0 z-50 outline-none focus:outline-none"
|
||||||
|
>
|
||||||
|
<div className="relative mx-auto w-4/5 max-h-1/2 -mt-96 max-w-3xl">
|
||||||
|
{/* Modal content */}
|
||||||
|
<div className="border-0 rounded-lg shadow-lg relative flex flex-col w-full bg-white outline-none focus:outline-none">
|
||||||
|
{/* Modal body */}
|
||||||
|
<div className="relative p-2 flex-auto">
|
||||||
|
<figure><embed src="https://wakatime.com/share/@yude/6f15075a-b9d5-464a-8b4f-545d31933dfb.svg"></embed></figure>
|
||||||
|
</div>
|
||||||
|
{/* Modal footer for close button */}
|
||||||
|
<div className="flex items-center justify-end p-6 border-t border-solid border-blueGray-200 rounded-b">
|
||||||
|
<button
|
||||||
|
className="text-red-500 font-bold uppercase px-6 py-2 text-sm outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
||||||
|
type="button"
|
||||||
|
onClick={() => setShowModal(false)}
|
||||||
|
>
|
||||||
|
{t('close')}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
) : null}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
@@ -1,17 +1,12 @@
|
|||||||
import Head from "next/head"
|
|
||||||
import Link from "next/link"
|
|
||||||
import "tailwindcss/tailwind.css";
|
import "tailwindcss/tailwind.css";
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
import { useRouter } from 'next/router'
|
import { useRouter } from 'next/router'
|
||||||
import React, { useEffect, useState } from 'react'
|
import React, { useEffect, useState } from 'react'
|
||||||
import { useTheme } from "next-themes";
|
import { useTheme } from "next-themes";
|
||||||
|
import { faMoon, faSun } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
|
|
||||||
const Layout = (props) => {
|
const ThemeSelector = (props) => {
|
||||||
const { title, children } = props
|
const { title, children } = props
|
||||||
const siteTitle = "yude.jp"
|
|
||||||
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(() => {
|
||||||
@@ -23,13 +18,13 @@ const Layout = (props) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<button className="my-4 mx-3 text-2xl" onClick={switchTheme}>
|
<button className="inline-flex rounded-md border border-gray-300 dark:border-gray-800 shadow-sm px-2 bg-white font-medium text-gray-700 hover:bg-gray-50 dark:bg-gray-700 dark:text-white my-3 py-1 text-2xl focus:outline-none" onClick={switchTheme}>
|
||||||
{theme === 'light' ? (
|
{theme !== undefined && (theme === "light" ? (
|
||||||
<span>🌙</span>
|
<FontAwesomeIcon icon={faMoon} className="w-10 h-7" />
|
||||||
) : (
|
) : (
|
||||||
<span>🌄</span>
|
<FontAwesomeIcon icon={faSun} className="w-10 h-7" />
|
||||||
)}
|
))}
|
||||||
</button>
|
</button>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
export default Layout
|
export default ThemeSelector
|
40
pages/hcunews.js
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
// Base layout
|
||||||
|
import Layout from "./components/Layout"
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// React
|
||||||
|
import React from "react"
|
||||||
|
import ReactMarkdown from "react-markdown"
|
||||||
|
|
||||||
|
// Markdown
|
||||||
|
import gfm from 'remark-gfm';
|
||||||
|
import ja from '../docs/hcunews/ja.md'
|
||||||
|
import en from '../docs/hcunews/en.md'
|
||||||
|
|
||||||
|
export default function HcuNews() {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
|
if (!query) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
|
<Layout title={t('hcunews')}>
|
||||||
|
<div>
|
||||||
|
<h1>{t('hcunews')}</h1>
|
||||||
|
{query["lang"] === 'ja' ? (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{ja}
|
||||||
|
</ReactMarkdown>
|
||||||
|
) : (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{en}
|
||||||
|
</ReactMarkdown>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@@ -1,18 +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")
|
|
||||||
const house = t('house')
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout title={house}>
|
<Layout title={t('house')}>
|
||||||
<div className="mx-9">
|
<div>
|
||||||
<p className="my-2 text-3xl text-center">{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>
|
||||||
)
|
)
|
||||||
|
112
pages/index.js
@@ -1,60 +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 } 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 { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
// Translation
|
if (!query) {
|
||||||
const router = useRouter()
|
return <p>Loading...</p>
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
} else {
|
||||||
const { t, lang } = useTranslation("index")
|
|
||||||
const home = t('home')
|
|
||||||
const profile = t('profile')
|
|
||||||
const blog = t('blog')
|
|
||||||
const status = t('status')
|
|
||||||
const house = t('house')
|
|
||||||
const discord = t('discord')
|
|
||||||
const mastodon = t('mastodon')
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
<Layout title={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"
|
||||||
alt = "yude's avatar"
|
src = "/images/avatar_riru.png"
|
||||||
width = {200}
|
alt = "yude's avatar"
|
||||||
height = {200}
|
width = {200}
|
||||||
unoptimized = {true}
|
height = {200}
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Index menu */}
|
||||||
|
<div className="grid grid-cols-3 gap-10">
|
||||||
|
<FAMenu dest="/profile" query={query} icon={faUser} />
|
||||||
|
<FAMenu dest="/server" query={query} icon={faServer} />
|
||||||
|
<FAMenu dest="/services" query={query} icon={faScrewdriver} />
|
||||||
|
<FAMenu dest="https://discord.gg/X6srY7X" icon={faDiscord} />
|
||||||
|
<FAMenu dest="https://github.com/yudejp" icon={faGithub} />
|
||||||
|
<FAMenu dest="https://git.yude.jp" icon={faGit} />
|
||||||
|
<MinecraftMenu query={query} />
|
||||||
|
<FAMenu dest="/mutual" icon={faHeart} query={query} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Banner */}
|
||||||
|
<div className="mx-auto mt-10">
|
||||||
|
<HappyBusy />
|
||||||
|
</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>
|
||||||
<div className="grid grid-cols-5 gap-10 max-w-xl mx-auto">
|
</Layout>
|
||||||
<div className="has-tooltip"><span className="tooltip rounded shadow-lg p-1 bg-yellow-600 transform translate-y-10 -translate-x-10">{profile}</span><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>
|
</>
|
||||||
<div className="has-tooltip"><span className="tooltip rounded shadow-lg p-1 bg-yellow-600 transform translate-y-10 -translate-x-9">{blog}</span><Link href="https://blog.yude.jp"><a><FontAwesomeIcon icon={faBlog} 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="has-tooltip"><span className="tooltip rounded shadow-lg p-1 bg-yellow-600 transform translate-y-10 -translate-x-12">{status}</span><Link href="/status"><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="has-tooltip"><span className="tooltip rounded shadow-lg p-1 bg-yellow-600 transform translate-y-10 -translate-x-5">{house}</span><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>
|
|
||||||
<div className="has-tooltip"><span className="tooltip rounded shadow-lg p-1 bg-yellow-600 transform translate-y-10 -translate-x-4">Scrapbox</span><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>
|
|
||||||
<div className="has-tooltip"><span className="tooltip rounded shadow-lg p-1 bg-yellow-600 transform translate-y-10 -translate-x-16">{discord}</span><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>
|
|
||||||
<div className="has-tooltip"><span className="tooltip rounded shadow-lg p-1 bg-yellow-600 transform translate-y-10 -translate-x-10">Spaces on Matrix</span><Link href="https://matrix.to/#/!oriLSKSTauvVrpdzZX:matrix.org?via=matrix.org"><a>
|
|
||||||
<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">
|
|
||||||
<g transform="translate(-.095 .005)">
|
|
||||||
<path d="m27.1 31.2v-30.5h-2.19v-0.732h3.04v32h-3.04v-0.732z"/>
|
|
||||||
<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"/>
|
|
||||||
<path d="m0.936 0.732v30.5h2.19v0.732h-3.04v-32h3.03v0.732z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
</a></Link></div>
|
|
||||||
<div className="has-tooltip"><span className="tooltip rounded shadow-lg p-1 bg-yellow-600 transform translate-y-10 -translate-x-16">GitHub Organization</span><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 className="has-tooltip"><span className="tooltip rounded shadow-lg p-1 bg-yellow-600 transform translate-y-10">Gitea</span><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 className="has-tooltip"><span className="tooltip rounded shadow-lg p-1 bg-yellow-600 transform translate-y-10 -translate-x-12">{mastodon}</span><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>
|
|
||||||
</div>
|
|
||||||
</Layout>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
102
pages/minecraft.js
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
// Base layout
|
||||||
|
import Layout from "./components/Layout"
|
||||||
|
|
||||||
|
// React Router etc.
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
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'
|
||||||
|
|
||||||
|
// Font Awesome
|
||||||
|
import { faMap, faCopy } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
|
|
||||||
|
// React Markdown
|
||||||
|
import ReactMarkdown from "react-markdown"
|
||||||
|
import gfm from 'remark-gfm';
|
||||||
|
import ja from '../docs/minecraft/ja.md'
|
||||||
|
import en from '../docs/minecraft/en.md'
|
||||||
|
|
||||||
|
// next-seo
|
||||||
|
import { NextSeo } from 'next-seo';
|
||||||
|
|
||||||
|
export default function About(props) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
|
// Copy server address to clipboard
|
||||||
|
const copyText = () => {
|
||||||
|
navigator.clipboard.writeText("yude.jp");
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!query) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<NextSeo
|
||||||
|
title="yude.jp Minecraft マルチプレイ"
|
||||||
|
description="yude.jp 上に設置されている Minecraft: Java Edition のマルチプレイサーバーについて"
|
||||||
|
/>
|
||||||
|
<Layout title={t('title')}>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<p className="my-2 text-3xl text-center">{t('title')}</p>
|
||||||
|
<div className="w-full">
|
||||||
|
<img
|
||||||
|
src = "/images/dynmap.png"
|
||||||
|
alt = "Minecraft brief world map generated by Dynmap"
|
||||||
|
width = {1354}
|
||||||
|
height = {619}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="text-center">
|
||||||
|
<Minecraft />
|
||||||
|
<p>
|
||||||
|
<span>{t('address')}: <code>yude.jp</code></span>
|
||||||
|
<button
|
||||||
|
className="bg-pink-600 text-white active:bg-pink-600 font-bold text-sm px-2 py-2 ml-2 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
||||||
|
type="button"
|
||||||
|
onClick={() => copyText()}
|
||||||
|
>
|
||||||
|
<FontAwesomeIcon icon={faCopy} className="w-5 h-5 inline"/>
|
||||||
|
</button>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>{t('version')}: 1.18.1</p>
|
||||||
|
|
||||||
|
<Link href="https://bluemap.yude.jp">
|
||||||
|
<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={faMap} className="w-5 h-5 inline"/> BlueMap
|
||||||
|
</button>
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Load markdown contents */}
|
||||||
|
{query["lang"] === 'ja' ? (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{ja}
|
||||||
|
</ReactMarkdown>
|
||||||
|
) : (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{en}
|
||||||
|
</ReactMarkdown>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
56
pages/minecraft/lookup/[ign].js
Normal file
@@ -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>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
59
pages/minecraft/players/[uuid].js
Normal file
@@ -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>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
49
pages/mutual.js
Normal file
@@ -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/mutual/ja.md'
|
||||||
|
import en from '../docs/mutual/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 と相互にリンクを貼っている Web サイトの一覧"
|
||||||
|
/>
|
||||||
|
<Layout title={t('mutual')}>
|
||||||
|
<div>
|
||||||
|
{query["lang"] === 'ja' ? (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{ja}
|
||||||
|
</ReactMarkdown>
|
||||||
|
) : (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{en}
|
||||||
|
</ReactMarkdown>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
325
pages/profile.js
@@ -1,208 +1,139 @@
|
|||||||
|
// 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, faKey, faDownload, faEye } 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'
|
|
||||||
|
|
||||||
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
|
||||||
const about = t('about')
|
import { faDiscord, faTwitter, faGithub, faKeybase, faInstagram, faMastodon, faSteam, faAmazon } from '@fortawesome/free-brands-svg-icons'
|
||||||
const desc = t('desc')
|
import { faEnvelope, faBirthdayCake, faMapPin, faSchool, faPhone, faBlog, faBookDead, faInfo, faBookmark, faLink, faMobile } from '@fortawesome/free-solid-svg-icons'
|
||||||
const school = t('school')
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
const contact = t('contact')
|
|
||||||
const location = t('location')
|
// Next.js, React
|
||||||
const belongs = t('belongs')
|
import Link from 'next/link'
|
||||||
const hiroshima = t('hiroshima')
|
|
||||||
const birth = t('birth')
|
// Discord
|
||||||
const date = t('date')
|
import DiscordStatus from './components/Discord/DiscordStatus'
|
||||||
const more = t('more')
|
import DiscordPlaying from './components/Discord/DiscordPlaying'
|
||||||
const grade = t('grade')
|
|
||||||
const icon_1 = t('icon_1')
|
// Custom component
|
||||||
const icon_2 = t('icon_2')
|
import Spotify from './components/Profile/Spotify'
|
||||||
const keys = t('keys')
|
import WakaTime from './components/Profile/WakaTime'
|
||||||
const download = t('download')
|
import PublicKeys from './components/Profile/PublicKeys'
|
||||||
const fingerprint = t('fingerprint')
|
import Button from './components/Profile/Button'
|
||||||
const view = t('view')
|
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 (
|
||||||
|
<>
|
||||||
<Layout title={about}>
|
<NextSeo
|
||||||
<div className="my-9 mx-8 text-center">
|
title="yude のプロフィール"
|
||||||
|
/>
|
||||||
{
|
<Layout title={t('about')}>
|
||||||
// Heading
|
<div className="text-center">
|
||||||
}
|
|
||||||
<div className="mb-5 flex justify-center">
|
{
|
||||||
|
// Heading
|
||||||
|
}
|
||||||
<div>
|
<div>
|
||||||
<div className="z-50 transform translate-x-40 translate-y-48">
|
<div className="flex mb-10 justify-center">
|
||||||
<DiscordStatus />
|
<img
|
||||||
</div>
|
className = "rounded-full hover:animate-rumble z-0 p-15"
|
||||||
<Image
|
src = "/images/avatar_mel.png"
|
||||||
className = "object-contain rounded-full hover:animate-rumble z-0"
|
alt = "yude's avatar"
|
||||||
src = "/static/images/avatar.png"
|
width = {200}
|
||||||
alt = "yude's avatar"
|
height = {200}
|
||||||
width = {200}
|
unoptimized = {true}
|
||||||
height = {200}
|
/>
|
||||||
unoptimized = {true}
|
<DiscordStatus />
|
||||||
/>
|
|
||||||
|
|
||||||
<p className="text-center text-4xl subpixel-antialiased">yude</p>
|
|
||||||
<DiscordPlaying />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{
|
|
||||||
// Description
|
|
||||||
}
|
|
||||||
<div className="container mx-auto max-w-3xl">
|
|
||||||
<div className="text-left">
|
|
||||||
<p className="text-2xl"><FontAwesomeIcon icon={faInfo} className="w-5 h-5 inline"/> {desc}</p>
|
|
||||||
</div>
|
|
||||||
<div className="my-2 text-left grid lg:grid-cols-3 md:grid-cols-2 sm:grid-cols-1 break-words">
|
|
||||||
<div>
|
|
||||||
<FontAwesomeIcon icon={faSchool} className="w-5 h-5 inline"/>
|
|
||||||
<p className="inline ml-4">{belongs}</p>
|
|
||||||
<p className="ml-9">{school}</p>
|
|
||||||
<p className="ml-9">{grade}</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<FontAwesomeIcon icon={faBirthdayCake} className="w-5 h-5 inline"/>
|
|
||||||
<p className="inline ml-4">{birth}</p>
|
|
||||||
<p className="ml-9">{date}</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<FontAwesomeIcon icon={faMapPin} className="w-5 h-5 inline"/>
|
|
||||||
<p className="inline ml-4">{location}</p>
|
|
||||||
<p className="ml-9">{hiroshima}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{
|
|
||||||
// Contact
|
|
||||||
}
|
|
||||||
<div className="text-left my-6">
|
|
||||||
<p className="text-2xl"><FontAwesomeIcon icon={faPhone} className="w-5 h-5 inline"/> {contact}</p>
|
|
||||||
</div>
|
|
||||||
<div className="my-2 grid grid-cols-2 lg:grid-cols-5 md:grid-cols-3 sm:grid-cols-2 justify-items-center gap-y-6">
|
|
||||||
<div className="hover:underline">
|
|
||||||
<Link href="https://twitter.com/yude_jp">
|
|
||||||
<a>
|
|
||||||
<FontAwesomeIcon icon={faTwitter} 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">
|
|
||||||
<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:i@yude.jp">
|
|
||||||
<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>
|
|
||||||
|
|
||||||
{
|
|
||||||
// Keys
|
|
||||||
}
|
|
||||||
<div className="text-left my-6">
|
|
||||||
<p className="text-2xl"><FontAwesomeIcon icon={faKey} className="w-5 h-5 inline"/> {keys}</p>
|
|
||||||
<ul className="list-disc mx-5 my-2">
|
|
||||||
<li>
|
|
||||||
<span className="font-bold">GPG </span>
|
|
||||||
<Link href="/static/yudejp.gpg">
|
|
||||||
<a className="hover:underline">
|
|
||||||
<FontAwesomeIcon icon={faDownload} className="w-5 h-5 inline"/>
|
|
||||||
{download}
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
<p>{fingerprint}:</p>
|
|
||||||
<div className="w-full overflow-x-auto ...">
|
|
||||||
<div className="whitespace-nowrap ...">
|
|
||||||
3745 F270 DB4E 8975 6B07 62BE EB0F E5D9 25C4 A968
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</li>
|
<p className="text-4xl transform -translate-y-4">yude</p>
|
||||||
<li>
|
<div>
|
||||||
<span className="font-bold">SSH </span>
|
<DiscordPlaying />
|
||||||
<Link href="https://github.com/yude.keys">
|
<Spotify />
|
||||||
<a className="hover:underline">
|
|
||||||
<FontAwesomeIcon icon={faEye} className="w-5 h-5 inline"/>
|
|
||||||
{view}
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
<p>{fingerprint}:</p>
|
|
||||||
<div className="w-full overflow-x-auto ...">
|
|
||||||
<div className="whitespace-nowrap ...">
|
|
||||||
2048 SHA256:xwSL4DORWmroWdC6P0GU1m1yZl/cXqjo9rCCWqqO+Dc
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</div>
|
||||||
</ul>
|
|
||||||
|
{
|
||||||
|
// Description
|
||||||
|
}
|
||||||
|
<div>
|
||||||
|
<div className="text-left">
|
||||||
|
<p className="text-2xl"><FontAwesomeIcon icon={faInfo} className="w-5 h-5 inline"/> {t('desc')}</p>
|
||||||
|
</div>
|
||||||
|
<div className="my-2 text-left grid lg:grid-cols-3 md:grid-cols-2 sm:grid-cols-1 break-words">
|
||||||
|
<div>
|
||||||
|
<FontAwesomeIcon icon={faSchool} className="w-5 h-5 inline"/>
|
||||||
|
<p className="inline ml-4">{t('belongs')}</p>
|
||||||
|
<p className="ml-9">{t('school')}</p>
|
||||||
|
<p className="ml-9">{t('grade')}</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<FontAwesomeIcon icon={faBirthdayCake} className="w-5 h-5 inline"/>
|
||||||
|
<p className="inline ml-4">{t('birth')}</p>
|
||||||
|
<p className="ml-9">{t('date')}</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<FontAwesomeIcon icon={faMapPin} className="w-5 h-5 inline"/>
|
||||||
|
<p className="inline ml-4">{t('location')}</p>
|
||||||
|
<p className="ml-9">{t('hiroshima')}</p>
|
||||||
|
</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
|
||||||
|
}
|
||||||
|
<div className="text-left my-6">
|
||||||
|
<p className="text-2xl"><FontAwesomeIcon icon={faPhone} className="w-5 h-5 inline"/> {t('contact')}</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://twitter.com/yude_jp" icon={faTwitter} caption="@yude_jp" />
|
||||||
|
<Contact dest="#" icon={faDiscord} caption="yude#3205" />
|
||||||
|
<Contact dest="mailto:i@yude.jp" icon={faEnvelope} caption="i@yude.jp" />
|
||||||
|
<Contact dest="https://github.com/yude" icon={faGithub} caption="yude" />
|
||||||
|
<Contact dest="https://mstdn.yude.jp/@yude" icon={faMastodon} caption="@yude@mstdn.yude.jp" />
|
||||||
|
<Contact dest="https://keybase.io/yude" icon={faKeybase} caption="yude" />
|
||||||
|
<Contact dest="https://instagram.com/yude.jp" icon={faInstagram} caption="yude.jp" />
|
||||||
|
<Contact dest="https://steamcommunity.com/id/yudejp" icon={faSteam} caption="id/yudejp" />
|
||||||
|
<NintendoSW />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{
|
||||||
|
// Buttons
|
||||||
|
}
|
||||||
|
<div className="text-center my-6 space-x-5">
|
||||||
|
<WakaTime />
|
||||||
|
<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')}/>
|
||||||
|
<Button dest="https://scrapbox.io/yude/%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9" icon={faMobile} caption={t('device')}/>
|
||||||
|
<Button dest="https://www.amazon.jp/hz/wishlist/ls/8WTKCPWKOJ2N?ref_=wl_share" icon={faAmazon} caption={t('wishlist')}/>
|
||||||
|
</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>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
</Layout>
|
||||||
<div>
|
</>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<Link href="https://scrapbox.io/yude/%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88">
|
|
||||||
<button className="border border-transparent rounded-md shadow-sm text-sm font-medium mt-3 text-white bg-indigo-800 hover:bg-indigo-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 p-3 w-60">{more}</button>
|
|
||||||
</Link>
|
|
||||||
<p className="mt-3 text-sm font-bold mb-2 text-gray-900 dark:text-gray-400">{icon_1}<Link href="https://twitter.com/xmnts"><a className="hover:underline">Minkasy {icon_2}</a></Link></p>
|
|
||||||
</div>
|
|
||||||
</Layout>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
86
pages/server.js
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
// Base layout
|
||||||
|
import Layout from "./components/Layout"
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// next-seo
|
||||||
|
import { NextSeo } from 'next-seo';
|
||||||
|
|
||||||
|
export default function Server(props) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<NextSeo
|
||||||
|
title="yude.jp サーバー上"
|
||||||
|
description="yude.jp 上に設置されているサーバーの一覧、情報"
|
||||||
|
/>
|
||||||
|
<Layout title={t('status')}>
|
||||||
|
<div className="my-9 text-center">
|
||||||
|
|
||||||
|
{
|
||||||
|
// Header
|
||||||
|
}
|
||||||
|
<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>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{
|
||||||
|
// sandy
|
||||||
|
}
|
||||||
|
<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-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">OS </p>Arch Linux</div>
|
||||||
|
<div className="flex-1"><p className="font-bold">{t('location')} </p>{t('hiroshima')}</div>
|
||||||
|
</div>
|
||||||
|
<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>
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
// oracle1
|
||||||
|
}
|
||||||
|
<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('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">RAM </p>1GB</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>
|
||||||
|
<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>
|
||||||
|
|
||||||
|
{
|
||||||
|
// oracle2
|
||||||
|
}
|
||||||
|
<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-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">RAM </p>1GB</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>
|
||||||
|
<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>
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
49
pages/services.js
Normal file
@@ -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>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@@ -1,54 +0,0 @@
|
|||||||
import Layout from "./components/Layout"
|
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
|
||||||
|
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
|
|
||||||
export default function About(props) {
|
|
||||||
const router = useRouter()
|
|
||||||
const { locale, locales, defaultLocale, pathname } = router
|
|
||||||
const { t, lang } = useTranslation("status")
|
|
||||||
const status = t('status')
|
|
||||||
const location = t('location')
|
|
||||||
const tottori = t('tottori')
|
|
||||||
const hiroshima = t('hiroshima')
|
|
||||||
const model = t('model')
|
|
||||||
|
|
||||||
return (
|
|
||||||
|
|
||||||
<Layout title={status}>
|
|
||||||
<div className="my-9 mx-9 text-center">
|
|
||||||
{
|
|
||||||
// Heading
|
|
||||||
}
|
|
||||||
<div className="mb-5">
|
|
||||||
<p className="text-left text-4xl">{status} <p className="md:inline font-mono text-base sm:">Powered / Generated by Mackerel.</p></p>
|
|
||||||
</div>
|
|
||||||
{
|
|
||||||
// cherry Mackerel
|
|
||||||
}
|
|
||||||
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">cherry</h2>
|
|
||||||
<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">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">{location} </p>{hiroshima}</div>
|
|
||||||
</div>
|
|
||||||
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/heHnGhDanoIDlf7jjxUe9yPVrsG3deeH5ptD8suErrq5w46crWEIYdLfzLoukzfF?period=24h" height="400" className="w-2/3" frameBorder="0" scrolling="no"></iframe>
|
|
||||||
|
|
||||||
{
|
|
||||||
// raspberry Mackerel
|
|
||||||
}
|
|
||||||
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">raspberry</h2>
|
|
||||||
<div className="flex xl:w-2/3 text-center">
|
|
||||||
<div className="flex-1"><p className="font-bold">{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">{location} </p>{tottori}</div>
|
|
||||||
</div>
|
|
||||||
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/5HVbQiwuxrMithyrGjmmQCCOVgJ6Ptf94SDA2qWSTsh2rtz7pjePihYzaW5QEml4?period=24h" height="400" className="w-2/3" frameBorder="0" scrolling="no"></iframe>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
47
pages/tos.js
@@ -1,21 +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 input from '../docs/tos.md'
|
import ja from '../docs/tos/ja.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")
|
|
||||||
const tos = t('tos')
|
if (!query) {
|
||||||
return(
|
return <p>Loading...</p>
|
||||||
<Layout title={tos}>
|
} else {
|
||||||
<div className="mx-9">
|
return (
|
||||||
<ReactMarkdown plugins={[gfm]} children={input} />
|
<Layout title={t('tos')}>
|
||||||
</div>
|
<div>
|
||||||
</Layout>
|
{query["lang"] === 'ja' ? (
|
||||||
)
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
}
|
{ja}
|
||||||
|
</ReactMarkdown>
|
||||||
|
) : (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{en}
|
||||||
|
</ReactMarkdown>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 137 KiB |
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
BIN
public/images/banner_new.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
public/images/brstrip.gif
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
public/images/busy_banner.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
public/images/dynmap.png
Normal file
After Width: | Height: | Size: 890 KiB |
BIN
public/images/favicon.ico
Normal file
After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 241 KiB After Width: | Height: | Size: 241 KiB |
Before Width: | Height: | Size: 340 KiB After Width: | Height: | Size: 340 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
BIN
public/images/minecraft/golem_trap.png
Normal file
After Width: | Height: | Size: 526 KiB |
BIN
public/images/minecraft/large_field.png
Normal file
After Width: | Height: | Size: 958 KiB |
BIN
public/images/minecraft/lockette/chest.png
Normal file
After Width: | Height: | Size: 9.8 KiB |
BIN
public/images/minecraft/shrine.png
Normal file
After Width: | Height: | Size: 464 KiB |
BIN
public/images/minecraft/sugarcane.png
Normal file
After Width: | Height: | Size: 332 KiB |
BIN
public/images/mutual/kirby3ds.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
public/images/mutual/nona-takahara.png
Normal file
After Width: | Height: | Size: 8.4 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 6.4 KiB |
67
public/yude.asc
Normal file
@@ -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-----
|
1
public/yude.keys
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfEH46roc6pn97+Bi0UxWaeogvN38U5/7W+s2TWAQfpE8gv7ibFwZ5FVvHguT8BbCkK8YuXW7Oug1n8S6o3ABhUQD/zGIuEBLVKO6BTUYNDpYNxmmXKZ+dbB1nz++bvson8pYv/MdkeeeRrmqVgmrZzDifgBqYicGep+LKobhXvgCX6Qb9cHC9MCx+3mUzT0RhwwxEL/AsBm6f5oPJZdnF3agnOi61KA+wrK7RPU5v88HY5jHb87irFjNbc2xvyoLJmx+ILyKIcdsaADiTdy2JX5fqsO4S3WFELK+utw1MgBnGt0ENaev2Tce9r2QuUZQYNpa1+vAcdsc0qcR2W9wV
|