mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-01-28 19:35:23 +00:00
[AB-184] adding various metrics to the system, organizing imports, changing some transactional behaviour
adding okhttp metrics, split bot service into multiple services (guild, message), unified some places that services are used in order to interact with the api, and not directly the objects (this is to make it easier for metric to be accurate)
This commit is contained in:
@@ -47,6 +47,13 @@
|
||||
<scope>test</scope>
|
||||
<type>test-jar</type>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>dev.sheldan.abstracto.core</groupId>
|
||||
<artifactId>metrics-interface</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.sheldan.abstracto.statistic.emotes.converter;
|
||||
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.service.GuildService;
|
||||
import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsModel;
|
||||
import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsResult;
|
||||
import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsResultDisplay;
|
||||
@@ -22,7 +22,7 @@ import java.util.List;
|
||||
public class EmoteStatsConverter {
|
||||
|
||||
@Autowired
|
||||
private BotService botService;
|
||||
private GuildService guildService;
|
||||
|
||||
@Autowired
|
||||
private TrackedEmoteManagementService trackedEmoteManagementService;
|
||||
@@ -33,7 +33,7 @@ public class EmoteStatsConverter {
|
||||
return EmoteStatsModel.builder().build();
|
||||
}
|
||||
// it is assumed all emotes are tracked in the same server
|
||||
Guild relevantGuild = botService.getGuildById(resultList.get(0).getServerId());
|
||||
Guild relevantGuild = guildService.getGuildById(resultList.get(0).getServerId());
|
||||
EmoteStatsModel resultingModel = EmoteStatsModel.builder().build();
|
||||
resultList.forEach(emoteStatsResult -> {
|
||||
TrackedEmote trackedEmote = trackedEmoteManagementService.loadByEmoteId(emoteStatsResult.getEmoteId(), emoteStatsResult.getServerId());
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.quartz.PersistJobDataAfterExecution;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.quartz.QuartzJobBean;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Isolation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.Instant;
|
||||
@@ -35,7 +36,7 @@ public class EmotePersistingJob extends QuartzJobBean {
|
||||
private TrackedEmoteService trackedEmoteService;
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@Transactional(isolation = Isolation.SERIALIZABLE)
|
||||
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
|
||||
// acquire the lock, because we are modifying
|
||||
trackedEmoteRuntimeService.takeLock();
|
||||
|
||||
@@ -4,7 +4,7 @@ import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageReceivedListener;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.service.GuildService;
|
||||
import dev.sheldan.abstracto.statistic.config.StatisticFeatures;
|
||||
import dev.sheldan.abstracto.statistic.emotes.service.TrackedEmoteService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -25,13 +25,13 @@ public class EmoteTrackingListener implements AsyncMessageReceivedListener {
|
||||
private TrackedEmoteService trackedEmoteService;
|
||||
|
||||
@Autowired
|
||||
private BotService botService;
|
||||
private GuildService guildService;
|
||||
|
||||
@Override
|
||||
public void execute(CachedMessage message) {
|
||||
Map<Long, List<CachedEmote>> collect = message.getEmotes().stream().collect(Collectors.groupingBy(CachedEmote::getEmoteId));
|
||||
collect.values().forEach(groupedEmotes ->
|
||||
trackedEmoteService.addEmoteToRuntimeStorage(groupedEmotes.get(0), botService.getGuildById(message.getServerId()), (long) groupedEmotes.size())
|
||||
trackedEmoteService.addEmoteToRuntimeStorage(groupedEmotes.get(0), guildService.getGuildById(message.getServerId()), (long) groupedEmotes.size())
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ package dev.sheldan.abstracto.statistic.emotes.service;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
|
||||
import dev.sheldan.abstracto.statistic.emotes.model.PersistingEmote;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.entities.Emote;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package dev.sheldan.abstracto.statistic.emotes.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.metrics.service.CounterMetric;
|
||||
import dev.sheldan.abstracto.core.metrics.service.MetricService;
|
||||
import dev.sheldan.abstracto.core.models.ServerSpecificId;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.service.EmoteService;
|
||||
import dev.sheldan.abstracto.core.service.FeatureModeService;
|
||||
import dev.sheldan.abstracto.core.service.GuildService;
|
||||
import dev.sheldan.abstracto.statistic.config.StatisticFeatures;
|
||||
import dev.sheldan.abstracto.statistic.emotes.config.EmoteTrackingMode;
|
||||
import dev.sheldan.abstracto.statistic.emotes.model.PersistingEmote;
|
||||
@@ -21,9 +23,10 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.time.Instant;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
@Component
|
||||
@@ -46,7 +49,18 @@ public class TrackedEmoteServiceBean implements TrackedEmoteService {
|
||||
private UsedEmoteManagementService usedEmoteManagementService;
|
||||
|
||||
@Autowired
|
||||
private BotService botService;
|
||||
private GuildService guildService;
|
||||
|
||||
@Autowired
|
||||
private MetricService metricService;
|
||||
|
||||
public static final String EMOTE_USAGES_TRACKED_METRIC = "emote.usages";
|
||||
private static final CounterMetric EMOTE_USAGES_TRACKED =
|
||||
CounterMetric
|
||||
.builder()
|
||||
.name(EMOTE_USAGES_TRACKED_METRIC)
|
||||
.build();
|
||||
|
||||
|
||||
@Override
|
||||
public void addEmoteToRuntimeStorage(List<CachedEmote> emotes, Guild guild) {
|
||||
@@ -76,6 +90,7 @@ public class TrackedEmoteServiceBean implements TrackedEmoteService {
|
||||
boolean autoTrackExternalEmotes = featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, serverId, EmoteTrackingMode.AUTO_TRACK_EXTERNAL);
|
||||
boolean trackExternalEmotes = featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, serverId, EmoteTrackingMode.EXTERNAL_EMOTES);
|
||||
persistingEmotes.forEach(persistingEmote -> {
|
||||
metricService.incrementCounter(EMOTE_USAGES_TRACKED);
|
||||
Optional<TrackedEmote> emoteOptional = trackedEmoteManagementService.loadByEmoteIdOptional(persistingEmote.getEmoteId(), serverId);
|
||||
emoteOptional.ifPresent(trackedEmote -> {
|
||||
// only track the record, if its enabled
|
||||
@@ -109,7 +124,7 @@ public class TrackedEmoteServiceBean implements TrackedEmoteService {
|
||||
* @param persistingEmote The {@link PersistingEmote} which contains all information necessary to create a {@link TrackedEmote}
|
||||
*/
|
||||
private void createNewTrackedEmote(Long serverId, PersistingEmote persistingEmote) {
|
||||
Optional<Guild> guildOptional = botService.getGuildByIdOptional(serverId);
|
||||
Optional<Guild> guildOptional = guildService.getGuildByIdOptional(serverId);
|
||||
guildOptional.ifPresent(guild -> {
|
||||
TrackedEmote newCreatedTrackedEmote = trackedEmoteManagementService.createExternalTrackedEmote(persistingEmote);
|
||||
usedEmoteManagementService.createEmoteUsageForToday(newCreatedTrackedEmote, persistingEmote.getCount());
|
||||
@@ -210,4 +225,8 @@ public class TrackedEmoteServiceBean implements TrackedEmoteService {
|
||||
trackedEmotes.forEach(trackedEmote -> trackedEmote.setTrackingEnabled(false));
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void postConstruct() {
|
||||
metricService.registerCounter(EMOTE_USAGES_TRACKED, "Tracked emote usages stored");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package dev.sheldan.abstracto.statistic.emotes.command;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.exception.IncorrectFeatureModeException;
|
||||
import dev.sheldan.abstracto.core.command.exception.IncorrectParameterException;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandResult;
|
||||
import dev.sheldan.abstracto.core.command.exception.IncorrectFeatureModeException;
|
||||
import dev.sheldan.abstracto.core.models.ServerSpecificId;
|
||||
import dev.sheldan.abstracto.core.service.EmoteService;
|
||||
import dev.sheldan.abstracto.core.service.FeatureModeService;
|
||||
|
||||
@@ -20,7 +20,6 @@ import org.mockito.junit.MockitoJUnitRunner;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.*;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class TrackedEmoteParameterParameterHandlerTest {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package dev.sheldan.abstracto.statistic.emotes.converter;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.ServerSpecificId;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.service.GuildService;
|
||||
import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsModel;
|
||||
import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsResult;
|
||||
import dev.sheldan.abstracto.statistic.emotes.model.database.TrackedEmote;
|
||||
@@ -27,7 +27,7 @@ public class EmoteStatsConverterTest {
|
||||
private EmoteStatsConverter testUnit;
|
||||
|
||||
@Mock
|
||||
private BotService botService;
|
||||
private GuildService guildService;
|
||||
|
||||
@Mock
|
||||
private TrackedEmoteManagementService trackedEmoteManagementService;
|
||||
@@ -66,7 +66,7 @@ public class EmoteStatsConverterTest {
|
||||
when(trackedEmote.getAnimated()).thenReturn(false);
|
||||
when(trackedEmote2.getExternal()).thenReturn(true);
|
||||
when(trackedEmote2.getAnimated()).thenReturn(true);
|
||||
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
EmoteStatsModel result = testUnit.fromEmoteStatsResults(Arrays.asList(emoteStatsResult, emoteStatsResult2));
|
||||
|
||||
Assert.assertEquals(1, result.getStaticEmotes().size());
|
||||
@@ -89,7 +89,7 @@ public class EmoteStatsConverterTest {
|
||||
when(trackedEmote2.getAnimated()).thenReturn(true);
|
||||
when(trackedEmote2.getDeleted()).thenReturn(false);
|
||||
when(trackedEmote2.getTrackedEmoteId()).thenReturn(new ServerSpecificId(SERVER_ID, EMOTE_ID_2));
|
||||
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
Emote emote1 = Mockito.mock(Emote.class);
|
||||
when(guild.getEmoteById(EMOTE_ID)).thenReturn(emote1);
|
||||
Emote emote2 = Mockito.mock(Emote.class);
|
||||
@@ -114,7 +114,7 @@ public class EmoteStatsConverterTest {
|
||||
when(trackedEmote2.getExternal()).thenReturn(false);
|
||||
when(trackedEmote2.getAnimated()).thenReturn(true);
|
||||
when(trackedEmote2.getDeleted()).thenReturn(true);
|
||||
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
EmoteStatsModel result = testUnit.fromEmoteStatsResults(Arrays.asList(emoteStatsResult, emoteStatsResult2));
|
||||
|
||||
Assert.assertEquals(1, result.getStaticEmotes().size());
|
||||
|
||||
@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.statistic.emotes.listener;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.service.GuildService;
|
||||
import dev.sheldan.abstracto.statistic.config.StatisticFeatures;
|
||||
import dev.sheldan.abstracto.statistic.emotes.service.TrackedEmoteService;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
@@ -28,7 +28,7 @@ public class EmoteTrackingListenerTest {
|
||||
private TrackedEmoteService trackedEmoteService;
|
||||
|
||||
@Mock
|
||||
private BotService botService;
|
||||
private GuildService guildService;
|
||||
|
||||
@Mock
|
||||
private CachedMessage message;
|
||||
@@ -49,7 +49,7 @@ public class EmoteTrackingListenerTest {
|
||||
public void testExecuteOneEmote() {
|
||||
List<CachedEmote> emotesBag = new ArrayList<>();
|
||||
emotesBag.add(emote1);
|
||||
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
when(message.getEmotes()).thenReturn(emotesBag);
|
||||
testUnit.execute(message);
|
||||
@@ -63,7 +63,7 @@ public class EmoteTrackingListenerTest {
|
||||
when(emote2.getEmoteId()).thenReturn(EMOTE_ID);
|
||||
emotesBag.add(emote1);
|
||||
emotesBag.add(emote2);
|
||||
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
when(message.getEmotes()).thenReturn(emotesBag);
|
||||
testUnit.execute(message);
|
||||
@@ -77,7 +77,7 @@ public class EmoteTrackingListenerTest {
|
||||
when(emote2.getEmoteId()).thenReturn(EMOTE_ID + 1);
|
||||
emotesBag.add(emote1);
|
||||
emotesBag.add(emote2);
|
||||
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
when(message.getEmotes()).thenReturn(emotesBag);
|
||||
testUnit.execute(message);
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package dev.sheldan.abstracto.statistic.emotes.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.metrics.service.MetricService;
|
||||
import dev.sheldan.abstracto.core.models.ServerSpecificId;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.service.EmoteService;
|
||||
import dev.sheldan.abstracto.core.service.FeatureModeService;
|
||||
import dev.sheldan.abstracto.core.service.GuildService;
|
||||
import dev.sheldan.abstracto.statistic.config.StatisticFeatures;
|
||||
import dev.sheldan.abstracto.statistic.emotes.config.EmoteTrackingMode;
|
||||
import dev.sheldan.abstracto.statistic.emotes.model.PersistingEmote;
|
||||
@@ -53,7 +54,10 @@ public class TrackedEmoteServiceBeanTest {
|
||||
private UsedEmoteManagementService usedEmoteManagementService;
|
||||
|
||||
@Mock
|
||||
private BotService botService;
|
||||
private GuildService guildService;
|
||||
|
||||
@Mock
|
||||
private MetricService metricService;
|
||||
|
||||
@Mock
|
||||
private CachedEmote emote;
|
||||
@@ -298,6 +302,7 @@ public class TrackedEmoteServiceBeanTest {
|
||||
HashMap<Long, List<PersistingEmote>> usagesToStore = new HashMap<>();
|
||||
testUnit.storeEmoteStatistics(usagesToStore);
|
||||
verify(featureModeService, times(0)).featureModeActive(eq(StatisticFeatures.EMOTE_TRACKING), anyLong(), eq(EmoteTrackingMode.AUTO_TRACK));
|
||||
verify(metricService, times(0)).incrementCounter(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -314,6 +319,7 @@ public class TrackedEmoteServiceBeanTest {
|
||||
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
|
||||
testUnit.storeEmoteStatistics(usagesToStore);
|
||||
verify(usedEmote, times(1)).setAmount(2 * COUNT);
|
||||
verify(metricService, times(1)).incrementCounter(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -328,6 +334,7 @@ public class TrackedEmoteServiceBeanTest {
|
||||
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
|
||||
testUnit.storeEmoteStatistics(usagesToStore);
|
||||
verify(usedEmote, times(0)).setAmount(anyLong());
|
||||
verify(metricService, times(1)).incrementCounter(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -343,6 +350,7 @@ public class TrackedEmoteServiceBeanTest {
|
||||
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
|
||||
testUnit.storeEmoteStatistics(usagesToStore);
|
||||
verify(usedEmoteManagementService, times(1)).createEmoteUsageForToday(trackedEmote, COUNT);
|
||||
verify(metricService, times(1)).incrementCounter(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -355,6 +363,7 @@ public class TrackedEmoteServiceBeanTest {
|
||||
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
|
||||
testUnit.storeEmoteStatistics(usagesToStore);
|
||||
verify(usedEmoteManagementService, times(0)).createEmoteUsageForToday(any(TrackedEmote.class), anyLong());
|
||||
verify(metricService, times(1)).incrementCounter(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -367,6 +376,7 @@ public class TrackedEmoteServiceBeanTest {
|
||||
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
|
||||
testUnit.storeEmoteStatistics(usagesToStore);
|
||||
verify(usedEmoteManagementService, times(0)).createEmoteUsageForToday(any(TrackedEmote.class), anyLong());
|
||||
verify(metricService, times(1)).incrementCounter(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -374,7 +384,7 @@ public class TrackedEmoteServiceBeanTest {
|
||||
HashMap<Long, List<PersistingEmote>> usagesToStore = new HashMap<>();
|
||||
usagesToStore.put(SERVER_ID, Arrays.asList(persistingEmote));
|
||||
when(persistingEmote.getEmoteId()).thenReturn(EMOTE_ID);
|
||||
when(botService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild));
|
||||
when(guildService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild));
|
||||
when(persistingEmote.getCount()).thenReturn(COUNT);
|
||||
when(trackedEmoteManagementService.loadByEmoteIdOptional(EMOTE_ID, SERVER_ID)).thenReturn(Optional.empty());
|
||||
when(trackedEmoteManagementService.createExternalTrackedEmote(persistingEmote)).thenReturn(trackedEmote);
|
||||
@@ -382,6 +392,7 @@ public class TrackedEmoteServiceBeanTest {
|
||||
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
|
||||
testUnit.storeEmoteStatistics(usagesToStore);
|
||||
verify(usedEmoteManagementService, times(1)).createEmoteUsageForToday(trackedEmote, COUNT);
|
||||
verify(metricService, times(1)).incrementCounter(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -411,6 +422,7 @@ public class TrackedEmoteServiceBeanTest {
|
||||
|
||||
verify(usedEmoteManagementService, times(1)).createEmoteUsageForToday(eq(trackedEmote2), anyLong());
|
||||
verify(usedEmote, times(1)).setAmount(2 * COUNT);
|
||||
verify(metricService, times(2)).incrementCounter(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -8,8 +8,8 @@ import dev.sheldan.abstracto.statistic.emotes.model.database.TrackedEmote;
|
||||
import net.dv8tion.jda.api.entities.Emote;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Service responsible to provide operations on {@link TrackedEmote}
|
||||
|
||||
Reference in New Issue
Block a user