Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bungeecord環境下のoffline-playerのUUIDサポート #102

Closed
kotarobo opened this issue Mar 11, 2020 · 25 comments
Closed

Bungeecord環境下のoffline-playerのUUIDサポート #102

kotarobo opened this issue Mar 11, 2020 · 25 comments

Comments

@kotarobo
Copy link

BungeeCord環境下だとOnlinePlayerのUUIDを取得出来ないので、usercache.jsonのUUIDかOnlineユーザー以外はUUID指定でメールを送る必要があります。

下記のライブラリでUUIDをBungeeCordを介さずに取得できるのでサポートしてもらえると嬉しいです。
https://github.com/GeorgH93/PCGF_PluginLib

amata氏に作成してもらったプラグインで使用中で、UUIDの取得にキャッシュから取得する方のAPIを使うと応答が早いそうです。

@RoboMWM
Copy link
Contributor

RoboMWM commented Mar 11, 2020

Hmm, I think Paper may have something natively? Not sure if there are other recommended ways. But from what I recall it should be able to resolve the UUID if the player has logged into the server recently, provided your bungeecord is in online mode.

@kotarobo
Copy link
Author

I am using 1.13 paper but have not been able to get it.
I want to try 1.15.
Since the server is restarted regularly, BungeCord's memory cache will disappear every time.
However, even if you create a mechanism that does not restart, it is not very good that all caches are erased when a restart is required.

@ucchyocean
Copy link
Owner

@kotarobo さん、
お返事が遅くなってしまって申し訳ありません。
一応確認を先にさせてください。

UndineMailerの設定で、 validateDestination は false に設定しているのですよね?

それから、下記のようにおっしゃっていますが、どうも根本原因がわかりにくいです。

BungeeCord環境下だとOnlinePlayerのUUIDを取得出来ないので、usercache.jsonのUUIDかOnlineユーザー以外はUUID指定でメールを送る必要があります。

例えば、オフラインのプレイヤーに(該当のBukkitサーバー上に現在接続していないプレイヤーに)対して、プレイヤー名でメールを送信しようとすると、
"宛先 %dest が見つかりません。"
のエラーが表示されているのでしょうか?

@kotarobo
Copy link
Author

kotarobo commented Apr 23, 2020

返信ありがとうございます!

UndineMailerの設定で、 validateDestination は false に設定しているのですよね?

確認してみたところコンフィグのバージョンが古く、その設定が消えた状態でした
再生成してみて確認してみます。
ただ大分前のことになって記憶が曖昧ですが、あて先が見つからない状態で送ると送り先のプレイヤーがログインしてもメールが届いていないといった報告が相次いだため、バックアップから設定を戻した気がします。

例えば、オフラインのプレイヤーに(該当のBukkitサーバー上に現在接続していないプレイヤーに)対して、プレイヤー名でメールを送信しようとすると、
"宛先 %dest が見つかりません。"
のエラーが表示されているのでしょうか?

例えば過去にログインしたことのあるプレイヤーや、昨日ログインしたことのあるプレイヤーでもサーバーが再起動するとこちらの画像のようになります

細かい挙動ですとusercache.jsonを削除すると新しくログインしてきたユーザーのUUIDが保存されていきます。
cacheの上限が来ると本来ならUUIDの取得リクエストが来た際、UUIDをサーバーから参照し古いcacheと入れ替えるといった処理があると思うのですが、BungeeCord経由だとonlineユーザーのUUID・またはBungeeCordのメモリキャッシュ内に存在するUUIDしか返さないため、取得できない→見つからないとなるようです。

@ucchyocean
Copy link
Owner

kotarobo さん、
返信ありがとうございます。十分理解できました。

まず、Bungeecord環境下のサーバーのために validateDestination 設定を用意しましたが、どうやら期待する効果を得ることができていないようですので、廃止しましょう。
それから、BukkitのAPIでUUIDを取得するのではなく、PCGF_PluginLib 経由でPlayerNameとUUIDを相互変換するように作り直ししましょう。

では、対応を開始します。

@kotarobo
Copy link
Author

ありがとうございます!
よろしくお願いします。

@ucchyocean
Copy link
Owner

@kotarobo さん、
対応してみました。

https://github.com/ucchyocean/UndineMailer/releases/tag/v1.10.2
から UndineMailer.jar をダウンロードして試してみてください。

@RoboMWM
Copy link
Contributor

RoboMWM commented Apr 27, 2020

Not sure if this is related but I'm getting the following stacktrace multiple times for different players. Is there an option to disable use of this API? The usercache.json on my server is more than sufficient.

[00:42:00 INFO]: Looks like there is a problem with the connection with mojang. Please retry later.
[00:42:00 INFO]: You have reached the request limit of the mojang api! Please retry later!
[00:42:00 WARN]: java.io.IOException: Server returned HTTP response code: 429 for URL: https://api.mojang.com/users/profiles/minecraft/SanfordTheDog?at=0
[00:42:00 WARN]:        at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1919)
[00:42:00 WARN]:        at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1515)
[00:42:00 WARN]:        at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:250)
[00:42:00 WARN]:        at java.base/java.net.URL.openStream(URL.java:1139)
[00:42:00 WARN]:        at at.pcgamingfreaks.UUIDConverter.getOnlineUUID(UUIDConverter.java:339)
[00:42:00 WARN]:        at at.pcgamingfreaks.UUIDConverter.getUUIDFromName(UUIDConverter.java:233)
[00:42:00 WARN]:        at at.pcgamingfreaks.UUIDConverter.getUUIDFromName(UUIDConverter.java:201)
[00:42:00 WARN]:        at org.bitbucket.ucchy.undine.bridge.PCGFPluginLibBridge.getUUIDFromName(PCGFPluginLibBridge.java:24)
[00:42:00 WARN]:        at org.bitbucket.ucchy.undine.PlayerUuidCache$1.run(PlayerUuidCache.java:78)
[00:42:00 WARN]:        at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftTask.run(CraftTask.java:84)
[00:42:00 WARN]:        at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:54)
[00:42:00 WARN]:        at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
[00:42:00 WARN]:        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[00:42:00 WARN]:        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[00:42:00 WARN]:        at java.base/java.lang.Thread.run(Thread.java:831)
[00:42:00 INFO]: [UndineMailer] Async refresh offline player data... Done. Time: 288508ms, Data: 592.
> version undinemailer
[00:42:45 INFO]: UndineMailer version 1.10.2
[00:42:45 INFO]: UndineMailer - Mail Plugin
[00:42:45 INFO]: Author: ucchy

@ucchyocean
Copy link
Owner

ucchyocean commented Apr 27, 2020

@RoboMWM

Is there an option to disable use of this API?

Yes. Turn off the uuidOnlineMode setting.
uuidOnlineMode: false

@RoboMWM
Copy link
Contributor

RoboMWM commented Apr 27, 2020

Hmm, guess I have to manually pick up the new config options, ok.

@ucchyocean
Copy link
Owner

ucchyocean commented Apr 27, 2020

But I couldn't imagine this problem.
I need to reconsider the measures for this issue.

kotarobo says that the UUID of usercache.json is wrong in the case of the server under Bungeecord. So I thought I shouldn't use usercache.json...

@RoboMWM
Copy link
Contributor

RoboMWM commented Apr 27, 2020

I've only seen this behavior occur with servers and bungeecord that are in offline mode, and even then, that usually points to a configuration issue.

Normally plugins can do lookups on names -> UUIDs with no problem, so it honestly sounds like he has a configuration issue and/or is running bungeecord in offline mode - which then makes the configuration to sending the UUID to servers a lot more complicated since setting the server to "bungeecord" mode means it's expecting a valid online UUID, instead of the generated offline-mode UUID.

@ucchyocean
Copy link
Owner

Thank you for the very useful information.
I also try to create and validate a properly configured Bungeecord environment.

@ucchyocean
Copy link
Owner

うーん、やっぱりBungeecord下のサーバーだと、Bungeecord側がonline-mode: trueになっていても、プラグインからはオフラインのUUIDが取得されてしまいますね。
プラグイン起動時の全プレイヤーのUUID更新はしないようにして、プレイヤーのログイン時に該当プレイヤーのUUIDのみをオンラインで更新するようにしてみましょうか。
MojangのUUID回答APIは、1日何回までリクエストを処理できるんですか?

@kotarobo
Copy link
Author

ありがとうございます!テストしてみますー

確かライブラリ内にキャッシュしたものから取得するモードがあったはずなので、そちらのAPIを利用すればサーバーへのアクセスも減ると思います。
既に使っていたらすみません。

@ucchyocean
Copy link
Owner

キャッシュから取得する方は、結局のところusercache.jsonから取得しているので、Bungeecord下のサーバーだと、期待の値にはならないみたいです。
現状の実装だとキャッシュから取得していないので、ユーザーが大量に接続したサーバーだと、APIの実行が許容量を超えますね。
ちょっと対策を考えてみます。

@kotarobo
Copy link
Author

古い情報かもしれませんが2017年だと
ユーザーネーム→UUIDで10分あたり600リクエスト
1回のリクエストで100名までだそうです。
https://www.spigotmc.org/wiki/rate-limit/

@kotarobo
Copy link
Author

動作テストを行った所、起動時にAPIリミットの警告が出ますが、それ以降は今まで見つからなかったプレイヤーが正しく表示されるようになりました!

@ucchyocean
Copy link
Owner

ucchyocean commented Apr 27, 2020

@kotarobo さん、
ご報告いただきありがとうございます。とても助かります。
じゃああとは、APIリミットに達しないように、ゆっくり実行するように調整したら良さそうですね。100プレイヤー名ごとに1リクエストにまとめて、10秒に1回(10分あたり60リクエスト)をめやすに実行するようにしましょう。

追記:1リクエストあたりのプレイヤー名の最大数ですが、最大100プレイヤー名から最大10プレイヤー名に変更されたようです。

@RoboMWM
Copy link
Contributor

RoboMWM commented Apr 28, 2020

Unfortunately I do not use bungeecord (I have in the past but not very long), but for what it's worth the plugin already does just fine with the users that have already connected. The only other things I could think of is that perhaps another plugin (or the server itself, if he isn't using spigot/paper?) is meddling with the cache or with the player packets upon join/leave.

I think the server itself will lookup the UUID (provided a name lookup was performed - which I believe is the case for your plugin) if it is not cached. I recall observing this behavior when debugging another plugin with OfflinePlayer lookups, and I had bungeecord enabled at the time.

@RoboMWM
Copy link
Contributor

RoboMWM commented Apr 28, 2020

So I briefly looked up this issue, it seems you need to also set ip_forward to true in your bungeecord config. https://www.spigotmc.org/threads/solved-getting-uuids.13654/#post-135081

@ucchyocean
Copy link
Owner

ucchyocean commented Apr 28, 2020

Yes. I tried ip_forward: true. But my plugin still got the offline-mode's UUID. My plugin got the correct online UUID. Maybe I was using the old usercache.json (cached offline-mode's UUID).

@ucchyocean
Copy link
Owner

@kotarobo さん、
対応完了しました。

https://github.com/ucchyocean/UndineMailer/releases/tag/v1.10.3
から UndineMailer.jar をダウンロードして試してみてください。
ただ、いくつか注意点があります。

  • デフォルトでは、「Bukkit経由でUUIDを取得する」設定になっています。
    RoboMWM さんの言っているように、ip_forwardを設定してBungeecord下のサーバーでも正しいUUIDを取得できるようにするか、
    設定を「オンラインからUUIDを取得する」に変更してください。
    設定をあらかじめ変更するには、UndineMailer.jarを更新してspigotを起動する前に、UndineMailer/config.yml に
    uuidOnlineMode: true
    を追加してください。既に uuidOnlineMode の行がある場合は、trueに書き換えてください。

@ucchyocean
Copy link
Owner

@RoboMWM

I have updated the plugin. Can you try a new version?
Jump to
https://github.com/ucchyocean/UndineMailer/releases/tag/v1.10.3
and download UndineMailer.jar.

There are some notes.

  • Leave uuidOnlineMode to false.
    uuidOnlineMode: false
    (uuidOnlineMode: false is default value of UndineMailer v1.10.3)
  • The UndineMailer/cache folder may contain offline-mode's UUIDs. Please delete the cache folder, then start your server.

@kotarobo
Copy link
Author

対応ありがとうございました!
BungeeCordを使っているサーバーも最近は増えてると思うので助かると思いますー

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants