Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

64 linhas
2.4KB

  1. package io.github.norbipeti.gcdc.service;
  2. import discord4j.core.DiscordClient;
  3. import discord4j.core.DiscordClientBuilder;
  4. import discord4j.core.event.domain.message.MessageCreateEvent;
  5. import discord4j.core.object.entity.GuildMessageChannel;
  6. import discord4j.core.object.entity.Member;
  7. import discord4j.core.object.util.Snowflake;
  8. import org.springframework.beans.factory.annotation.Value;
  9. import org.springframework.stereotype.Component;
  10. import org.springframework.web.context.request.async.DeferredResult;
  11. import reactor.core.publisher.Mono;
  12. import javax.annotation.PostConstruct;
  13. import java.awt.*;
  14. import java.util.HashMap;
  15. import java.util.Map;
  16. @Component
  17. public class DiscordService {
  18. private DiscordClient client;
  19. @Value("${discord.token}")
  20. private String token;
  21. @PostConstruct
  22. public void init() {
  23. this.client = new DiscordClientBuilder(token).build();
  24. client.getEventDispatcher().on(MessageCreateEvent.class).subscribe(event -> {
  25. if (event.getMember().isEmpty() || event.getMessage().getContent().isEmpty())
  26. return;
  27. var req = requests.remove(event.getMessage().getChannelId().asLong());
  28. if (req == null) return;
  29. var msg = event.getMember().map(member -> Map.of("username", member.getDisplayName(),
  30. "message", event.getMessage().getContent().orElse("")));
  31. msg.ifPresent(req::setResult);
  32. });
  33. client.login().subscribe();
  34. }
  35. public DeferredResult<Map<String, String>> sendMessage(long channel, long user, String message) {
  36. var result = new DeferredResult<Map<String, String>>();
  37. client.getChannelById(Snowflake.of(channel)).cast(GuildMessageChannel.class)
  38. .flatMap(ch -> getUsername(user, ch)
  39. .flatMap(name -> ch.createEmbed(ecs -> ecs.setAuthor(name, null, null)
  40. .setColor(Color.BLUE).setDescription(message)).map(msg -> name)))
  41. .doOnError(result::setErrorResult)
  42. .subscribe(name -> result.setResult(Map.of("response", "OK", "username", name)));
  43. return result;
  44. }
  45. private final HashMap<Long, DeferredResult<Map<String, String>>> requests = new HashMap<>();
  46. public DeferredResult<Map<String, String>> getMessage(long channel) {
  47. var result = new DeferredResult<Map<String, String>>(120000L);
  48. requests.put(channel, result);
  49. return result;
  50. }
  51. private Mono<String> getUsername(long user, GuildMessageChannel channel) {
  52. return client.getUserById(Snowflake.of(user)).flatMap(u -> u.asMember(channel.getGuildId()))
  53. .map(Member::getDisplayName);
  54. }
  55. }