-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #99 from Softawii/feature/twitter-embeds
feat: add twitter listener
- Loading branch information
Showing
6 changed files
with
233 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
27 changes: 27 additions & 0 deletions
27
src/main/java/com/softawii/capivara/entity/TwitterParserConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package com.softawii.capivara.entity; | ||
|
||
import javax.persistence.Column; | ||
import javax.persistence.Entity; | ||
import javax.persistence.Id; | ||
|
||
@Entity | ||
public class TwitterParserConfig { | ||
@Id | ||
@Column(unique = true, nullable = false) | ||
private Long guildId; | ||
|
||
public TwitterParserConfig() { | ||
} | ||
|
||
public TwitterParserConfig(Long guildId) { | ||
this.guildId = guildId; | ||
} | ||
|
||
public Long getGuildId() { | ||
return guildId; | ||
} | ||
|
||
public void setGuildId(Long guildId) { | ||
this.guildId = guildId; | ||
} | ||
} |
77 changes: 77 additions & 0 deletions
77
src/main/java/com/softawii/capivara/listeners/TwitterGroup.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
package com.softawii.capivara.listeners; | ||
|
||
import com.softawii.capivara.services.TwitterParserConfigService; | ||
import com.softawii.curupira.annotations.IButton; | ||
import com.softawii.curupira.annotations.ICommand; | ||
import com.softawii.curupira.annotations.IGroup; | ||
import net.dv8tion.jda.api.Permission; | ||
import net.dv8tion.jda.api.entities.channel.unions.MessageChannelUnion; | ||
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; | ||
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; | ||
import net.dv8tion.jda.api.interactions.components.buttons.Button; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.stereotype.Component; | ||
|
||
@IGroup(name = "twitter", description = "Transformação de links do Twitter automática", hidden = false) | ||
@Component | ||
public class TwitterGroup { | ||
|
||
public static final String deleteBotTwitterMessage = "twitter-bot-message-delete"; | ||
private static TwitterParserConfigService service; | ||
|
||
@Autowired | ||
@SuppressWarnings("unused") | ||
public void setCurupira(TwitterParserConfigService service) { | ||
TwitterGroup.service = service; | ||
} | ||
|
||
@ICommand(name = "enable", description = "Ativa o serviço de transformação de links do Twitter automática", | ||
permissions = {Permission.ADMINISTRATOR}) | ||
@SuppressWarnings("unused") | ||
public static void enable(SlashCommandInteractionEvent event) { | ||
long guildId = event.getGuild().getIdLong(); | ||
if (service.isEnabled(guildId)) { | ||
event.reply("O serviço já está ativado").setEphemeral(true).queue(); | ||
return; | ||
} | ||
|
||
service.enable(guildId); | ||
event.reply("O serviço foi está ativado").setEphemeral(true).queue(); | ||
} | ||
|
||
@ICommand(name = "disable", description = "Desativa o serviço de transformação de links do Twitter automática", | ||
permissions = {Permission.ADMINISTRATOR}) | ||
@SuppressWarnings("unused") | ||
public static void disable(SlashCommandInteractionEvent event) { | ||
long guildId = event.getGuild().getIdLong(); | ||
if (!service.isEnabled(guildId)) { | ||
event.reply("O serviço não está ativado").setEphemeral(true).queue(); | ||
return; | ||
} | ||
|
||
service.disable(guildId); | ||
event.reply("O serviço foi está ativado").setEphemeral(true).queue(); | ||
} | ||
|
||
@IButton(id = deleteBotTwitterMessage) | ||
@SuppressWarnings("unused") | ||
public static void delete(ButtonInteractionEvent event) { | ||
// Format: ButtonID:Owner | ||
String ownerId = event.getComponentId().split(":")[1]; | ||
String messageOwner = event.getMember().getId(); | ||
|
||
MessageChannelUnion channel = event.getChannel(); | ||
|
||
if (!messageOwner.equals(ownerId)) { | ||
event.reply("Você não pode apagar essa mensagem").setEphemeral(true).queue(); | ||
return; | ||
} | ||
|
||
event.reply("Mensagem apagada").setEphemeral(true).queue(); | ||
channel.deleteMessageById(event.getMessageId()).queue(); | ||
} | ||
|
||
public static Button generateDeleteButton(long authorId) { | ||
return Button.danger(String.format("%s:%s", deleteBotTwitterMessage, authorId), "Apagar"); | ||
} | ||
} |
85 changes: 85 additions & 0 deletions
85
src/main/java/com/softawii/capivara/listeners/events/TwitterListener.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
package com.softawii.capivara.listeners.events; | ||
|
||
import com.softawii.capivara.listeners.TwitterGroup; | ||
import com.softawii.capivara.services.TwitterParserConfigService; | ||
import net.dv8tion.jda.api.JDA; | ||
import net.dv8tion.jda.api.entities.Message; | ||
import net.dv8tion.jda.api.entities.User; | ||
import net.dv8tion.jda.api.entities.channel.unions.MessageChannelUnion; | ||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent; | ||
import net.dv8tion.jda.api.events.message.MessageUpdateEvent; | ||
import net.dv8tion.jda.api.hooks.ListenerAdapter; | ||
import net.dv8tion.jda.api.requests.RestAction; | ||
import org.jetbrains.annotations.NotNull; | ||
import org.springframework.stereotype.Component; | ||
|
||
import java.util.Optional; | ||
import java.util.regex.Matcher; | ||
import java.util.regex.Pattern; | ||
|
||
@Component | ||
@SuppressWarnings("unused") | ||
public class TwitterListener extends ListenerAdapter { | ||
private final Pattern twitterPattern; | ||
private final TwitterParserConfigService service; | ||
|
||
public TwitterListener(JDA jda, TwitterParserConfigService service) { | ||
this.service = service; | ||
this.twitterPattern = Pattern.compile("^https://(twitter|x)\\.com/(?<username>\\w+)/status/(?<postId>\\d+)([-a-zA-Z0-9()@:%_+.~#?&/=]*)$"); // https://stackoverflow.com/a/17773849 | ||
jda.addEventListener(this); | ||
} | ||
|
||
@Override | ||
public void onMessageReceived(@NotNull MessageReceivedEvent event) { | ||
if (event.getAuthor().isBot()) return; | ||
|
||
String rawMessage = event.getMessage().getContentRaw(); | ||
User author = event.getAuthor(); | ||
Optional<String> parsedMessage = parseMessage(rawMessage, author); | ||
|
||
parsedMessage.ifPresent(message -> createTweetMessage(event.getGuild().getIdLong(), message, event.getMessage())); | ||
} | ||
|
||
@Override | ||
public void onMessageUpdate(@NotNull MessageUpdateEvent event) { | ||
if (event.getAuthor().isBot()) return; | ||
|
||
String rawMessage = event.getMessage().getContentRaw(); | ||
User author = event.getAuthor(); | ||
Optional<String> parsedMessage = parseMessage(rawMessage, author); | ||
|
||
parsedMessage.ifPresent(message -> createTweetMessage(event.getGuild().getIdLong(), message, event.getMessage())); | ||
} | ||
|
||
private void createTweetMessage(Long guildId, String replacementMessage, Message originalMessage) { | ||
if (!service.isEnabled(guildId)) return; | ||
|
||
MessageChannelUnion channel = originalMessage.getChannel(); | ||
|
||
RestAction.allOf( | ||
originalMessage.delete(), | ||
channel.sendMessage(replacementMessage) | ||
.addActionRow(TwitterGroup.generateDeleteButton(originalMessage.getAuthor().getIdLong())) | ||
.setSuppressedNotifications(true) | ||
).queue(); | ||
} | ||
|
||
private Optional<String> parseMessage(String twitterLink, User author) { | ||
Matcher matcher = this.twitterPattern.matcher(twitterLink); | ||
|
||
if (matcher.find()) { | ||
String twitterUsername = matcher.group("username"); | ||
String twitterPostId = matcher.group("postId"); | ||
|
||
String result = String.format( | ||
""" | ||
Autor: %s | ||
Link original: `%s` | ||
[Postagem](https://fxtwitter.com/%s/status/%s) | ||
""", author.getAsMention(), twitterLink, twitterUsername, twitterPostId); | ||
return Optional.of(result); | ||
} | ||
|
||
return Optional.empty(); | ||
} | ||
} |
9 changes: 9 additions & 0 deletions
9
src/main/java/com/softawii/capivara/repository/TwitterParserConfigRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package com.softawii.capivara.repository; | ||
|
||
import com.softawii.capivara.entity.TwitterParserConfig; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
|
||
@Repository | ||
public interface TwitterParserConfigRepository extends JpaRepository<TwitterParserConfig, Long> { | ||
} |
27 changes: 27 additions & 0 deletions
27
src/main/java/com/softawii/capivara/services/TwitterParserConfigService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package com.softawii.capivara.services; | ||
|
||
import com.softawii.capivara.entity.TwitterParserConfig; | ||
import com.softawii.capivara.repository.TwitterParserConfigRepository; | ||
import org.springframework.stereotype.Service; | ||
|
||
@Service | ||
public class TwitterParserConfigService { | ||
|
||
private final TwitterParserConfigRepository repository; | ||
|
||
public TwitterParserConfigService(TwitterParserConfigRepository repository) { | ||
this.repository = repository; | ||
} | ||
|
||
public boolean isEnabled(Long guildId) { | ||
return repository.existsById(guildId); | ||
} | ||
|
||
public void enable(Long guildId) { | ||
repository.save(new TwitterParserConfig(guildId)); | ||
} | ||
|
||
public void disable(Long guildId) { | ||
repository.deleteById(guildId); | ||
} | ||
} |