25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

62 satır
2.2KB

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