Giter Site home page Giter Site logo

hammuni's People

Contributors

dependabot[bot] avatar risu729 avatar

Stargazers

 avatar

Watchers

 avatar

hammuni's Issues

Discordへのログ追加

Discordの特定チャンネルへログを送信する

ログに表示する内容はユーザーと変動したポイントのみで、合計のポイントやポイントの理由は表示しない。
コマンドを用いて表示されていない詳細を表示できる。

`PointResponse`の`user`が履歴の取得の際にnullになりエラーを吐く

@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

Listenerが`ArrayIndexOutOfBoundsException`を吐く

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)

イベントの回数のカウントがインメモリで保持されている

インメモリでイベントの回数のカウントなどを保持しているので、再起動でリセットされてしまう

  • messageCounts
    FIRST_MESSAGE: APIで履歴のdetailを取得して当日に無いか確認する
    MESSAGE: 履歴のMESSAGEの数が付与されるメッセージの送信回数に切り捨てる
  • voiceCounts
    FIRST_VC: FIRST_MESSAGEと同様
    VC: 履歴を数えて最大回数に達していなければ付与する
  • voiceFutures
    permanentに保持するためにはDBが必要なので、Botの起動時にリセットと同様の処理を行い、再度ポイント付与をスケジュールする

複数のDiscordアカウントを紐づけられるようにする

Discordで複数のアカウントを持っていた場合、それぞれでポイントが計算されてしまうので、統合できるようにする

統合の操作は管理者がコマンドなどからDiscordアカウントを指定して行う

  • SERVER_JOINなど、統合前のポイントで大きいものについて引き継がれないようにする
    FIRST_MESSAGEなどについては統合の際の処理が大変なのでそのまま引き継ぐ

  • 片方のDiscordアカウントをメインとして扱い、サブの方のポイントは全て消去する

上記どちらかの実装をする

`deferReply`したコマンドへ`ephemeral`で返信できない

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`の実装

ポイント消費イベントのrejectIfNotEnoughtrueの場合、ポイントが足りないときには実行できないように、またもし実行されたら例外を吐くよう実装する

  • コマンドで実行するイベント
    ポイントが足りない場合はその旨エラーメッセージを返す

  • #22
    ポイントが十分にあるときは操作が行えるようなロールを付与し、ないときには剥奪する

クエリストリングのsince/untilのフォーマットが合っていない

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を適用する

ポイントの順位に応じたロールの追加

消費ポイントが高順位な数人に付与される、名前の色が変わるロールの管理機能を追加

順位はリアルタイムか前月か未定

懸念点

金色/銀色のロールとどちらかのみ色が反映される

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.