risu729 / hammuni Goto Github PK
View Code? Open in Web Editor NEWLicense: MIT License
License: MIT License
Discordの特定チャンネルへログを送信する
ログに表示する内容はユーザーと変動したポイントのみで、合計のポイントやポイントの理由は表示しない。
コマンドを用いて表示されていない詳細を表示できる。
@NotNull
でなく@Nullable
にする必要がある
StackTrace:
java.lang.RuntimeException: Failed to invoke constructor 'io.github.risu729.hammuni.api.response.PointResponse(UUID, OffsetDateTime, int, UUID, UUID, String, Boolean)' with args [ed776f4b-c423-4a98-8c5b-74e68f6371e9, 2023-02-03T15:08:08.733703+09:00, 100, null, (appid), hammuni:server_join, null]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$RecordAdapter.finalize(ReflectiveTypeAdapterFactory.java:530)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$RecordAdapter.finalize(ReflectiveTypeAdapterFactory.java:442)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:402)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.readIntoArray(ReflectiveTypeAdapterFactory.java:201)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$RecordAdapter.readField(ReflectiveTypeAdapterFactory.java:509)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$RecordAdapter.readField(ReflectiveTypeAdapterFactory.java:442)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:393)
at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:40)
at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:204)
at io.github.risu729.hammuni.PointApi.retrieveCountSinceReset(PointApi.java:155)
at io.github.risu729.hammuni.PointApi.retrieveCountSinceReset(PointApi.java:143)
at io.github.risu729.hammuni.Listener.onMessageReceived(Listener.java:107)
at net.dv8tion.jda.api.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:424)
at net.dv8tion.jda.api.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:96)
at net.dv8tion.jda.internal.hooks.EventManagerProxy.handleInternally(EventManagerProxy.java:88)
at net.dv8tion.jda.internal.hooks.EventManagerProxy.handle(EventManagerProxy.java:70)
at net.dv8tion.jda.internal.JDAImpl.handleEvent(JDAImpl.java:171)
at net.dv8tion.jda.internal.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:136)
at net.dv8tion.jda.internal.handle.SocketHandler.handle(SocketHandler.java:39)
at net.dv8tion.jda.internal.requests.WebSocketClient.onDispatch(WebSocketClient.java:984)
at net.dv8tion.jda.internal.requests.WebSocketClient.onEvent(WebSocketClient.java:870)
at net.dv8tion.jda.internal.requests.WebSocketClient.handleEvent(WebSocketClient.java:848)
at net.dv8tion.jda.internal.requests.WebSocketClient.onBinaryMessage(WebSocketClient.java:1023)
at com.neovisionaries.ws.client.ListenerManager.callOnBinaryMessage(ListenerManager.java:385)
at com.neovisionaries.ws.client.ReadingThread.callOnBinaryMessage(ReadingThread.java:276)
at com.neovisionaries.ws.client.ReadingThread.handleBinaryFrame(ReadingThread.java:996)
at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:755)
at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:108)
at com.neovisionaries.ws.client.ReadingThread.runMain(ReadingThread.java:64)
at com.neovisionaries.ws.client.WebSocketThread.run(WebSocketThread.java:45)
Caused by: java.lang.IllegalArgumentException: Argument for @NotNull parameter 'user' of io/github/risu729/hammuni/api/response/PointResponse.<init> must not be null
at io.github.risu729.hammuni.api.response.PointResponse.$$$reportNull$$$0(PointResponse.java)
at io.github.risu729.hammuni.api.response.PointResponse.<init>(PointResponse.java)
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:484)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$RecordAdapter.finalize(ReflectiveTypeAdapterFactory.java:515)
... 34 common frames omitted
API履歴からメッセージの回数を取得した値が0の場合が考慮されていない
StackTrace:
java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 10
at java.base/java.util.ImmutableCollections$ListN.get(ImmutableCollections.java:680)
at io.github.risu729.hammuni.Listener.onMessageReceived(Listener.java:113)
at net.dv8tion.jda.api.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:424)
at net.dv8tion.jda.api.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:96)
at net.dv8tion.jda.internal.hooks.EventManagerProxy.handleInternally(EventManagerProxy.java:88)
at net.dv8tion.jda.internal.hooks.EventManagerProxy.handle(EventManagerProxy.java:70)
at net.dv8tion.jda.internal.JDAImpl.handleEvent(JDAImpl.java:171)
at net.dv8tion.jda.internal.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:136)
at net.dv8tion.jda.internal.handle.SocketHandler.handle(SocketHandler.java:39)
at net.dv8tion.jda.internal.requests.WebSocketClient.onDispatch(WebSocketClient.java:984)
at net.dv8tion.jda.internal.requests.WebSocketClient.onEvent(WebSocketClient.java:870)
at net.dv8tion.jda.internal.requests.WebSocketClient.handleEvent(WebSocketClient.java:848)
at net.dv8tion.jda.internal.requests.WebSocketClient.onBinaryMessage(WebSocketClient.java:1023)
at com.neovisionaries.ws.client.ListenerManager.callOnBinaryMessage(ListenerManager.java:385)
at com.neovisionaries.ws.client.ReadingThread.callOnBinaryMessage(ReadingThread.java:276)
at com.neovisionaries.ws.client.ReadingThread.handleBinaryFrame(ReadingThread.java:996)
at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:755)
at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:108)
at com.neovisionaries.ws.client.ReadingThread.runMain(ReadingThread.java:64)
at com.neovisionaries.ws.client.WebSocketThread.run(WebSocketThread.java:45)
インメモリでイベントの回数のカウントなどを保持しているので、再起動でリセットされてしまう
履歴をコピーすることでmergeする際にFIRST_MESSAGEやSERVER_JOINなどの調整ができる
ただし、後からポイント付与の仕様が変わる可能性もあるので、mergeする際の基準で調整するのはよろしくないかもしれない
DiscordのIDとMinecraftのIDの連携機能を追加する
管理者のみ使えるコマンドを想定
コードを見やすく、またバグを減らすため極力ライブラリを使用したい
ephemeralかどうかのみ先に判定する仕組みが必要?
判定できた時点でdeferReply
することでできるだけ早く取得するようにする
この場合、抽象クラスで使用を強制する必要はなさそう
以下InteractionHookのJavaDocより
This only works on InteractionHooks! For a deferred reply, this is not supported. When a reply is deferred, the very first message sent through the InteractionHook, inherits the ephemeral state of the initial reply. To send an ephemeral deferred reply, you must use deferReply(true) instead.
ポイント消費イベントのrejectIfNotEnough
がtrue
の場合、ポイントが足りないときには実行できないように、またもし実行されたら例外を吐くよう実装する
コマンドで実行するイベント
ポイントが足りない場合はその旨エラーメッセージを返す
#22
ポイントが十分にあるときは操作が行えるようなロールを付与し、ないときには剥奪する
定期的な送信とコマンドによる送信を実装する
ValueError at /api/users/(id)/history/
time data '2023-01-30T00:00+09:00 +0900' does not match format '%Y-%m-%d_%H:%M:%S %z'
OffsetDateTime
を直接用いるとこうなってしまうので、+0900のLocalDateTime
に変更する
また、ドキュメントにある通りYYYY-mm-DD_HH:MM:SS
となるようDateTimeFormatter
を適用する
nextが含まれている場合、タイムスタンプで判定してリセット前の記録が含まれるまで探す
APIではis_valid
だが、Gsonがフィールドの値を変更していないのでパースされない
消費ポイントが高順位な数人に付与される、名前の色が変わるロールの管理機能を追加
順位はリアルタイムか前月か未定
金色/銀色のロールとどちらかのみ色が反映される
100消費, 10付与
ExecutableCommandData
を継承しているクラス全てを自動で登録できるようにする
リフレクションを用いて実装
APIを叩く度にUserResponse
を取得しているので、可能な限り使いまわせるように変更する
Discordクライアントで自由に行えるイベントのrejectIfNotEnough
の実装
ポイントが十分にあるときは操作が行えるようなロールを付与し、ないときには剥奪する
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.