【问题标题】:Repetitive Consumer For Loop循环重复消费者
【发布时间】:2019-11-03 16:19:23
【问题描述】:

我正在使用带有方法的库,在该方法中我调用了一个方法,该方法采用事件类和在事件触发时调用的使用者。此方法返回一个 void。我需要在消费者中再次调用该方法,然后在该消费者中再次调用它等等(很多次)。我怎样才能把它放在一个 for 循环中以避免多次输入这个方法? 代码:

ShurikenBot.getInstance().getEventWaiter().waitForEvent(MessageReactionAddEvent.class,
                    t -> t.getMessageId().equals(m.getId()) && event.getAuthor().getId().equals(t.getMember().getUser().getId())
                            && t.getReaction().getReactionEmote().getName().equals("\u25B6"),
                    t ->
                            t.getChannel().getMessageById(t.getMessageId()).queue(msg -> {
                                System.out.println("yes");
                                // i want to call waitForEvent() again here
                                msg.editMessage(builder.setTitle("Shuriken Tutorial - Step 2").setImage("https://i.615283.net/u/47794c.jpg").build()).queue();
                                t.getReaction().removeReaction(t.getUser()).queue();
                            }));

【问题讨论】:

    标签: java lambda discord-jda


    【解决方案1】:

    您可以使用通用事件侦听器创建状态机,而不是使用 EventWaiter。

    public class StateMachine extends ListenerAdapter {
        private final long messageId;
        private final long userId;
        private final String emoji;
    
        private int state = 0;
    
        public StateMachine(...) {...}
    
        @Override
        public void onMessageReactionAdd(MessageReactionAddEvent event) {
            if (event.getMessageIdLong() != messageId) return;
            if (event.getUser().getIdLong() != userId) return;
            if (!event.getReactionEmote().getName().equals(emoji)) return;
            switch (state) {
            case 0:
                System.out.println("yes");
                event.getChannel().editMessageById(messageId, ...).queue();
                event.getReaction().removeReaction(event.getUser()).queue();
                state = 1;
                break;
            case 1:
                System.out.println("This is the next awaited event");
                // do something here...
                break;
            }
        }
    }
    

    然后您可以定义一个最终状态,在该状态下再次删除事件侦听器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-26
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2019-01-07
      相关资源
      最近更新 更多